Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef MEDIA_BASE_AUDIO_RENDERER_H_
      6 #define MEDIA_BASE_AUDIO_RENDERER_H_
      7 
      8 #include "base/callback.h"
      9 #include "base/memory/ref_counted.h"
     10 #include "base/time/time.h"
     11 #include "media/base/media_export.h"
     12 #include "media/base/pipeline_status.h"
     13 
     14 namespace media {
     15 
     16 class DemuxerStream;
     17 
     18 class MEDIA_EXPORT AudioRenderer {
     19  public:
     20   // First parameter is the current time that has been rendered.
     21   // Second parameter is the maximum time value that the clock cannot exceed.
     22   typedef base::Callback<void(base::TimeDelta, base::TimeDelta)> TimeCB;
     23 
     24   AudioRenderer();
     25   virtual ~AudioRenderer();
     26 
     27   // Initialize an AudioRenderer with |stream|, executing |init_cb| upon
     28   // completion.
     29   //
     30   // |statistics_cb| is executed periodically with audio rendering stats.
     31   //
     32   // |underflow_cb| is executed when the renderer runs out of data to pass to
     33   // the audio card during playback. ResumeAfterUnderflow() must be called
     34   // to resume playback. Pause(), Preroll(), or Stop() cancels the underflow
     35   // condition.
     36   //
     37   // |time_cb| is executed whenever time has advanced by way of audio rendering.
     38   //
     39   // |ended_cb| is executed when audio rendering has reached the end of stream.
     40   //
     41   // |disabled_cb| is executed when audio rendering has been disabled due to
     42   // external factors (i.e., device was removed). |time_cb| will no longer be
     43   // executed. TODO(scherkus): this might not be needed http://crbug.com/234708
     44   //
     45   // |error_cb| is executed if an error was encountered.
     46   virtual void Initialize(DemuxerStream* stream,
     47                           const PipelineStatusCB& init_cb,
     48                           const StatisticsCB& statistics_cb,
     49                           const base::Closure& underflow_cb,
     50                           const TimeCB& time_cb,
     51                           const base::Closure& ended_cb,
     52                           const base::Closure& disabled_cb,
     53                           const PipelineStatusCB& error_cb) = 0;
     54 
     55   // Start audio decoding and rendering at the current playback rate, executing
     56   // |callback| when playback is underway.
     57   virtual void Play(const base::Closure& callback) = 0;
     58 
     59   // Temporarily suspend decoding and rendering audio, executing |callback| when
     60   // playback has been suspended.
     61   virtual void Pause(const base::Closure& callback) = 0;
     62 
     63   // Discard any audio data, executing |callback| when completed.
     64   virtual void Flush(const base::Closure& callback) = 0;
     65 
     66   // Start prerolling audio data for samples starting at |time|, executing
     67   // |callback| when completed.
     68   //
     69   // Only valid to call after a successful Initialize() or Flush().
     70   virtual void Preroll(base::TimeDelta time,
     71                        const PipelineStatusCB& callback) = 0;
     72 
     73   // Stop all operations in preparation for being deleted, executing |callback|
     74   // when complete.
     75   virtual void Stop(const base::Closure& callback) = 0;
     76 
     77   // Updates the current playback rate.
     78   virtual void SetPlaybackRate(float playback_rate) = 0;
     79 
     80   // Sets the output volume.
     81   virtual void SetVolume(float volume) = 0;
     82 
     83   // Resumes playback after underflow occurs.
     84   virtual void ResumeAfterUnderflow() = 0;
     85 
     86  private:
     87   DISALLOW_COPY_AND_ASSIGN(AudioRenderer);
     88 };
     89 
     90 }  // namespace media
     91 
     92 #endif  // MEDIA_BASE_AUDIO_RENDERER_H_
     93