diff options
| -rw-r--r-- | media/java/android/media/AudioManager.java | 34 | ||||
| -rw-r--r-- | media/java/android/media/AudioService.java | 93 | ||||
| -rw-r--r-- | media/java/android/media/IAudioService.aidl | 8 |
3 files changed, 117 insertions, 18 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 040d4bc65758..60fc0e048b0d 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -649,10 +649,11 @@ public class AudioManager { * <var>false</var> to turn it off */ public void setSpeakerphoneOn(boolean on){ - if (on) { - AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_SPEAKER); - } else { - AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_NONE); + IAudioService service = getService(); + try { + service.setSpeakerphoneOn(on); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in setSpeakerphoneOn", e); } } @@ -662,9 +663,11 @@ public class AudioManager { * @return true if speakerphone is on, false if it's off */ public boolean isSpeakerphoneOn() { - if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION) == AudioSystem.FORCE_SPEAKER) { - return true; - } else { + IAudioService service = getService(); + try { + return service.isSpeakerphoneOn(); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in isSpeakerphoneOn", e); return false; } } @@ -676,10 +679,11 @@ public class AudioManager { * <var>false</var> to not use bluetooth SCO for communications */ public void setBluetoothScoOn(boolean on){ - if (on) { - AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_BT_SCO); - } else { - AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_NONE); + IAudioService service = getService(); + try { + service.setBluetoothScoOn(on); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in setBluetoothScoOn", e); } } @@ -690,9 +694,11 @@ public class AudioManager { * false if otherwise */ public boolean isBluetoothScoOn() { - if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION) == AudioSystem.FORCE_BT_SCO) { - return true; - } else { + IAudioService service = getService(); + try { + return service.isBluetoothScoOn(); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in isBluetoothScoOn", e); return false; } } diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 30640c308d7b..1f9e3afd9038 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -47,7 +47,10 @@ import com.android.internal.telephony.ITelephony; import java.io.IOException; import java.util.ArrayList; - +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; /** * The implementation of the volume manager service. @@ -210,6 +213,12 @@ public class AudioService extends IAudioService.Stub { private int mHeadsetState; + // Devices currently connected + private HashMap <Integer, String> mConnectedDevices = new HashMap <Integer, String>(); + + // Forced device usage for communications + private int mForcedUseForComm; + /////////////////////////////////////////////////////////////////////////// // Construction /////////////////////////////////////////////////////////////////////////// @@ -220,7 +229,9 @@ public class AudioService extends IAudioService.Stub { mContentResolver = context.getContentResolver(); mVolumePanel = new VolumePanel(context, this); mSettingsObserver = new SettingsObserver(); - + mMode = AudioSystem.MODE_NORMAL; + mHeadsetState = 0; + mForcedUseForComm = AudioSystem.FORCE_NONE; createAudioSystemThread(); readPersistedSettings(); createStreamStates(); @@ -721,6 +732,46 @@ public class AudioService extends IAudioService.Stub { setRingerModeInt(getRingerMode(), false); } + /** @see AudioManager#setSpeakerphoneOn() */ + public void setSpeakerphoneOn(boolean on){ + if (on) { + AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_SPEAKER); + mForcedUseForComm = AudioSystem.FORCE_SPEAKER; + } else { + AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_NONE); + mForcedUseForComm = AudioSystem.FORCE_NONE; + } + } + + /** @see AudioManager#isSpeakerphoneOn() */ + public boolean isSpeakerphoneOn() { + if (mForcedUseForComm == AudioSystem.FORCE_SPEAKER) { + return true; + } else { + return false; + } + } + + /** @see AudioManager#setBluetoothScoOn() */ + public void setBluetoothScoOn(boolean on){ + if (on) { + AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_BT_SCO); + mForcedUseForComm = AudioSystem.FORCE_BT_SCO; + } else { + AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_NONE); + mForcedUseForComm = AudioSystem.FORCE_NONE; + } + } + + /** @see AudioManager#isBluetoothScoOn() */ + public boolean isBluetoothScoOn() { + if (mForcedUseForComm == AudioSystem.FORCE_BT_SCO) { + return true; + } else { + return false; + } + } + /////////////////////////////////////////////////////////////////////////// // Internal methods /////////////////////////////////////////////////////////////////////////// @@ -1188,16 +1239,33 @@ public class AudioService extends IAudioService.Stub { Log.e(TAG, "Media server died."); // Force creation of new IAudioflinger interface mMediaServerOk = false; - AudioSystem.getMode(); + AudioSystem.isMusicActive(); break; case MSG_MEDIA_SERVER_STARTED: Log.e(TAG, "Media server started."); + // Restore device connection states + Set set = mConnectedDevices.entrySet(); + Iterator i = set.iterator(); + while(i.hasNext()){ + Map.Entry device = (Map.Entry)i.next(); + AudioSystem.setDeviceConnectionState(((Integer)device.getKey()).intValue(), + AudioSystem.DEVICE_STATE_AVAILABLE, + (String)device.getValue()); + } + + // Restore call state + AudioSystem.setPhoneState(mMode); + + // Restore forced usage for communcations + AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, mForcedUseForComm); + // Restore stream volumes int numStreamTypes = AudioSystem.getNumStreamTypes(); for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { int index; VolumeStreamState streamState = mStreamStates[streamType]; + AudioSystem.initStreamVolume(streamType, 0, (streamState.mIndexMax + 5) / 10); if (streamState.muteCount() == 0) { index = streamState.mIndex; } else { @@ -1205,7 +1273,10 @@ public class AudioService extends IAudioService.Stub { } setStreamVolumeIndex(streamType, index); } - setRingerMode(mRingerMode); + + // Restore ringer mode + setRingerModeInt(getRingerMode(), false); + mMediaServerOk = true; break; @@ -1276,10 +1347,12 @@ public class AudioService extends IAudioService.Stub { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, AudioSystem.DEVICE_STATE_UNAVAILABLE, address); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); } else if (state == BluetoothA2dp.STATE_CONNECTED){ AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, AudioSystem.DEVICE_STATE_AVAILABLE, address); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP), address); } } else if (action.equals(BluetoothIntent.HEADSET_AUDIO_STATE_CHANGED_ACTION)) { int state = intent.getIntExtra(BluetoothIntent.HEADSET_AUDIO_STATE, @@ -1289,10 +1362,12 @@ public class AudioService extends IAudioService.Stub { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_SCO, AudioSystem.DEVICE_STATE_UNAVAILABLE, address); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_SCO); } else if (state == BluetoothHeadset.AUDIO_STATE_CONNECTED) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_SCO, AudioSystem.DEVICE_STATE_AVAILABLE, address); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_BLUETOOTH_SCO), address); } } else if (action.equals(Intent.ACTION_HEADSET_PLUG)) { int state = intent.getIntExtra("state", 0); @@ -1301,55 +1376,65 @@ public class AudioService extends IAudioService.Stub { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADSET, AudioSystem.DEVICE_STATE_UNAVAILABLE, ""); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_WIRED_HEADSET); } else if ((state & BIT_HEADSET) != 0 && (mHeadsetState & BIT_HEADSET) == 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADSET, AudioSystem.DEVICE_STATE_AVAILABLE, ""); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_WIRED_HEADSET), ""); } if ((state & BIT_HEADSET_NO_MIC) == 0 && (mHeadsetState & BIT_HEADSET_NO_MIC) != 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, AudioSystem.DEVICE_STATE_UNAVAILABLE, ""); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE); } else if ((state & BIT_HEADSET_NO_MIC) != 0 && (mHeadsetState & BIT_HEADSET_NO_MIC) == 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, AudioSystem.DEVICE_STATE_AVAILABLE, ""); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE), ""); } if ((state & BIT_TTY) == 0 && (mHeadsetState & BIT_TTY) != 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_TTY, AudioSystem.DEVICE_STATE_UNAVAILABLE, ""); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_TTY); } else if ((state & BIT_TTY) != 0 && (mHeadsetState & BIT_TTY) == 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_TTY, AudioSystem.DEVICE_STATE_AVAILABLE, ""); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_TTY), ""); } if ((state & BIT_FM_HEADSET) == 0 && (mHeadsetState & BIT_FM_HEADSET) != 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_FM_HEADPHONE, AudioSystem.DEVICE_STATE_UNAVAILABLE, ""); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_FM_HEADPHONE); } else if ((state & BIT_FM_HEADSET) != 0 && (mHeadsetState & BIT_FM_HEADSET) == 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_FM_HEADPHONE, AudioSystem.DEVICE_STATE_AVAILABLE, ""); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_FM_HEADPHONE), ""); } if ((state & BIT_FM_SPEAKER) == 0 && (mHeadsetState & BIT_FM_SPEAKER) != 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_FM_SPEAKER, AudioSystem.DEVICE_STATE_UNAVAILABLE, ""); + mConnectedDevices.remove(AudioSystem.DEVICE_OUT_FM_SPEAKER); } else if ((state & BIT_FM_SPEAKER) != 0 && (mHeadsetState & BIT_FM_SPEAKER) == 0) { AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_FM_SPEAKER, AudioSystem.DEVICE_STATE_AVAILABLE, ""); + mConnectedDevices.put( new Integer(AudioSystem.DEVICE_OUT_FM_SPEAKER), ""); } mHeadsetState = state; } diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index bb4252b3a2e9..d3d2d29ece8d 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -60,4 +60,12 @@ interface IAudioService { oneway void unloadSoundEffects(); oneway void reloadAudioSettings(); + + void setSpeakerphoneOn(boolean on); + + boolean isSpeakerphoneOn(); + + void setBluetoothScoOn(boolean on); + + boolean isBluetoothScoOn(); } |