Merge remote-tracking branch 'origin/master' into belle-sip

Conflicts:
	.gitmodules
	linphone.xcodeproj/project.pbxproj
	submodules/build/builder-iphone-os.mk
	submodules/build/builders.d/libvpx.mk
	submodules/build/builders.d/mssilk.mk
	submodules/build/builders.d/opencore-amr.mk
	submodules/build/iphone-config.site
	submodules/liblinphone.xcodeproj/project.pbxproj
	submodules/linphone
This commit is contained in:
Jehan Monnier 2013-06-04 10:31:39 +02:00
commit 8f74160e83
31 changed files with 445 additions and 187 deletions

3
.gitmodules vendored
View file

@ -58,3 +58,6 @@
[submodule "submodules/externals/polarssl"]
path = submodules/externals/polarssl
url = git://git.linphone.org/polarssl.git
[submodule "submodules/externals/opus"]
path = submodules/externals/opus
url = git://git.opus-codec.org/opus.git

View file

@ -122,7 +122,7 @@ static UICompositeViewDescription *compositeDescription = nil;
if ([[addressField text ]length] == 0) { // if no address is manually set, lauch address book
[ContactSelection setSelectionMode:ContactSelectionModeMessage];
[ContactSelection setAddAddress:nil];
[ContactSelection setSipFilter:TRUE];
[ContactSelection setSipFilter: [LinphoneManager instance].contactFilter];
[ContactSelection setEmailFilter:FALSE];
[[PhoneMainView instance] changeCurrentView:[ContactsViewController compositeViewDescription] push:TRUE];
} else {

View file

@ -198,20 +198,32 @@ static const int contactSections[ContactSections_MAX] = {ContactSections_None, C
CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, i);
BOOL add = false;
if(CFDictionaryContainsKey(lDict, kABPersonInstantMessageServiceKey)) {
if(CFStringCompare((CFStringRef)kContactSipField, CFDictionaryGetValue(lDict, kABPersonInstantMessageServiceKey), kCFCompareCaseInsensitive) == 0) {
if(CFStringCompare((CFStringRef)[LinphoneManager instance].contactSipField, CFDictionaryGetValue(lDict, kABPersonInstantMessageServiceKey), kCFCompareCaseInsensitive) == 0) {
add = true;
}
} else {
add = true;
}
if(add) {
Entry *entry = [[Entry alloc] initWithData:identifier];
[subArray addObject: entry];
[entry release];
}
CFRelease(lDict);
}
CFRelease(lMap);
} else { //check domain
LinphoneAddress* address = linphone_address_new([(NSString*)CFDictionaryGetValue(lDict,kABPersonInstantMessageUsernameKey) UTF8String]);
if (address) {
if ([[ContactSelection getSipFilter] compare:@"*" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
add = true;
} else {
NSString* domain = [NSString stringWithCString:linphone_address_get_domain(address)
encoding:[NSString defaultCStringEncoding]];
add = [domain compare:[ContactSelection getSipFilter] options:NSCaseInsensitiveSearch] == NSOrderedSame;
}
linphone_address_destroy(address);
} else {
add = false;
}
}
if(add) {
Entry *entry = [[Entry alloc] initWithData:identifier];
[subArray addObject: entry];
[entry release];
}
CFRelease(lDict);
}
CFRelease(lMap);
}
[dataCache addObject:subArray];
}
@ -241,6 +253,68 @@ static const int contactSections[ContactSections_MAX] = {ContactSections_None, C
[self.tableView reloadData];
}
-(Entry *) setOrCreateSipContactEntry:(Entry *)entry withValue:(NSString*)value {
ABMultiValueRef lcMap = ABRecordCopyValue(contact, kABPersonInstantMessageProperty);
ABMutableMultiValueRef lMap;
if(lcMap != NULL) {
lMap = ABMultiValueCreateMutableCopy(lcMap);
CFRelease(lcMap);
} else {
lMap = ABMultiValueCreateMutable(kABStringPropertyType);
}
ABMultiValueIdentifier index;
NSError* error = NULL;
CFStringRef keys[] = { kABPersonInstantMessageUsernameKey, kABPersonInstantMessageServiceKey};
CFTypeRef values[] = { [value copy], [LinphoneManager instance].contactSipField };
CFDictionaryRef lDict = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 2, NULL, NULL);
if (entry) {
index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]);
ABMultiValueReplaceValueAtIndex(lMap, lDict, index);
} else {
CFStringRef label = (CFStringRef)[labelArray objectAtIndex:0];
ABMultiValueAddValueAndLabel(lMap, lDict, label, &index);
}
if (!ABRecordSetValue(contact, kABPersonInstantMessageProperty, lMap, (CFErrorRef*)&error)) {
[LinphoneLogger log:LinphoneLoggerLog format:@"Can't set contact with value [%@] cause [%@]", value,[error localizedDescription]];
} else {
if (entry == nil) {
entry = [[Entry alloc] initWithData:index];
}
CFRelease(lDict);
/*check if message type is kept or not*/
lcMap = ABRecordCopyValue(contact, kABPersonInstantMessageProperty);
lMap = ABMultiValueCreateMutableCopy(lcMap);
CFRelease(lcMap);
index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]);
lDict = ABMultiValueCopyValueAtIndex(lMap,index);
if(!CFDictionaryContainsKey(lDict, kABPersonInstantMessageServiceKey)) {
/*too bad probably a gtalk number, storing uri*/
NSString* username = CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey);
LinphoneAddress* address = linphone_core_interpret_url([LinphoneManager getLc]
,[username UTF8String]);
char* uri = linphone_address_as_string_uri_only(address);
CFStringRef keys[] = { kABPersonInstantMessageUsernameKey, kABPersonInstantMessageServiceKey};
CFTypeRef values[] = { [NSString stringWithCString:uri encoding:[NSString defaultCStringEncoding]], [LinphoneManager instance].contactSipField };
CFDictionaryRef lDict2 = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 2, NULL, NULL);
ABMultiValueReplaceValueAtIndex(lMap, lDict2, index);
if (!ABRecordSetValue(contact, kABPersonInstantMessageProperty, lMap, (CFErrorRef*)&error)) {
[LinphoneLogger log:LinphoneLoggerLog format:@"Can't set contact with value [%@] cause [%@]", value,[error localizedDescription]];
}
CFRelease(lDict2);
linphone_address_destroy(address);
ms_free(uri);
}
CFRelease(lMap);
}
CFRelease(lDict);
return entry;
}
-(void) setSipContactEntry:(Entry *)entry withValue:(NSString*)value {
[self setOrCreateSipContactEntry:entry withValue:value];
}
- (void)addEntry:(UITableView*)tableview section:(NSInteger)section animated:(BOOL)animated {
[self addEntry:tableview section:section animated:animated value:@""];
}
@ -275,33 +349,15 @@ static const int contactSections[ContactSections_MAX] = {ContactSections_None, C
}
CFRelease(lMap);
} else if(contactSections[section] == ContactSections_Sip) {
ABMultiValueIdentifier identifier;
ABMultiValueRef lcMap = ABRecordCopyValue(contact, kABPersonInstantMessageProperty);
ABMutableMultiValueRef lMap;
if(lcMap != NULL) {
lMap = ABMultiValueCreateMutableCopy(lcMap);
CFRelease(lcMap);
} else {
lMap = ABMultiValueCreateMutable(kABDictionaryPropertyType);
}
CFStringRef keys[] = { kABPersonInstantMessageUsernameKey, kABPersonInstantMessageServiceKey };
CFTypeRef values[] = { [value copy], kContactSipField };
CFDictionaryRef lDict = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 1, NULL, NULL);
CFStringRef label = (CFStringRef)[labelArray objectAtIndex:0];
if(!ABMultiValueAddValueAndLabel(lMap, lDict, label, &identifier)) {
added = false;
}
CFRelease(lDict);
if(added && ABRecordSetValue(contact, kABPersonInstantMessageProperty, lMap, (CFErrorRef*)&error)) {
Entry *entry = [[Entry alloc] initWithData:identifier];
[sectionArray addObject:entry];
[entry release];
} else {
added = false;
[LinphoneLogger log:LinphoneLoggerError format:@"Can't add entry: %@", [error localizedDescription]];
}
CFRelease(lMap);
Entry *entry = [self setOrCreateSipContactEntry:nil withValue:value];
if (entry) {
[sectionArray addObject:entry];
[entry release];
added=true;
} else {
added=false;
[LinphoneLogger log:LinphoneLoggerError format:@"Can't add entry for value: %@", value];
}
} else if(contactSections[section] == ContactSections_Email) {
ABMultiValueIdentifier identifier;
ABMultiValueRef lcMap = ABRecordCopyValue(contact, kABPersonEmailProperty);
@ -497,7 +553,17 @@ static const int contactSections[ContactSections_MAX] = {ContactSections_None, C
CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, index);
CFStringRef valueRef = CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey);
if(valueRef != NULL) {
value = [NSString stringWithString:(NSString*) valueRef];
LinphoneAddress* addr=NULL;
if ([[LinphoneManager instance] lpConfigBoolForKey:@"contact_display_username_only"]
&& (addr=linphone_address_new([(NSString *)valueRef UTF8String]))) {
if (linphone_address_get_username(addr)) {
value = [NSString stringWithCString:linphone_address_get_username(addr)
encoding:[NSString defaultCStringEncoding]];
} /*else value=@""*/
} else {
value = [NSString stringWithString:(NSString*) valueRef];
}
if (addr) linphone_address_destroy(addr);
}
CFRelease(lDict);
CFRelease(lMap);
@ -537,7 +603,7 @@ static const int contactSections[ContactSections_MAX] = {ContactSections_None, C
NSMutableArray *sectionDict = [self getSectionData:[indexPath section]];
Entry *entry = [sectionDict objectAtIndex:[indexPath row]];
if (![self isEditing]) {
NSString *dest;
NSString *dest=NULL;;
if(contactSections[[indexPath section]] == ContactSections_Number) {
ABMultiValueRef lMap = ABRecordCopyValue(contact, kABPersonPhoneProperty);
int index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]);
@ -820,17 +886,7 @@ static const int contactSections[ContactSections_MAX] = {ContactSections_None, C
ABRecordSetValue(contact, kABPersonPhoneProperty, lMap, nil);
CFRelease(lMap);
} else if(contactSections[[path section]] == ContactSections_Sip) {
ABMultiValueRef lcMap = ABRecordCopyValue(contact, kABPersonInstantMessageProperty);
ABMutableMultiValueRef lMap = ABMultiValueCreateMutableCopy(lcMap);
CFRelease(lcMap);
int index = ABMultiValueGetIndexForIdentifier(lMap, [entry identifier]);
CFStringRef keys[] = { kABPersonInstantMessageUsernameKey, kABPersonInstantMessageServiceKey};
CFTypeRef values[] = { [value copy], kContactSipField };
CFDictionaryRef lDict = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 2, NULL, NULL);
ABMultiValueReplaceValueAtIndex(lMap, lDict, index);
CFRelease(lDict);
ABRecordSetValue(contact, kABPersonInstantMessageProperty, lMap, nil);
CFRelease(lMap);
[self setSipContactEntry:entry withValue:value];
} else if(contactSections[[path section]] == ContactSections_Email) {
ABMultiValueRef lcMap = ABRecordCopyValue(contact, kABPersonEmailProperty);
ABMutableMultiValueRef lMap = ABMultiValueCreateMutableCopy(lcMap);

View file

@ -87,13 +87,26 @@ static void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef inf
CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, i);
if(CFDictionaryContainsKey(lDict, kABPersonInstantMessageServiceKey)) {
CFStringRef serviceKey = CFDictionaryGetValue(lDict, kABPersonInstantMessageServiceKey);
if(CFStringCompare((CFStringRef)@"SIP", serviceKey, kCFCompareCaseInsensitive) == 0) {
add = true;
}
} else {
NSString* usernameKey = CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey);
if([usernameKey hasPrefix:@"sip:"]) {
CFStringRef username = username=CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey);
if(CFStringCompare((CFStringRef)[LinphoneManager instance].contactSipField, serviceKey, kCFCompareCaseInsensitive) == 0) {
add = true;
} else {
add=false;
}
} else {
//check domain
LinphoneAddress* address = linphone_address_new([(NSString*)CFDictionaryGetValue(lDict,kABPersonInstantMessageUsernameKey) UTF8String]);
if (address) {
if ([[ContactSelection getSipFilter] compare:@"*" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
add = true;
} else {
NSString* domain = [NSString stringWithCString:linphone_address_get_domain(address)
encoding:[NSString defaultCStringEncoding]];
add = [domain compare:[ContactSelection getSipFilter] options:NSCaseInsensitiveSearch] == NSOrderedSame;
}
linphone_address_destroy(address);
} else {
add = false;
}
}
CFRelease(lDict);

View file

@ -36,8 +36,9 @@ typedef enum _ContactSelectionMode {
+ (ContactSelectionMode)getSelectionMode;
+ (void)setAddAddress:(NSString*)address;
+ (NSString*)getAddAddress;
+ (void)setSipFilter:(BOOL)enable;
+ (BOOL)getSipFilter;
/* define sip filter, can be * or sip domain*/
+ (void)setSipFilter:(NSString*) domain;
+ (NSString*)getSipFilter;
+ (void)setEmailFilter:(BOOL)enable;
+ (BOOL)getEmailFilter;

View file

@ -27,7 +27,7 @@
static ContactSelectionMode sSelectionMode = ContactSelectionModeNone;
static NSString* sAddAddress = nil;
static BOOL sSipFilter = FALSE;
static NSString* sSipFilter = nil;
static BOOL sEmailFilter = FALSE;
+ (void)setSelectionMode:(ContactSelectionMode)selectionMode {
@ -52,11 +52,12 @@ static BOOL sEmailFilter = FALSE;
return sAddAddress;
}
+ (void)setSipFilter:(BOOL)enable {
sSipFilter = enable;
+ (void)setSipFilter:(NSString*)domain {
[sSipFilter release];
sSipFilter = [domain retain];
}
+ (BOOL)getSipFilter {
+ (NSString*)getSipFilter {
return sSipFilter;
}
@ -197,7 +198,7 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)changeView:(HistoryView)view {
if(view == History_All) {
[ContactSelection setSipFilter:FALSE];
[ContactSelection setSipFilter:nil];
[ContactSelection setEmailFilter:FALSE];
[tableController loadData];
allButton.selected = TRUE;
@ -206,7 +207,7 @@ static UICompositeViewDescription *compositeDescription = nil;
}
if(view == History_Linphone) {
[ContactSelection setSipFilter:TRUE];
[ContactSelection setSipFilter:[LinphoneManager instance].contactFilter];
[ContactSelection setEmailFilter:FALSE];
[tableController loadData];
linphoneButton.selected = TRUE;

View file

@ -317,7 +317,7 @@ static UICompositeViewDescription *compositeDescription = nil;
- (IBAction)onAddContactClick: (id) event {
[ContactSelection setSelectionMode:ContactSelectionModeEdit];
[ContactSelection setAddAddress:[addressField text]];
[ContactSelection setSipFilter:FALSE];
[ContactSelection setSipFilter:nil];
[ContactSelection setEmailFilter:FALSE];
ContactsViewController *controller = DYNAMIC_CAST([[PhoneMainView instance] changeCurrentView:[ContactsViewController compositeViewDescription] push:TRUE], ContactsViewController);
if(controller != nil) {

View file

@ -281,13 +281,15 @@ static UICompositeViewDescription *compositeDescription = nil;
// contact name
[plainAddressLabel setText:@""];
if (addr != NULL) {
char* lAddress = linphone_address_as_string_uri_only(addr);
if(lAddress != NULL) {
[plainAddressLabel setText:[NSString stringWithUTF8String:lAddress]];
ms_free(lAddress);
} else {
}
if ([[LinphoneManager instance] lpConfigBoolForKey:@"contact_display_username_only"]) {
[plainAddressLabel setText:[NSString stringWithUTF8String:linphone_address_get_username(addr)?linphone_address_get_username(addr):""]];
} else {
char* lAddress = linphone_address_as_string_uri_only(addr);
if(lAddress != NULL) {
[plainAddressLabel setText:[NSString stringWithUTF8String:lAddress]];
ms_free(lAddress);
}
}
}
if (addr != NULL) {
@ -327,7 +329,7 @@ static UICompositeViewDescription *compositeDescription = nil;
[ContactSelection setAddAddress:[NSString stringWithUTF8String:lAddress]];
[ContactSelection setSelectionMode:ContactSelectionModeEdit];
[ContactSelection setSipFilter:FALSE];
[ContactSelection setSipFilter:nil];
[ContactSelection setEmailFilter:FALSE];
ContactsViewController *controller = DYNAMIC_CAST([[PhoneMainView instance] changeCurrentView:[ContactsViewController compositeViewDescription] push:TRUE], ContactsViewController);
if(controller != nil) {

View file

@ -47,8 +47,6 @@ extern NSString *const kLinphoneLogsUpdate;
extern NSString *const kLinphoneSettingsUpdate;
extern NSString *const kLinphoneBluetoothAvailabilityUpdate;
extern NSString *const kContactSipField;
typedef enum _NetworkType {
network_none = 0,
network_2g,
@ -117,6 +115,7 @@ typedef struct _LinphoneManagerSounds {
+ (NSSet *)unsupportedCodecs;
+ (NSString *)getUserAgent;
- (void)startLibLinphone;
- (void)destroyLibLinphone;
- (BOOL)resignActive;
@ -144,6 +143,7 @@ typedef struct _LinphoneManagerSounds {
- (void)lpConfigSetString:(NSString*)value forKey:(NSString*)key;
- (NSString*)lpConfigStringForKey:(NSString*)key;
- (NSString*)lpConfigStringForKey:(NSString*)key withDefault:(NSString*)value;
- (void)lpConfigSetString:(NSString*)value forKey:(NSString*)key forSection:(NSString*)section;
- (NSString*)lpConfigStringForKey:(NSString*)key forSection:(NSString*)section;
- (void)lpConfigSetInt:(NSInteger)value forKey:(NSString*)key;
@ -155,6 +155,7 @@ typedef struct _LinphoneManagerSounds {
- (void)lpConfigSetBool:(BOOL)value forKey:(NSString*)key forSection:(NSString*)section;
- (BOOL)lpConfigBoolForKey:(NSString*)key forSection:(NSString*)section;
@property (readonly) FastAddressBook* fastAddressBook;
@property Connectivity connectivity;
@property (readonly) NetworkType network;
@ -168,6 +169,8 @@ typedef struct _LinphoneManagerSounds {
@property (nonatomic, assign) BOOL bluetoothAvailable;
@property (nonatomic, assign) BOOL bluetoothEnabled;
@property (readonly) ALAssetsLibrary *photoLibrary;
@property (readonly) NSString* contactSipField;
@property (readonly,copy) NSString* contactFilter;
@end

View file

@ -57,7 +57,7 @@ NSString *const kLinphoneMainViewChange = @"LinphoneMainViewChange";
NSString *const kLinphoneLogsUpdate = @"LinphoneLogsUpdate";
NSString *const kLinphoneSettingsUpdate = @"LinphoneSettingsUpdate";
NSString *const kLinphoneBluetoothAvailabilityUpdate = @"LinphoneBluetoothAvailabilityUpdate";
NSString *const kContactSipField = @"SIP";
extern void libmsilbc_init();
@ -133,6 +133,7 @@ struct codec_name_pref_table codec_pref_table[]={
{ "vp8", 90000, @"vp8_preference"},
{ "mpeg4-generic", 44100, @"aaceld_44k_preference"},
{ "mpeg4-generic", 22050, @"aaceld_22k_preference"},
{ "opus", 48000, @"opus_preference"},
{ NULL,0,Nil }
};
@ -245,6 +246,7 @@ struct codec_name_pref_table codec_pref_table[]={
[self copyDefaultSettings];
pendindCallIdFromRemoteNotif = [[NSMutableArray alloc] init ];
photoLibrary = [[ALAssetsLibrary alloc] init];
}
return self;
}
@ -840,6 +842,10 @@ static LinphoneCoreVTable linphonec_vtable = {
,self);
linphone_core_set_user_agent(theLinphoneCore,"LinphoneIPhone",
[[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey] UTF8String]);
[_contactSipField release];
_contactSipField = [[self lpConfigStringForKey:@"contact_im_type_value" withDefault:@"SIP"] retain];
fastAddressBook = [[FastAddressBook alloc] init];
linphone_core_set_root_ca(theLinphoneCore, lRootCa);
@ -924,6 +930,7 @@ static LinphoneCoreVTable linphonec_vtable = {
//go directly to bg mode
[self resignActive];
}
// Post event
NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:theLinphoneCore] forKey:@"core"];
@ -1413,6 +1420,10 @@ static void audioRouteChangeListenerCallback (
- (NSString*)lpConfigStringForKey:(NSString*)key {
return [self lpConfigStringForKey:key forSection:[NSString stringWithUTF8String:LINPHONERC_APPLICATION_KEY]];
}
- (NSString*)lpConfigStringForKey:(NSString*)key withDefault:(NSString*)defaultValue {
NSString* value = [self lpConfigStringForKey:key];
return value?value:defaultValue;
}
- (NSString*)lpConfigStringForKey:(NSString*)key forSection:(NSString *)section {
if (!key) return nil;
@ -1497,4 +1508,16 @@ static void audioRouteChangeListenerCallback (
}
} //else nop, keep call in paused state
}
-(NSString*) contactFilter {
NSString* filter=@"*";
if ( [self lpConfigBoolForKey:@"contact_filter_on_default_domain"]) {
LinphoneProxyConfig* proxy_cfg;
linphone_core_get_default_proxy(theLinphoneCore, &proxy_cfg);
if (proxy_cfg && linphone_proxy_config_get_addr(proxy_cfg)) {
return [NSString stringWithCString:linphone_proxy_config_get_domain(proxy_cfg)
encoding:[NSString defaultCStringEncoding]];
}
}
return filter;
}
@end

View file

@ -103,7 +103,7 @@
- (void)initUICompositeViewController {
viewControllerCache = [[NSMutableDictionary alloc] init];
currentOrientation = UIDeviceOrientationUnknown;
currentOrientation = (UIInterfaceOrientation)UIDeviceOrientationUnknown;
}
- (id)init{
@ -416,18 +416,18 @@
if(currentOrientation == UIDeviceOrientationUnknown) {
return [UIApplication sharedApplication].statusBarOrientation;
}
deviceOrientation = currentOrientation;
deviceOrientation = (UIDeviceOrientation)currentOrientation;
}
if (UIDeviceOrientationIsPortrait(deviceOrientation)) {
if ([currentViewDescription portraitMode]) {
return deviceOrientation;
return (UIInterfaceOrientation)deviceOrientation;
} else {
return UIInterfaceOrientationLandscapeLeft;
}
}
if (UIDeviceOrientationIsLandscape(deviceOrientation)) {
if ([currentViewDescription landscapeMode]) {
return deviceOrientation;
return (UIInterfaceOrientation)deviceOrientation;
} else {
return UIInterfaceOrientationPortrait;
}
@ -435,7 +435,7 @@
} else if([rotationPreference isEqualToString:@"portrait"]) {
if ([currentViewDescription portraitMode]) {
if (UIDeviceOrientationIsPortrait(deviceOrientation)) {
return deviceOrientation;
return (UIInterfaceOrientation)deviceOrientation;
} else {
if(UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) {
return [UIApplication sharedApplication].statusBarOrientation;
@ -449,7 +449,7 @@
} else if([rotationPreference isEqualToString:@"landscape"]) {
if ([currentViewDescription landscapeMode]) {
if (UIDeviceOrientationIsLandscape(deviceOrientation)) {
return deviceOrientation;
return (UIInterfaceOrientation)deviceOrientation;
} else {
if(UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) {
return [UIApplication sharedApplication].statusBarOrientation;

View file

@ -400,7 +400,7 @@ static NSString * const kDisappearAnimation = @"disappear";
- (IBAction)onContactsClick:(id)event {
[ContactSelection setSelectionMode:ContactSelectionModeNone];
[ContactSelection setAddAddress:nil];
[ContactSelection setSipFilter:FALSE];
[ContactSelection setSipFilter:nil];
[ContactSelection setEmailFilter:FALSE];
[[PhoneMainView instance] changeCurrentView:[ContactsViewController compositeViewDescription]];
}

View file

@ -179,7 +179,7 @@ static void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef inf
CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, i);
BOOL add = false;
if(CFDictionaryContainsKey(lDict, kABPersonInstantMessageServiceKey)) {
if(CFStringCompare((CFStringRef)kContactSipField, CFDictionaryGetValue(lDict, kABPersonInstantMessageServiceKey), kCFCompareCaseInsensitive) == 0) {
if(CFStringCompare((CFStringRef)[LinphoneManager instance].contactSipField, CFDictionaryGetValue(lDict, kABPersonInstantMessageServiceKey), kCFCompareCaseInsensitive) == 0) {
add = true;
}
} else {

View file

@ -47,3 +47,7 @@ stun=stun.linphone.org
[video]
display_filter_auto_rotate=0
[app]
#contact_display_username_only=1
#contact_filter_on_default_domain=1

View file

@ -30,6 +30,16 @@
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>opus_preference</string>
<key>Title</key>
<string>Opus 48kHz</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<false/>
@ -50,6 +60,28 @@
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>aaceld_22k_preference</string>
<key>Title</key>
<string>AAC-ELD 22kHz</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>New item</key>
<string></string>
<key>DefaultValue</key>
<false/>
<key>Key</key>
<string>aaceld_44k_preference</string>
<key>Title</key>
<string>AAC-ELD 44kHz</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
@ -120,26 +152,6 @@
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<false/>
<key>Key</key>
<string>aaceld_44k_preference</string>
<key>Title</key>
<string>AAC-ELD 44kHz</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>aaceld_22k_preference</string>
<key>Title</key>
<string>AAC-ELD 22kHz</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>Key</key>
<string>audio_advanced_group</string>

View file

@ -75,6 +75,8 @@
1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
2200C2DB174BB87A002E9A70 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22405EED1600B4E400B92522 /* AssetsLibrary.framework */; };
2200C2DC174BBB24002E9A70 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */; };
22058C71116E305000B08DDD /* linphone_icon_57.png in Resources */ = {isa = PBXBuildFile; fileRef = 22058C70116E305000B08DDD /* linphone_icon_57.png */; };
220FAD3210765B400068D98F /* libgsm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2910765B400068D98F /* libgsm.a */; };
220FAD3810765B400068D98F /* libspeex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 220FAD2F10765B400068D98F /* libspeex.a */; };
@ -128,6 +130,8 @@
22AA8AFD13D7125600B30535 /* libx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFB13D7125500B30535 /* libx264.a */; };
22AA8AFE13D7125600B30535 /* libmsx264.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AA8AFC13D7125500B30535 /* libmsx264.a */; };
22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 22AA8B0013D83F6300B30535 /* UICamSwitch.m */; };
22AF73C21754C0D100BE8398 /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AF73C11754C0D000BE8398 /* libopus.a */; };
22AF73C31754C0D800BE8398 /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AF73C11754C0D000BE8398 /* libopus.a */; };
22B5EFA310CE50BD00777D97 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */; };
22B5F03510CE6B2F00777D97 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5F03410CE6B2F00777D97 /* AddressBook.framework */; };
22BB1A69132FF16A005CD7AA /* UIEraseButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 22BB1A68132FF16A005CD7AA /* UIEraseButton.m */; };
@ -1608,6 +1612,7 @@
22AA8AFC13D7125500B30535 /* libmsx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmsx264.a; path = "liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins/libmsx264.a"; sourceTree = "<group>"; };
22AA8AFF13D83F6300B30535 /* UICamSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICamSwitch.h; sourceTree = "<group>"; };
22AA8B0013D83F6300B30535 /* UICamSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICamSwitch.m; sourceTree = "<group>"; };
22AF73C11754C0D000BE8398 /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopus.a; path = "liblinphone-sdk/apple-darwin/lib/libopus.a"; sourceTree = "<group>"; };
22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; };
22B5F03410CE6B2F00777D97 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; };
22BB1A67132FF16A005CD7AA /* UIEraseButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIEraseButton.h; sourceTree = "<group>"; };
@ -2414,6 +2419,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
22AF73C21754C0D100BE8398 /* libopus.a in Frameworks */,
57B0E360173C010400A476B8 /* libpolarssl.a in Frameworks */,
223CA7E616D9255800EF1BEC /* libantlr3c.a in Frameworks */,
223CA7E716D9255800EF1BEC /* libbellesip.a in Frameworks */,
@ -2472,6 +2478,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2200C2DC174BBB24002E9A70 /* MobileCoreServices.framework in Frameworks */,
2200C2DB174BB87A002E9A70 /* AssetsLibrary.framework in Frameworks */,
D30562131671DC3E00C97967 /* libNinePatch.a in Frameworks */,
D30562141671DC3E00C97967 /* libXMLRPC.a in Frameworks */,
22D8F170147548E2008C97DB /* AVFoundation.framework in Frameworks */,
@ -2509,6 +2517,7 @@
22D8F15B147548E2008C97DB /* libvpx.a in Frameworks */,
223CA7E816D9256E00EF1BEC /* libantlr3c.a in Frameworks */,
223CA7E916D9257200EF1BEC /* libbellesip.a in Frameworks */,
22AF73C31754C0D800BE8398 /* libopus.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2972,6 +2981,7 @@
57B0E35F173C010400A476B8 /* libpolarssl.a */,
223CA7E416D9255800EF1BEC /* libantlr3c.a */,
223CA7E516D9255800EF1BEC /* libbellesip.a */,
22AF73C11754C0D000BE8398 /* libopus.a */,
2258633C11410BAC00C5A737 /* README */,
22276E8013C73D3100210156 /* libavcodec.a */,
22276E8113C73D3100210156 /* libavutil.a */,
@ -3786,7 +3796,7 @@
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0450;
LastUpgradeCheck = 0460;
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "linphone" */;
compatibilityVersion = "Xcode 3.2";
@ -5480,15 +5490,20 @@
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Distribution: jehan monnier";
GCC_THUMB_SUPPORT = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "";
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
LIBRARY_SEARCH_PATHS = "";
PROVISIONING_PROFILE = "7763350E-083E-4ADA-8535-05883F19F947";
PROVISIONING_PROFILE = "BB7E624F-8CD6-448B-A235-CE8DBB401F92";
SDKROOT = iphoneos;
STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic;
TARGETED_DEVICE_FAMILY = "1,2";
@ -5500,6 +5515,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CODE_SIGN_ENTITLEMENTS = "";
CODE_SIGN_IDENTITY = "iPhone Distribution: jehan monnier";
COMPRESS_PNG_FILES = NO;
COPY_PHASE_STRIP = NO;
FRAMEWORK_SEARCH_PATHS = "";
@ -5538,6 +5554,7 @@
ORDER_FILE = "";
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = linphone;
PROVISIONING_PROFILE = "B0005B58-1160-4269-B1FC-C5BA54ACBA65";
SKIP_INSTALL = NO;
TARGETED_DEVICE_FAMILY = "1,2";
};
@ -5718,10 +5735,15 @@
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
GCC_THUMB_SUPPORT = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "";
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
@ -5784,10 +5806,15 @@
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Distribution: jehan monnier";
GCC_THUMB_SUPPORT = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "";
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
@ -5851,10 +5878,15 @@
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer: jehan monnier (E8MYPN2NXL)";
GCC_THUMB_SUPPORT = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "";
IPHONEOS_DEPLOYMENT_TARGET = 4.3;

@ -1 +1 @@
Subproject commit ef33d5b7158c1b8391a67f9fd01759ae00cc612b
Subproject commit 89aa5d6a1b9957b73696f250043b799b462a5c0f

View file

@ -22,6 +22,7 @@
host?=armv7-apple-darwin
config_site:=iphone-config.site
config_site_gcc:=iphone-config-gcc.site
library_mode:= --disable-shared --enable-static
linphone_configure_controls= \
--disable-strict \
@ -112,18 +113,18 @@ veryclean: veryclean-linphone veryclean-msbcg729
rm -rf $(BUILDER_BUILD_DIR)
.NOTPARALLEL build-linphone: init build-polarssl build-libantlr build-belle-sip build-srtp build-zrtpcpp build-speex build-libgsm build-ffmpeg build-libvpx detect_gpl_mode_switch $(LINPHONE_BUILD_DIR)/Makefile
.NOTPARALLEL build-linphone: init build-polarssl build-libantlr build-belle-sip build-srtp build-zrtpcpp build-speex build-libgsm build-ffmpeg build-libvpx build-opus detect_gpl_mode_switch $(LINPHONE_BUILD_DIR)/Makefile
cd $(LINPHONE_BUILD_DIR) && export PKG_CONFIG_LIBDIR=$(prefix)/lib/pkgconfig export CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make newdate && make && make install
mkdir -p $(prefix)/share/linphone/tutorials && cp -f $(LINPHONE_SRC_DIR)/coreapi/help/*.c $(prefix)/share/linphone/tutorials/
clean-linphone: clean-libantlr clean-polarssl clean-belle-sip clean-speex clean-libgsm clean-srtp clean-zrtpcpp clean-msilbc clean-libilbc clean-msamr clean-mssilk clean-ffmpeg clean-libvpx clean-msx264
clean-linphone: clean-libantlr clean-polarssl clean-belle-sip clean-speex clean-libgsm clean-srtp clean-zrtpcpp clean-msilbc clean-libilbc clean-msamr clean-mssilk clean-ffmpeg clean-libvpx clean-msx264 clean-opus
cd $(LINPHONE_BUILD_DIR) && make clean
veryclean-linphone: veryclean-libantlr veryclean-polarssl veryclean-belle-sip veryclean-speex veryclean-srtp veryclean-zrtpcpp veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr veryclean-mssilk veryclean-msx264 veryclean-libvpx
veryclean-linphone: veryclean-libantlr veryclean-polarssl veryclean-belle-sip veryclean-speex veryclean-srtp veryclean-zrtpcpp veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr veryclean-mssilk veryclean-msx264 veryclean-libvpx veryclean-opus
#-cd $(LINPHONE_BUILD_DIR) && make distclean
-cd $(LINPHONE_SRC_DIR) && rm -f configure
clean-makefile-linphone: clean-makefile-libantlr clean-makefile-polarssl clean-makefile-belle-sip clean-makefile-speex clean-makefile-srtp clean-makefile-zrtpcpp clean-makefile-libilbc clean-makefile-msilbc clean-makefile-openssl clean-makefile-msamr clean-makefile-ffmpeg clean-makefile-libvpx clean-makefile-mssilk
clean-makefile-linphone: clean-makefile-libantlr clean-makefile-polarssl clean-makefile-belle-sip clean-makefile-speex clean-makefile-srtp clean-makefile-zrtpcpp clean-makefile-libilbc clean-makefile-msilbc clean-makefile-openssl clean-makefile-msamr clean-makefile-ffmpeg clean-makefile-libvpx clean-makefile-mssilk clean-makefile-opus
cd $(LINPHONE_BUILD_DIR) && rm -f Makefile && rm -f oRTP/Makefile && rm -f mediastreamer2/Makefile

View file

@ -14,6 +14,9 @@ else
libvpx_configure_options+= --target=x86-darwin10-gcc
endif
libvpx_dir?=externals/libvpx
all_p=armv6-darwin-gcc #neon Cortex-A8
all_p+=armv7-darwin-gcc #neon Cortex-A8
all_p+=armv7s-darwin-gcc #neon Cortex-A8
$(BUILDER_SRC_DIR)/$(libvpx_dir)/patched.stamp:
cd $(BUILDER_SRC_DIR)/$(libvpx_dir) \
@ -24,7 +27,7 @@ $(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mk: $(BUILDER_SRC_DIR)/$(libvpx_dir)/p
mkdir -p $(BUILDER_BUILD_DIR)/$(libvpx_dir)
cd $(BUILDER_BUILD_DIR)/$(libvpx_dir)/ \
&& host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \
&& SYSROOT_PATH=$$SYSROOT_PATH SDK_BIN_PATH=$$SDK_BIN_PATH $(BUILDER_SRC_DIR)/$(libvpx_dir)/configure --prefix=$(prefix) $(libvpx_configure_options)
&& export all_platforms="${all_p}" && $(BUILDER_SRC_DIR)/$(libvpx_dir)/configure --prefix=$(prefix) --sdk-path=$$SDK_BIN_PATH/../../ --libc=$$SYSROOT_PATH $(libvpx_configure_options)
build-libvpx: $(BUILDER_BUILD_DIR)/$(libvpx_dir)/config.mk
cd $(BUILDER_BUILD_DIR)/$(libvpx_dir) && PKG_CONFIG_LIBDIR=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make && make install

View file

@ -1,29 +1,9 @@
diff --git a/build/make/configure.sh b/build/make/configure.sh
index 0426f92..38fdcb2 100755
index c99a01c..48f8876 100755
--- a/build/make/configure.sh
+++ b/build/make/configure.sh
@@ -624,6 +624,9 @@ process_common_toolchain() {
if [ -d "/Developer/SDKs/MacOSX10.7.sdk" ]; then
osx_sdk_dir="/Developer/SDKs/MacOSX10.7.sdk"
fi
+ if test -n "$SYSROOT_PATH" ; then
+ osx_sdk_dir=$SYSROOT_PATH
+ fi
case ${toolchain} in
*-darwin8-*)
@@ -743,9 +746,17 @@ process_common_toolchain() {
darwin*)
SDK_PATH=/Developer/Platforms/iPhoneOS.platform/Developer
TOOLCHAIN_PATH=${SDK_PATH}/usr/bin
+ if test -n "$SYSROOT_PATH" ; then
+ SDK_FULL_PATH=$SYSROOT_PATH
+ else
+ SDK_FULL_PATH="${SDK_PATH}/SDKs/iPhoneOS5.0.sdk"
+ fi
+ if test -n "$SDK_BIN_PATH" ; then
+ TOOLCHAIN_PATH=$SDK_BIN_PATH
+ fi
@@ -892,7 +892,7 @@ process_common_toolchain() {
CXX=${TOOLCHAIN_PATH}/g++
CC=${TOOLCHAIN_PATH}/gcc
AR=${TOOLCHAIN_PATH}/ar
- LD=${TOOLCHAIN_PATH}/arm-apple-darwin10-llvm-gcc-4.2
@ -31,39 +11,12 @@ index 0426f92..38fdcb2 100755
AS=${TOOLCHAIN_PATH}/as
STRIP=${TOOLCHAIN_PATH}/strip
NM=${TOOLCHAIN_PATH}/nm
@@ -757,12 +768,12 @@ process_common_toolchain() {
@@ -904,7 +904,7 @@ process_common_toolchain() {
ASFLAGS="-version -arch ${tgt_isa} -g"
add_cflags -arch ${tgt_isa}
- add_ldflags -arch_only ${tgt_isa}
+ add_ldflags -arch ${tgt_isa}
- add_cflags "-isysroot ${SDK_PATH}/SDKs/iPhoneOS5.0.sdk"
+ add_cflags "-isysroot $SDK_FULL_PATH"
# This should be overridable
- alt_libc=${SDK_PATH}/SDKs/iPhoneOS5.0.sdk
+ alt_libc=$SDK_FULL_PATH
# Add the paths for the alternate libc
for d in usr/include; do
diff --git a/configure b/configure
index 6f20c6b..4638ea2 100755
--- a/configure
+++ b/configure
@@ -94,6 +94,7 @@ all_platforms="${all_platforms} iwmmxt-linux-gcc"
all_platforms="${all_platforms} iwmmxt2-linux-rvct"
all_platforms="${all_platforms} iwmmxt2-linux-gcc"
all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8
+all_platforms="${all_platforms} armv7s-darwin-gcc" #neon Cortex-A8
all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8
all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8
all_platforms="${all_platforms} armv7-none-rvct" #neon Cortex-A8
@@ -198,6 +199,7 @@ ARCH_EXT_LIST="
armv5te
armv6
armv7
+ armv7s
iwmmxt
iwmmxt2
if [ -z "${alt_libc}" ]; then
alt_libc=${SDK_PATH}/SDKs/iPhoneOS5.1.sdk

View file

@ -30,7 +30,7 @@ $(BUILDER_BUILD_DIR)/$(mssilk_dir)/Makefile: $(BUILDER_SRC_DIR)/$(mssilk_dir)/co
echo -e "\033[01;32m Running configure in $(BUILDER_BUILD_DIR)/$(mssilk_dir) \033[0m"
mkdir -p $(BUILDER_BUILD_DIR)/$(mssilk_dir)
cd $(BUILDER_BUILD_DIR)/$(mssilk_dir)/ \
&& PKG_CONFIG_LIBDIR=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \
&& PKG_CONFIG_LIBDIR=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site_gcc) \
$(BUILDER_SRC_DIR)/$(mssilk_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} \
--enable-static
@ -39,8 +39,8 @@ ifeq ($(enable_silk),yes)
build-mssilk: $(BUILDER_BUILD_DIR)/$(mssilk_dir)/Makefile
echo -e "\033[01;32m building silk \033[0m"
cd $(BUILDER_BUILD_DIR)/$(mssilk_dir) \
&& PKG_CONFIG_LIBDIR=$(prefix)/lib/pkgconfig \
CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \
&& PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig \
CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site_gcc) \
make -j1 && make install

View file

@ -31,11 +31,11 @@ $(BUILDER_SRC_DIR)/$(opencore-amr_dir)/configure: $(BUILDER_SRC_DIR)/$(opencore-
$(BUILDER_BUILD_DIR)/$(opencore-amr_dir)/Makefile: $(BUILDER_SRC_DIR)/$(opencore-amr_dir)/configure
mkdir -p $(BUILDER_BUILD_DIR)/$(opencore-amr_dir)
cd $(BUILDER_BUILD_DIR)/$(opencore-amr_dir)/ \
&& CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \
&& CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site_gcc) \
$(BUILDER_SRC_DIR)/$(opencore-amr_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} ${opencore-amr-configure-option}
build-opencore-amr: $(BUILDER_BUILD_DIR)/$(opencore-amr_dir)/Makefile
cd $(BUILDER_BUILD_DIR)/$(opencore-amr_dir) && PKG_CONFIG_LIBDIR=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make && make install
cd $(BUILDER_BUILD_DIR)/$(opencore-amr_dir) && PKG_CONFIG_LIBDIR=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site_gcc) make && make install
clean-opencore-amr:
cd $(BUILDER_BUILD_DIR)/$(opencore-amr_dir) && make clean

View file

@ -0,0 +1,69 @@
############################################################################
# opus.mk
# Copyright (C) 2013 Belledonne Communications,Grenoble France
#
############################################################################
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
############################################################################
opus_dir?=externals/opus
enable_opus?=yes
libopus_configure_options=--disable-extra-programs --disable-doc
ifneq (,$(findstring armv7,$(host)))
libopus_configure_options+= --enable-fixed-point --disable-asm
endif
ifneq (,$(findstring armv7s,$(host)))
libopus_configure_options+= --enable-fixed-point --disable-asm
endif
$(BUILDER_SRC_DIR)/$(opus_dir)/configure:
@echo -e "\033[01;32m Running autogen for msopus in $(BUILDER_SRC_DIR)/$(opus_dir) \033[0m"
cd $(BUILDER_SRC_DIR)/$(opus_dir) && ./autogen.sh
$(BUILDER_BUILD_DIR)/$(opus_dir)/Makefile: $(BUILDER_SRC_DIR)/$(opus_dir)/configure
@echo -e "\033[01;32m Running configure in $(BUILDER_BUILD_DIR)/$(opus_dir) \033[0m"
mkdir -p $(BUILDER_BUILD_DIR)/$(opus_dir)
cd $(BUILDER_BUILD_DIR)/$(opus_dir)/ \
&& PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \
$(BUILDER_SRC_DIR)/$(opus_dir)/configure -prefix=$(prefix) --host=$(host) ${library_mode} \
${libopus_configure_options}
ifeq ($(enable_opus),yes)
build-opus: $(BUILDER_BUILD_DIR)/$(opus_dir)/Makefile
@echo -e "\033[01;32m building opus \033[0m"
cd $(BUILDER_BUILD_DIR)/$(opus_dir) \
&& PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig \
CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) \
make && make install
else
build-opus:
@echo "opus is disabled"
endif
clean-opus:
-cd $(BUILDER_BUILD_DIR)/$(opus_dir) && make clean
veryclean-opus:
-cd $(BUILDER_BUILD_DIR)/$(opus_dir) && make distclean
rm -f $(BUILDER_SRC_DIR)/$(opus_dir)/configure
clean-makefile-opus:
-cd $(BUILDER_BUILD_DIR)/$(opus_dir) && rm -f Makefile

View file

@ -11,7 +11,7 @@ $(BUILDER_BUILD_DIR)/$(srtp_dir)/Makefile: $(BUILDER_SRC_DIR)/$(srtp_dir)/config
build-srtp: $(BUILDER_BUILD_DIR)/$(srtp_dir)/Makefile
host_alias=$(host) && . /$(BUILDER_SRC_DIR)/build/$(config_site) && \
cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make libsrtp.a AR=$$AR && make install
cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make libsrtp.a AR="$$AR" && make install
clean-srtp:
-cd $(BUILDER_BUILD_DIR)/$(srtp_dir) && make clean

View file

@ -0,0 +1,51 @@
# -*- shell-script -*-
SDK_VERSION_MAJOR=4
SDK_VERSION=4.0
MCPU=""
if test "${host_alias}" = "i386-apple-darwin" ; then
PLATFORM=Simulator
ARCH=i386
CMAKE_OPTS="-DCMAKE_SYSTEM_PROCESSOR=i386"
MCPU=""
elif test "${host_alias}" = "armv6-apple-darwin" ; then
ARCH=armv6
PLATFORM=OS
CMAKE_OPTS="-DCMAKE_SYSTEM_PROCESSOR=arm"
MCPU="-mcpu=arm1176jzf-s"
elif test "${host_alias}" = "armv7-apple-darwin" ; then
ARCH=armv7
PLATFORM=OS
CMAKE_OPTS="-DCMAKE_SYSTEM_PROCESSOR=arm"
MCPU="-mcpu=cortex-a8"
elif test "${host_alias}" = "armv7s-apple-darwin" ; then
ARCH=armv7s
PLATFORM=OS
CMAKE_OPTS="-DCMAKE_SYSTEM_PROCESSOR=arm"
else
echo "bad host ${host_alias} must be either i386-apple-darwin or armv6-apple-darwin"
exit
fi
echo "Loading config.site for iPhone platform=${PLATFORM} version=${SDK_VERSION}"
XCODE_DEV_PATH=`xcode-select -print-path`
#new path with Xcode 4.3:
if test -d ${XCODE_DEV_PATH}/Platforms/iPhone${PLATFORM}.platform/Developer/SDKs ; then
SDK_PATH_LIST=`ls -drt ${XCODE_DEV_PATH}/Platforms/iPhone${PLATFORM}.platform/Developer/SDKs/iPhone${PLATFORM}*`
SDK_BIN_PATH=${XCODE_DEV_PATH}/Platforms/iPhone${PLATFORM}.platform/Developer/usr/bin
else
SDK_PATH_LIST=`ls -drt /Developer/Platforms/iPhone${PLATFORM}.platform/Developer/SDKs/iPhone${PLATFORM}*`
SDK_BIN_PATH=/Developer/Platforms/iPhone${PLATFORM}.platform/Developer/usr/bin
fi
for SYSROOT_PATH in $SDK_PATH_LIST ; do echo $SYSROOT_PATH ; done ;
echo "Selecting SDK path = ${SYSROOT_PATH}"
COMMON_FLAGS=" -arch ${ARCH} ${MCPU} -isysroot ${SYSROOT_PATH} -miphoneos-version-min=${SDK_VERSION} -DTARGET_OS_IPHONE=1 -D__IOS"
CC="${SDK_BIN_PATH}/gcc -std=c99 $COMMON_FLAGS"
OBJC="${SDK_BIN_PATH}/gcc -std=c99 $COMMON_FLAGS"
CXX="${SDK_BIN_PATH}/g++ $COMMON_FLAGS"
LD="${SDK_BIN_PATH}/ld -arch ${ARCH}"
AR=${SDK_BIN_PATH}/ar
RANLIB=${SDK_BIN_PATH}/ranlib
CPPFLAGS="-Dasm=__asm"
OBJCFLAGS="-x objective-c -fexceptions -gdwarf-2 -fobjc-abi-version=2 -fobjc-legacy-dispatch"

View file

@ -27,11 +27,11 @@ else
exit
fi
echo "Loading config.site for iPhone platform=${PLATFORM} version=${SDK_VERSION}"
XCODE_ROOT=/Applications/Xcode.app
XCODE_DEV_PATH=`xcode-select -print-path`
#new path with Xcode 4.3:
if test -d ${XCODE_ROOT}/Contents/Developer/Platforms/iPhone${PLATFORM}.platform/Developer/SDKs ; then
SDK_PATH_LIST=`ls -drt ${XCODE_ROOT}/Contents/Developer/Platforms/iPhone${PLATFORM}.platform/Developer/SDKs/iPhone${PLATFORM}*`
SDK_BIN_PATH=${XCODE_ROOT}/Contents/Developer/Platforms/iPhone${PLATFORM}.platform/Developer/usr/bin
if test -d ${XCODE_DEV_PATH}/Platforms/iPhone${PLATFORM}.platform/Developer/SDKs ; then
SDK_PATH_LIST=`ls -drt ${XCODE_DEV_PATH}/Platforms/iPhone${PLATFORM}.platform/Developer/SDKs/iPhone${PLATFORM}*`
SDK_BIN_PATH=${XCODE_DEV_PATH}/Platforms/iPhone${PLATFORM}.platform/Developer/usr/bin
else
SDK_PATH_LIST=`ls -drt /Developer/Platforms/iPhone${PLATFORM}.platform/Developer/SDKs/iPhone${PLATFORM}*`
SDK_BIN_PATH=/Developer/Platforms/iPhone${PLATFORM}.platform/Developer/usr/bin
@ -40,12 +40,12 @@ fi
for SYSROOT_PATH in $SDK_PATH_LIST ; do echo $SYSROOT_PATH ; done ;
echo "Selecting SDK path = ${SYSROOT_PATH}"
COMMON_FLAGS=" -arch ${ARCH} ${MCPU} -isysroot ${SYSROOT_PATH} -miphoneos-version-min=${SDK_VERSION} -DTARGET_OS_IPHONE=1 -D__IOS -fms-extensions"
CC="${SDK_BIN_PATH}/gcc -std=c99 $COMMON_FLAGS"
OBJC="${SDK_BIN_PATH}/gcc -std=c99 $COMMON_FLAGS"
CXX="${SDK_BIN_PATH}/g++ $COMMON_FLAGS"
LD="${SDK_BIN_PATH}/ld -arch ${ARCH}"
AR=${SDK_BIN_PATH}/ar
RANLIB=${SDK_BIN_PATH}/ranlib
CC="xcrun clang -std=c99 $COMMON_FLAGS"
OBJC="xcrun clang -std=c99 $COMMON_FLAGS"
CXX="xcrun clang++ $COMMON_FLAGS"
LD="xcrun ld -arch ${ARCH}"
AR="xcrun ar"
RANLIB="xcrun ranlib"
CPPFLAGS="-Dasm=__asm"
OBJCFLAGS="-x objective-c -fexceptions -gdwarf-2 -fobjc-abi-version=2 -fobjc-legacy-dispatch"

@ -1 +1 @@
Subproject commit c8df1656bd94928059204242e778bd5b8b9dc7aa
Subproject commit b9ce43029298182668d4dcb0e0814189e4a63c2a

1
submodules/externals/opus vendored Submodule

@ -0,0 +1 @@
Subproject commit fcecd29abf32164326e568acdcdf7d8e877b33b1

@ -1 +1 @@
Subproject commit 89e99a4814fd62945ff559d3d37d9aa92caf3169
Subproject commit 3c317818481b67e0dd732e5dc045d6b981a8775b

View file

@ -467,6 +467,16 @@
22A10B5911F84E2D00373793 /* proto.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B5311F84E2D00373793 /* proto.h */; };
22A10B5A11F84E2D00373793 /* toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B5411F84E2D00373793 /* toast.h */; };
22A10B5B11F84E2D00373793 /* unproto.h in Headers */ = {isa = PBXBuildFile; fileRef = 22A10B5511F84E2D00373793 /* unproto.h */; };
22AF73BE1753E83700BE8398 /* msopus.c in Sources */ = {isa = PBXBuildFile; fileRef = 22AF73BD1753E83700BE8398 /* msopus.c */; };
22AF73C01753F3E100BE8398 /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AF73BF1753F3E100BE8398 /* libopus.a */; };
22D07CD016F3BC5F009F2C9E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 22D07CB416F3BC5F009F2C9E /* InfoPlist.strings */; };
22D07CD116F3BC5F009F2C9E /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22D07CB616F3BC5F009F2C9E /* MainWindow.xib */; };
22D07CD216F3BC5F009F2C9E /* mediastreamViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 22D07CB816F3BC5F009F2C9E /* mediastreamViewController.xib */; };
22D07CD316F3BC5F009F2C9E /* mediastream-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22D07CBA16F3BC5F009F2C9E /* mediastream-Info.plist */; };
22D07CD416F3BC5F009F2C9E /* mediastreamAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 22D07CBD16F3BC5F009F2C9E /* mediastreamAppDelegate.m */; };
22D07CD516F3BC5F009F2C9E /* mediastreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22D07CBF16F3BC5F009F2C9E /* mediastreamViewController.m */; };
22D07CD616F3BC5F009F2C9E /* mediastream.c in Sources */ = {isa = PBXBuildFile; fileRef = 22D07CC016F3BC5F009F2C9E /* mediastream.c */; };
22D07CE516F3BFCB009F2C9E /* speexec.c in Sources */ = {isa = PBXBuildFile; fileRef = 22D07CE416F3BFCB009F2C9E /* speexec.c */; };
22DD19C113A8D7FA0018ECD4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22DD19C013A8D7FA0018ECD4 /* UIKit.framework */; };
22DD19C213A8D7FA0018ECD4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; };
22DD19C413A8D7FA0018ECD4 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22DD19C313A8D7FA0018ECD4 /* CoreGraphics.framework */; };
@ -777,6 +787,19 @@
22A10B5311F84E2D00373793 /* proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = proto.h; sourceTree = "<group>"; };
22A10B5411F84E2D00373793 /* toast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = toast.h; sourceTree = "<group>"; };
22A10B5511F84E2D00373793 /* unproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unproto.h; sourceTree = "<group>"; };
22AF73BD1753E83700BE8398 /* msopus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = msopus.c; sourceTree = "<group>"; };
22AF73BF1753F3E100BE8398 /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopus.a; path = "../liblinphone-sdk/apple-darwin/lib/libopus.a"; sourceTree = "<group>"; };
22D07CB516F3BC5F009F2C9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
22D07CB716F3BC5F009F2C9E /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow.xib; sourceTree = "<group>"; };
22D07CB916F3BC5F009F2C9E /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/mediastreamViewController.xib; sourceTree = "<group>"; };
22D07CBA16F3BC5F009F2C9E /* mediastream-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "mediastream-Info.plist"; sourceTree = "<group>"; };
22D07CBB16F3BC5F009F2C9E /* mediastream-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mediastream-Prefix.pch"; sourceTree = "<group>"; };
22D07CBC16F3BC5F009F2C9E /* mediastreamAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mediastreamAppDelegate.h; sourceTree = "<group>"; };
22D07CBD16F3BC5F009F2C9E /* mediastreamAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamAppDelegate.m; sourceTree = "<group>"; };
22D07CBE16F3BC5F009F2C9E /* mediastreamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mediastreamViewController.h; sourceTree = "<group>"; };
22D07CBF16F3BC5F009F2C9E /* mediastreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamViewController.m; sourceTree = "<group>"; };
22D07CC016F3BC5F009F2C9E /* mediastream.c */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; fileEncoding = 4; path = mediastream.c; sourceTree = "<group>"; };
22D07CE416F3BFCB009F2C9E /* speexec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = speexec.c; sourceTree = "<group>"; };
22DD19BE13A8D7FA0018ECD4 /* mediastream.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mediastream.app; sourceTree = BUILT_PRODUCTS_DIR; };
22DD19C013A8D7FA0018ECD4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
22DD19C313A8D7FA0018ECD4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
@ -834,6 +857,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
22AF73C01753F3E100BE8398 /* libopus.a in Frameworks */,
225D65CD1521C19A008B2E81 /* libortp.a in Frameworks */,
225D65CC1521C195008B2E81 /* libmediastreamer.a in Frameworks */,
2211DB9F14765CED00DEE054 /* libmssilk.a in Frameworks */,
@ -887,6 +911,7 @@
0867D691FE84028FC02AAC07 /* liblinphone */ = {
isa = PBXGroup;
children = (
22AF73BF1753F3E100BE8398 /* libopus.a */,
2211DBA0147660BB00DEE054 /* libSKP_SILK_SDK.a */,
2211DB9E14765CEC00DEE054 /* libmssilk.a */,
7066FC0913E830B800EFC6DC /* libvpx.a */,
@ -1171,6 +1196,9 @@
223CA7EF16D9268D00EF1BEC /* audiofilters */ = {
isa = PBXGroup;
children = (
22AF73BD1753E83700BE8398 /* msopus.c */,
0406A7651721FF79009FD24F /* aac-eld.c */,
22D07CE416F3BFCB009F2C9E /* speexec.c */,
223CA7F016D9268D00EF1BEC /* alaw.c */,
223CA7F216D9268D00EF1BEC /* aqsnd.c */,
223CA7F416D9268D00EF1BEC /* audiomixer.c */,
@ -1938,6 +1966,8 @@
223CA8D316D9268D00EF1BEC /* ringstream.c in Sources */,
223CA8D416D9268D00EF1BEC /* scaler.c in Sources */,
223CA8D716D9268D00EF1BEC /* videostream.c in Sources */,
22D07CE516F3BFCB009F2C9E /* speexec.c in Sources */,
22AF73BE1753E83700BE8398 /* msopus.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

@ -1 +1 @@
Subproject commit aae5ae888c24542bda99ecdef882f0fa0f607670
Subproject commit 6e3c6551a9cac6d231910420386e9666a0a30c0b