Merge remote-tracking branch 'origin' into bellesip

Conflicts:
	Makefile
	submodules/linphone
This commit is contained in:
Yann Diorcet 2013-03-08 16:02:07 +01:00
commit e24ec45fc6
5 changed files with 108 additions and 51 deletions

View file

@ -8,6 +8,7 @@ LINPHONE_VERSION=$(shell cd submodules/linphone && git describe)
LINPHONE_ANDROID_DEBUG_VERSION=$(shell git describe) LINPHONE_ANDROID_DEBUG_VERSION=$(shell git describe)
ANDROID_MOST_RECENT_TARGET=$(shell android list target -c | grep android | tail -n1) ANDROID_MOST_RECENT_TARGET=$(shell android list target -c | grep android | tail -n1)
NDK_DEBUG=0
BUILD_UPNP=1 BUILD_UPNP=1
BUILD_REMOTE_PROVISIONING=1 BUILD_REMOTE_PROVISIONING=1
BUILD_X264=0 BUILD_X264=0

View file

@ -58,7 +58,7 @@ ifeq ($(BUILD_G729),1)
APP_MODULES +=libbcg729 libmsbcg729 APP_MODULES +=libbcg729 libmsbcg729
endif endif
ifneq ($BUILD_WEBRTC_AECM), 0) ifneq ($(BUILD_WEBRTC_AECM), 0)
APP_MODULES += libwebrtc_system_wrappers libwebrtc_spl libwebrtc_apm_utility libwebrtc_aecm APP_MODULES += libwebrtc_system_wrappers libwebrtc_spl libwebrtc_apm_utility libwebrtc_aecm
APP_MODULES += libwebrtc_spl_neon libwebrtc_aecm_neon APP_MODULES += libwebrtc_spl_neon libwebrtc_aecm_neon
endif endif

View file

@ -2,14 +2,18 @@ package org.linphone;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import android.bluetooth.BluetoothAdapter; import android.annotation.TargetApi;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.media.AudioManager;
import android.os.Build;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class BluetoothManager extends BroadcastReceiver { public class BluetoothManager extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) { @SuppressWarnings("deprecation")
public void onReceive(Context context, Intent intent) {
boolean routeToBT = context.getResources().getBoolean(R.bool.route_audio_to_bluetooth_if_available); boolean routeToBT = context.getResources().getBoolean(R.bool.route_audio_to_bluetooth_if_available);
if (!routeToBT) if (!routeToBT)
return; return;
@ -17,22 +21,47 @@ public class BluetoothManager extends BroadcastReceiver {
String action = intent.getAction(); String action = intent.getAction();
LinphoneManager lm = LinphoneManager.getInstance(); LinphoneManager lm = LinphoneManager.getInstance();
String actionScoConnected = AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED;
if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
Log.e("Bluetooth Received Event" + " ACTION_ACL_DISCONNECTED" ); Log.e("Bluetooth Received Event" + " ACTION_ACL_DISCONNECTED" );
if (lm != null) { if (lm != null) {
lm.uninitBluetooth(); lm.isBluetoothScoConnected = false;
lm.scoDisconnected();
lm.routeAudioToReceiver(); lm.routeAudioToReceiver();
} }
} else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { }
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
Log.e("Bluetooth Received Event" + " ACTION_ACL_CONNECTED" ); Log.e("Bluetooth Received Event" + " ACTION_ACL_CONNECTED" );
if (lm != null) { if (lm != null) {
lm.routeToBluetoothIfAvailable(); lm.isBluetoothScoConnected = true;
lm.scoConnected();
} }
} else if (BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED.equals(action)) { }
Log.e("Bluetooth state changed!"); else if (actionScoConnected.equals(action)) {
if (lm != null) { int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, 0);
Log.e("Bluetooth sco state changed : " + state);
if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
if (lm != null) {
lm.isBluetoothScoConnected = true;
lm.scoConnected();
}
} else if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED) {
if (lm != null) {
lm.isBluetoothScoConnected = false;
lm.scoDisconnected();
lm.routeAudioToReceiver();
}
}
}
//Using real value instead of constant because not available before sdk 11
else if ("android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED".equals(action)) { //BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED
int currentConnState = intent.getIntExtra("android.bluetooth.adapter.extra.CONNECTION_STATE", //BluetoothAdapter.EXTRA_CONNECTION_STATE
0); //BluetoothAdapter.STATE_DISCONNECTED
Log.e("Bluetooth state changed: " + currentConnState);
if (lm != null && currentConnState == 2) { //BluetoothAdapter.STATE_CONNECTED
lm.isBluetoothScoConnected = true;
lm.startBluetooth(); lm.startBluetooth();
} }
} }

