summaryrefslogtreecommitdiffstats
path: root/content/renderer/media/webrtc_local_audio_track.h
diff options
context:
space:
mode:
authorxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-29 17:01:10 +0000
committerxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-29 17:01:10 +0000
commit0d1817c725dc82849135cdf674f410f6d986cf33 (patch)
treeb8954ff81b1d5669affdf013d89cca774a478fe6 /content/renderer/media/webrtc_local_audio_track.h
parent965666ad3cec772aaa0906b0e055f7e15cc676d7 (diff)
downloadchromium_src-0d1817c725dc82849135cdf674f410f6d986cf33.zip
chromium_src-0d1817c725dc82849135cdf674f410f6d986cf33.tar.gz
chromium_src-0d1817c725dc82849135cdf674f410f6d986cf33.tar.bz2
Reland 196894 - First step to add audio track support to local stream.
First step to add audio track support to local stream. This patch builds up a correct structure for the local audio track, and added a correct chromium audio track implementation to local media stream. This patch does not change the current functionalities and behaviour of local media stream, it is more like a refactoring on the structure. TBR=tommi@chromium.org BUG=164813 TEST=content_unittests --gtest_filter="*WebRtcLocalAudio*" apprtc.appspot.com and webrtc.googlecode.com/svn/trunk/samples/js/demos/html/local-audio-rendering.html Review URL: https://codereview.chromium.org/14359019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@197063 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/media/webrtc_local_audio_track.h')
-rw-r--r--content/renderer/media/webrtc_local_audio_track.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/content/renderer/media/webrtc_local_audio_track.h b/content/renderer/media/webrtc_local_audio_track.h
new file mode 100644
index 0000000..d436dc4
--- /dev/null
+++ b/content/renderer/media/webrtc_local_audio_track.h
@@ -0,0 +1,99 @@
+// 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/mediastreaminterface.h"
+#include "third_party/libjingle/source/talk/app/webrtc/mediastreamtrack.h"
+
+
+namespace content {
+
+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 WebRtcAudioCapturerSink),
+ NON_EXPORTED_BASE(
+ public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>) {
+ public:
+ static scoped_refptr<WebRtcLocalAudioTrack> Create(
+ const std::string& id,
+ const scoped_refptr<WebRtcAudioCapturer>& capturer,
+ webrtc::AudioSourceInterface* stream_source);
+
+ // 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);
+
+ protected:
+ WebRtcLocalAudioTrack(const std::string& label,
+ const scoped_refptr<WebRtcAudioCapturer>& capturer,
+ webrtc::AudioSourceInterface* stream_source);
+ virtual ~WebRtcLocalAudioTrack();
+
+ private:
+ class SinkOwner;
+ typedef std::list<scoped_refptr<WebRtcAudioCapturerSinkOwner> > SinkList;
+
+ // content::WebRtcAudioCapturerSink implementation.
+ // Called on the AudioInputDevice worker thread.
+ virtual void CaptureData(const int16* audio_data,
+ int number_of_channels,
+ int number_of_frames,
+ int audio_delay_milliseconds,
+ double volume) OVERRIDE;
+
+ // Can be called on different user threads.
+ virtual void SetCaptureFormat(const media::AudioParameters& params) OVERRIDE;
+
+ // webrtc::AudioTrackInterface implementation.
+ virtual webrtc::AudioSourceInterface* GetSource() const 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 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_;
+
+ // Cached values of the audio parameters used by the |source_| and |sinks_|.
+ media::AudioParameters params_;
+
+ // Protects |params_| and |sinks_|.
+ mutable base::Lock lock_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebRtcLocalAudioTrack);
+};
+
+} // namespace content
+
+#endif // CONTENT_RENDERER_MEDIA_WEBRTC_LOCAL_AUDIO_TRACK_H_