Home | History | Annotate | Download | only in pulse
      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 // Creates an audio output stream based on the PulseAudio asynchronous API;
      6 // specifically using the pa_threaded_mainloop model.
      7 //
      8 // If the stream is successfully opened, Close() must be called before the
      9 // stream is deleted as Close() is responsible for ensuring resource cleanup
     10 // occurs.
     11 //
     12 // This object is designed so that all AudioOutputStream methods will be called
     13 // on the same thread that created the object.
     14 //
     15 // WARNING: This object blocks on internal PulseAudio calls in Open() while
     16 // waiting for PulseAudio's context structure to be ready.  It also blocks in
     17 // inside PulseAudio in Start() and repeated during playback, waiting for
     18 // PulseAudio write callbacks to occur.
     19 
     20 #ifndef MEDIA_AUDIO_PULSE_PULSE_OUTPUT_H_
     21 #define MEDIA_AUDIO_PULSE_PULSE_OUTPUT_H_
     22 
     23 #include "base/memory/scoped_ptr.h"
     24 #include "media/audio/audio_io.h"
     25 #include "media/audio/audio_parameters.h"
     26 
     27 struct pa_context;
     28 struct pa_operation;
     29 struct pa_stream;
     30 struct pa_threaded_mainloop;
     31 
     32 namespace media {
     33 class AudioManagerBase;
     34 
     35 class PulseAudioOutputStream : public AudioOutputStream {
     36  public:
     37   PulseAudioOutputStream(const AudioParameters& params,
     38                          AudioManagerBase* manager);
     39 
     40   virtual ~PulseAudioOutputStream();
     41 
     42   // Implementation of AudioOutputStream.
     43   virtual bool Open() OVERRIDE;
     44   virtual void Close() OVERRIDE;
     45   virtual void Start(AudioSourceCallback* callback) OVERRIDE;
     46   virtual void Stop() OVERRIDE;
     47   virtual void SetVolume(double volume) OVERRIDE;
     48   virtual void GetVolume(double* volume) OVERRIDE;
     49 
     50  private:
     51   // Called by PulseAudio when |pa_stream_| change state.  If an unexpected
     52   // failure state change happens and |source_callback_| is set
     53   // this method will forward the error via OnError().
     54   static void StreamNotifyCallback(pa_stream* s, void* p_this);
     55 
     56   // Called by PulseAudio when it needs more audio data.
     57   static void StreamRequestCallback(pa_stream* s, size_t len, void* p_this);
     58 
     59   // Fulfill a write request from the write request callback.  Outputs silence
     60   // if the request could not be fulfilled.
     61   void FulfillWriteRequest(size_t requested_bytes);
     62 
     63   // Close() helper function to free internal structs.
     64   void Reset();
     65 
     66   // AudioParameters from the constructor.
     67   const AudioParameters params_;
     68 
     69   // Audio manager that created us.  Used to report that we've closed.
     70   AudioManagerBase* manager_;
     71 
     72   // PulseAudio API structs.
     73   pa_context* pa_context_;
     74   pa_threaded_mainloop* pa_mainloop_;
     75   pa_stream* pa_stream_;
     76 
     77   // Float representation of volume from 0.0 to 1.0.
     78   float volume_;
     79 
     80   // Callback to audio data source.  Must only be modified while holding a lock
     81   // on |pa_mainloop_| via pa_threaded_mainloop_lock().
     82   AudioSourceCallback* source_callback_;
     83 
     84   // Container for retrieving data from AudioSourceCallback::OnMoreData().
     85   scoped_ptr<AudioBus> audio_bus_;
     86 
     87   DISALLOW_COPY_AND_ASSIGN(PulseAudioOutputStream);
     88 };
     89 
     90 }  // namespace media
     91 
     92 #endif  // MEDIA_AUDIO_PULSE_PULSE_OUTPUT_H_
     93