Merge change 8984

* changes:
  Fix issue 2019031: Volume changes have no effect.
This commit is contained in:
Android (Google) Code Review
2009-07-29 09:37:14 -07:00
3 changed files with 117 additions and 18 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -60,4 +60,12 @@ interface IAudioService {
oneway void unloadSoundEffects();
oneway void reloadAudioSettings();
void setSpeakerphoneOn(boolean on);
boolean isSpeakerphoneOn();
void setBluetoothScoOn(boolean on);
boolean isBluetoothScoOn();
}