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 2175b4e186f47fefc982e097a1691dac1fdd7383..c523203bb368b363a7104360d5e2e2a091258071 100644 |
--- a/content/renderer/media/media_stream_audio_track.h |
+++ b/content/renderer/media/media_stream_audio_track.h |
@@ -5,36 +5,51 @@ |
#ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_TRACK_H_ |
#define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_TRACK_H_ |
+#include <vector> |
+ |
+#include "base/callback.h" |
#include "base/macros.h" |
+#include "base/synchronization/lock.h" |
#include "content/renderer/media/media_stream_track.h" |
- |
-namespace webrtc { |
-class AudioTrackInterface; |
-} // namespace webrtc |
+#include "media/audio/audio_parameters.h" |
namespace content { |
class MediaStreamAudioSink; |
+class MediaStreamAudioSource; |
+// 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 |
+// Get() to gain access to a MediaStreamAudioTrack. |
class CONTENT_EXPORT MediaStreamAudioTrack : public MediaStreamTrack { |
public: |
explicit MediaStreamAudioTrack(bool is_local_track); |
+ |
~MediaStreamAudioTrack() override; |
- static MediaStreamAudioTrack* GetTrack( |
- const blink::WebMediaStreamTrack& track); |
+ // Accessor to the MediaStreamAudioTrack instance owned (as extraData) by the |
+ // given WebMediaStreamTrack. |
+ static MediaStreamAudioTrack* Get(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; |
+ // When Stop() is called on this track, |stop_callback| will be run. This is |
+ // generally used to notify the source that the track cannot accept more |
+ // data. |
+ void AddStopObserver(const base::Closure& stop_callback); |
- // Remove a sink from the track. |
- // Called on the main render thread. |
- virtual void RemoveSink(MediaStreamAudioSink* sink) = 0; |
+ // Adds |sink| as another destination of audio flow. Calls |
+ // MediaStreamAudioSink::OnReadyStateChanged() to notify the sink it is live. |
+ void AddSink(MediaStreamAudioSink* sink); |
+ |
+ // Removes |sink| as a receiver of audio flow. When this method returns, the |
+ // sink's OnSetFormat() and OnData() methods will not be called again on any |
+ // thread. Calls MediaStreamAudioSink::OnReadyStateChanged() to notify the |
+ // sink it is no longer live. |
+ void RemoveSink(MediaStreamAudioSink* sink); |
- // TODO(tommi, xians): Remove this method. |
- virtual webrtc::AudioTrackInterface* GetAudioAdapter(); |
+ // MediaStreamTrack implementation. |
+ void SetEnabled(bool enabled) override; |
+ void Stop() final; |
// Returns the output format of the capture source. May return an invalid |
// AudioParameters if the format is not yet available. |
@@ -42,9 +57,52 @@ 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; |
+ // http://crbug.com/577874 |
+ media::AudioParameters GetOutputFormat() const; |
+ |
+ // Returns a unique class identifier. Some subclasses override and use this |
+ // method to provide safe down-casting to their type. |
+ virtual void* GetClassIdentifier() const; |
+ |
+ protected: |
+ friend class MediaStreamAudioSource; |
+ |
+ // Called by the MediaStreamAudioSource 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 SetFormat(const media::AudioParameters& params); |
+ |
+ // Called by the MediaStreamAudioSource to deliver audio data to this track, |
+ // which in turn delivers the audio to one or more MediaStreamAudioSinks. |
+ void DeliverDataToSinks(const media::AudioBus& audio_bus, |
+ base::TimeTicks reference_time); |
private: |
+ // These are run after this track has been stopped. Even if Stop() is called |
+ // multiple times, the |stop_callbacks_| are only run the first time. |
+ std::vector<base::Closure> stop_callbacks_; |
+ |
+ // The current format of the audio passing through this track. |
+ media::AudioParameters params_; |
+ |
+ // Lock protects concurrent access to the sink lists below and the |
+ // |is_enabled_| state, between the main thread and the audio thread. |
+ mutable base::Lock lock_; |
+ |
+ // Any sinks needing a call to MediaStreamAudioSink::OnSetFormat(), to be |
+ // notified of the changed audio format, are placed in this list. This |
+ // includes sinks added via AddSink() that need to have an initial |
+ // OnSetFormat() call before audio data is first delivered. Sinks are moved |
+ // from this list to |sinks_|. |
+ std::vector<MediaStreamAudioSink*> pending_sinks_; |
+ |
+ // Sinks that are up-to-date on the current audio format and are receiving |
+ // audio data are placed in this list. |
+ std::vector<MediaStreamAudioSink*> sinks_; |
+ |
+ // When false, delivery of audio data is temporarily halted to the sinks. |
+ bool is_enabled_; |
+ |
DISALLOW_COPY_AND_ASSIGN(MediaStreamAudioTrack); |
}; |