android audio 音量設定分析

2021-07-10 02:00:35 字數 2231 閱讀 7644

audiod 中經常遇到的場景是音量調整與輸出裝置的切換,下面兩篇文章 針對這兩個場景分別分析一下

1,音量調整場景

android 音量調整,可以使用兩種方式: 

軟體mixer的時候修改pcm data  

控制dac硬體的增益

第一種情況,如果是多路mix的情況,就是mixerthread進行軟體mixer,然後在mixer計算的時候來縮放pcm data,

首先,jni層呼叫了audioflinger::setstreamvolume。

status_t audioflinger::setstreamvolume(audio_stream_type_t stream, float value,

audio_io_handle_t output)

}if (thread == null)

} else

return no_error;

}

可以看到,最終是呼叫了playbackthread::setstreamvolume來繼續設定音量

void audioflinger::playbackthread::setstreamvolume(audio_stream_type_t stream, float value)

audioflinger::playbackthread::mixer_state audioflinger::mixerthread::preparetracks_l()

可以看到上述函式把引數設定到了audiomixer裡面,在audiomixer章節裡面,

我們介紹過在audiomixer的實際操作函式是track__16bitsstereo這種函式,

對track__16bitsstereo的分析中,我們可以看到根據音量對pcm data進行實際的縮放

不再繼續贅述了。

對於第二種方式,控制dac硬體的增益,主要用在了directoutputthread,中,因為directoutputthread只有一路音訊,直接寫入hal層,直接寫入硬體的,

所以需要直接呼叫硬體dac晶元的控制介面來調整音量。

其主要流程如下:

和mixerthread的流程一樣,上層在呼叫了audioflinger::setstreamvolume之後,會呼叫preparetracks_l函式

audioflinger::playbackthread::mixer_state audioflinger::directoutputthread::preparetracks_l(

vector< sp> *trackstoremove

)

at章節中,我們提到過preparetracks_l函式,其中會呼叫processvolume_l來處理音量

void audioflinger::directoutputthread::processvolume_l(track *track, bool lasttrack)}}

}

moutput->stream->set_volume實際上呼叫的是 libhardware_legacy中的函式

static int out_set_volume(struct audio_stream_out *stream, float left,  //呼叫libhardware_legacy中的函式

float right)

然後就進入了hal層**,hal層**中最終呼叫了 ioctl(ctl->mixer->fd, sndrv_ctl_ioctl_elem_write, &ev);

寫入驅動

由於商業機密,hal層**不能貼出來。

到了核心中,則是按照以下呼叫序列,最終通過iic匯流排,將音量控制命令寫入了dac晶元中

ioctl(ctl->mixer->fd, sndrv_ctl_ioctl_elem_write, &ev);

snd_ctl_elem_write_user

snd_ctl_elem_write_user

snd_ctl_elem_write

wm8523_controls

snd_soc_put_volsw

snd_soc_update_bits_locked

iic匯流排寫入命令

關於驅動的流程我們在這裡不展開講,後續會單獨講解

android audio系統簡記

audiotrack audioflinger audiopolicysevice 當audiopolicymanagerbase構造時,它會根據使用者提供的audio policy.conf來分析系統中有哪些audio inte ce primary,a2dp以及usb 然後通過audioflin...

Android Audio音訊通路 七

例如 deep buffer playback speaker 通路中的路由控制項 1 deep buffer usacase 對應的 fe pcm quat mi2s rx speaker device所連線的be dai audio mixer 表示dsp路由功能 value 1 表示連線 va...

Windows音量變化通知 系統音量監控

總結參考 本次使用win32 api的endpoint volume controls實現當系統音量變化時程式收到通知,環境為win10 64位。實現iaudioendpointvolumecallback介面,重點是onnotify方法。epvolume.h include include inc...