Android Audio HAL 介面介紹之 adev_set_parameters()和out_set_parameters()

hdzhang429發表於2018-03-16

前言

這幾天一直再解決BUG,是兩個usease同時存在的場景,插入耳機來實現音訊切換的問題。有Recroding+HFP_Call場景,有兩個Recording同時存在的場景。當插入有線耳機後,音訊裝置切換出現問題。由於有HFP Call,所有就涉及了 adev_set_parameters(),HFP的開始和停止都是通過它來控制的。插入耳機後,音訊裝置切換時通過out_set_parameters()來控制的。之前沒怎麼太注意,為了解決BUG,詳細的跟蹤這兩個介面的實現和呼叫流程。

1. adev_set_parameters()

在HAL模組在AudioFlinger裡被載入時,在adev_open()中實現和AudioFlinger中set_parameters()關聯的。如果應用程式中要呼叫set_parameters()介面,需要匯入AudioManager。他們供應用程式呼叫的標準介面。這個介面一般被用來控制feature的開啟和關閉。我們可以根據自己專案的需求來定製自己的功能控制。在我所經歷的專案中,這個介面使用的頻率是很高的,如果想控制某些功能的關閉和開啟,推薦使用這個介面。具體的程式碼就不貼在這裡,太多了影響閱讀效率,可以自己找資源檢視。

static struct hw_module_methods_t hal_module_methods = {
    .open = adev_open,
};
    adev->device.init_check = adev_init_check;
    adev->device.set_voice_volume = adev_set_voice_volume;
    adev->device.set_master_volume = adev_set_master_volume;
    adev->device.get_master_volume = adev_get_master_volume;
    adev->device.set_master_mute = adev_set_master_mute;
    adev->device.get_master_mute = adev_get_master_mute;
    adev->device.set_mode = adev_set_mode;
    adev->device.set_mic_mute = adev_set_mic_mute;
    adev->device.get_mic_mute = adev_get_mic_mute;
    adev->device.set_parameters = adev_set_parameters;
    adev->device.get_parameters = adev_get_parameters;
    adev->device.get_input_buffer_size = adev_get_input_buffer_size;
    adev->device.open_output_stream = adev_open_output_stream;
    adev->device.close_output_stream = adev_close_output_stream;
    adev->device.open_input_stream = adev_open_input_stream;
    adev->device.close_input_stream = adev_close_input_stream;
    adev->device.dump = adev_dump;

2.out_set_parameters()

這個介面主要是在AudioPolicyManager中被呼叫,在有新裝置被連線後,在AudioPolicyManager會為所有的輸出和輸入流做裝置切換,如果需要做裝置切換就呼叫set_parameters()介面。在Thread.cpp中會呼叫到audio HAL層去切換音訊裝置。這介面第三方應用軟體是無法使用的。

AudioParameter inputCmd = AudioParameter();
ALOGV("%s: inform input %d of device:%d", __func__,
                      inputDescriptor->mIoHandle, device);
inputCmd.addInt(String8(AudioParameter::keyRouting),device);
                mpClientInterface->setParameters(inputDescriptor->mIoHandle,inputCmd.toString(),delayMs);
AudioParameter param = AudioParameter(String8(address));
free(address);
param.addInt(String8(AUDIO_PARAMETER_STREAM_ROUTING), (int)type);
status = mOutput->stream->common.set_parameters(&mOutput->stream->common,param.toString().string());
*out = (struct stream_out *)calloc(1, sizeof(struct stream_out));*
*out->stream.common.set_parameters = out_set_parameters;*

相關文章