为什么要设置通道个数?

告诉系统输出设备的使用通道个数,假如扬声器是4声道,设置通道个数为2,则会有2个声道没有声音。

立体声还是单声道?

image.png

源码分析

H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\media\engine\adm_helpers.cc
void Init(AudioDeviceModule* adm) 方法

webrtc::adm_helpers::Init

  1. void Init(AudioDeviceModule* adm) {
  2. **
  3. // Set number of channels
  4. bool available = false;
  5. if (adm->StereoPlayoutIsAvailable(&available) != 0) {
  6. RTC_LOG(LS_ERROR) << "Failed to query stereo playout.";
  7. }
  8. if (adm->SetStereoPlayout(available) != 0) {
  9. RTC_LOG(LS_ERROR) << "Failed to set stereo playout mode.";
  10. }
  11. ***
  12. }
  13. adm->StereoPlayoutIsAvailable(&available)
  14. ->
  15. int32_t AudioDeviceModuleImpl::StereoRecordingIsAvailable(bool* available) const {
  16. **
  17. bool isAvailable = false;
  18. if (audio_device_->StereoRecordingIsAvailable(isAvailable) == -1) {
  19. return -1;
  20. }
  21. *available = isAvailable;
  22. ***
  23. ==
  24. }
  25. ->
  26. int32_t AudioDeviceWindowsCore::StereoRecordingIsAvailable(bool& available) {
  27. available = true;
  28. return 0;
  29. }

adm->SetStereoPlayout(available)

AudioDeviceModuleImpl::SetStereoPlayout

  1. int32_t AudioDeviceModuleImpl::SetStereoPlayout(bool enable) {
  2. RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
  3. CHECKinitialized_();
  4. // 上节课的 AudioDeviceWindowsCore::InitSpeakerLocked成功后,该函数就会返回true
  5. // 主要返回的是_speakerIsInitialized变量值
  6. if (audio_device_->PlayoutIsInitialized()) {
  7. RTC_LOG(LERROR)
  8. << "unable to set stereo mode while playing side is initialized";
  9. return -1;
  10. }
  11. if (audio_device_->SetStereoPlayout(enable)) {
  12. RTC_LOG(WARNING) << "stereo playout is not supported";
  13. return -1;
  14. }
  15. int8_t nChannels(1);
  16. if (enable) {
  17. nChannels = 2;
  18. }
  19. // buffer会根据通道的数量来计算大小
  20. audio_device_buffer_.SetPlayoutChannels(nChannels);
  21. return 0;
  22. }

audiodevice->SetStereoPlayout(enable),enable正常是true

  1. int32_t AudioDeviceWindowsCore::SetStereoPlayout(bool enable) {
  2. MutexLock lock(&mutex_);
  3. if (enable) {
  4. _playChannelsPrioList[0] = 2; // try stereo first
  5. _playChannelsPrioList[1] = 1;
  6. _playChannels = 2;
  7. } else {
  8. _playChannelsPrioList[0] = 1; // try mono first
  9. _playChannelsPrioList[1] = 2;
  10. _playChannels = 1;
  11. }
  12. return 0;
  13. }