View file

@ -150,6 +150,8 @@ public final class LinphoneManager implements LinphoneCoreListener {
private BluetoothAdapter mBluetoothAdapter; private BluetoothAdapter mBluetoothAdapter;
private BluetoothHeadset mBluetoothHeadset; private BluetoothHeadset mBluetoothHeadset;
private BluetoothProfile.ServiceListener mProfileListener; private BluetoothProfile.ServiceListener mProfileListener;
private BroadcastReceiver bluetoothReiceiver = new BluetoothManager();
public boolean isBluetoothScoConnected;
private static List<LinphoneSimpleListener> simpleListeners = new ArrayList<LinphoneSimpleListener>(); private static List<LinphoneSimpleListener> simpleListeners = new ArrayList<LinphoneSimpleListener>();
public static void addListener(LinphoneSimpleListener listener) { public static void addListener(LinphoneSimpleListener listener) {
@ -204,14 +206,14 @@ public final class LinphoneManager implements LinphoneCoreListener {
boolean routeToBT = mServiceContext.getResources().getBoolean(R.bool.route_audio_to_bluetooth_if_available); boolean routeToBT = mServiceContext.getResources().getBoolean(R.bool.route_audio_to_bluetooth_if_available);
if (!routeToBT || (routeToBT && !routeToBluetoothIfAvailable())) { if (!routeToBT || (routeToBT && !routeToBluetoothIfAvailable())) {
mLc.enableSpeaker(false); mLc.enableSpeaker(false);
uninitBluetooth(); scoDisconnected();
} else { } else {
Log.d("Routing audio to bluetooth headset"); Log.d("Routing audio to bluetooth headset");
routeToBluetoothEnabled = true; routeToBluetoothEnabled = true;
} }
} else { } else {
mLc.enableSpeaker(true); mLc.enableSpeaker(true);
uninitBluetooth(); scoDisconnected();
} }
for (LinphoneOnAudioChangedListener listener : getSimpleListeners(LinphoneOnAudioChangedListener.class)) { for (LinphoneOnAudioChangedListener listener : getSimpleListeners(LinphoneOnAudioChangedListener.class)) {
@ -243,27 +245,40 @@ public final class LinphoneManager implements LinphoneCoreListener {
@TargetApi(Build.VERSION_CODES.HONEYCOMB) @TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void startBluetooth() { public void startBluetooth() {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (Version.sdkAboveOrEqual(Version.API11_HONEYCOMB_30) && mBluetoothAdapter.isEnabled()) { if (mBluetoothAdapter.isEnabled()) {
mProfileListener = new BluetoothProfile.ServiceListener() { if (Version.sdkAboveOrEqual(Version.API11_HONEYCOMB_30)) {
@TargetApi(Build.VERSION_CODES.HONEYCOMB) mProfileListener = new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) { @TargetApi(Build.VERSION_CODES.HONEYCOMB)
if (profile == BluetoothProfile.HEADSET) { public void onServiceConnected(int profile, BluetoothProfile proxy) {
mBluetoothHeadset = (BluetoothHeadset) proxy; if (profile == BluetoothProfile.HEADSET) {
Log.d("Bluetooth headset connected"); mBluetoothHeadset = (BluetoothHeadset) proxy;
routeToBluetoothIfAvailable(); Log.d("Bluetooth headset connected");
} routeToBluetoothIfAvailable();
} }
@TargetApi(Build.VERSION_CODES.HONEYCOMB) }
public void onServiceDisconnected(int profile) { @TargetApi(Build.VERSION_CODES.HONEYCOMB)
if (profile == BluetoothProfile.HEADSET) { public void onServiceDisconnected(int profile) {
mBluetoothHeadset = null; if (profile == BluetoothProfile.HEADSET) {
Log.d("Bluetooth headset disconnected"); mBluetoothHeadset = null;
routeAudioToReceiver(); Log.d("Bluetooth headset disconnected");
} routeAudioToReceiver();
} }
}; }
mBluetoothAdapter.getProfileProxy(mServiceContext, mProfileListener, BluetoothProfile.HEADSET); };
} else { mBluetoothAdapter.getProfileProxy(mServiceContext, mProfileListener, BluetoothProfile.HEADSET);
} else {
@SuppressWarnings("deprecation")
String actionScoConnected = AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED;
Intent currentValue = mServiceContext.registerReceiver(bluetoothReiceiver, new IntentFilter(actionScoConnected));
int state = currentValue == null ? 0 : currentValue.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, 0);
if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
isBluetoothScoConnected = true;
scoConnected();
}
}
}
else {
scoDisconnected();
routeAudioToReceiver(); routeAudioToReceiver();
} }
} }
@ -271,30 +286,42 @@ public final class LinphoneManager implements LinphoneCoreListener {
@TargetApi(Build.VERSION_CODES.HONEYCOMB) @TargetApi(Build.VERSION_CODES.HONEYCOMB)
public boolean routeToBluetoothIfAvailable() { public boolean routeToBluetoothIfAvailable() {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (Version.sdkAboveOrEqual(Version.API11_HONEYCOMB_30) && mBluetoothAdapter.isEnabled() && mAudioManager.isBluetoothScoAvailableOffCall()) { if (mBluetoothAdapter.isEnabled() && mAudioManager.isBluetoothScoAvailableOffCall()) {
mAudioManager.setBluetoothScoOn(true); mAudioManager.setBluetoothScoOn(true);
mAudioManager.startBluetoothSco(); mAudioManager.startBluetoothSco();
boolean connected = false; if (Version.sdkAboveOrEqual(Version.API11_HONEYCOMB_30)) {
if (mBluetoothHeadset != null) { boolean connected = false;
List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices(); if (mBluetoothHeadset != null) {
for (final BluetoothDevice dev : devices) { List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices();
connected |= mBluetoothHeadset.getConnectionState(dev) == BluetoothHeadset.STATE_CONNECTED; for (final BluetoothDevice dev : devices) {
connected |= mBluetoothHeadset.getConnectionState(dev) == BluetoothHeadset.STATE_CONNECTED;
}
} }
}
if (!connected) { if (!connected) {
Log.d("No bluetooth device available"); Log.d("No bluetooth device available");
uninitBluetooth(); scoDisconnected();
}
return connected;
} else {
return isBluetoothScoConnected;
} }
return connected;
} }
return false; return false;
} }
@TargetApi(Build.VERSION_CODES.HONEYCOMB) public void scoConnected() {
public void uninitBluetooth() { Log.e("Bluetooth sco connected!");
if (Version.sdkAboveOrEqual(Version.API11_HONEYCOMB_30) && mAudioManager != null) { mAudioManager.setMode(AudioManager.MODE_IN_CALL);
routeToBluetoothIfAvailable();
}
public void scoDisconnected() {
Log.e("Bluetooth sco disconnected!");
if (mAudioManager != null) {
mAudioManager.setMode(AudioManager.MODE_NORMAL);
mAudioManager.stopBluetoothSco(); mAudioManager.stopBluetoothSco();
mAudioManager.setBluetoothScoOn(false); mAudioManager.setBluetoothScoOn(false);
} }

@ -1 +1 @@
Subproject commit 5d79ed6fc0a5568038a952875b7a6d9dfce4f0d1 Subproject commit 7c9b370b9db37e1c559c678b6b8ae958e192be92