webrtc_audio_module.h 5.87 KB
Newer Older
sergeyu's avatar
sergeyu committed
1 2 3 4 5 6 7 8 9 10 11 12
// 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 REMOTING_PROTOCOL_WEBRTC_AUDIO_MODULE_H_
#define REMOTING_PROTOCOL_WEBRTC_AUDIO_MODULE_H_

#include "base/memory/ref_counted.h"
#include "base/synchronization/lock.h"
#include "third_party/webrtc/modules/audio_device/include/audio_device.h"

namespace base {
13
class RepeatingTimer;
sergeyu's avatar
sergeyu committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
class SingleThreadTaskRunner;
}  // namespace base

namespace remoting {
namespace protocol {

// 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:
  WebrtcAudioModule();
  ~WebrtcAudioModule() override;

  void SetAudioTaskRunner(
      scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner);

  // webrtc::AudioDeviceModule implementation.
  int32_t ActiveAudioLayer(AudioLayer* audio_layer) 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,
                            char name[webrtc::kAdmMaxDeviceNameSize],
                            char guid[webrtc::kAdmMaxGuidSize]) override;
  int32_t RecordingDeviceName(uint16_t index,
                              char name[webrtc::kAdmMaxDeviceNameSize],
                              char guid[webrtc::kAdmMaxGuidSize]) override;
  int32_t SetPlayoutDevice(uint16_t index) override;
  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 InitSpeaker() override;
  bool SpeakerIsInitialized() const override;
  int32_t InitMicrophone() override;
  bool MicrophoneIsInitialized() const override;
  int32_t SpeakerVolumeIsAvailable(bool* available) override;
  int32_t SetSpeakerVolume(uint32_t volume) override;
  int32_t SpeakerVolume(uint32_t* volume) const override;
  int32_t MaxSpeakerVolume(uint32_t* max_volume) const override;
  int32_t MinSpeakerVolume(uint32_t* min_volume) 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 SpeakerMuteIsAvailable(bool* available) override;
  int32_t SetSpeakerMute(bool enable) override;
  int32_t SpeakerMute(bool* enabled) const override;
  int32_t MicrophoneMuteIsAvailable(bool* available) override;
  int32_t SetMicrophoneMute(bool enable) override;
  int32_t MicrophoneMute(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 PlayoutDelay(uint16_t* delay_ms) const 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 SetLoudspeakerStatus(bool enable) override;
  int32_t GetLoudspeakerStatus(bool* enabled) 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;

// Only supported on iOS.
#if defined(WEBRTC_IOS)
111 112
  int GetPlayoutAudioParameters(webrtc::AudioParameters* params) const override;
  int GetRecordAudioParameters(webrtc::AudioParameters* params) const override;
sergeyu's avatar
sergeyu committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
#endif  // WEBRTC_IOS

 private:
  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_|.
133
  std::unique_ptr<base::RepeatingTimer> poll_timer_;
sergeyu's avatar
sergeyu committed
134 135 136 137 138 139
};

}  // namespace protocol
}  // namespace remoting

#endif  // REMOTING_PROTOCOL_WEBRTC_AUDIO_MODULE_H_