Reputation: 44765
I'm porting AOSP (Android 10) to a new device. Audio is working. Call audio is not working.
My audio_policy_configuration.xml is currently:
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
<globalConfiguration speaker_drc_enabled="true"/>
<modules>
<module name="primary" halVersion="2.0">
<attachedDevices>
<item>Speaker</item>
<item>Built-In Mic</item>
<item>Telephony Rx</item>
<item>Telephony Tx</item>
</attachedDevices>
<defaultOutputDevice>Speaker</defaultOutputDevice>
<mixPorts>
<mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="hdmi output" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="32000,44100,48000,88200,96000,176400,192000" channelMasks="AUDIO_CHANNEL_NONE"/>
</mixPort>
<mixPort name="esai output" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000,96000,192000,384000,768000"
channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_FLOAT"
samplingRates="48000,96000,192000,384000,768000"
channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
</mixPort>
<mixPort name="dsd output" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD">
<profile name="" format="AUDIO_FORMAT_DSD"
samplingRates="2822400,5644800,11289600,22579200" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="primary input" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,11025,16000,22050,24000,32000,44100,48000"
channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
</mixPort>
<mixPort name="voice_tx" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="16000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="voice_rx" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="16000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
</mixPort>
</mixPorts>
<devicePorts>
<devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink" >
</devicePort>
<devicePort tagName="Wired Headphones" type="AUDIO_DEVICE_OUT_WIRED_HEADPHONE" role="sink">
</devicePort>
<devicePort tagName="HDMI Out" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink">
</devicePort>
<devicePort tagName="Line-Out" type="AUDIO_DEVICE_OUT_LINE" role="sink">
</devicePort>
<devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
</devicePort>
<devicePort tagName="Line-In" type="AUDIO_DEVICE_IN_AUX_DIGITAL" role="source">
</devicePort>
<devicePort tagName="Telephony Rx" type="AUDIO_DEVICE_IN_TELEPHONY_RX" role="source">
</devicePort>
<devicePort tagName="Telephony Tx" type="AUDIO_DEVICE_OUT_TELEPHONY_TX" role="sink">
</devicePort>
</devicePorts>
<routes>
<route type="mix" sink="Speaker"
sources="primary output"/>
<route type="mix" sink="Wired Headphones"
sources="dsd output,esai output,primary output"/>
<route type="mix" sink="HDMI Out"
sources="hdmi output,primary output"/>
<route type="mix" sink="Line-Out"
sources="dsd output,esai output,primary output"/>
<route type="mix" sink="primary input"
sources="Built-In Mic,Line-In"/>
<route type="mix" sink="Telephony Tx"
sources="voice_tx"/>
<route type="mix" sink="voice_rx"
sources="Telephony Rx"/>
</routes>
</module>
<!-- A2dp Audio HAL -->
<xi:include href="a2dp_audio_policy_configuration.xml"/>
<!-- Usb Audio HAL -->
<xi:include href="usb_audio_policy_configuration.xml"/>
<!-- Remote Submix Audio HAL -->
<xi:include href="r_submix_audio_policy_configuration.xml"/>
</modules>
<!-- Volume section -->
<xi:include href="audio_policy_volumes.xml"/>
<xi:include href="default_volume_tables.xml"/>
</audioPolicyConfiguration>
(I have added the Telephone Tx
/Rx
attachedDevices
and devicePorts
, the voice_tx
/rx
mixPorts
and the Telephony Tx
and voice_rx
routes
.)
The output of logcat | grep audio
is:
<DIAL>
03-29 10:09:36.495 3504 3661 I audio_hw_primary: adev_set_mode mode 2
03-29 10:09:36.495 3504 3661 W audio_hw_primary: Entering IN_CALL state, in_call=0
03-29 10:09:36.495 3504 3661 W audio_hw_primary: no standby
03-29 10:09:36.495 3504 3661 I audio_hw_primary: select_output_device(), headphone 0 ,headset 0 ,speaker 0, earpiece 1,
03-29 10:09:36.591 3504 3661 D audio_hw_primary: out_set_parameters: enter: kvpairs: routing=2
03-29 10:09:36.591 3504 3661 D audio_hw_primary: out_set_parameters: exit: code(0)
03-29 10:09:36.594 3504 3661 D audio_hw_primary: out_set_parameters: enter: kvpairs: routing=2
03-29 10:09:36.594 3504 3661 D audio_hw_primary: out_set_parameters: exit: code(0)
03-29 10:09:36.643 4425 4425 I Dialer : ProximitySensor.updateProximitySensorMode - screenOnImmediately: false, dialPadVisible: false, offHook: false, horizontal: false, uiShowing: false, audioRoute: EARPIECE
03-29 10:09:36.908 4425 4425 I Dialer : ProximitySensor.updateProximitySensorMode - screenOnImmediately: false, dialPadVisible: false, offHook: true, horizontal: false, uiShowing: false, audioRoute: EARPIECE
03-29 10:09:36.910 4425 4425 I Dialer : ProximitySensor.updateProximitySensorMode - screenOnImmediately: false, dialPadVisible: false, offHook: true, horizontal: false, uiShowing: true, audioRoute: EARPIECE
03-29 10:09:37.054 3737 4093 I Telecom : InCallController: Calling onAudioStateChanged, audioState: [AudioState isMuted: false, route: WIRED_HEADSET, supportedRouteMask: WIRED_HEADSET, SPEAKER, activeBluetoothDevice: [null], supportedBluetoothDevices: []] -> [AudioState isMuted: false, route: WIRED_HEADSET, supportedRouteMask: WIRED_HEADSET, SPEAKER, activeBluetoothDevice: [null], supportedBluetoothDevices: []]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->CARSM.pM_UPDATE_SYSTEM_AUDIO_ROUTE@E-E-AGA
03-29 10:09:37.246 4425 4425 I Dialer : ProximitySensor.updateProximitySensorMode - screenOnImmediately: true, dialPadVisible: false, offHook: true, horizontal: false, uiShowing: true, audioRoute: WIRED_HEADSET
03-29 10:09:37.296 4425 4425 I Dialer : InCallFragment.setAudioState - audioState: [AudioState isMuted: false, route: WIRED_HEADSET, supportedRouteMask: WIRED_HEADSET, SPEAKER, activeBluetoothDevice: [null], supportedBluetoothDevices: []]
<ANSWER>
<HUP>
03-29 10:09:59.189 3737 4093 I Telecom : InCallController: Calling onAudioStateChanged, audioState: [AudioState isMuted: false, route: WIRED_HEADSET, supportedRouteMask: WIRED_HEADSET, SPEAKER, activeBluetoothDevice: [null], supportedBluetoothDevices: []] -> [AudioState isMuted: false, route: WIRED_HEADSET, supportedRouteMask: WIRED_HEADSET, SPEAKER, activeBluetoothDevice: [null], supportedBluetoothDevices: []]: CSW.sDc->CARSM.pM_UPDATE_SYSTEM_AUDIO_ROUTE@AO0
03-29 10:09:59.243 4425 4425 I Dialer : ProximitySensor.updateProximitySensorMode - screenOnImmediately: true, dialPadVisible: false, offHook: false, horizontal: false, uiShowing: true, audioRoute: WIRED_HEADSET
03-29 10:09:59.343 3504 5123 I audio_hw_primary: start_output_stream_primary... 0xeb651000, device 2, address , mode 2
03-29 10:09:59.343 3504 5123 I audio_hw_primary: get_card_for_device adev: 0xeb62d000, device: 2, flag: 0, card_index: 0xeb651158
03-29 10:09:59.353 3504 5123 W audio_hw_primary: card 0, port 0 device 0x2
03-29 10:09:59.353 3504 5123 W audio_hw_primary: rate 48000, channel 2 period_size 0xc0
03-29 10:10:00.607 3737 4094 I Telecom : CallAudioModeStateMachine: Abandoning audio focus: now UNFOCUSED: CSW.sDc->ICTP.r->ICTP.cUTP->CAMSM.pM_3002@AO0
03-29 10:10:00.608 3504 3661 I audio_hw_primary: adev_set_mode mode 0
03-29 10:10:00.608 3504 3661 W audio_hw_primary: Leaving IN_CALL state, in_call=1, mode=0
03-29 10:10:00.609 3504 3661 W audio_hw_primary: do_out_standby... 0xeb651000
03-29 10:10:00.609 3504 3661 I audio_hw_primary: select_output_device(), headphone 0 ,headset 0 ,speaker 0, earpiece 1,
03-29 10:10:00.615 3504 5123 I audio_hw_primary: start_output_stream_primary... 0xeb651000, device 2, address , mode 0
03-29 10:10:00.615 3504 5123 I audio_hw_primary: select_output_device(), headphone 0 ,headset 0 ,speaker 0, earpiece 1,
03-29 10:10:00.618 3504 5123 I audio_hw_primary: get_card_for_device adev: 0xeb62d000, device: 2, flag: 0, card_index: 0xeb651158
03-29 10:10:00.623 3504 5123 W audio_hw_primary: card 0, port 0 device 0x2
03-29 10:10:00.623 3504 5123 W audio_hw_primary: rate 48000, channel 2 period_size 0xc0
03-29 10:10:01.776 4425 4425 I Dialer : ProximitySensor.updateProximitySensorMode - screenOnImmediately: true, dialPadVisible: false, offHook: false, horizontal: false, uiShowing: false, audioRoute: WIRED_HEADSET
03-29 10:10:03.607 3504 3661 W audio_hw_primary: do_out_standby... 0xeb651000
^C
I cannot see any errors here.
Nor can I see any indication that the new routes are being used. (There is no audio in calls yet.)
How do I make Android notice the additions to the audio_policy_configuration.xml
and make it use the Telephony Tx
and voice_rx
routed during a call?
Upvotes: 2
Views: 1197
Reputation: 58467
When looking at this example which also has Telephony Tx
and Telephony Rx
ports, one difference compared to your configuration is that it also defines routes from Telephony Rx
to most of the sinks, and from all of the microphones to Telephony Tx
:
<route type="mix" sink="Speaker"
sources="primary output,deep_buffer,compressed_offload,BT SCO Headset Mic,Telephony Rx"/>
<route type="mix" sink="Wired Headset"
sources="primary output,deep_buffer,compressed_offload,BT SCO Headset Mic,Telephony Rx"/>
<route type="mix" sink="Wired Headphones"
sources="primary output,deep_buffer,compressed_offload,BT SCO Headset Mic,Telephony Rx"/>
<route type="mix" sink="Telephony Tx"
sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic,BT SCO Headset Mic"/>
This might be part of what's missing from your configuration in order for the routing to work properly.
For some reason, Telephony Rx
isn't added as a source for the Earpiece
sink. I don't know why that is. Perhaps an oversight(?).
Upvotes: 1
Reputation: 75
If you are using the Agora Android Video SDK then you can use the setDefaultAudioRoutetoSpeakerphone method
Upvotes: 0