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

Commit fc354ab

Browse files
taste1981jianjunz
authored andcommitted
Changes for fake audio on headless platform
1 parent d998135 commit fc354ab

File tree

3 files changed

+92
-10
lines changed

3 files changed

+92
-10
lines changed

media/engine/webrtc_voice_engine.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "media/engine/webrtc_media_engine.h"
3434
#include "modules/async_audio_processing/async_audio_processing.h"
3535
#include "modules/audio_device/audio_device_impl.h"
36+
#include "modules/audio_device/include/fake_audio_device.h"
3637
#include "modules/audio_mixer/audio_mixer_impl.h"
3738
#include "modules/audio_processing/aec_dump/aec_dump_factory.h"
3839
#include "modules/audio_processing/include/audio_processing.h"
@@ -358,6 +359,9 @@ void WebRtcVoiceEngine::Init() {
358359
webrtc::AudioDeviceModule::kPlatformDefaultAudio, task_queue_factory_);
359360
}
360361
#endif // WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE
362+
if (!adm_) {
363+
adm_ = new rtc::RefCountedObject<webrtc::FakeAudioDeviceModule>();
364+
}
361365
RTC_CHECK(adm());
362366
webrtc::adm_helpers::Init(adm());
363367

modules/audio_device/include/audio_device_default.h

Lines changed: 84 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@
1111
#ifndef MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_DEFAULT_H_
1212
#define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_DEFAULT_H_
1313

14+
#include "modules/audio_device/audio_device_buffer.h"
1415
#include "modules/audio_device/include/audio_device.h"
16+
#include "api/task_queue/default_task_queue_factory.h"
17+
#include "api/task_queue/task_queue_factory.h"
18+
#include "rtc_base/critical_section.h"
19+
#include "rtc_base/platform_thread.h"
20+
#include "rtc_base/time_utils.h"
21+
#include "system_wrappers/include/sleep.h"
1522

