Home | History | Annotate | Download | only in audio
      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_AUDIO_AUDIO_OUTPUT_PROXY_H_
      6 #define MEDIA_AUDIO_AUDIO_OUTPUT_PROXY_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/compiler_specific.h"
     10 #include "base/memory/ref_counted.h"
     11 #include "base/threading/non_thread_safe.h"
     12 #include "media/audio/audio_io.h"
     13 #include "media/audio/audio_parameters.h"
     14 
     15 namespace media {
     16 
     17 class AudioOutputDispatcher;
     18 
     19 // AudioOutputProxy is an audio otput stream that uses resources more
     20 // efficiently than a regular audio output stream: it opens audio
     21 // device only when sound is playing, i.e. between Start() and Stop()
     22 // (there is still one physical stream per each audio output proxy in
     23 // playing state).
     24 //
     25 // AudioOutputProxy uses AudioOutputDispatcher to open and close
     26 // physical output streams.
     27 class MEDIA_EXPORT AudioOutputProxy
     28   : public AudioOutputStream,
     29     public NON_EXPORTED_BASE(base::NonThreadSafe) {
     30  public:
     31   // Caller keeps ownership of |dispatcher|.
     32   explicit AudioOutputProxy(AudioOutputDispatcher* dispatcher);
     33 
     34   // AudioOutputStream interface.
     35   virtual bool Open() OVERRIDE;
     36   virtual void Start(AudioSourceCallback* callback) OVERRIDE;
     37   virtual void Stop() OVERRIDE;
     38   virtual void SetVolume(double volume) OVERRIDE;
     39   virtual void GetVolume(double* volume) OVERRIDE;
     40   virtual void Close() OVERRIDE;
     41 
     42  private:
     43   enum State {
     44     kCreated,
     45     kOpened,
     46     kPlaying,
     47     kClosed,
     48     kOpenError,
     49     kStartError,
     50   };
     51 
     52   virtual ~AudioOutputProxy();
     53 
     54   scoped_refptr<AudioOutputDispatcher> dispatcher_;
     55   State state_;
     56 
     57   // Need to save volume here, so that we can restore it in case the stream
     58   // is stopped, and then started again.
     59   double volume_;
     60 
     61   DISALLOW_COPY_AND_ASSIGN(AudioOutputProxy);
     62 };
     63 
     64 }  // namespace media
     65 
     66 #endif  // MEDIA_AUDIO_AUDIO_OUTPUT_PROXY_H_
     67