Index: content/renderer/media/webaudio_media_stream_source.h |
diff --git a/content/renderer/media/webaudio_capturer_source.h b/content/renderer/media/webaudio_media_stream_source.h |
similarity index 25% |
rename from content/renderer/media/webaudio_capturer_source.h |
rename to content/renderer/media/webaudio_media_stream_source.h |
index b0ee262ccd7c3c06135b9252b3b394db8c0dc7dd..ae854542830144415c79671b6e2fa5fff31b021b 100644 |
--- a/content/renderer/media/webaudio_capturer_source.h |
+++ b/content/renderer/media/webaudio_media_stream_source.h |
@@ -1,100 +1,77 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Copyright (c) 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 CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ |
-#define CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ |
+#ifndef CONTENT_RENDERER_MEDIA_WEBAUDIO_MEDIA_STREAM_SOURCE_H_ |
+#define CONTENT_RENDERER_MEDIA_WEBAUDIO_MEDIA_STREAM_SOURCE_H_ |
-#include <stddef.h> |
- |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/synchronization/lock.h" |
-#include "base/threading/thread_checker.h" |
-#include "media/audio/audio_parameters.h" |
-#include "media/base/audio_capturer_source.h" |
-#include "media/base/audio_fifo.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/time/time.h" |
+#include "content/renderer/media/media_stream_audio_source.h" |
+#include "media/base/audio_bus.h" |
+#include "media/base/audio_rechunker.h" |
#include "third_party/WebKit/public/platform/WebAudioDestinationConsumer.h" |
#include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
#include "third_party/WebKit/public/platform/WebVector.h" |
namespace content { |
-class WebRtcLocalAudioTrack; |
- |
-// WebAudioCapturerSource is the missing link between |
-// WebAudio's MediaStreamAudioDestinationNode and WebRtcLocalAudioTrack. |
-// |
-// 1. WebKit calls the setFormat() method setting up the basic stream format |
-// (channels, and sample-rate). |
-// 2. consumeAudio() is called periodically by WebKit which dispatches the |
-// audio stream to the WebRtcLocalAudioTrack::Capture() method. |
-class WebAudioCapturerSource |
- : public base::RefCountedThreadSafe<WebAudioCapturerSource>, |
- public blink::WebAudioDestinationConsumer { |
+// Implements the WebAudioDestinationConsumer interface to provide a source of |
+// audio data (i.e., the output from a graph of WebAudio nodes) to one or more |
+// MediaStreamAudioTracks. Audio data is transported directly to the tracks in |
+// 10 ms chunks. |
+class WebAudioMediaStreamSource |
+ : NON_EXPORTED_BASE(public MediaStreamAudioSource), |
+ public blink::WebAudioDestinationConsumer { |
public: |
- explicit WebAudioCapturerSource( |
+ explicit WebAudioMediaStreamSource( |
const blink::WebMediaStreamSource& blink_source); |
+ ~WebAudioMediaStreamSource() final; |
+ |
+ private: |
// WebAudioDestinationConsumer implementation. |
- // setFormat() is called early on, so that we can configure the audio track. |
+ // |
+ // Note: Blink ensures setFormat() and consumeAudio() are not called |
+ // concurrently across threads, but these methods could be called on any |
+ // thread. |
void setFormat(size_t number_of_channels, float sample_rate) override; |
- // MediaStreamAudioDestinationNode periodically calls consumeAudio(). |
- // Called on the WebAudio audio thread. |
void consumeAudio(const blink::WebVector<const float*>& audio_data, |
size_t number_of_frames) override; |
- // Called when the WebAudioCapturerSource is hooking to a media audio track. |
- // |track| is the sink of the data flow. |source_provider| is the source of |
- // the data flow where stream information like delay, volume, key_pressed, |
- // is stored. |
- void Start(WebRtcLocalAudioTrack* track); |
+ // Called by AudioRechunker zero or more times during the call to |
+ // consumeAudio(). Delivers re-chunked audio data to the tracks. |
+ void DeliverRechunkedAudio(const media::AudioBus& audio_bus, |
+ base::TimeDelta reference_timestamp); |
- // Called when the media audio track is stopping. |
- void Stop(); |
+ // MediaStreamAudioSource implementation. |
+ void DoStopSource() final; |
+ bool EnsureSourceIsStarted() final; |
- protected: |
- friend class base::RefCountedThreadSafe<WebAudioCapturerSource>; |
- ~WebAudioCapturerSource() override; |
- |
- private: |
// Removes this object from a blink::WebMediaStreamSource with which it |
// might be registered. The goal is to avoid dangling pointers. |
void removeFromBlinkSource(); |
- // Used to DCHECK that some methods are called on the correct thread. |
- base::ThreadChecker thread_checker_; |
- |
- // The audio track this WebAudioCapturerSource is feeding data to. |
- // WebRtcLocalAudioTrack is reference counted, and owning this object. |
- // To avoid circular reference, a raw pointer is kept here. |
- WebRtcLocalAudioTrack* track_; |
- |
- media::AudioParameters params_; |
+ // This object registers and de-registers as an audio consumer of a |
+ // blink::WebMediaStreamSource. |
+ blink::WebMediaStreamSource blink_source_; |
- // Flag to help notify the |track_| when the audio format has changed. |
- bool audio_format_changed_; |
+ // True while this WebAudioMediaStreamSource is registered with |
+ // |blink_source_| and is consuming audio. |
+ bool is_started_; |
- // Wraps data coming from HandleCapture(). |
+ // An adapter used for providing audio to |rechunker_|. |
scoped_ptr<media::AudioBus> wrapper_bus_; |
- // Bus for reading from FIFO and calling the CaptureCallback. |
- scoped_ptr<media::AudioBus> capture_bus_; |
- |
- // Handles mismatch between WebAudio buffer size and WebRTC. |
- scoped_ptr<media::AudioFifo> fifo_; |
- |
- // Synchronizes HandleCapture() with AudioCapturerSource calls. |
- base::Lock lock_; |
- bool started_; |
- |
- // This object registers with a blink::WebMediaStreamSource. We keep track of |
- // that in order to be able to deregister before stopping the audio track. |
- blink::WebMediaStreamSource blink_source_; |
+ // Takes in the audio data passed to consumeAudio() and re-chunks it into 10 |
+ // ms chunks for the tracks. This ensures each chunk of audio delivered to |
+ // the tracks has the same buffer size, even if audio is provided in |
+ // varying-sized chunks. |
+ media::AudioRechunker rechunker_; |
- DISALLOW_COPY_AND_ASSIGN(WebAudioCapturerSource); |
+ DISALLOW_COPY_AND_ASSIGN(WebAudioMediaStreamSource); |
}; |
} // namespace content |
-#endif // CONTENT_RENDERER_MEDIA_WEBAUDIO_CAPTURER_SOURCE_H_ |
+#endif // CONTENT_RENDERER_MEDIA_WEBAUDIO_MEDIA_STREAM_SOURCE_H_ |