Index: media/blink/webaudiosourceprovider_impl.h |
diff --git a/media/blink/webaudiosourceprovider_impl.h b/media/blink/webaudiosourceprovider_impl.h |
index afdf1e3ce8dc6364b5c0d3d5b80e45084a1bf2d2..7e859db150e714f0fcacae46cb8caeaf93a7a291 100644 |
--- a/media/blink/webaudiosourceprovider_impl.h |
+++ b/media/blink/webaudiosourceprovider_impl.h |
@@ -24,19 +24,28 @@ class WebAudioSourceProviderClient; |
namespace media { |
-// WebAudioSourceProviderImpl provides a bridge between classes: |
-// blink::WebAudioSourceProvider <---> AudioRendererSink |
+// WebAudioSourceProviderImpl is either one of two things (but not both): |
+// - a connection between a RestartableAudioRendererSink (the |sink_|) passed in |
+// constructor and an AudioRendererSink::RenderCallback passed on Initialize() |
+// by means of an internal AudioRendererSink::RenderCallback. |
+// - a connection between the said AudioRendererSink::RenderCallback and a |
+// blink::WebAudioSourceProviderClient passed via setClient() (the |client_|), |
+// again using the internal AudioRendererSink::RenderCallback. Blink calls |
+// provideInput() periodically to fetch the appropriate data. |
// |
-// WebAudioSourceProviderImpl wraps an existing audio sink that is used unless |
-// WebKit has set a client via setClient(). While a client is set WebKit will |
-// periodically call provideInput() to render a certain number of audio |
-// sample-frames using the sink's RenderCallback to get the data. |
+// In either case, the internal RenderCallback allows for delivering a copy of |
+// the data if a listener is configured. WASPImpl is also a |
+// RestartableAudioRendererSink itself in order to be controlled (Play(), |
+// Pause() etc). |
// |
// All calls are protected by a lock. |
class MEDIA_BLINK_EXPORT WebAudioSourceProviderImpl |
: NON_EXPORTED_BASE(public blink::WebAudioSourceProvider), |
NON_EXPORTED_BASE(public RestartableAudioRendererSink) { |
public: |
+ using CopyAudioCB = base::Callback< |
+ void(scoped_ptr<AudioBus>, uint32_t delay_milliseconds, int sample_rate)>; |
+ |
explicit WebAudioSourceProviderImpl( |
const scoped_refptr<RestartableAudioRendererSink>& sink); |
@@ -55,36 +64,40 @@ class MEDIA_BLINK_EXPORT WebAudioSourceProviderImpl |
void Initialize(const AudioParameters& params, |
RenderCallback* renderer) override; |
- protected: |
- ~WebAudioSourceProviderImpl() override; |
+ // These methods allow a client to get a copy of the rendered audio. |
+ void SetCopyAudioCallback(const CopyAudioCB& callback); |
+ void ClearCopyAudioCallback(); |
private: |
+ friend class WebAudioSourceProviderImplTest; |
+ ~WebAudioSourceProviderImpl() override; |
+ |
// Calls setFormat() on |client_| from the Blink renderer thread. |
void OnSetFormat(); |
- // Closure that posts a task to call OnSetFormat() on the renderer thread. |
- base::Closure set_format_cb_; |
+ int RenderForTesting(AudioBus* audio_bus); |
- // Set to true when Initialize() is called. |
- int channels_; |
- int sample_rate_; |
+ // Used to keep the volume across reconfigurations. |
double volume_; |
// Tracks the current playback state. |
enum PlaybackState { kStopped, kStarted, kPlaying }; |
PlaybackState state_; |
- // Where audio comes from. |
- AudioRendererSink::RenderCallback* renderer_; |
- |
+ // Closure that calls OnSetFormat() on |client_| on the renderer thread. |
+ base::Closure set_format_cb_; |
// When set via setClient() it overrides |sink_| for consuming audio. |
blink::WebAudioSourceProviderClient* client_; |
// Where audio ends up unless overridden by |client_|. |
base::Lock sink_lock_; |
- scoped_refptr<RestartableAudioRendererSink> sink_; |
+ const scoped_refptr<RestartableAudioRendererSink> sink_; |
scoped_ptr<AudioBus> bus_wrapper_; |
+ // An inner class acting as a T filter where actual data can be tapped. |
+ class TeeFilter; |
+ scoped_ptr<TeeFilter> tee_filter_; |
+ |
// NOTE: Weak pointers must be invalidated before all other member variables. |
base::WeakPtrFactory<WebAudioSourceProviderImpl> weak_factory_; |