blob: 01b11208021d3e32198eb3061f1895957fb7f29d [file] [log] [blame]
// Copyright 2013 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_LOCAL_AUDIO_TRACK_H_
#define CONTENT_RENDERER_MEDIA_WEBRTC_LOCAL_AUDIO_TRACK_H_
#include <list>
#include <string>
#include "base/synchronization/lock.h"
#include "base/threading/thread_checker.h"
#include "content/renderer/media/webrtc_audio_device_impl.h"
#include "third_party/libjingle/source/talk/app/webrtc/mediaconstraintsinterface.h"
#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
#include "third_party/libjingle/source/talk/app/webrtc/mediastreamtrack.h"
#include "third_party/libjingle/source/talk/media/base/audiorenderer.h"
namespace cricket {
class AudioRenderer;
} // namespace cricket
namespace media {
class AudioBus;
} // namespace media
namespace content {
class WebAudioCapturerSource;
class WebRtcAudioCapturer;
class WebRtcAudioCapturerSinkOwner;
// A WebRtcLocalAudioTrack instance contains the implementations of
// MediaStreamTrack and WebRtcAudioCapturerSink.
// When an instance is created, it will register itself as a track to the
// WebRtcAudioCapturer to get the captured data, and forward the data to
// its |sinks_|. The data flow can be stopped by disabling the audio track.
class CONTENT_EXPORT WebRtcLocalAudioTrack
: NON_EXPORTED_BASE(public cricket::AudioRenderer),
NON_EXPORTED_BASE(
public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>) {
public:
static scoped_refptr<WebRtcLocalAudioTrack> Create(
const std::string& id,
const scoped_refptr<WebRtcAudioCapturer>& capturer,
WebAudioCapturerSource* webaudio_source,
webrtc::AudioSourceInterface* track_source,
const webrtc::MediaConstraintsInterface* constraints);
// Add a sink to the track. This function will trigger a SetCaptureFormat()
// call on the |sink|.
// Called on the main render thread.
void AddSink(WebRtcAudioCapturerSink* sink);
// Remove a sink from the track.
// Called on the main render thread.
void RemoveSink(WebRtcAudioCapturerSink* sink);
// Starts the local audio track. Called on the main render thread and
// should be called only once when audio track is created.
void Start();
// Stops the local audio track. Called on the main render thread and
// should be called only once when audio track going away.
void Stop();
// Method called by the capturer to deliver the capture data.
void Capture(media::AudioBus* audio_source,
int audio_delay_milliseconds,
int volume,
bool key_pressed);
// Method called by the capturer to set the audio parameters used by source
// of the capture data..
// Can be called on different user threads.
void SetCaptureFormat(const media::AudioParameters& params);
protected:
WebRtcLocalAudioTrack(
const std::string& label,
const scoped_refptr<WebRtcAudioCapturer>& capturer,
WebAudioCapturerSource* webaudio_source,
webrtc::AudioSourceInterface* track_source,
const webrtc::MediaConstraintsInterface* constraints);
virtual ~WebRtcLocalAudioTrack();
private:
typedef std::list<scoped_refptr<WebRtcAudioCapturerSinkOwner> > SinkList;
// cricket::AudioCapturer implementation.
virtual void AddChannel(int channel_id) OVERRIDE;
virtual void RemoveChannel(int channel_id) OVERRIDE;
// webrtc::AudioTrackInterface implementation.
virtual webrtc::AudioSourceInterface* GetSource() const OVERRIDE;
virtual cricket::AudioRenderer* GetRenderer() OVERRIDE;
// webrtc::MediaStreamTrack implementation.
virtual std::string kind() const OVERRIDE;
// The provider of captured data to render.
// The WebRtcAudioCapturer is today created by WebRtcAudioDeviceImpl.
scoped_refptr<WebRtcAudioCapturer> capturer_;
// The source of the audio track which is used by WebAudio, which provides
// data to the audio track when hooking up with WebAudio.
scoped_refptr<WebAudioCapturerSource> webaudio_source_;
// The source of the audio track which handles the audio constraints.
// TODO(xians): merge |track_source_| to |capturer_|.
talk_base::scoped_refptr<webrtc::AudioSourceInterface> track_source_;
// A list of sinks that the audio data is fed to.
SinkList sinks_;
// Used to DCHECK that we are called on the correct thread.
base::ThreadChecker thread_checker_;
// Protects |params_| and |sinks_|.
mutable base::Lock lock_;
// A vector of WebRtc VoE channels that the capturer sends datat to.
std::vector<int> voe_channels_;
bool need_audio_processing_;
// Buffers used for temporary storage during capture callbacks.
// Allocated during initialization.
class ConfiguredBuffer;
scoped_refptr<ConfiguredBuffer> buffer_;
DISALLOW_COPY_AND_ASSIGN(WebRtcLocalAudioTrack);
};
} // namespace content
#endif // CONTENT_RENDERER_MEDIA_WEBRTC_LOCAL_AUDIO_TRACK_H_