AsyncAudioValve.h

Go to the documentation of this file.
00001 
00028 #ifndef ASYNC_AUDIO_VALVE_INCLUDED
00029 #define ASYNC_AUDIO_VALVE_INCLUDED
00030 
00031 
00032 /****************************************************************************
00033  *
00034  * System Includes
00035  *
00036  ****************************************************************************/
00037 
00038 
00039 
00040 /****************************************************************************
00041  *
00042  * Project Includes
00043  *
00044  ****************************************************************************/
00045 
00046 #include <AsyncAudioSink.h>
00047 #include <AsyncAudioSource.h>
00048 
00049 
00050 
00051 /****************************************************************************
00052  *
00053  * Local Includes
00054  *
00055  ****************************************************************************/
00056 
00057 
00058 
00059 /****************************************************************************
00060  *
00061  * Forward declarations
00062  *
00063  ****************************************************************************/
00064 
00065 
00066 
00067 /****************************************************************************
00068  *
00069  * Namespace
00070  *
00071  ****************************************************************************/
00072 
00073 namespace Async
00074 {
00075 
00076 
00077 /****************************************************************************
00078  *
00079  * Forward declarations of classes inside of the declared namespace
00080  *
00081  ****************************************************************************/
00082 
00083   
00084 
00085 /****************************************************************************
00086  *
00087  * Defines & typedefs
00088  *
00089  ****************************************************************************/
00090 
00091 
00092 
00093 /****************************************************************************
00094  *
00095  * Exported Global Variables
00096  *
00097  ****************************************************************************/
00098 
00099 
00100 
00101 /****************************************************************************
00102  *
00103  * Class definitions
00104  *
00105  ****************************************************************************/
00106 
00116 class AudioValve : public Async::AudioSink, public Async::AudioSource
00117 {
00118   public:
00122     explicit AudioValve(void)
00123       : block_when_closed(false), is_open(true),
00124         is_idle(true), is_flushing(false), input_stopped(false)
00125     {
00126     }
00127   
00131     ~AudioValve(void) {}
00132     
00142     void setOpen(bool do_open)
00143     {
00144       if (is_open == do_open)
00145       {
00146         return;
00147       }
00148       
00149       is_open = do_open;
00150       
00151       if (do_open)
00152       {
00153         if (input_stopped)
00154         {
00155           input_stopped = false;
00156           sourceResumeOutput();
00157         }
00158       }
00159       else
00160       {
00161         if (!is_idle && !is_flushing)
00162         {
00163           sinkFlushSamples();
00164         }
00165         if (!block_when_closed && input_stopped)
00166         {
00167           input_stopped = false;
00168           sourceResumeOutput();
00169         }
00170         if (is_flushing)
00171         {
00172           is_idle = true;
00173           is_flushing = false;
00174           sourceAllSamplesFlushed();
00175         }
00176       }
00177     }
00178 
00188     void setBlockWhenClosed(bool block_when_closed)
00189     {
00190       if (block_when_closed == this->block_when_closed)
00191       {
00192         return;
00193       }
00194       
00195       this->block_when_closed = block_when_closed;
00196       
00197       if (!block_when_closed && input_stopped)
00198       {
00199         input_stopped = false;
00200         sourceResumeOutput();
00201       }
00202     }
00203     
00208     bool isOpen(void) const
00209     {
00210       return is_open;
00211     }
00212     
00217     bool isIdle(void) const
00218     {
00219       return is_idle;
00220     }
00221   
00233     int writeSamples(const float *samples, int count)
00234     {
00235       int ret = 0;
00236       is_idle = false;
00237       is_flushing = false;
00238       if (is_open)
00239       {
00240         ret = sinkWriteSamples(samples, count);
00241       }
00242       else
00243       {
00244         ret = (block_when_closed ? 0 : count);
00245       }
00246       
00247       if (ret == 0)
00248       {
00249         input_stopped = true;
00250       }
00251       
00252       return ret;
00253     }
00254     
00263     void flushSamples(void)
00264     {
00265       if (is_open)
00266       {
00267         is_flushing = true;
00268         sinkFlushSamples();
00269       }
00270       else
00271       {
00272         is_flushing = false;
00273         is_idle = true;
00274         sourceAllSamplesFlushed();
00275       }
00276     }
00277     
00286     void resumeOutput(void)
00287     {
00288       if (is_open)
00289       {
00290         if (input_stopped)
00291         {
00292           input_stopped = false;
00293           sourceResumeOutput();
00294         }
00295       }
00296     }
00297     
00305     virtual void allSamplesFlushed(void)
00306     {
00307       bool was_flushing = is_flushing;
00308       is_flushing = false;
00309       is_idle = true;
00310       if (is_open && was_flushing)
00311       {
00312         sourceAllSamplesFlushed();
00313       }
00314     }
00315     
00316     
00317   protected:
00318     
00319   private:
00320     AudioValve(const AudioValve&);
00321     AudioValve& operator=(const AudioValve&);
00322     
00323     bool block_when_closed;
00324     bool is_open;
00325     bool is_idle;
00326     bool is_flushing;
00327     bool input_stopped;
00328     
00329 };  /* class AudioValve */
00330 
00331 
00332 } /* namespace */
00333 
00334 #endif /* ASYNC_AUDIO_VALVE_INCLUDED */
00335 
00336 
00337 
00338 /*
00339  * This file has not been truncated
00340  */
00341 
Generated by  doxygen 1.6.2-20100208