听筒测试声音从喇叭出

客户反馈了一个问题:工厂测试听筒测试后,麦克风录音播放声音很小;
尝试修改每次在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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值