Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit bf53054

Browse files
authored
Add CustomizedOutputAudioDeviceModule. (#669)
This allows audio data received to be routed to implementations of AudioPlayerInterface without depending on platform audio module.
1 parent d189a08 commit bf53054

File tree

4 files changed

+154
-2
lines changed

4 files changed

+154
-2
lines changed

talk/owt/BUILD.gn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ static_library("owt_sdk_base") {
123123
"sdk/base/customizedaudiocapturer.h",
124124
"sdk/base/customizedaudiodevicemodule.cc",
125125
"sdk/base/customizedaudiodevicemodule.h",
126+
"sdk/base/customizedoutputaudiodevicemodule.cc",
127+
"sdk/base/customizedoutputaudiodevicemodule.h",
126128
"sdk/base/deviceutils.cc",
127129
"sdk/base/encodedstreamproviderwrapper.cc",
128130
"sdk/base/encodedstreamproviderwrapper.h",

talk/owt/sdk/base/customizedaudiodevicemodule.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "talk/owt/sdk/base/customizedaudiodevicemodule.h"
1212
#include "talk/owt/sdk/base/customizedaudiocapturer.h"
13+
#include "talk/owt/sdk/base/customizedoutputaudiodevicemodule.h"
1314
#include "webrtc/api/make_ref_counted.h"
1415
#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
1516
#include "webrtc/modules/audio_device/audio_device_config.h"
@@ -597,8 +598,8 @@ void CustomizedAudioDeviceModule::CreateOutputAdm() {
597598
_outputAdm = webrtc::AudioDeviceModuleImpl::Create(
598599
AudioDeviceModule::kPlatformDefaultAudio, task_queue_factory_.get());
599600
#else
600-
_outputAdm = rtc::scoped_refptr<webrtc::FakeAudioDeviceModule>(
601-
new rtc::RefCountedObject<webrtc::FakeAudioDeviceModule>());
601+
_outputAdm = rtc::scoped_refptr<CustomizedOutputAudioDeviceModule>(
602+
new rtc::RefCountedObject<CustomizedOutputAudioDeviceModule>());
602603
#endif
603604
}
604605
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// Copyright (C) <2023> Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#include "talk/owt/sdk/base/customizedoutputaudiodevicemodule.h"
6+
#include "rtc_base/platform_thread.h"
7+
#include "third_party/webrtc/api/task_queue/default_task_queue_factory.h"
8+
#include "third_party/webrtc/rtc_base/time_utils.h"
9+
#include "third_party/webrtc/system_wrappers/include/sleep.h"
10+
11+
namespace owt {
12+
namespace base {
13+
CustomizedOutputAudioDeviceModule::CustomizedOutputAudioDeviceModule()
14+
: task_queue_factory_(webrtc::CreateDefaultTaskQueueFactory()),
15+
audio_device_buffer_(
16+
new webrtc::AudioDeviceBuffer(task_queue_factory_.get())),
17+
playout_frames_in_10ms_(48000 / 100) {}
18+
19+
int32_t CustomizedOutputAudioDeviceModule::RegisterAudioCallback(
20+
webrtc::AudioTransport* audioCallback) {
21+
return audio_device_buffer_->RegisterAudioCallback(audioCallback);
22+
}
23+
24+
int32_t CustomizedOutputAudioDeviceModule::StopPlayout() {
25+
{
26+
const std::lock_guard<std::mutex> lock(mutex_);
27+
playing_ = false;
28+
}
29+
if (play_thread_.get()) {
30+
play_thread_->Finalize();
31+
play_thread_.reset();
32+
}
33+
return 0;
34+
}
35+
36+
int32_t CustomizedOutputAudioDeviceModule::PlayoutIsAvailable(bool* available) {
37+
*available = true;
38+
return 0;
39+
}
40+
41+
int32_t CustomizedOutputAudioDeviceModule::InitPlayout() {
42+
const std::lock_guard<std::mutex> lock(mutex_);
43+
if (audio_device_buffer_.get()) {
44+
audio_device_buffer_->SetPlayoutSampleRate(48000);
45+
audio_device_buffer_->SetPlayoutChannels(2);
46+
}
47+
return 0;
48+
}
49+
50+
bool CustomizedOutputAudioDeviceModule::PlayThreadProcess() {
51+
if (!playing_)
52+
return false;
53+
int64_t current_time = rtc::TimeMillis();
54+
55+
mutex_.lock();
56+
if (last_call_millis_ == 0 || current_time - last_call_millis_ >= 10) {
57+
mutex_.unlock();
58+
audio_device_buffer_->RequestPlayoutData(playout_frames_in_10ms_);
59+
mutex_.lock();
60+
last_call_millis_ = current_time;
61+
}
62+
mutex_.unlock();
63+
int64_t delta_time = rtc::TimeMillis() - current_time;
64+
if (delta_time < 10) {
65+
webrtc::SleepMs(10 - delta_time);
66+
}
67+
return true;
68+
}
69+
70+
int32_t CustomizedOutputAudioDeviceModule::StartPlayout() {
71+
if (playing_)
72+
return 0;
73+
74+
playing_ = true;
75+
play_thread_ =
76+
std::make_unique<rtc::PlatformThread>(rtc::PlatformThread::SpawnJoinable(
77+
[this] {
78+
while (PlayThreadProcess()) {
79+
}
80+
},
81+
"fake_audio_play_thread",
82+
rtc::ThreadAttributes().SetPriority(rtc::ThreadPriority::kRealtime)));
83+
return 0;
84+
}
85+
86+
bool CustomizedOutputAudioDeviceModule::Playing() const {
87+
return playing_;
88+
}
89+
90+
bool CustomizedOutputAudioDeviceModule::Recording() const {
91+
return true;
92+
}
93+
94+
int32_t CustomizedOutputAudioDeviceModule::StereoPlayoutIsAvailable(
95+
bool* available) const {
96+
*available = true;
97+
return 0;
98+
}
99+
100+
int32_t CustomizedOutputAudioDeviceModule::StereoRecordingIsAvailable(
101+
bool* available) const {
102+
*available = true;
103+
return 0;
104+
}
105+
106+
} // namespace base
107+
} // namespace owt
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (C) <2023> Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#ifndef OWT_BASE_CUSTOMIZEDOUTPUTAUDIODEVICEMODULE_H_
6+
#define OWT_BASE_CUSTOMIZEDOUTPUTAUDIODEVICEMODULE_H_
7+
8+
#include <mutex>
9+
#include "third_party/webrtc/modules/audio_device/audio_device_buffer.h"
10+
#include "third_party/webrtc/modules/audio_device/include/fake_audio_device.h"
11+
#include "third_party/webrtc/rtc_base/platform_thread.h"
12+
13+
namespace owt {
14+
namespace base {
15+
class CustomizedOutputAudioDeviceModule : public webrtc::FakeAudioDeviceModule {
16+
public:
17+
CustomizedOutputAudioDeviceModule();
18+
int32_t RegisterAudioCallback(webrtc::AudioTransport* audioCallback) override;
19+
int32_t StopPlayout() override;
20+
int32_t PlayoutIsAvailable(bool* available) override;
21+
int32_t InitPlayout() override;
22+
int32_t StartPlayout() override;
23+
bool Playing() const override;
24+
bool Recording() const override;
25+
int32_t StereoPlayoutIsAvailable(bool* available) const override;
26+
int32_t StereoRecordingIsAvailable(bool* available) const override;
27+
28+
private:
29+
bool PlayThreadProcess();
30+
31+
std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
32+
std::unique_ptr<webrtc::AudioDeviceBuffer> audio_device_buffer_;
33+
std::unique_ptr<rtc::PlatformThread> play_thread_;
34+
size_t playout_frames_in_10ms_;
35+
bool playing_ = false;
36+
int64_t last_call_millis_ = 0;
37+
std::mutex mutex_;
38+
};
39+
} // namespace base
40+
} // namespace owt
41+
42+
#endif

0 commit comments

Comments
 (0)