am 273d2ea3: Merge "Fix setting audio group mode in SipPhone." into gingerbread

* commit '273d2ea3f986f1611d2cf303cc5b93f820c14dd3':
  Fix setting audio group mode in SipPhone.
This commit is contained in:
Hung-ying Tyan
2011-01-04 17:47:47 -08:00
committed by Android Git Automerger

View File

@@ -17,6 +17,7 @@
package com.android.internal.telephony.sip; package com.android.internal.telephony.sip;
import android.content.Context; import android.content.Context;
import android.media.AudioManager;
import android.net.rtp.AudioGroup; import android.net.rtp.AudioGroup;
import android.net.sip.SipAudioCall; import android.net.sip.SipAudioCall;
import android.net.sip.SipErrorCode; import android.net.sip.SipErrorCode;
@@ -126,7 +127,7 @@ public class SipPhone extends SipPhoneBase {
(ringingCall.getState() == Call.State.WAITING)) { (ringingCall.getState() == Call.State.WAITING)) {
if (DEBUG) Log.d(LOG_TAG, "acceptCall"); if (DEBUG) Log.d(LOG_TAG, "acceptCall");
// Always unmute when answering a new call // Always unmute when answering a new call
setMute(false); ringingCall.setMute(false);
ringingCall.acceptCall(); ringingCall.acceptCall();
} else { } else {
throw new CallStateException("phone not ringing"); throw new CallStateException("phone not ringing");
@@ -170,7 +171,7 @@ public class SipPhone extends SipPhoneBase {
throw new CallStateException("cannot dial in current state"); throw new CallStateException("cannot dial in current state");
} }
setMute(false); foregroundCall.setMute(false);
try { try {
Connection c = foregroundCall.dial(dialString); Connection c = foregroundCall.dial(dialString);
return c; return c;
@@ -288,16 +289,13 @@ public class SipPhone extends SipPhoneBase {
@Override @Override
public void setEchoSuppressionEnabled(boolean enabled) { public void setEchoSuppressionEnabled(boolean enabled) {
// TODO: Remove the enabled argument. We should check the speakerphone
// state with AudioManager instead of keeping a state here so the
// method with a state argument is redundant. Also rename the method
// to something like onSpeaerphoneStateChanged(). Echo suppression may
// not be available on every device.
synchronized (SipPhone.class) { synchronized (SipPhone.class) {
AudioGroup audioGroup = foregroundCall.getAudioGroup(); foregroundCall.setAudioGroupMode();
if (audioGroup == null) return;
int mode = audioGroup.getMode();
audioGroup.setMode(enabled
? AudioGroup.MODE_ECHO_SUPPRESSION
: AudioGroup.MODE_NORMAL);
if (DEBUG) Log.d(LOG_TAG, String.format(
"audioGroup mode change: %d --> %d", mode,
audioGroup.getMode()));
} }
} }
@@ -450,13 +448,33 @@ public class SipPhone extends SipPhoneBase {
((SipConnection) connections.get(0)).acceptCall(); ((SipConnection) connections.get(0)).acceptCall();
} }
private boolean isSpeakerOn() {
return ((AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE))
.isSpeakerphoneOn();
}
void setAudioGroupMode() {
AudioGroup audioGroup = getAudioGroup();
if (audioGroup == null) return;
int mode = audioGroup.getMode();
if (state == State.HOLDING) {
audioGroup.setMode(AudioGroup.MODE_ON_HOLD);
} else if (getMute()) {
audioGroup.setMode(AudioGroup.MODE_MUTED);
} else if (isSpeakerOn()) {
audioGroup.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);
} else {
audioGroup.setMode(AudioGroup.MODE_NORMAL);
}
if (DEBUG) Log.d(LOG_TAG, String.format(
"audioGroup mode change: %d --> %d", mode,
audioGroup.getMode()));
}
void hold() throws CallStateException { void hold() throws CallStateException {
setState(State.HOLDING); setState(State.HOLDING);
AudioGroup audioGroup = getAudioGroup();
if (audioGroup != null) {
audioGroup.setMode(AudioGroup.MODE_ON_HOLD);
}
for (Connection c : connections) ((SipConnection) c).hold(); for (Connection c : connections) ((SipConnection) c).hold();
setAudioGroupMode();
} }
void unhold() throws CallStateException { void unhold() throws CallStateException {
@@ -465,19 +483,19 @@ public class SipPhone extends SipPhoneBase {
for (Connection c : connections) { for (Connection c : connections) {
((SipConnection) c).unhold(audioGroup); ((SipConnection) c).unhold(audioGroup);
} }
setAudioGroupMode();
} }
void setMute(boolean muted) { void setMute(boolean muted) {
AudioGroup audioGroup = getAudioGroup(); for (Connection c : connections) {
if (audioGroup == null) return; ((SipConnection) c).setMute(muted);
audioGroup.setMode( }
muted ? AudioGroup.MODE_MUTED : AudioGroup.MODE_NORMAL);
} }
boolean getMute() { boolean getMute() {
AudioGroup audioGroup = getAudioGroup(); return connections.isEmpty()
if (audioGroup == null) return false; ? false
return (audioGroup.getMode() == AudioGroup.MODE_MUTED); : ((SipConnection) connections.get(0)).getMute();
} }
void merge(SipCall that) throws CallStateException { void merge(SipCall that) throws CallStateException {
@@ -736,6 +754,17 @@ public class SipPhone extends SipPhoneBase {
} }
} }
void setMute(boolean muted) {
if ((mSipAudioCall != null) && (muted != mSipAudioCall.isMuted())) {
mSipAudioCall.toggleMute();
}
}
boolean getMute() {
return (mSipAudioCall == null) ? false
: mSipAudioCall.isMuted();
}
@Override @Override
protected void setState(Call.State state) { protected void setState(Call.State state) {
if (state == mState) return; if (state == mState) return;