am 2ba92c71: do not merge bug 3370834 Cherrypick from master
* commit '2ba92c71b5684dce700cf848bf157153c156df1d': do not merge bug 3370834 Cherrypick from master
This commit is contained in:
@@ -156,6 +156,7 @@ public:
|
|||||||
MODE_NORMAL = 0,
|
MODE_NORMAL = 0,
|
||||||
MODE_RINGTONE,
|
MODE_RINGTONE,
|
||||||
MODE_IN_CALL,
|
MODE_IN_CALL,
|
||||||
|
MODE_IN_COMMUNICATION,
|
||||||
NUM_MODES // not a valid entry, denotes end-of-list
|
NUM_MODES // not a valid entry, denotes end-of-list
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -466,7 +467,7 @@ public:
|
|||||||
AudioParameter(const String8& keyValuePairs);
|
AudioParameter(const String8& keyValuePairs);
|
||||||
virtual ~AudioParameter();
|
virtual ~AudioParameter();
|
||||||
|
|
||||||
// reserved parameter keys for changeing standard parameters with setParameters() function.
|
// reserved parameter keys for changing standard parameters with setParameters() function.
|
||||||
// Using these keys is mandatory for AudioFlinger to properly monitor audio output/input
|
// Using these keys is mandatory for AudioFlinger to properly monitor audio output/input
|
||||||
// configuration changes and act accordingly.
|
// configuration changes and act accordingly.
|
||||||
// keyRouting: to change audio routing, value is an int in AudioSystem::audio_devices
|
// keyRouting: to change audio routing, value is an int in AudioSystem::audio_devices
|
||||||
@@ -474,11 +475,14 @@ public:
|
|||||||
// keyFormat: to change audio format, value is an int in AudioSystem::audio_format
|
// keyFormat: to change audio format, value is an int in AudioSystem::audio_format
|
||||||
// keyChannels: to change audio channel configuration, value is an int in AudioSystem::audio_channels
|
// keyChannels: to change audio channel configuration, value is an int in AudioSystem::audio_channels
|
||||||
// keyFrameCount: to change audio output frame count, value is an int
|
// keyFrameCount: to change audio output frame count, value is an int
|
||||||
|
// keyInputSource: to change audio input source, value is an int in audio_source
|
||||||
|
// (defined in media/mediarecorder.h)
|
||||||
static const char *keyRouting;
|
static const char *keyRouting;
|
||||||
static const char *keySamplingRate;
|
static const char *keySamplingRate;
|
||||||
static const char *keyFormat;
|
static const char *keyFormat;
|
||||||
static const char *keyChannels;
|
static const char *keyChannels;
|
||||||
static const char *keyFrameCount;
|
static const char *keyFrameCount;
|
||||||
|
static const char *keyInputSource;
|
||||||
|
|
||||||
String8 toString();
|
String8 toString();
|
||||||
|
|
||||||
|
|||||||
@@ -602,9 +602,9 @@ enum audio_device_e {
|
|||||||
|
|
||||||
// Audio mode
|
// Audio mode
|
||||||
enum audio_mode_e {
|
enum audio_mode_e {
|
||||||
AUDIO_MODE_NORMAL, // phone idle
|
AUDIO_MODE_NORMAL, // device idle
|
||||||
AUDIO_MODE_RINGTONE, // phone ringing
|
AUDIO_MODE_RINGTONE, // device ringing
|
||||||
AUDIO_MODE_IN_CALL // phone call connected
|
AUDIO_MODE_IN_CALL // audio call connected (VoIP or telephony)
|
||||||
};
|
};
|
||||||
|
|
||||||
// Values for "accessMode" field of buffer_config_t:
|
// Values for "accessMode" field of buffer_config_t:
|
||||||
|
|||||||
@@ -44,7 +44,8 @@ enum audio_source {
|
|||||||
AUDIO_SOURCE_VOICE_CALL = 4,
|
AUDIO_SOURCE_VOICE_CALL = 4,
|
||||||
AUDIO_SOURCE_CAMCORDER = 5,
|
AUDIO_SOURCE_CAMCORDER = 5,
|
||||||
AUDIO_SOURCE_VOICE_RECOGNITION = 6,
|
AUDIO_SOURCE_VOICE_RECOGNITION = 6,
|
||||||
AUDIO_SOURCE_MAX = AUDIO_SOURCE_VOICE_RECOGNITION,
|
AUDIO_SOURCE_VOICE_COMMUNICATION = 7,
|
||||||
|
AUDIO_SOURCE_MAX = AUDIO_SOURCE_VOICE_COMMUNICATION,
|
||||||
|
|
||||||
AUDIO_SOURCE_LIST_END // must be last - used to validate audio source type
|
AUDIO_SOURCE_LIST_END // must be last - used to validate audio source type
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -966,9 +966,14 @@ public class AudioManager {
|
|||||||
*/
|
*/
|
||||||
public static final int MODE_RINGTONE = AudioSystem.MODE_RINGTONE;
|
public static final int MODE_RINGTONE = AudioSystem.MODE_RINGTONE;
|
||||||
/**
|
/**
|
||||||
* In call audio mode. A call is established.
|
* In call audio mode. A telephony call is established.
|
||||||
*/
|
*/
|
||||||
public static final int MODE_IN_CALL = AudioSystem.MODE_IN_CALL;
|
public static final int MODE_IN_CALL = AudioSystem.MODE_IN_CALL;
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
* In communication audio mode. An audio/video chat or VoIP call is established.
|
||||||
|
*/
|
||||||
|
public static final int MODE_IN_COMMUNICATION = AudioSystem.MODE_IN_COMMUNICATION;
|
||||||
|
|
||||||
/* Routing bits for setRouting/getRouting API */
|
/* Routing bits for setRouting/getRouting API */
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -252,7 +252,8 @@ public class AudioRecord
|
|||||||
//--------------
|
//--------------
|
||||||
// audio source
|
// audio source
|
||||||
if ( (audioSource < MediaRecorder.AudioSource.DEFAULT) ||
|
if ( (audioSource < MediaRecorder.AudioSource.DEFAULT) ||
|
||||||
(audioSource > MediaRecorder.getAudioSourceMax()) ) {
|
(audioSource > MediaRecorder.AudioSource.VOICE_COMMUNICATION) ) {
|
||||||
|
//(audioSource > MediaRecorder.getAudioSourceMax()) ) {
|
||||||
throw (new IllegalArgumentException("Invalid audio source."));
|
throw (new IllegalArgumentException("Invalid audio source."));
|
||||||
} else {
|
} else {
|
||||||
mRecordSource = audioSource;
|
mRecordSource = audioSource;
|
||||||
|
|||||||
@@ -708,7 +708,7 @@ public class AudioService extends IAudioService.Stub {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode < AudioSystem.MODE_CURRENT || mode > AudioSystem.MODE_IN_CALL) {
|
if (mode < AudioSystem.MODE_CURRENT || mode >= AudioSystem.NUM_MODES) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2259,6 +2259,7 @@ public class AudioService extends IAudioService.Stub {
|
|||||||
// add modify the phone app to take advantage of the new API
|
// add modify the phone app to take advantage of the new API
|
||||||
synchronized(mRingingLock) {
|
synchronized(mRingingLock) {
|
||||||
if (mIsRinging || (getMode() == AudioSystem.MODE_IN_CALL) ||
|
if (mIsRinging || (getMode() == AudioSystem.MODE_IN_CALL) ||
|
||||||
|
(getMode() == AudioSystem.MODE_IN_COMMUNICATION) ||
|
||||||
(getMode() == AudioSystem.MODE_RINGTONE) ) {
|
(getMode() == AudioSystem.MODE_RINGTONE) ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,8 @@ public class AudioSystem
|
|||||||
public static final int MODE_NORMAL = 0;
|
public static final int MODE_NORMAL = 0;
|
||||||
public static final int MODE_RINGTONE = 1;
|
public static final int MODE_RINGTONE = 1;
|
||||||
public static final int MODE_IN_CALL = 2;
|
public static final int MODE_IN_CALL = 2;
|
||||||
public static final int NUM_MODES = 3;
|
public static final int MODE_IN_COMMUNICATION = 3;
|
||||||
|
public static final int NUM_MODES = 4;
|
||||||
|
|
||||||
|
|
||||||
/* Routing bits for setRouting/getRouting API */
|
/* Routing bits for setRouting/getRouting API */
|
||||||
|
|||||||
@@ -145,6 +145,15 @@ public class MediaRecorder
|
|||||||
/** Microphone audio source tuned for voice recognition if available, behaves like
|
/** Microphone audio source tuned for voice recognition if available, behaves like
|
||||||
* {@link #DEFAULT} otherwise. */
|
* {@link #DEFAULT} otherwise. */
|
||||||
public static final int VOICE_RECOGNITION = 6;
|
public static final int VOICE_RECOGNITION = 6;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
* Microphone audio source tuned for voice communications such as VoIP. It
|
||||||
|
* will for instance take advantage of echo cancellation or automatic gain control
|
||||||
|
* if available. It otherwise behaves like {@link #DEFAULT} if no voice processing
|
||||||
|
* is available.
|
||||||
|
*/
|
||||||
|
public static final int VOICE_COMMUNICATION = 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -835,6 +835,7 @@ const char *AudioParameter::keySamplingRate = "sampling_rate";
|
|||||||
const char *AudioParameter::keyFormat = "format";
|
const char *AudioParameter::keyFormat = "format";
|
||||||
const char *AudioParameter::keyChannels = "channels";
|
const char *AudioParameter::keyChannels = "channels";
|
||||||
const char *AudioParameter::keyFrameCount = "frame_count";
|
const char *AudioParameter::keyFrameCount = "frame_count";
|
||||||
|
const char *AudioParameter::keyInputSource = "input_source";
|
||||||
|
|
||||||
AudioParameter::AudioParameter(const String8& keyValuePairs)
|
AudioParameter::AudioParameter(const String8& keyValuePairs)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5810,7 +5810,8 @@ uint32_t AudioFlinger::EffectModule::deviceAudioSystemToEffectApi(uint32_t devic
|
|||||||
const uint32_t AudioFlinger::EffectModule::sModeConvTable[] = {
|
const uint32_t AudioFlinger::EffectModule::sModeConvTable[] = {
|
||||||
AUDIO_MODE_NORMAL, // AudioSystem::MODE_NORMAL
|
AUDIO_MODE_NORMAL, // AudioSystem::MODE_NORMAL
|
||||||
AUDIO_MODE_RINGTONE, // AudioSystem::MODE_RINGTONE
|
AUDIO_MODE_RINGTONE, // AudioSystem::MODE_RINGTONE
|
||||||
AUDIO_MODE_IN_CALL // AudioSystem::MODE_IN_CALL
|
AUDIO_MODE_IN_CALL, // AudioSystem::MODE_IN_CALL
|
||||||
|
AUDIO_MODE_IN_CALL // AudioSystem::MODE_IN_COMMUNICATION, same conversion as for MODE_IN_CALL
|
||||||
};
|
};
|
||||||
|
|
||||||
int AudioFlinger::EffectModule::modeAudioSystemToEffectApi(uint32_t mode)
|
int AudioFlinger::EffectModule::modeAudioSystemToEffectApi(uint32_t mode)
|
||||||
|
|||||||
@@ -48,14 +48,15 @@ static const char* routingModeStrings[] =
|
|||||||
"CURRENT",
|
"CURRENT",
|
||||||
"NORMAL",
|
"NORMAL",
|
||||||
"RINGTONE",
|
"RINGTONE",
|
||||||
"IN_CALL"
|
"IN_CALL",
|
||||||
|
"IN_COMMUNICATION"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char* routeNone = "NONE";
|
static const char* routeNone = "NONE";
|
||||||
|
|
||||||
static const char* displayMode(int mode)
|
static const char* displayMode(int mode)
|
||||||
{
|
{
|
||||||
if ((mode < -2) || (mode > 2))
|
if ((mode < AudioSystem::MODE_INVALID) || (mode >= AudioSystem::NUM_MODES))
|
||||||
return routingModeStrings[0];
|
return routingModeStrings[0];
|
||||||
return routingModeStrings[mode+3];
|
return routingModeStrings[mode+3];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ void AudioPolicyManagerBase::setPhoneState(int state)
|
|||||||
|
|
||||||
// if leaving call state, handle special case of active streams
|
// if leaving call state, handle special case of active streams
|
||||||
// pertaining to sonification strategy see handleIncallSonification()
|
// pertaining to sonification strategy see handleIncallSonification()
|
||||||
if (mPhoneState == AudioSystem::MODE_IN_CALL) {
|
if (isInCall()) {
|
||||||
LOGV("setPhoneState() in call state management: new state is %d", state);
|
LOGV("setPhoneState() in call state management: new state is %d", state);
|
||||||
for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
|
for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
|
||||||
handleIncallSonification(stream, false, true);
|
handleIncallSonification(stream, false, true);
|
||||||
@@ -248,16 +248,21 @@ void AudioPolicyManagerBase::setPhoneState(int state)
|
|||||||
bool force = false;
|
bool force = false;
|
||||||
|
|
||||||
// are we entering or starting a call
|
// are we entering or starting a call
|
||||||
if ((oldState != AudioSystem::MODE_IN_CALL) && (state == AudioSystem::MODE_IN_CALL)) {
|
if (!isStateInCall(oldState) && isStateInCall(state)) {
|
||||||
LOGV(" Entering call in setPhoneState()");
|
LOGV(" Entering call in setPhoneState()");
|
||||||
// force routing command to audio hardware when starting a call
|
// force routing command to audio hardware when starting a call
|
||||||
// even if no device change is needed
|
// even if no device change is needed
|
||||||
force = true;
|
force = true;
|
||||||
} else if ((oldState == AudioSystem::MODE_IN_CALL) && (state != AudioSystem::MODE_IN_CALL)) {
|
} else if (isStateInCall(oldState) && !isStateInCall(state)) {
|
||||||
LOGV(" Exiting call in setPhoneState()");
|
LOGV(" Exiting call in setPhoneState()");
|
||||||
// force routing command to audio hardware when exiting a call
|
// force routing command to audio hardware when exiting a call
|
||||||
// even if no device change is needed
|
// even if no device change is needed
|
||||||
force = true;
|
force = true;
|
||||||
|
} else if (isStateInCall(state) && (state != oldState)) {
|
||||||
|
LOGV(" Switching between telephony and VoIP in setPhoneState()");
|
||||||
|
// force routing command to audio hardware when switching between telephony and VoIP
|
||||||
|
// even if no device change is needed
|
||||||
|
force = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for device and output changes triggered by new phone state
|
// check for device and output changes triggered by new phone state
|
||||||
@@ -272,7 +277,7 @@ void AudioPolicyManagerBase::setPhoneState(int state)
|
|||||||
|
|
||||||
// force routing command to audio hardware when ending call
|
// force routing command to audio hardware when ending call
|
||||||
// even if no device change is needed
|
// even if no device change is needed
|
||||||
if (oldState == AudioSystem::MODE_IN_CALL && newDevice == 0) {
|
if (isStateInCall(oldState) && newDevice == 0) {
|
||||||
newDevice = hwOutputDesc->device();
|
newDevice = hwOutputDesc->device();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,7 +285,7 @@ void AudioPolicyManagerBase::setPhoneState(int state)
|
|||||||
// immediately and delay the route change to avoid sending the ring tone
|
// immediately and delay the route change to avoid sending the ring tone
|
||||||
// tail into the earpiece or headset.
|
// tail into the earpiece or headset.
|
||||||
int delayMs = 0;
|
int delayMs = 0;
|
||||||
if (state == AudioSystem::MODE_IN_CALL && oldState == AudioSystem::MODE_RINGTONE) {
|
if (isStateInCall(state) && oldState == AudioSystem::MODE_RINGTONE) {
|
||||||
// delay the device change command by twice the output latency to have some margin
|
// delay the device change command by twice the output latency to have some margin
|
||||||
// and be sure that audio buffers not yet affected by the mute are out when
|
// and be sure that audio buffers not yet affected by the mute are out when
|
||||||
// we actually apply the route change
|
// we actually apply the route change
|
||||||
@@ -293,7 +298,7 @@ void AudioPolicyManagerBase::setPhoneState(int state)
|
|||||||
|
|
||||||
// if entering in call state, handle special case of active streams
|
// if entering in call state, handle special case of active streams
|
||||||
// pertaining to sonification strategy see handleIncallSonification()
|
// pertaining to sonification strategy see handleIncallSonification()
|
||||||
if (state == AudioSystem::MODE_IN_CALL) {
|
if (isStateInCall(state)) {
|
||||||
LOGV("setPhoneState() in call state management: new state is %d", state);
|
LOGV("setPhoneState() in call state management: new state is %d", state);
|
||||||
// unmute the ringing tone after a sufficient delay if it was muted before
|
// unmute the ringing tone after a sufficient delay if it was muted before
|
||||||
// setting output device above
|
// setting output device above
|
||||||
@@ -564,7 +569,7 @@ status_t AudioPolicyManagerBase::startOutput(audio_io_handle_t output,
|
|||||||
setOutputDevice(output, getNewDevice(output));
|
setOutputDevice(output, getNewDevice(output));
|
||||||
|
|
||||||
// handle special case for sonification while in call
|
// handle special case for sonification while in call
|
||||||
if (mPhoneState == AudioSystem::MODE_IN_CALL) {
|
if (isInCall()) {
|
||||||
handleIncallSonification(stream, true, false);
|
handleIncallSonification(stream, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -589,7 +594,7 @@ status_t AudioPolicyManagerBase::stopOutput(audio_io_handle_t output,
|
|||||||
routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);
|
routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);
|
||||||
|
|
||||||
// handle special case for sonification while in call
|
// handle special case for sonification while in call
|
||||||
if (mPhoneState == AudioSystem::MODE_IN_CALL) {
|
if (isInCall()) {
|
||||||
handleIncallSonification(stream, false, false);
|
handleIncallSonification(stream, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -738,10 +743,8 @@ status_t AudioPolicyManagerBase::startInput(audio_io_handle_t input)
|
|||||||
AudioParameter param = AudioParameter();
|
AudioParameter param = AudioParameter();
|
||||||
param.addInt(String8(AudioParameter::keyRouting), (int)inputDesc->mDevice);
|
param.addInt(String8(AudioParameter::keyRouting), (int)inputDesc->mDevice);
|
||||||
|
|
||||||
// use Voice Recognition mode or not for this input based on input source
|
param.addInt(String8(AudioParameter::keyInputSource), (int)inputDesc->mInputSource);
|
||||||
int vr_enabled = inputDesc->mInputSource == AUDIO_SOURCE_VOICE_RECOGNITION ? 1 : 0;
|
LOGV("AudioPolicyManager::startInput() input source = %d", inputDesc->mInputSource);
|
||||||
param.addInt(String8("vr_mode"), vr_enabled);
|
|
||||||
LOGV("AudioPolicyManager::startInput(%d), setting vr_mode to %d", inputDesc->mInputSource, vr_enabled);
|
|
||||||
|
|
||||||
mpClientInterface->setParameters(input, param.toString());
|
mpClientInterface->setParameters(input, param.toString());
|
||||||
|
|
||||||
@@ -1494,7 +1497,7 @@ uint32_t AudioPolicyManagerBase::getNewDevice(audio_io_handle_t output, bool fro
|
|||||||
// use device for strategy media
|
// use device for strategy media
|
||||||
// 4: the strategy DTMF is active on the hardware output:
|
// 4: the strategy DTMF is active on the hardware output:
|
||||||
// use device for strategy DTMF
|
// use device for strategy DTMF
|
||||||
if (mPhoneState == AudioSystem::MODE_IN_CALL ||
|
if (isInCall() ||
|
||||||
outputDesc->isUsedByStrategy(STRATEGY_PHONE)) {
|
outputDesc->isUsedByStrategy(STRATEGY_PHONE)) {
|
||||||
device = getDeviceForStrategy(STRATEGY_PHONE, fromCache);
|
device = getDeviceForStrategy(STRATEGY_PHONE, fromCache);
|
||||||
} else if (outputDesc->isUsedByStrategy(STRATEGY_SONIFICATION)) {
|
} else if (outputDesc->isUsedByStrategy(STRATEGY_SONIFICATION)) {
|
||||||
@@ -1549,7 +1552,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
|
|||||||
|
|
||||||
switch (strategy) {
|
switch (strategy) {
|
||||||
case STRATEGY_DTMF:
|
case STRATEGY_DTMF:
|
||||||
if (mPhoneState != AudioSystem::MODE_IN_CALL) {
|
if (!isInCall()) {
|
||||||
// when off call, DTMF strategy follows the same rules as MEDIA strategy
|
// when off call, DTMF strategy follows the same rules as MEDIA strategy
|
||||||
device = getDeviceForStrategy(STRATEGY_MEDIA, false);
|
device = getDeviceForStrategy(STRATEGY_MEDIA, false);
|
||||||
break;
|
break;
|
||||||
@@ -1562,7 +1565,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
|
|||||||
// of priority
|
// of priority
|
||||||
switch (mForceUse[AudioSystem::FOR_COMMUNICATION]) {
|
switch (mForceUse[AudioSystem::FOR_COMMUNICATION]) {
|
||||||
case AudioSystem::FORCE_BT_SCO:
|
case AudioSystem::FORCE_BT_SCO:
|
||||||
if (mPhoneState != AudioSystem::MODE_IN_CALL || strategy != STRATEGY_DTMF) {
|
if (!isInCall() || strategy != STRATEGY_DTMF) {
|
||||||
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
|
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
|
||||||
if (device) break;
|
if (device) break;
|
||||||
}
|
}
|
||||||
@@ -1580,7 +1583,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
|
|||||||
if (device) break;
|
if (device) break;
|
||||||
#ifdef WITH_A2DP
|
#ifdef WITH_A2DP
|
||||||
// when not in a phone call, phone strategy should route STREAM_VOICE_CALL to A2DP
|
// when not in a phone call, phone strategy should route STREAM_VOICE_CALL to A2DP
|
||||||
if (mPhoneState != AudioSystem::MODE_IN_CALL) {
|
if (!isInCall()) {
|
||||||
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP;
|
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP;
|
||||||
if (device) break;
|
if (device) break;
|
||||||
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES;
|
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES;
|
||||||
@@ -1594,14 +1597,14 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case AudioSystem::FORCE_SPEAKER:
|
case AudioSystem::FORCE_SPEAKER:
|
||||||
if (mPhoneState != AudioSystem::MODE_IN_CALL || strategy != STRATEGY_DTMF) {
|
if (!isInCall() || strategy != STRATEGY_DTMF) {
|
||||||
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
|
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
|
||||||
if (device) break;
|
if (device) break;
|
||||||
}
|
}
|
||||||
#ifdef WITH_A2DP
|
#ifdef WITH_A2DP
|
||||||
// when not in a phone call, phone strategy should route STREAM_VOICE_CALL to
|
// when not in a phone call, phone strategy should route STREAM_VOICE_CALL to
|
||||||
// A2DP speaker when forcing to speaker output
|
// A2DP speaker when forcing to speaker output
|
||||||
if (mPhoneState != AudioSystem::MODE_IN_CALL) {
|
if (!isInCall()) {
|
||||||
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
|
device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER;
|
||||||
if (device) break;
|
if (device) break;
|
||||||
}
|
}
|
||||||
@@ -1618,7 +1621,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy,
|
|||||||
|
|
||||||
// If incall, just select the STRATEGY_PHONE device: The rest of the behavior is handled by
|
// If incall, just select the STRATEGY_PHONE device: The rest of the behavior is handled by
|
||||||
// handleIncallSonification().
|
// handleIncallSonification().
|
||||||
if (mPhoneState == AudioSystem::MODE_IN_CALL) {
|
if (isInCall()) {
|
||||||
device = getDeviceForStrategy(STRATEGY_PHONE, false);
|
device = getDeviceForStrategy(STRATEGY_PHONE, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1739,6 +1742,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForInputSource(int inputSource)
|
|||||||
case AUDIO_SOURCE_DEFAULT:
|
case AUDIO_SOURCE_DEFAULT:
|
||||||
case AUDIO_SOURCE_MIC:
|
case AUDIO_SOURCE_MIC:
|
||||||
case AUDIO_SOURCE_VOICE_RECOGNITION:
|
case AUDIO_SOURCE_VOICE_RECOGNITION:
|
||||||
|
case AUDIO_SOURCE_VOICE_COMMUNICATION:
|
||||||
if (mForceUse[AudioSystem::FOR_RECORD] == AudioSystem::FORCE_BT_SCO &&
|
if (mForceUse[AudioSystem::FOR_RECORD] == AudioSystem::FORCE_BT_SCO &&
|
||||||
mAvailableInputDevices & AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
|
mAvailableInputDevices & AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
|
||||||
device = AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET;
|
device = AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET;
|
||||||
@@ -1960,6 +1964,16 @@ void AudioPolicyManagerBase::handleIncallSonification(int stream, bool starting,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AudioPolicyManagerBase::isInCall()
|
||||||
|
{
|
||||||
|
return isStateInCall(mPhoneState);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AudioPolicyManagerBase::isStateInCall(int state) {
|
||||||
|
return ((state == AudioSystem::MODE_IN_CALL) ||
|
||||||
|
(state == AudioSystem::MODE_IN_COMMUNICATION));
|
||||||
|
}
|
||||||
|
|
||||||
bool AudioPolicyManagerBase::needsDirectOuput(AudioSystem::stream_type stream,
|
bool AudioPolicyManagerBase::needsDirectOuput(AudioSystem::stream_type stream,
|
||||||
uint32_t samplingRate,
|
uint32_t samplingRate,
|
||||||
uint32_t format,
|
uint32_t format,
|
||||||
|
|||||||
@@ -380,12 +380,17 @@ public final class CallManager {
|
|||||||
break;
|
break;
|
||||||
case OFFHOOK:
|
case OFFHOOK:
|
||||||
Phone fgPhone = getFgPhone();
|
Phone fgPhone = getFgPhone();
|
||||||
// Enable IN_CALL mode while foreground call is in DIALING,
|
// While foreground call is in DIALING,
|
||||||
// ALERTING, ACTIVE and DISCONNECTING state and not from sipPhone
|
// ALERTING, ACTIVE and DISCONNECTING state
|
||||||
if (getActiveFgCallState() != Call.State.IDLE
|
if (getActiveFgCallState() != Call.State.IDLE
|
||||||
&& getActiveFgCallState() != Call.State.DISCONNECTED
|
&& getActiveFgCallState() != Call.State.DISCONNECTED) {
|
||||||
&& !(fgPhone instanceof SipPhone)) {
|
if (fgPhone instanceof SipPhone) {
|
||||||
mode = AudioManager.MODE_IN_CALL;
|
// enable IN_COMMUNICATION audio mode for sipPhone
|
||||||
|
mode = AudioManager.MODE_IN_COMMUNICATION;
|
||||||
|
} else {
|
||||||
|
// enable IN_CALL audio mode for telephony
|
||||||
|
mode = AudioManager.MODE_IN_CALL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -483,7 +483,7 @@ public:
|
|||||||
ON_HOLD = 0,
|
ON_HOLD = 0,
|
||||||
MUTED = 1,
|
MUTED = 1,
|
||||||
NORMAL = 2,
|
NORMAL = 2,
|
||||||
EC_ENABLED = 3,
|
ECHO_SUPPRESSION = 3,
|
||||||
LAST_MODE = 3,
|
LAST_MODE = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -619,6 +619,10 @@ bool AudioGroup::setMode(int mode)
|
|||||||
if (mode < 0 || mode > LAST_MODE) {
|
if (mode < 0 || mode > LAST_MODE) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (mode == ECHO_SUPPRESSION && AudioSystem::getParameters(
|
||||||
|
0, String8("ec_supported")) == "ec_supported=yes") {
|
||||||
|
mode = NORMAL;
|
||||||
|
}
|
||||||
if (mMode == mode) {
|
if (mMode == mode) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -775,8 +779,8 @@ bool AudioGroup::DeviceThread::threadLoop()
|
|||||||
AudioTrack track;
|
AudioTrack track;
|
||||||
AudioRecord record;
|
AudioRecord record;
|
||||||
if (track.set(AudioSystem::VOICE_CALL, sampleRate, AudioSystem::PCM_16_BIT,
|
if (track.set(AudioSystem::VOICE_CALL, sampleRate, AudioSystem::PCM_16_BIT,
|
||||||
AudioSystem::CHANNEL_OUT_MONO, output) != NO_ERROR ||
|
AudioSystem::CHANNEL_OUT_MONO, output) != NO_ERROR || record.set(
|
||||||
record.set(AUDIO_SOURCE_MIC, sampleRate, AudioSystem::PCM_16_BIT,
|
AUDIO_SOURCE_VOICE_COMMUNICATION, sampleRate, AudioSystem::PCM_16_BIT,
|
||||||
AudioSystem::CHANNEL_IN_MONO, input) != NO_ERROR) {
|
AudioSystem::CHANNEL_IN_MONO, input) != NO_ERROR) {
|
||||||
LOGE("cannot initialize audio device");
|
LOGE("cannot initialize audio device");
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user