audiod 中经常遇到的场景是音量调整与输出设备的切换,下面两篇文章 针对这两个场景分别分析一下
1,音量调整场景
android 音量调整,可以使用两种方式:
软件mixer的时候修改PCM data
控制DAC硬件的增益
第一种情况,如果是多路mix的情况,就是MixerThread进行软件mixer,然后在mixer计算的时候来缩放PCM data,
首先,JNI层调用了AudioFlinger::setStreamVolume。
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)
{
AutoMutex lock(mLock);
PlaybackThread *thread = NULL;
if (output) {
thread = checkPlaybackThread_l(output); //获得对应的PlaybackThread
if (thread == NULL) {
return BAD_VALUE;
}
}
if (thread == NULL) {
for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
mPlaybackThreads.valueAt(i)->setStreamVolume(stream, value);
}
} else {
thread->setStreamVolume(stream, va