Index: remoting/protocol/webrtc_audio_module.h |
diff --git a/content/renderer/media/webrtc_audio_device_not_impl.h b/remoting/protocol/webrtc_audio_module.h |
similarity index 58% |
copy from content/renderer/media/webrtc_audio_device_not_impl.h |
copy to remoting/protocol/webrtc_audio_module.h |
index e9a98f0e71050265470f32009c8afa2ee33a1a50..52f00c31d400091123d7d2dd36482432a74be28b 100644 |
--- a/content/renderer/media/webrtc_audio_device_not_impl.h |
+++ b/remoting/protocol/webrtc_audio_module.h |
@@ -1,46 +1,50 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_NOT_IMPL_H_ |
-#define CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_NOT_IMPL_H_ |
+#ifndef REMOTING_PROTOCOL_WEBRTC_AUDIO_MODULE_H_ |
+#define REMOTING_PROTOCOL_WEBRTC_AUDIO_MODULE_H_ |
-#include <stdint.h> |
- |
-#include "base/compiler_specific.h" |
-#include "base/macros.h" |
-#include "base/time/time.h" |
-#include "content/common/content_export.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/synchronization/lock.h" |
+#include "base/timer/timer.h" |
#include "third_party/webrtc/modules/audio_device/include/audio_device.h" |
-namespace content { |
+namespace base { |
+class SingleThreadTaskRunner; |
+} // namespace base |
+ |
+namespace remoting { |
+namespace protocol { |
+ |
+class AudioStub; |
-// WebRtcAudioDeviceNotImpl contains default implementations of all methods |
-// in the webrtc::AudioDeviceModule which are currently not supported in Chrome. |
-// The real implementation is in WebRtcAudioDeviceImpl and it derives from |
-// this class. The main purpose of breaking out non-implemented methods into |
-// a separate unit is to make WebRtcAudioDeviceImpl more readable and easier |
-// to maintain. |
-class CONTENT_EXPORT WebRtcAudioDeviceNotImpl |
- : NON_EXPORTED_BASE(public webrtc::AudioDeviceModule) { |
+// Audio module passed to WebRTC. It doesn't access actual audio devices, but it |
+// provides all functionality we need to ensure that audio streaming works |
+// properly in WebRTC. Particularly it's responsible for calling AudioTransport |
+// on regular intervals when playback is active. This ensures that all incoming |
+// audio data is processed and passed to webrtc::AudioTrackSinkInterface |
+// connected to the audio track. |
+class WebrtcAudioModule : public webrtc::AudioDeviceModule { |
public: |
- WebRtcAudioDeviceNotImpl(); |
+ WebrtcAudioModule(); |
+ ~WebrtcAudioModule() override; |
- // webrtc::Module implementation. |
- // TODO(henrika): it is possible to add functionality in these methods. |
- // Only adding very basic support for now without triggering any callback |
- // in the webrtc::AudioDeviceObserver interface. |
+ void SetAudioTaskRunner( |
+ scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner); |
+ |
+ // webrtc::AudioDeviceModule implementation. |
int64_t TimeUntilNextProcess() override; |
void Process() override; |
- |
- // Methods in webrtc::AudioDeviceModule which are not yet implemented. |
- // The idea is that we can move methods from this class to the real |
- // implementation in WebRtcAudioDeviceImpl when needed. |
- |
+ int32_t ActiveAudioLayer(AudioLayer* audio_layer) const override; |
+ ErrorCode LastError() const override; |
int32_t RegisterEventObserver( |
webrtc::AudioDeviceObserver* event_callback) override; |
- int32_t ActiveAudioLayer(AudioLayer* audio_layer) const override; |
- webrtc::AudioDeviceModule::ErrorCode LastError() const override; |
+ int32_t RegisterAudioCallback( |
+ webrtc::AudioTransport* audio_callback) override; |
+ int32_t Init() override; |
+ int32_t Terminate() override; |
+ bool Initialized() const override; |
int16_t PlayoutDevices() override; |
int16_t RecordingDevices() override; |
int32_t PlayoutDeviceName(uint16_t index, |
@@ -53,8 +57,20 @@ class CONTENT_EXPORT WebRtcAudioDeviceNotImpl |
int32_t SetPlayoutDevice(WindowsDeviceType device) override; |
int32_t SetRecordingDevice(uint16_t index) override; |
int32_t SetRecordingDevice(WindowsDeviceType device) override; |
+ int32_t PlayoutIsAvailable(bool* available) override; |
int32_t InitPlayout() override; |
+ bool PlayoutIsInitialized() const override; |
+ int32_t RecordingIsAvailable(bool* available) override; |
int32_t InitRecording() override; |
+ bool RecordingIsInitialized() const override; |
+ int32_t StartPlayout() override; |
+ int32_t StopPlayout() override; |
+ bool Playing() const override; |
+ int32_t StartRecording() override; |
+ int32_t StopRecording() override; |
+ bool Recording() const override; |
+ int32_t SetAGC(bool enable) override; |
+ bool AGC() const override; |
int32_t SetWaveOutVolume(uint16_t volume_left, |
uint16_t volume_right) override; |
int32_t WaveOutVolume(uint16_t* volume_left, |
@@ -70,6 +86,10 @@ class CONTENT_EXPORT WebRtcAudioDeviceNotImpl |
int32_t MinSpeakerVolume(uint32_t* min_volume) const override; |
int32_t SpeakerVolumeStepSize(uint16_t* step_size) const override; |
int32_t MicrophoneVolumeIsAvailable(bool* available) override; |
+ int32_t SetMicrophoneVolume(uint32_t volume) override; |
+ int32_t MicrophoneVolume(uint32_t* volume) const override; |
+ int32_t MaxMicrophoneVolume(uint32_t* max_volume) const override; |
+ int32_t MinMicrophoneVolume(uint32_t* min_volume) const override; |
int32_t MicrophoneVolumeStepSize(uint16_t* step_size) const override; |
int32_t SpeakerMuteIsAvailable(bool* available) override; |
int32_t SetSpeakerMute(bool enable) override; |
@@ -80,14 +100,18 @@ class CONTENT_EXPORT WebRtcAudioDeviceNotImpl |
int32_t MicrophoneBoostIsAvailable(bool* available) override; |
int32_t SetMicrophoneBoost(bool enable) override; |
int32_t MicrophoneBoost(bool* enabled) const override; |
+ int32_t StereoPlayoutIsAvailable(bool* available) const override; |
int32_t SetStereoPlayout(bool enable) override; |
int32_t StereoPlayout(bool* enabled) const override; |
+ int32_t StereoRecordingIsAvailable(bool* available) const override; |
int32_t SetStereoRecording(bool enable) override; |
int32_t StereoRecording(bool* enabled) const override; |
int32_t SetRecordingChannel(const ChannelType channel) override; |
int32_t RecordingChannel(ChannelType* channel) const override; |
int32_t SetPlayoutBuffer(const BufferType type, uint16_t size_ms) override; |
int32_t PlayoutBuffer(BufferType* type, uint16_t* size_ms) const override; |
+ int32_t PlayoutDelay(uint16_t* delay_ms) const override; |
+ int32_t RecordingDelay(uint16_t* delay_ms) const override; |
int32_t CPULoad(uint16_t* load) const override; |
int32_t StartRawOutputFileRecording( |
const char pcm_file_name_utf8[webrtc::kAdmMaxFileNameSize]) override; |
@@ -96,31 +120,47 @@ class CONTENT_EXPORT WebRtcAudioDeviceNotImpl |
const char pcm_file_name_utf8[webrtc::kAdmMaxFileNameSize]) override; |
int32_t StopRawInputFileRecording() override; |
int32_t SetRecordingSampleRate(const uint32_t samples_per_sec) override; |
+ int32_t RecordingSampleRate(uint32_t* samples_per_sec) const override; |
int32_t SetPlayoutSampleRate(const uint32_t samples_per_sec) override; |
+ int32_t PlayoutSampleRate(uint32_t* samples_per_sec) const override; |
int32_t ResetAudioDevice() override; |
int32_t SetLoudspeakerStatus(bool enable) override; |
int32_t GetLoudspeakerStatus(bool* enabled) const override; |
- int32_t SetAGC(bool enable) override; |
- bool AGC() const override; |
bool BuiltInAECIsAvailable() const override; |
bool BuiltInAGCIsAvailable() const override; |
bool BuiltInNSIsAvailable() const override; |
int32_t EnableBuiltInAEC(bool enable) override; |
int32_t EnableBuiltInAGC(bool enable) override; |
int32_t EnableBuiltInNS(bool enable) override; |
-#if defined(OS_IOS) |
+ |
+// Only supported on iOS. |
+#if defined(WEBRTC_IOS) |
int GetPlayoutAudioParameters(AudioParameters* params) const override; |
int GetRecordAudioParameters(AudioParameters* params) const override; |
-#endif // OS_IOS |
- |
- protected: |
- ~WebRtcAudioDeviceNotImpl() override{}; |
+#endif // WEBRTC_IOS |
private: |
- base::TimeTicks last_process_time_; |
- DISALLOW_COPY_AND_ASSIGN(WebRtcAudioDeviceNotImpl); |
+ void StartPlayoutOnAudioThread(); |
+ void StopPlayoutOnAudioThread(); |
+ |
+ void PollFromSource(); |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_; |
+ |
+ // |lock_| must be locked when accessing |initialized_|, |playing_| and |
+ // |audio_transport_|. |
+ mutable base::Lock lock_; |
+ |
+ bool initialized_ = false; |
+ bool playing_ = false; |
+ webrtc::AudioTransport* audio_transport_ = nullptr; |
+ |
+ // Timer running on the |audio_task_runner_| that polls audio from |
+ // |audio_transport_|. |
+ base::RepeatingTimer poll_timer_; |
}; |
-} // namespace content |
+} // namespace protocol |
+} // namespace remoting |
-#endif // CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_NOT_IMPL_H_ |
+#endif // REMOTING_PROTOCOL_WEBRTC_AUDIO_MODULE_H_ |