为什么要设置通道个数?
告诉系统输出设备的使用通道个数,假如扬声器是4声道,设置通道个数为2,则会有2个声道没有声音。
立体声还是单声道?
源码分析
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\media\engine\adm_helpers.cc
void Init(AudioDeviceModule* adm) 方法
webrtc::adm_helpers::Init
void Init(AudioDeviceModule* adm) {
**
// Set number of channels
bool available = false;
if (adm->StereoPlayoutIsAvailable(&available) != 0) {
RTC_LOG(LS_ERROR) << "Failed to query stereo playout.";
}
if (adm->SetStereoPlayout(available) != 0) {
RTC_LOG(LS_ERROR) << "Failed to set stereo playout mode.";
}
***
}
adm->StereoPlayoutIsAvailable(&available)
->
int32_t AudioDeviceModuleImpl::StereoRecordingIsAvailable(bool* available) const {
**
bool isAvailable = false;
if (audio_device_->StereoRecordingIsAvailable(isAvailable) == -1) {
return -1;
}
*available = isAvailable;
***
==
}
->
int32_t AudioDeviceWindowsCore::StereoRecordingIsAvailable(bool& available) {
available = true;
return 0;
}
adm->SetStereoPlayout(available)
AudioDeviceModuleImpl::SetStereoPlayout
int32_t AudioDeviceModuleImpl::SetStereoPlayout(bool enable) {
RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
CHECKinitialized_();
// 上节课的 AudioDeviceWindowsCore::InitSpeakerLocked成功后,该函数就会返回true
// 主要返回的是_speakerIsInitialized变量值
if (audio_device_->PlayoutIsInitialized()) {
RTC_LOG(LERROR)
<< "unable to set stereo mode while playing side is initialized";
return -1;
}
if (audio_device_->SetStereoPlayout(enable)) {
RTC_LOG(WARNING) << "stereo playout is not supported";
return -1;
}
int8_t nChannels(1);
if (enable) {
nChannels = 2;
}
// buffer会根据通道的数量来计算大小
audio_device_buffer_.SetPlayoutChannels(nChannels);
return 0;
}
audiodevice->SetStereoPlayout(enable),enable正常是true
int32_t AudioDeviceWindowsCore::SetStereoPlayout(bool enable) {
MutexLock lock(&mutex_);
if (enable) {
_playChannelsPrioList[0] = 2; // try stereo first
_playChannelsPrioList[1] = 1;
_playChannels = 2;
} else {
_playChannelsPrioList[0] = 1; // try mono first
_playChannelsPrioList[1] = 2;
_playChannels = 1;
}
return 0;
}