1623
namespace webrtc {
1724
namespace webrtc_impl {
@@ -22,11 +29,15 @@ namespace webrtc_impl {
2229
template <typename T>
2330
class AudioDeviceModuleDefault : public T {
2431
public:
25-
AudioDeviceModuleDefault() {}
32+
AudioDeviceModuleDefault() {
33+
task_queue_factory = webrtc::CreateDefaultTaskQueueFactory();
34+
audio_device_buffer.reset(new AudioDeviceBuffer(task_queue_factory.get()));
35+
playout_frames_in_10ms = 48000 / 100;
36+
}
2637
virtual ~AudioDeviceModuleDefault() {}
2738

2839
int32_t RegisterAudioCallback(AudioTransport* audioCallback) override {
29-
return 0;
40+
return audio_device_buffer->RegisterAudioCallback(audioCallback);
3041
}
3142
int32_t Init() override { return 0; }
3243
int32_t InitSpeaker() override { return 0; }
@@ -36,7 +47,17 @@ class AudioDeviceModuleDefault : public T {
3647
return 0;
3748
}
3849
int32_t SetStereoPlayout(bool enable) override { return 0; }
39-
int32_t StopPlayout() override { return 0; }
50+
int32_t StopPlayout() override {
51+
{
52+
rtc::CritScope lock(&_critSect);
53+
playing = false;
54+
}
55+
if (play_thread.get()) {
56+
play_thread->Stop();
57+
play_thread.reset();
58+
}
59+
return 0;
60+
}
4061
int32_t InitMicrophone() override { return 0; }
4162
int32_t SetRecordingDevice(uint16_t index) override { return 0; }
4263
int32_t SetRecordingDevice(
@@ -65,16 +86,35 @@ class AudioDeviceModuleDefault : public T {
6586
char guid[kAdmMaxGuidSize]) override {
6687
return 0;
6788
}
68-
int32_t PlayoutIsAvailable(bool* available) override { return 0; }
69-
int32_t InitPlayout() override { return 0; }
89+
int32_t PlayoutIsAvailable(bool* available) override {
90+
*available = true;
91+
return 0;
92+
}
93+
int32_t InitPlayout() override {
94+
rtc::CritScope lock(&_critSect);
95+
if (audio_device_buffer.get()) {
96+
audio_device_buffer->SetPlayoutSampleRate(48000);
97+
audio_device_buffer->SetPlayoutChannels(2);
98+
}
99+
return 0;
100+
}
70101
bool PlayoutIsInitialized() const override { return true; }
71102
int32_t RecordingIsAvailable(bool* available) override { return 0; }
72103
int32_t InitRecording() override { return 0; }
73104
bool RecordingIsInitialized() const override { return true; }
74-
int32_t StartPlayout() override { return 0; }
75-
bool Playing() const override { return false; }
105+
int32_t StartPlayout() override {
106+
if (playing)
107+
return 0;
108+
109+
playing = true;
110+
play_thread.reset(new rtc::PlatformThread(PlayThreadFunc,
111+
this, "fake_audio_play_thread", rtc::kRealtimePriority));
112+
play_thread->Start();
113+
return 0;
114+
}
115+
bool Playing() const override { return playing; }
76116
int32_t StartRecording() override { return 0; }
77-
bool Recording() const override { return false; }
117+
bool Recording() const override { return true; }
78118
bool SpeakerIsInitialized() const override { return true; }
79119
bool MicrophoneIsInitialized() const override { return true; }
80120
int32_t SpeakerVolumeIsAvailable(bool* available) override { return 0; }
@@ -94,12 +134,12 @@ class AudioDeviceModuleDefault : public T {
94134
int32_t SetMicrophoneMute(bool enable) override { return 0; }
95135
int32_t MicrophoneMute(bool* enabled) const override { return 0; }
96136
int32_t StereoPlayoutIsAvailable(bool* available) const override {
97-
*available = false;
137+
*available = true;
98138
return 0;
99139
}
100140
int32_t StereoPlayout(bool* enabled) const override { return 0; }
101141
int32_t StereoRecordingIsAvailable(bool* available) const override {
102-
*available = false;
142+
*available = true;
103143
return 0;
104144
}
105145
int32_t StereoRecording(bool* enabled) const override { return 0; }
@@ -116,6 +156,40 @@ class AudioDeviceModuleDefault : public T {
116156

117157
int32_t GetPlayoutUnderrunCount() const override { return -1; }
118158

159+
bool PlayThreadProcess() {
160+
if (!playing)
161+
return false;
162+
int64_t current_time = rtc::TimeMillis();
163+
164+
_critSect.Enter();
165+
if (last_call_millis == 0 ||
166+
current_time - last_call_millis >= 10) {
167+
_critSect.Leave();
168+
audio_device_buffer->RequestPlayoutData(playout_frames_in_10ms);
169+
_critSect.Enter();
170+
last_call_millis = current_time;
171+
}
172+
_critSect.Leave();
173+
int64_t delta_time = rtc::TimeMillis() - current_time;
174+
if (delta_time < 10) {
175+
SleepMs(10 - delta_time);
176+
}
177+
return true;
178+
}
179+
180+
static void PlayThreadFunc(void* pThis) {
181+
AudioDeviceModuleDefault* device = static_cast<AudioDeviceModuleDefault*>(pThis);
182+
while (device->PlayThreadProcess()) {
183+
}
184+
}
185+
std::unique_ptr<AudioDeviceBuffer> audio_device_buffer;
186+
std::unique_ptr<rtc::PlatformThread> play_thread;
187+
size_t playout_frames_in_10ms;
188+
rtc::CriticalSection _critSect;
189+
bool playing = false;
190+
int64_t last_call_millis = 0;
191+
std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory;
192+
119193
#if defined(WEBRTC_IOS)
120194
int GetPlayoutAudioParameters(AudioParameters* params) const override {
121195
return -1;

modules/audio_processing/audio_processing_impl.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,6 +1790,9 @@ void AudioProcessingImpl::InitializeHighPassFilter(bool forced_reset) {
17901790
}
17911791

17921792
void AudioProcessingImpl::InitializeEchoController() {
1793+
#if defined(WEBRTC_LINUX)
1794+
return;
1795+
#else
17931796
bool use_echo_controller =
17941797
echo_control_factory_ ||
17951798
(config_.echo_canceller.enabled && !config_.echo_canceller.mobile_mode);
@@ -1866,6 +1869,7 @@ void AudioProcessingImpl::InitializeEchoController() {
18661869

18671870
submodules_.echo_control_mobile.reset();
18681871
aecm_render_signal_queue_.reset();
1872+
#endif
18691873
}
18701874

18711875
void AudioProcessingImpl::InitializeGainController1() {

0 commit comments

Comments
 (0)