11
11
#ifndef MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_DEFAULT_H_
12
12
#define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_DEFAULT_H_
13
13
14
+ #include " modules/audio_device/audio_device_buffer.h"
14
15
#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"
15
22
16
23
namespace webrtc {
17
24
namespace webrtc_impl {
@@ -22,11 +29,15 @@ namespace webrtc_impl {
22
29
template <typename T>
23
30
class AudioDeviceModuleDefault : public T {
24
31
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
+ }
26
37
virtual ~AudioDeviceModuleDefault () {}
27
38
28
39
int32_t RegisterAudioCallback (AudioTransport* audioCallback) override {
29
- return 0 ;
40
+ return audio_device_buffer-> RegisterAudioCallback (audioCallback) ;
30
41
}
31
42
int32_t Init () override { return 0 ; }
32
43
int32_t InitSpeaker () override { return 0 ; }
@@ -36,7 +47,17 @@ class AudioDeviceModuleDefault : public T {
36
47
return 0 ;
37
48
}
38
49
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
+ }
40
61
int32_t InitMicrophone () override { return 0 ; }
41
62
int32_t SetRecordingDevice (uint16_t index) override { return 0 ; }
42
63
int32_t SetRecordingDevice (
@@ -65,16 +86,35 @@ class AudioDeviceModuleDefault : public T {
65
86
char guid[kAdmMaxGuidSize ]) override {
66
87
return 0 ;
67
88
}
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
+ }
70
101
bool PlayoutIsInitialized () const override { return true ; }
71
102
int32_t RecordingIsAvailable (bool * available) override { return 0 ; }
72
103
int32_t InitRecording () override { return 0 ; }
73
104
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; }
76
116
int32_t StartRecording () override { return 0 ; }
77
- bool Recording () const override { return false ; }
117
+ bool Recording () const override { return true ; }
78
118
bool SpeakerIsInitialized () const override { return true ; }
79
119
bool MicrophoneIsInitialized () const override { return true ; }
80
120
int32_t SpeakerVolumeIsAvailable (bool * available) override { return 0 ; }
@@ -94,12 +134,12 @@ class AudioDeviceModuleDefault : public T {
94
134
int32_t SetMicrophoneMute (bool enable) override { return 0 ; }
95
135
int32_t MicrophoneMute (bool * enabled) const override { return 0 ; }
96
136
int32_t StereoPlayoutIsAvailable (bool * available) const override {
97
- *available = false ;
137
+ *available = true ;
98
138
return 0 ;
99
139
}
100
140
int32_t StereoPlayout (bool * enabled) const override { return 0 ; }
101
141
int32_t StereoRecordingIsAvailable (bool * available) const override {
102
- *available = false ;
142
+ *available = true ;
103
143
return 0 ;
104
144
}
105
145
int32_t StereoRecording (bool * enabled) const override { return 0 ; }
@@ -116,6 +156,40 @@ class AudioDeviceModuleDefault : public T {
116
156
117
157
int32_t GetPlayoutUnderrunCount () const override { return -1 ; }
118
158
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
+
119
193
#if defined(WEBRTC_IOS)
120
194
int GetPlayoutAudioParameters (AudioParameters* params) const override {
121
195
return -1 ;
0 commit comments