1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef MEDIA_BLINK_WEBAUDIOSOURCEPROVIDER_IMPL_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MEDIA_BLINK_WEBAUDIOSOURCEPROVIDER_IMPL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_renderer_sink.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/media_export.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebAudioSourceProvider.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebAudioSourceProviderClient; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebAudioSourceProviderImpl provides a bridge between classes: 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// blink::WebAudioSourceProvider <---> AudioRendererSink 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebAudioSourceProviderImpl wraps an existing audio sink that is used unless 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebKit has set a client via setClient(). While a client is set WebKit will 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// periodically call provideInput() to render a certain number of audio 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sample-frames using the sink's RenderCallback to get the data. 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// All calls are protected by a lock. 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MEDIA_EXPORT WebAudioSourceProviderImpl 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : NON_EXPORTED_BASE(public blink::WebAudioSourceProvider), 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NON_EXPORTED_BASE(public AudioRendererSink) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit WebAudioSourceProviderImpl( 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<AudioRendererSink>& sink); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // blink::WebAudioSourceProvider implementation. 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void setClient(blink::WebAudioSourceProviderClient* client); 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void provideInput(const blink::WebVector<float*>& audio_data, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t number_of_frames); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // AudioRendererSink implementation. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start() OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Stop() OVERRIDE; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Play() OVERRIDE; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Pause() OVERRIDE; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetVolume(double volume) OVERRIDE; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Initialize(const AudioParameters& params, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderCallback* renderer) OVERRIDE; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WebAudioSourceProviderImpl(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Calls setFormat() on |client_| from the Blink renderer thread. 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnSetFormat(); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Closure that posts a task to call OnSetFormat() on the renderer thread. 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure set_format_cb_; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when Initialize() is called. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int channels_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sample_rate_; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) double volume_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tracks the current playback state. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum PlaybackState { kStopped, kStarted, kPlaying }; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PlaybackState state_; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Where audio comes from. 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AudioRendererSink::RenderCallback* renderer_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When set via setClient() it overrides |sink_| for consuming audio. 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebAudioSourceProviderClient* client_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Where audio ends up unless overridden by |client_|. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock sink_lock_; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<AudioRendererSink> sink_; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<AudioBus> bus_wrapper_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // NOTE: Weak pointers must be invalidated before all other member variables. 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::WeakPtrFactory<WebAudioSourceProviderImpl> weak_factory_; 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_IMPLICIT_CONSTRUCTORS(WebAudioSourceProviderImpl); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace media 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // MEDIA_BLINK_WEBAUDIOSOURCEPROVIDER_IMPL_H_ 91