diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml index 84ba4485b..88551ea41 100644 --- a/res/values/non_localizable_strings.xml +++ b/res/values/non_localizable_strings.xml @@ -1,6 +1,9 @@ + pref_audio_use_specific_mode_key + pref_audio_hacks_use_galaxys_hack_key + pref_audio_hacks_use_routing_api_key pref_audio_soft_volume_key pref_ipv6_key diff --git a/res/values/strings.xml b/res/values/strings.xml index adc83a94c..dd5edf359 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,6 +1,12 @@ + Audio hacks + Use specific mode hack + 0=MODE_NORMAL (default), 2=MODE_IN_CALL + Use routing API hack + Use Galaxy S audio hack + Use software volume Use ipv6 instead of ipv4 diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 028666276..b468f3ed4 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -135,6 +135,18 @@ + + + + + + diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 49d2b8bdd..bf64c59a9 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone; +import static android.media.AudioManager.ROUTE_EARPIECE; import static android.media.AudioManager.MODE_IN_CALL; import static android.media.AudioManager.MODE_NORMAL; import static android.media.AudioManager.MODE_RINGTONE; @@ -111,6 +112,7 @@ public final class LinphoneManager implements LinphoneCoreListener { private LinphoneCore mLc; private int mPhoneOrientation; private static Transports initialTransports; + private static LinphonePreferenceManager lpm = LinphonePreferenceManager.getInstance(); @@ -171,14 +173,38 @@ public final class LinphoneManager implements LinphoneCoreListener { private boolean hasCamera; + private synchronized void routeAudioToSpeakerHelper(boolean speakerOn) { + LinphoneCall call = mLc.getCurrentCall(); + boolean paused = false; + if (call != null && call.getState() == State.StreamsRunning && Hacks.needPausingCallForSpeakers()) { + Log.d(TAG, "Hack pausing call to have speaker="+speakerOn); + mLc.pauseCall(call); + paused = true; + } + + if (Hacks.needGalaxySAudioHack() || lpm.useGalaxySHack()) + setAudioModeIncallForGalaxyS(); + + if (lpm.useSpecificAudioModeHack() != -1) + mAudioManager.setMode(lpm.useSpecificAudioModeHack()); + + if (Hacks.needRoutingAPI() || lpm.useAudioRoutingAPIHack()) { + mAudioManager.setRouting( + MODE_NORMAL, + speakerOn? ROUTE_SPEAKER : ROUTE_EARPIECE, + AudioManager.ROUTE_ALL); + } else { + mAudioManager.setSpeakerphoneOn(speakerOn); + } + + if (paused) { + Log.d(TAG, "Hack resuming call to have speaker="+speakerOn); + mLc.resumeCall(call); + } + } public void routeAudioToSpeaker() { - if (Integer.parseInt(Build.VERSION.SDK) <= 4 /*