Skip to content

Commit

Permalink
DummyAudioMixer について追記
Browse files Browse the repository at this point in the history
  • Loading branch information
tnoho committed Aug 26, 2023
1 parent 83279e4 commit e4863cf
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 2 deletions.
15 changes: 13 additions & 2 deletions src/dummy_audio_mixer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,14 @@ void DummyAudioMixer::Mix(size_t number_of_channels,
webrtc::AudioFrame* audio_frame_for_mixing) {
webrtc::MutexLock lock(&mutex_);
for (auto& source_and_status : audio_source_list_) {
// 第一引数の設定値にサンプリングレートがリサンプリングされる
// -1 を指定するとリサンプリングされなくなる
/**
* webrtc::AudioTrackSinkInterface の OnData はこの関数内で呼ばれる
*
* 第一引数の設定値にサンプリングレートがリサンプリングされるが、
* -1 を指定するとリサンプリングされなくなる。
* SoraAudioSinkImpl の OnData 内でリサンプリングするため、
* ここでは -1 を指定している。
*/
source_and_status->audio_source->GetAudioFrameWithInfo(
-1, &source_and_status->audio_frame);
}
Expand All @@ -41,6 +47,11 @@ void DummyAudioMixer::RemoveSource(Source* audio_source) {

DummyAudioMixer::DummyAudioMixer(webrtc::TaskQueueFactory* task_queue_factory)
: task_queue_factory_(task_queue_factory) {
/**
* 通常 webrtc::AudioMixer の Mix は音声出力デバイスのループで呼ばれるが、
* sora::SoraClientContextConfig::use_audio_device を false にした際に設定される、
* webrtc::AudioDeviceDummy はループを回さないため、ここでループを作ることとした。
*/
task_queue_ =
std::make_unique<rtc::TaskQueue>(task_queue_factory_->CreateTaskQueue(
"TestAudioDeviceModuleImpl",
Expand Down
12 changes: 12 additions & 0 deletions src/dummy_audio_mixer.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,18 @@
#include <rtc_base/task_utils/repeating_task.h>
#include <rtc_base/thread_annotations.h>

/**
* webrtc::AudioMixer を継承した DummyAudioMixer です。
*
* PeerConnectionFactory 生成時に渡す cricket::MediaEngineDependencies の
* audio_mixer を指定しない場合 webrtc::AudioMixerImpl が使用されます。
* これはすべての AudioTrack の出力データのサンプリングレートとチャネル数を揃え、
* ミキシングした上で音声出力デバイスに渡す役割を担います。
* しかし、 Python SDK では音声をデバイスに出力することはありません。
* ですが、 AudioTrack からデータを受け取る AudioSinkInterface::OnData は
* AudioMixer により駆動されているため、 AudioSinkInterface::OnData を呼び出す仕組みだけを持つ
* シンプルな webrtc::AudioMixer になっています。
*/
class DummyAudioMixer : public webrtc::AudioMixer {
public:
struct SourceStatus;
Expand Down
3 changes: 3 additions & 0 deletions src/sora_factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ SoraFactory::SoraFactory(std::optional<bool> use_hardware_encoder,
#endif

sora::SoraClientContextConfig context_config;
// Audio デバイスは使わない、 use_audio_device を true にしただけでデバイスを掴んでしまうので常に false
context_config.use_audio_device = false;
if (use_hardware_encoder) {
context_config.use_hardware_encoder = *use_hardware_encoder;
Expand All @@ -44,8 +45,10 @@ SoraFactory::SoraFactory(std::optional<bool> use_hardware_encoder,
[use_hardware_encoder = context_config.use_hardware_encoder, openh264](
const webrtc::PeerConnectionFactoryDependencies& dependencies,
cricket::MediaEngineDependencies& media_dependencies) {
// 通常の AudioMixer を使うと use_audio_device が false のとき、音声のループは全て止まってしまうので自前の AudioMixer を使う
media_dependencies.audio_mixer =
DummyAudioMixer::Create(media_dependencies.task_queue_factory);
// アンチエコーやゲインコントロール、ノイズサプレッションが必要になる用途は想定していないため nullptr
media_dependencies.audio_processing = nullptr;

#ifndef _WIN32
Expand Down

0 comments on commit e4863cf

Please sign in to comment.