Index: content/renderer/media/media_stream_audio_track.h |
diff --git a/content/renderer/media/media_stream_audio_track.h b/content/renderer/media/media_stream_audio_track.h |
index 0ef126b431a3af9bcdc0686f71ecd95a474214bc..c8c2b8482a8e90a042ebb1fd384ff1a69bd8336c 100644 |
--- a/content/renderer/media/media_stream_audio_track.h |
+++ b/content/renderer/media/media_stream_audio_track.h |
@@ -5,46 +5,50 @@ |
#ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_TRACK_H_ |
#define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_TRACK_H_ |
+#include <memory> |
+ |
+#include "base/atomicops.h" |
#include "base/callback.h" |
#include "base/macros.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/synchronization/lock.h" |
+#include "base/threading/thread_checker.h" |
+#include "content/renderer/media/media_stream_audio_deliverer.h" |
#include "content/renderer/media/media_stream_track.h" |
-namespace webrtc { |
-class AudioTrackInterface; |
-} // namespace webrtc |
- |
namespace content { |
class MediaStreamAudioSink; |
+class MediaStreamAudioSource; |
-// TODO(miu): In a soon-upcoming set of refactoring changes, this class will |
-// take on the functionality of managing sink connections and the audio data |
-// flow between source and sinks. The WebRTC-specific elements will then be |
-// moved into a subclass. http://crbug.com/577874 |
+// Provides the part of the audio pipeline delivering audio from a |
+// MediaStreamAudioSource to one or more MediaStreamAudioSinks. An instance of |
+// this class is owned by blink::WebMediaStreamTrack, and clients should use |
+// From() to gain access to a MediaStreamAudioTrack. |
class CONTENT_EXPORT MediaStreamAudioTrack : public MediaStreamTrack { |
public: |
explicit MediaStreamAudioTrack(bool is_local_track); |
- // Subclasses must ensure the track is stopped (i.e., Stop() has been called |
- // at least once) before this destructor is invoked. |
~MediaStreamAudioTrack() override; |
// Returns the MediaStreamAudioTrack instance owned by the given blink |track| |
// or null. |
static MediaStreamAudioTrack* From(const blink::WebMediaStreamTrack& track); |
- // Add a sink to the track. This function will trigger a OnSetFormat() |
- // call on the |sink|. |
- // Called on the main render thread. |
- virtual void AddSink(MediaStreamAudioSink* sink) = 0; |
+ // Provides a weak reference to this MediaStreamAudioTrack which is |
+ // invalidated when Stop() is called. The weak pointer may only be |
+ // dereferenced on the main thread. |
+ base::WeakPtr<MediaStreamAudioTrack> GetWeakPtr() { |
+ return weak_factory_.GetWeakPtr(); |
+ } |
- // Remove a sink from the track. |
- // Called on the main render thread. |
- virtual void RemoveSink(MediaStreamAudioSink* sink) = 0; |
+ // Add a sink to the track. This function will trigger a OnSetFormat() |
+ // call on the |sink| before the first chunk of audio is delivered. |
+ void AddSink(MediaStreamAudioSink* sink); |
- // TODO(tommi, xians): Remove this method. |
- // TODO(miu): See class-level TODO comment. ;-) |
- virtual webrtc::AudioTrackInterface* GetAudioAdapter(); |
+ // Remove a sink from the track. When this method returns, the sink's |
+ // OnSetFormat() and OnData() methods will not be called again on any thread. |
+ void RemoveSink(MediaStreamAudioSink* sink); |
// Returns the output format of the capture source. May return an invalid |
// AudioParameters if the format is not yet available. |
@@ -52,25 +56,60 @@ class CONTENT_EXPORT MediaStreamAudioTrack : public MediaStreamTrack { |
// TODO(tommi): This method appears to only be used by Pepper and in fact |
// does not appear to be necessary there. We should remove it since it adds |
// to the complexity of all types of audio tracks+source implementations. |
- virtual media::AudioParameters GetOutputFormat() const = 0; |
- |
- // Called to notify this track that the flow of audio data has started from |
- // the source. |stop_callback| is run by Stop() when the source must halt the |
- // flow of audio data to this track. |
- void Start(const base::Closure& stop_callback); |
+ // http://crbug.com/577874 |
+ media::AudioParameters GetOutputFormat() const; |
// Halts the flow of audio data from the source (and to the sinks), and then |
- // invokes OnStop() to perform any additional actions. |
+ // notifies all sinks of the "ended" state. |
void Stop() final; |
- protected: |
- // Called by Stop() after the source has halted the flow of audio data. |
- virtual void OnStop(); |
+ // MediaStreamTrack override. |
+ void SetEnabled(bool enabled) override; |
+ |
+ // Returns a unique class identifier. Some subclasses override and use this |
+ // method to provide safe down-casting to their type. |
+ virtual void* GetClassIdentifier() const; |
+ |
+ private: |
+ friend class MediaStreamAudioSource; |
+ friend class MediaStreamAudioDeliverer<MediaStreamAudioTrack>; |
+ |
+ // Called by MediaStreamAudioSource to notify this track that the flow of |
+ // audio data has started from the source. |stop_callback| is run by Stop() |
+ // when the source must halt the flow of audio data to this track. |
+ void Start(const base::Closure& stop_callback); |
+ |
+ // Called by the MediaStreamAudioDeliverer to notify this track of an audio |
+ // format change. In turn, all MediaStreamAudioSinks will be notified before |
+ // the next chunk of audio is delivered to them. |
+ void OnSetFormat(const media::AudioParameters& params); |
+ |
+ // Called by the MediaStreamAudioDeliverer to deliver audio data to this |
+ // track, which in turn delivers the audio to one or more |
+ // MediaStreamAudioSinks. While this track is disabled, silent audio will be |
+ // delivered to the sinks instead of the content of |audio_bus|. |
+ void OnData(const media::AudioBus& audio_bus, base::TimeTicks reference_time); |
private: |
+ // In debug builds, check that all methods that could cause object graph |
+ // or data flow changes are being called on the main thread. |
+ base::ThreadChecker thread_checker_; |
+ |
// Callback provided to Start() which is run when the audio flow must halt. |
base::Closure stop_callback_; |
+ // Manages sinks connected to this track and the audio format and data flow. |
+ MediaStreamAudioDeliverer<MediaStreamAudioSink> deliverer_; |
+ |
+ // While false (0), silent audio is delivered to the sinks. |
+ base::subtle::Atomic32 is_enabled_; |
+ |
+ // Buffer used to deliver silent audio data while this track is disabled. |
+ std::unique_ptr<media::AudioBus> silent_bus_; |
+ |
+ // Provides weak pointers that are valid until Stop() is called. |
+ base::WeakPtrFactory<MediaStreamAudioTrack> weak_factory_; |
+ |
DISALLOW_COPY_AND_ASSIGN(MediaStreamAudioTrack); |
}; |