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