客户反馈了一个问题:工厂测试听筒测试后,麦克风录音播放声音很小;
尝试修改每次在mic测试前加入
mAudioManager.setSpeakerphoneOn(true);
这样修改导致一个大问题:每次测试完mic,再测听筒时,都从喇叭出声,
10797 08-18 09:06:24.979553 4418 4418 E Earphone: onCreate
10799 08-18 09:06:24.980818 1437 2992 E AS.AudioDeviceBroker: BrokerHandler msg=42
10814 08-18 09:06:24.983424 796 894 D APM_AudioPolicyManager: [MTK_APM_Route]setPhoneState() state 3
10918 08-18 09:06:25.005776 796 894 D APM_AudioPolicyManager: [MTK_APM_Route]setOutputDevices mIoHandle 13 : changing device 0x2 to 0x1, delayMs = 0, force = 1, skipMuteDelay = 0, skipDelayMTK = 0, caller setPhoneState[[portId:1][io:13, primary output]]
11239 08-18 09:06:25.167142 1437 2992 E AS.AudioDeviceBroker: mCommunicationDeviceUpdateCount already 0 in MSG_L_SET_COMMUNICATION_DEVICE_FOR_CLIENT
11241 08-18 09:06:25.167230 1437 2992 E AS.AudioDeviceBroker: BrokerHandler msg=16
11242 08-18 09:06:25.167339 1437 2992 V AS.AudioDeviceBroker: updateCommunicationRoute, preferredCommunicationDevice: null eventSource: setNewModeOwner
11245 08-18 09:06:25.168492 1437 2992 I AS.AudioDeviceInventory: removePreferredDevicesForStrategyInt, strategy: 14
11246 08-18 09:06:25.168603 1437 2992 I AS.AudioDeviceInventory: removePreferredDevicesForStrategyInt APM fail to removed, strategy: 14, 0ms
11247 08-18 09:06:25.168620 1437 2992 I AS.AudioDeviceInventory: removePreferredDevicesForStrategyInt, strategy: 17
11248 08-18 09:06:25.168644 1437 2992 I AS.AudioDeviceInventory: removePreferredDevicesForStrategyInt APM fail to removed, strategy: 17, 0ms
11569 08-18 09:06:25.272109 796 796 D APM_AudioPolicyManager: [MTK_APM_Route]setForceUse() usage 7, config 0, mPhoneState 3
11696 08-18 09:06:25.297220 796 4510 D APM_AudioPolicyManager: [MTK_APM_Route]setForceUse() usage 7, config 0, mPhoneState 3
13628 08-18 09:06:30.212333 796 900 D APM_AudioPolicyManager: [MTK_APM_Route]setPhoneState() state 0
14149 08-18 09:06:30.708926 1437 2992 E AS.AudioDeviceBroker: BrokerHandler msg=16
14150 08-18 09:06:30.709252 1437 2992 V AS.AudioDeviceBroker: updateCommunicationRoute, preferredCommunicationDevice: null eventSource: setNewModeOwner
14152 08-18 09:06:30.710694 1437 2992 I AS.AudioDeviceInventory: removePreferredDevicesForStrategyInt, strategy: 14
14154 08-18 09:06:30.711290 1437 2992 I AS.AudioDeviceInventory: removePreferredDevicesForStrategyInt APM fail to removed, strategy: 14, 0ms
14155 08-18 09:06:30.711959 1437 2992 I AS.AudioDeviceInventory: removePreferredDevicesForStrategyInt, strategy: 17
14156 08-18 09:06:30.712057 1437 2992 I AS.AudioDeviceInventory: removePreferredDevicesForStrategyInt APM fail to removed, strategy: 17, 0ms
14297 08-18 09:06:30.894380 796 2998 D APM_AudioPolicyManager: [MTK_APM_Route]setForceUse() usage 7, config 0, mPhoneState 0
14313 08-18 09:06:30.921594 796 796 D APM_AudioPolicyManager: [MTK_APM_Route]setForceUse() usage 7, config 0, mPhoneState 0
14506 08-18 09:06:32.110805 4418 4418 E Mic : onCreate
14508 08-18 09:06:32.112000 1437 2992 E AS.AudioDeviceBroker: BrokerHandler msg=42
14509 08-18 09:06:32.112308 1437 2992 I AS.AudioDeviceBroker: setCommunicationRouteForClient for uid: 1000 device: AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[] isPrivileged: true from API: setSpeakerphoneOn(true) from u/pid:1000/4418
14511 08-18 09:06:32.112777 1437 2992 V AS.AudioDeviceBroker: updateCommunicationRoute, preferredCommunicationDevice: AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[] eventSource: setSpeakerphoneOn(true) from u/pid:1000/4418
14512 08-18 09:06:32.112947 1437 2992 I AS.AudioDeviceInventory: setPreferredDevicesForStrategyInt, strategy: 14 devices: [AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[]]
14555 08-18 09:06:32.122187 796 2998 D APM_AudioPolicyManager: [MTK_APM_Route]setOutputDevices mIoHandle 13 : changing device 0x2 to 0x2, delayMs = 100, force = 1, skipMuteDelay = 0, skipDelayMTK = 0, caller updateCallAndOutputRouting[[portId:1][io:13, primary output]]
15168 08-18 09:06:32.329162 1437 2992 I AS.AudioDeviceInventory: setPreferredDevicesForStrategyInt, strategy: 17, APM made devices: [AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[]]preferred device in42ms
18560 08-18 09:06:48.730375 4418 4418 E Earphone: onCreate
18561 08-18 09:06:48.731218 1437 2992 E AS.AudioDeviceBroker: BrokerHandler msg=42
18575 08-18 09:06:48.734433 796 900 D APM_AudioPolicyManager: [MTK_APM_Route]setPhoneState() state 3
18648 08-18 09:06:48.755196 796 900 D APM_AudioPolicyManager: [MTK_APM_Route]setOutputDevices mIoHandle 13 : changing device 0x2 to 0x2, delayMs = 0, force = 1, skipMuteDelay = 0, skipDelayMTK = 0, caller setPhoneState[[portId:1][io:13, primary output]]
18812 08-18 09:06:48.812010 1437 2992 I AS.AudioDeviceBroker: setCommunicationRouteForClient for uid: 1000 device: null isPrivileged: true from API: setSpeakerphoneOn(false) from u/pid:1000/4418 //setSpeakerphoneOn(false);传入的device为null
18813 08-18 09:06:48.812287 1437 2992 E AS.AudioDeviceBroker: mCommunicationDeviceUpdateCount already 0 in MSG_L_SET_COMMUNICATION_DEVICE_FOR_CLIENT
18814 08-18 09:06:48.812333 1437 2992 E AS.AudioDeviceBroker: BrokerHandler msg=16
18815 08-18 09:06:48.812393 1437 2992 I AS.AudioDeviceBroker: setCommunicationRouteForClient for uid: 1000 device: AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[] isPrivileged: true from API: setNewModeOwner
//setMode(AudioManager.MODE_IN_COMMUNICATION);传入的device为speaker
18816 08-18 09:06:48.812543 1437 2992 V AS.AudioDeviceBroker: updateCommunicationRoute, preferredCommunicationDevice: AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[] eventSource: setNewModeOwner
18817 08-18 09:06:48.812583 1437 2992 I AS.AudioDeviceInventory: setPreferredDevicesForStrategyInt, strategy: 14 devices: [AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[]]
18818 08-18 09:06:48.812632 1437 2992 I AS.AudioDeviceInventory: setPreferredDevicesForStrategyInt, strategy: 14, APM made devices: [AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[]]preferred device in0ms
18819 08-18 09:06:48.812647 1437 2992 I AS.AudioDeviceInventory: setPreferredDevicesForStrategyInt, strategy: 17 devices: [AudioDeviceAttributes: role:output type:speaker addr: name: profiles:[] descriptors:[]]
除非后台清除掉工模进程,再进工模,直接测试听筒,声音才从听筒出。
1701 08-15 11:14:29.415 4942 4942 D Earphone: onCreate-->
1705 08-15 11:14:29.425 759 1187 D AudioALSAStreamManager: +setMode(), mAudioMode: 0 => 3, mEnterPhoneCallMode = 0, mIsNeedResumeStreamOut = 0, mIsNeedResumeStreamIn = 0, mResumeAllStreamsAtSetMode = 1
1713 08-15 11:14:29.427 759 1187 D AudioALSAStreamManager: needEnableVoip(), output_devices = 0x2, flags: 0x4, mAvailableOutputFlags: 0x1c00f, enable: 0
1714 08-15 11:14:29.427 759 1187 D AudioALSAStreamManager: -setMode(), mAudioMode = 3, mIsNeedResumeStreamOut = 0, mIsNeedResumeStreamIn = 0, mResumeAllStreamsAtSetMode = 1
1715 08-15 11:14:29.428 796 4403 D APM_AudioPolicyManager: [MTK_APM_Route]setPhoneState() state 3
1780 08-15 11:14:29.446 796 4403 E APM::AudioPolicyEngine: getDevicesForStrategyInt strategy 1, device 0x1
1815 08-15 11:14:29.450 796 4403 D APM_AudioPolicyManager: [MTK_APM_Route]setOutputDevices mIoHandle 13 : changing device 0x2 to 0x1, delayMs = 0, force = 1, skipMuteDelay = 0, skipDelayMTK = 0, caller setPhoneState[[portId:1][io:13, primary output]]
AudioPolicyManager.cpp (frameworks\av\services\audiopolicy\managerdefault):
uint32_t AudioPolicyManager::setOutputDevices(const char *caller,
MTK_ALOGI("[MTK_APM_Route]%s mIoHandle %d : changing device %s to %s, delayMs = %d, force = %d, skipMuteDelay = %d, skipDelayMTK = %d, %s",
__func__, outputDesc->mIoHandle, (prevDevices.isEmpty()?"AUDIO_DEVICE_NONE":dumpDeviceTypes(prevDevices.types()).c_str()),
(filteredDevices.isEmpty()?"AUDIO_DEVICE_NONE":dumpDeviceTypes(filteredDevices.types()).c_str()),
delayMs, force, skipMuteDelay, skipDelayMTK, logPrefix.c_str());
void AudioPolicyManager::setPhoneState(audio_mode_t state)
{
// reevaluate routing on all outputs in case tracks have been started during the call
遍历所有可用设备集合,现在state是3(AUDIO_MODE_IN_COMMUNICATION)
for (size_t i = 0; i < mOutputs.size(); i++) {
sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
DeviceVector newDevices = getNewOutputDevices(desc, true /*fromCache*/);
if (state != AUDIO_MODE_NORMAL && oldState == AUDIO_MODE_NORMAL
&& desc->mPreferredAttrInfo != nullptr) {
// If the output is using preferred mixer attributes and the audio mode is not normal,
// the output need to reopen with default configuration.
outputsToReopen.emplace(mOutputs.keyAt(i), newDevices);
continue;
}
if (state != AUDIO_MODE_IN_CALL || (desc != mPrimaryOutput && !isTelephonyRxOrTx(desc))) {
bool forceRouting = !newDevices.isEmpty();
setOutputDevices(__func__, desc, newDevices, forceRouting, 0 /*delayMs*/, nullptr,
true /*requiresMuteCheck*/, !forceRouting /*requiresVolumeCheck*/);
}
}
DeviceVector AudioPolicyManager::getNewOutputDevices(const sp<SwAudioOutputDescriptor>& outputDesc,
bool fromCache)
{
DeviceVector devices;
遍历所有Strategy
for (const auto &productStrategy : mEngine->getOrderedProductStrategies()) {
StreamTypeVector streams = mEngine->getStreamTypesForProductStrategy(productStrategy);
#if !defined(MTK_AUDIO_FIX_DEFAULT_DEFECT) //ALPS04425315 get new output device when isStrategyActiveOnSameModule == true
auto hasStreamActive = [&](auto stream) {
return hasStream(streams, stream) && isStreamActive(stream, 0);
};
#endif
auto doGetOutputDevicesForVoice = [&]() {
return hasVoiceStream(streams) && (outputDesc == mPrimaryOutput ||
outputDesc->isActive(toVolumeSource(AUDIO_STREAM_VOICE_CALL, false))) &&
(isInCall() ||
mOutputs.isStrategyActiveOnSameModule(productStrategy, outputDesc)) &&
!isStreamActive(AUDIO_STREAM_ENFORCED_AUDIBLE, 0);
};
// With low-latency playing on speaker, music on WFD, when the first low-latency
// output is stopped, getNewOutputDevices checks for a product strategy
// from the list, as STRATEGY_SONIFICATION comes prior to STRATEGY_MEDIA.
// If an ALARM or ENFORCED_AUDIBLE stream is supported by the product strategy,
// devices are returned for STRATEGY_SONIFICATION without checking whether the
// stream is associated to the output descriptor.
获取voice或活动Strategy的device
if (doGetOutputDevicesForVoice() || outputDesc->isStrategyActive(productStrategy) ||
#if defined(MTK_AUDIO_FIX_DEFAULT_DEFECT) //ALPS04425315 get new output device when isStrategyActiveOnSameModule == true
mOutputs.isStrategyActiveOnSameModule(productStrategy, outputDesc))
#else
((hasStreamActive(AUDIO_STREAM_ALARM) ||
hasStreamActive(AUDIO_STREAM_ENFORCED_AUDIBLE)) &&
mOutputs.isStrategyActiveOnSameModule(productStrategy, outputDesc)))
#endif
{
// Retrieval of devices for voice DL is done on primary output profile, cannot
// check the route (would force modifying configuration file for this profile)
auto attr = mEngine->getAllAttributesForProductStrategy(productStrategy).front();
devices = mEngine->getOutputDevicesForAttributes(attr, nullptr, fromCache);
break;
}
}
ALOGV("%s selected devices %s", __func__, devices.toString().c_str());
return devices;
}
Engine.cpp (frameworks\av\services\audiopolicy\enginedefault\src):
DeviceVector Engine::getDevicesForStrategyInt(legacy_strategy strategy,
DeviceVector availableOutputDevices,
const SwAudioOutputCollection &outputs) const
{
ALOGE("%s strategy %d, device %s", __func__,
strategy, dumpDeviceTypes(devices.types()).c_str());
return devices;
}
./av/services/audiopolicy/enginedefault/src/Engine.h
enum legacy_strategy {
STRATEGY_NONE = -1,
STRATEGY_MEDIA,
STRATEGY_PHONE,
STRATEGY_SONIFICATION,
STRATEGY_SONIFICATION_RESPECTFUL,
STRATEGY_DTMF,
STRATEGY_ENFORCED_AUDIBLE,
STRATEGY_TRANSMITTED_THROUGH_SPEAKER,
STRATEGY_ACCESSIBILITY,
STRATEGY_REROUTING,
STRATEGY_CALL_ASSISTANT,
};
Audio_policy_engine_product_strategies.xml (frameworks\av\services\audiopolicy\enginedefault\config\example\phone):
<ProductStrategy name="STRATEGY_PHONE">
<AttributesGroup streamType="AUDIO_STREAM_VOICE_CALL" volumeGroup="voice_call">
<Attributes> <Usage value="AUDIO_USAGE_VOICE_COMMUNICATION"/> </Attributes>
</AttributesGroup>
<AttributesGroup streamType="AUDIO_STREAM_BLUETOOTH_SCO" volumeGroup="bluetooth_sco">
<Attributes> <Flags value="AUDIO_FLAG_SCO"/> </Attributes>
</AttributesGroup>
</ProductStrategy>
<ProductStrategy name="STRATEGY_SONIFICATION">
<AttributesGroup streamType="AUDIO_STREAM_RING" volumeGroup="ring">
<Attributes> <Usage value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE"/> </Attributes>
</AttributesGroup>
<AttributesGroup streamType="AUDIO_STREAM_ALARM" volumeGroup="alarm">
<Attributes> <Usage value="AUDIO_USAGE_ALARM"/> </Attributes>
</AttributesGroup>
</ProductStrategy>
<ProductStrategy name="STRATEGY_ENFORCED_AUDIBLE">
<AttributesGroup streamType="AUDIO_STREAM_ENFORCED_AUDIBLE" volumeGroup="enforced_audible">
<Attributes> <Flags value="AUDIO_FLAG_AUDIBILITY_ENFORCED"/> </Attributes>
</AttributesGroup>
</ProductStrategy>
/system/media/audio/include/system/audio-hal-enums.h
#define AUDIO_STREAM_LIST_NO_SYS_DEF(V) \
V(AUDIO_STREAM_VOICE_CALL, 0) \
V(AUDIO_STREAM_SYSTEM, 1) \
V(AUDIO_STREAM_RING, 2) \
V(AUDIO_STREAM_MUSIC, 3) \
V(AUDIO_STREAM_ALARM, 4) \
V(AUDIO_STREAM_NOTIFICATION, 5) \
V(AUDIO_STREAM_BLUETOOTH_SCO, 6) \
V(AUDIO_STREAM_ENFORCED_AUDIBLE, 7) \
V(AUDIO_STREAM_DTMF, 8) \
V(AUDIO_STREAM_TTS, 9) \
V(AUDIO_STREAM_ACCESSIBILITY, 10) \
V(AUDIO_STREAM_ASSISTANT, 11) \
V(AUDIO_STREAM_REROUTING, 12) \
V(AUDIO_STREAM_PATCH, 13) \
V(AUDIO_STREAM_CALL_ASSISTANT, 14)
#ifdef AUDIO_NO_SYSTEM_DECLARATIONS
#define AUDIO_STREAM_LIST_DEF AUDIO_STREAM_LIST_NO_SYS_DEF
#else
#define AUDIO_STREAM_LIST_DEF(V) \
AUDIO_STREAM_LIST_NO_SYS_DEF(V) \
V(AUDIO_STREAM_DEFAULT, -1)
#endif // AUDIO_NO_SYSTEM_DECLARATIONS
对照log看,异常时,APM遍历的strategy中有5(STRATEGY_ENFORCED_AUDIBLE)、9、6、8,查找到的device是2(AUDIO_DEVICE_OUT_SPEAKER)。正常时,APM遍历的strategy中有1(STRATEGY_PHONE)、9、6、8,查找到的device是1(AUDIO_DEVICE_OUT_EARPIECE)。
08-15 17:19:09.198380 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_PHONE, id=14
08-15 17:19:09.198589 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_SONIFICATION, id=15
08-15 17:19:09.198621 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_ENFORCED_AUDIBLE, id=16
08-15 17:19:09.198650 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_ACCESSIBILITY, id=17
08-15 17:19:09.198669 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_SONIFICATION_RESPECTFUL, id=18
08-15 17:19:09.198701 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_MEDIA, id=19
08-15 17:19:09.198718 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_DTMF, id=21
08-15 17:19:09.198739 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_CALL_ASSISTANT, id=22
08-15 17:19:09.198764 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_TRANSMITTED_THROUGH_SPEAKER, id=24
08-15 17:19:09.198775 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_REROUTING, id=25
08-15 17:19:09.198787 786 873 E APM::AudioPolicyEngine/Base: listAudioProductStrategies strategy STRATEGY_PATCH, id=26
在Earphone.java中,调用setSpeakerphoneOn(false);传入的device为null,导致没有设回AUDIO_DEVICE_OUT_EARPIECE
AudioDeviceBroker.java (frameworks\base\services\core\java\com\android\server\audio):
/**
* Sets or resets the communication device for matching client. If no client matches and the
* request is to reset for a given device (deviceInfo.mOn == false), the method is a noop.
* @param deviceInfo information on the device and requester {@link #CommunicationDeviceInfo}
*/
@GuardedBy("mDeviceStateLock")
/*package*/ void onSetCommunicationDeviceForClient(CommunicationDeviceInfo deviceInfo) {
if (AudioService.DEBUG_COMM_RTE) {
Log.v(TAG, "onSetCommunicationDeviceForClient: " + deviceInfo);
}
if (!deviceInfo.mOn) {
CommunicationRouteClient client = getCommunicationRouteClientForUid(deviceInfo.mUid);
if (client == null
|| (deviceInfo.mDevice != null
&& !deviceInfo.mDevice.equals(client.getDevice())
/// M: Optimize the logic of shutting down the device @{
&& deviceInfo.mDevice.getType() != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)
|| (deviceInfo.mDevice != null
&& deviceInfo.mDevice.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
&& client.getDevice().getType() != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)) {
/// @}
return;
}
}
AudioDeviceAttributes device = deviceInfo.mOn ? deviceInfo.mDevice : null;
setCommunicationRouteForClient(deviceInfo.mCb, deviceInfo.mUid, device,
deviceInfo.mScoAudioMode, deviceInfo.mIsPrivileged, deviceInfo.mEventSource);
}
看来在mic测试中设置setSpeakerphoneOn(true)会导致应用PreferredDevices变化,后面听筒测试异常。最后在mic测试退出时,设置了一下setSpeakerphoneOn(false),再进听筒测试,就是从听筒出了。
也就是说setSpeakerphoneOn与setMode是关联的,在AudioManager.MODE_NORMAL模式下,setSpeakerphoneOn(true),setSpeakerphoneOn(false)应成对使用,否则会影响AudioManager.MODE_IN_COMMUNICATION下preferredCommunicationDevice。
4465

被折叠的 条评论
为什么被折叠?



