diff --git a/Classes/AdvancedPhoneViewController.m b/Classes/AdvancedPhoneViewController.m
index 40801743b..9f5c3f633 100644
--- a/Classes/AdvancedPhoneViewController.m
+++ b/Classes/AdvancedPhoneViewController.m
@@ -51,6 +51,8 @@
}
-(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName {
+ [self presentModalViewController:mIncallViewController animated:true];
+
[super displayIncallFromUI:viewCtrl
forUser:username
withDisplayName:displayName];
@@ -65,6 +67,12 @@
[mIncallViewController displayStatus:message];
}
+-(void) updateUIFromLinphoneState:(UIViewController*) viewCtrl {
+ [super updateUIFromLinphoneState:viewCtrl];
+
+ [mIncallViewController updateUIFromLinphoneState:viewCtrl];
+}
+
- (void)dealloc {
[mIncallViewController release];
[super dealloc];
diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h
index 51d0869f9..fd783733e 100644
--- a/Classes/IncallViewController.h
+++ b/Classes/IncallViewController.h
@@ -35,6 +35,7 @@
UIHangUpButton* endCtrl;
UIButton* dialer;
UIMuteButton* mute;
+ UIPauseResumeButton* pause;
UISpeakerButton* speaker;
UIButton* contacts;
@@ -74,6 +75,7 @@
@property (nonatomic, retain) IBOutlet UIButton* endCtrl;
@property (nonatomic, retain) IBOutlet UIButton* dialer;
@property (nonatomic, retain) IBOutlet UIButton* mute;
+@property (nonatomic, retain) IBOutlet UIButton* pause;
@property (nonatomic, retain) IBOutlet UIButton* speaker;
@property (nonatomic, retain) IBOutlet UIButton* contacts;
diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m
index ba06c0292..c3a7464e9 100644
--- a/Classes/IncallViewController.m
+++ b/Classes/IncallViewController.m
@@ -35,6 +35,7 @@
@synthesize endCtrl;
@synthesize close;
@synthesize mute;
+@synthesize pause;
@synthesize dialer;
@synthesize speaker;
@synthesize contacts;
@@ -70,6 +71,7 @@
[super viewDidLoad];
//Controls
[mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ];
+ [pause initWithOnImage:[UIImage imageNamed:@"resumecall.png"] offImage:[UIImage imageNamed:@"pausecall.png"] ];
[speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ];
@@ -127,6 +129,11 @@
[callDuration stop];
[self dismissModalViewControllerAnimated:true];
}
+-(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl {
+ [mute reset];
+ [pause reset];
+}
+
- (IBAction)doAction:(id)sender {
if (sender == dialer) {
diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib
index 74b79c19f..a2b4e804e 100644
--- a/Classes/IncallViewController.xib
+++ b/Classes/IncallViewController.xib
@@ -2,30 +2,29 @@
784
- 10J567
- 823
- 1038.35
- 462.00
+ 11C74
+ 1938
+ 1138.23
+ 567.00
-
diff --git a/Classes/LinphoneUI/LinphoneManager.h b/Classes/LinphoneUI/LinphoneManager.h
index a80e91b44..be7984827 100644
--- a/Classes/LinphoneUI/LinphoneManager.h
+++ b/Classes/LinphoneUI/LinphoneManager.h
@@ -18,6 +18,7 @@
*/
#import
+#import
#import
#include "linphonecore.h"
#import "LogView.h"
@@ -28,7 +29,7 @@ typedef enum _Connectivity {
,none
} Connectivity;
@class FastAddressBook;
-@interface LinphoneManager : NSObject {
+@interface LinphoneManager : NSObject {
@private
SCNetworkReachabilityContext proxyReachabilityContext;
SCNetworkReachabilityRef proxyReachability;
diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m
index 7a3545fee..c382fcd8a 100644
--- a/Classes/LinphoneUI/LinphoneManager.m
+++ b/Classes/LinphoneUI/LinphoneManager.m
@@ -35,12 +35,17 @@ extern void libmsilbc_init();
#ifdef HAVE_AMR
extern void libmsamr_init();
#endif
+
#ifdef HAVE_X264
extern void libmsx264_init();
#endif
#define FRONT_CAM_NAME "AV Capture: Front Camera"
#define BACK_CAM_NAME "AV Capture: Back Camera"
+#if defined (HAVE_SILK)
+extern void libmssilk_init();
+#endif
+
@implementation LinphoneManager
@synthesize callDelegate;
@synthesize registrationDelegate;
@@ -151,9 +156,11 @@ extern void libmsx264_init();
break;
case LinphoneCallConnected:
- [callDelegate displayIncallFromUI:mCurrentViewController
+ if (linphone_call_get_dir(currentCall)==LinphoneCallIncoming){
+ [callDelegate displayIncallFromUI:mCurrentViewController
forUser:lUserName
withDisplayName:lDisplayName];
+ }
break;
case LinphoneCallError: {
@@ -524,6 +531,8 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
{
ms_message("SPEEX codecs deactivated");
}
+ [self configurePayloadType:"SILK" fromPrefKey:@"silk_24k_preference" withRate:24000];
+ [self configurePayloadType:"SILK" fromPrefKey:@"silk_16k_preference" withRate:16000];
[self configurePayloadType:"AMR" fromPrefKey:@"amr_8k_preference" withRate:8000];
[self configurePayloadType:"GSM" fromPrefKey:@"gsm_8k_preference" withRate:8000];
[self configurePayloadType:"iLBC" fromPrefKey:@"ilbc_preference" withRate:8000];
@@ -709,7 +718,9 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
}
libmsilbc_init();
-
+#if defined (HAVE_SILK)
+ libmssilk_init();
+#endif
#ifdef HAVE_AMR
libmsamr_init(); //load amr plugin if present from the liblinphone sdk
#endif
@@ -751,6 +762,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
//init audio session
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
BOOL bAudioInputAvailable= [audioSession inputIsAvailable];
+ [audioSession setDelegate:self];
if(!bAudioInputAvailable){
UIAlertView* error = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No microphone",nil)
@@ -823,5 +835,25 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
mLogView = view;
}
+-(void) beginInterruption {
+ LinphoneCall* c = linphone_core_get_current_call(theLinphoneCore);
+ ms_message("Sound interruption detected!");
+ if (c) {
+ linphone_core_pause_call(theLinphoneCore, c);
+ }
+}
+
+-(void) endInterruption {
+ ms_message("Sound interruption ended!");
+ const MSList* c = linphone_core_get_calls(theLinphoneCore);
+
+ if (c) {
+ ms_message("Auto resuming call");
+ linphone_core_resume_call(theLinphoneCore, (LinphoneCall*) c->data);
+ }
+
+ [callDelegate updateUIFromLinphoneState:mCurrentViewController];
+}
+
@end
diff --git a/Classes/LinphoneUI/LinphoneUIDelegates.h b/Classes/LinphoneUI/LinphoneUIDelegates.h
index 459bb1fa8..96cdf0775 100644
--- a/Classes/LinphoneUI/LinphoneUIDelegates.h
+++ b/Classes/LinphoneUI/LinphoneUIDelegates.h
@@ -26,6 +26,7 @@
-(void) displayIncomingCallNotigicationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName;
-(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName;
-(void) displayVideoCallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName;
+-(void) updateUIFromLinphoneState:(UIViewController*) viewCtrl;
//status reporting
-(void) displayStatus:(NSString*) message;
@end
diff --git a/Classes/LinphoneUI/UILinphone.h b/Classes/LinphoneUI/UILinphone.h
index 4a0349580..a65b21951 100644
--- a/Classes/LinphoneUI/UILinphone.h
+++ b/Classes/LinphoneUI/UILinphone.h
@@ -27,3 +27,4 @@
#import "UIEraseButton.h"
#import "LinphoneUIDelegates.h"
#import "UICamSwitch.h"
+#import "UIPauseResumeButton.h"
diff --git a/Classes/LinphoneUI/UIPauseResumeButton.h b/Classes/LinphoneUI/UIPauseResumeButton.h
new file mode 100644
index 000000000..fe5a80e30
--- /dev/null
+++ b/Classes/LinphoneUI/UIPauseResumeButton.h
@@ -0,0 +1,28 @@
+/* UIMuteButton.h
+ *
+ * Copyright (C) 2011 Belledonne Comunications, 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.
+ */
+
+#import
+#import "UIToggleButton.h"
+
+
+@interface UIPauseResumeButton : UIToggleButton {
+
+}
+
+@end
diff --git a/Classes/LinphoneUI/UIPauseResumeButton.m b/Classes/LinphoneUI/UIPauseResumeButton.m
new file mode 100644
index 000000000..9cd47f8ac
--- /dev/null
+++ b/Classes/LinphoneUI/UIPauseResumeButton.m
@@ -0,0 +1,69 @@
+/* UIMuteButton.m
+ *
+ * Copyright (C) 2011 Belledonne Comunications, 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.
+ */
+#import "UIPauseResumeButton.h"
+#include "LinphoneManager.h"
+
+
+@implementation UIPauseResumeButton
+
+
+
+-(void) onOn {
+ LinphoneCall* c = linphone_core_get_current_call([LinphoneManager getLc]);
+ if (c) {
+ linphone_core_pause_call([LinphoneManager getLc], c);
+ }
+}
+-(void) onOff {
+ const MSList* c = linphone_core_get_calls([LinphoneManager getLc]);
+ if (c) {
+ linphone_core_resume_call([LinphoneManager getLc], (LinphoneCall*) c->data);
+ }
+}
+-(bool) isInitialStateOn {
+ @try {
+ const MSList* c = linphone_core_get_calls([LinphoneManager getLc]);
+
+ if (c) {
+ return linphone_call_get_state((LinphoneCall*)c->data) == LinphoneCallPaused;
+ } else {
+
+ return false;
+ }
+ } @catch(NSException* e) {
+ //not ready yet
+ return false;
+ }
+
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+ // Drawing code.
+}
+*/
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+
+@end
diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m
index ac68f3042..c55ab2b9e 100644
--- a/Classes/PhoneViewController.m
+++ b/Classes/PhoneViewController.m
@@ -259,6 +259,10 @@
[status setText:message];
}
+-(void) updateUIFromLinphoneState:(UIViewController*) viewCtrl {
+ [mute reset];
+}
+
-(void) displayIncomingCallNotigicationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName {
diff --git a/linphonerc b/linphonerc
index 5b9d49c56..26be7bee4 100644
--- a/linphonerc
+++ b/linphonerc
@@ -31,6 +31,7 @@ echocancellation=0
[misc]
history_max_size=30
+max_calls=1
[video]
display=1
@@ -38,3 +39,5 @@ capture=1
show_local=0
enabled=1
size=ios-medium
+
+
diff --git a/submodules/build/builder-iphone-os.mk b/submodules/build/builder-iphone-os.mk
index 6bbe1fbc8..816809d7f 100644
--- a/submodules/build/builder-iphone-os.mk
+++ b/submodules/build/builder-iphone-os.mk
@@ -47,6 +47,7 @@ linphone_configure_controls= \
SPEEX_LIBS="-L$(prefix)/lib -lspeexdsp -lspeex " \
OPENSSL_CFLAGS="-I$(prefix)/include" \
OPENSSL_LIBS="-L$(prefix)/lib -lssl -lcrypto"
+ MSSILK_CFLAGS="-I$(prefix)/include/silk"
ifeq ($(enable_zrtp),yes)
linphone_configure_controls+= --with-srtp=$(prefix) --enable-zrtp=yes --disable-tests
endif
@@ -96,13 +97,14 @@ init:
veryclean: veryclean-linphone
rm -rf $(BUILDER_BUILD_DIR)
-.NOTPARALLEL build-linphone: init build-openssl build-srtp build-zrtpcpp build-osip2 build-eXosip2 build-speex build-libgsm build-ffmpeg build-libvpx $(LINPHONE_BUILD_DIR)/Makefile
+
+.NOTPARALLEL build-linphone: init build-openssl build-srtp build-zrtpcpp build-osip2 build-eXosip2 build-speex build-libgsm buils-silk build-ffmpeg build-libvpx $(LINPHONE_BUILD_DIR)/Makefile
cd $(LINPHONE_BUILD_DIR) && export PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig export CONFIG_SITE=$(BUILDER_SRC_DIR)/build/$(config_site) make newdate && make && make install
-clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-srtp clean-zrtpcpp clean-msilbc clean-libilbc clean-openssl clean-msamr clean-ffmpeg clean-libvpx clean-msx264
+clean-linphone: clean-osip2 clean-eXosip2 clean-speex clean-libgsm clean-srtp clean-zrtpcpp clean-msilbc clean-libilbc clean-openssl clean-msamr clean-silk clean-ffmpeg clean-libvpx clean-msx264
cd $(LINPHONE_BUILD_DIR) && make clean
-veryclean-linphone: veryclean-osip2 veryclean-eXosip2 veryclean-speex veryclean-srtp veryclean-zrtpcpp veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr veryclean-msx264
+veryclean-linphone: veryclean-osip2 veryclean-eXosip2 veryclean-speex veryclean-srtp veryclean-zrtpcpp veryclean-libgsm veryclean-msilbc veryclean-libilbc veryclean-openssl veryclean-msamr veryclean-silk veryclean-msx264
#-cd $(LINPHONE_BUILD_DIR) && make distclean
-cd $(LINPHONE_SRC_DIR) && rm -f configure
@@ -295,7 +297,7 @@ multi-arch:
if test -f "$$i386_path"; then \
echo "Mixing $$archive and $$i386_path into $$destpath"; \
mkdir -p `dirname $$destpath` ; \
- lipo -create $$archive $$armv7_path $$i386_path -output $$destpath; \
+ lipo -create -arch armv6 $$archive -arch armv7 $$armv7_path -arch i386 $$i386_path -output $$destpath; \
else \
echo "WARNING: archive `basename $$archive` exists in arm tree but does not exists in i386 tree."; \
fi \
diff --git a/submodules/build/builders.d/silk.mk b/submodules/build/builders.d/silk.mk
index 5e848ab79..8bc9599fd 100644
--- a/submodules/build/builders.d/silk.mk
+++ b/submodules/build/builders.d/silk.mk
@@ -23,13 +23,12 @@
SILK_BUILD_DIR?=$(BUILDER_BUILD_DIR)/externals/silk
ifneq (,$(findstring i386,$(host)))
- make_options := TARGET_MTUNE=i386 TARGET_ARCH=i386
-endif
-ifneq (,$(findstring armv6,$(host)))
- make_options := TARGET_ARCH="-arch armv6"
+ src := SILK_SDK_SRC_v1.0.8/SILK_SDK_SRC_FIX_v1.0.8
+else
+ src := SILK_SDK_SRC_v1.0.8/SILK_SDK_SRC_ARM_v1.0.8
endif
ifneq (,$(findstring armv7,$(host)))
- make_options := USE_NEON=yes TARGET_ARCH="armv7 -mno-thumb"
+ make_options := USE_NEON=yes
endif
$(SILK_BUILD_DIR)/Makefile:
@@ -39,12 +38,12 @@ $(SILK_BUILD_DIR)/Makefile:
&& wget http://developer.skype.com/silk/SILK_SDK_SRC_v1.0.8.zip \
&& unzip SILK_SDK_SRC_v1.0.8.zip \
&& rm -f SILK_SDK_SRC_v1.0.8.zip \
- && mv SILK_SDK_SRC_v1.0.8/SILK_SDK_SRC_ARM_v1.0.8 silk \
+ && mv ${src} silk \
&& rm -rf SILK_SDK_SRC_v1.0.8
build-silk: $(SILK_BUILD_DIR)/Makefile
cd $(SILK_BUILD_DIR) && host_alias=${host} . $(BUILDER_SRC_DIR)/build/$(config_site) \
- && make all TOOLCHAIN_PREFIX=$$SDK_BIN_PATH/ $(make_options) ADDED_DEFINES+=IPHONE \
+ && make -j1 all TOOLCHAIN_PREFIX=$$SDK_BIN_PATH/ CXX="$$CXX" CC="$$CC -mno-thumb -g" LD="$$LD" $(make_options) ADDED_DEFINES+=IPHONE \
&& mkdir -p $(prefix)/include/silk \
&& cp -f $(SILK_BUILD_DIR)/interface/* $(prefix)/include/silk \
&& cp -f lib*.a $(prefix)/lib