Async  0.18.0
AsyncAudioDevice.h
Go to the documentation of this file.
00001 
00028 #ifndef ASYNC_AUDIO_DEVICE_INCLUDED
00029 #define ASYNC_AUDIO_DEVICE_INCLUDED
00030 
00031 
00032 /****************************************************************************
00033  *
00034  * System Includes
00035  *
00036  ****************************************************************************/
00037 
00038 #include <sigc++/sigc++.h>
00039 #include <stdint.h>
00040 
00041 #include <string>
00042 #include <map>
00043 #include <list>
00044 
00045 
00046 /****************************************************************************
00047  *
00048  * Project Includes
00049  *
00050  ****************************************************************************/
00051 
00052 
00053 
00054 /****************************************************************************
00055  *
00056  * Local Includes
00057  *
00058  ****************************************************************************/
00059 
00060 
00061 
00062 /****************************************************************************
00063  *
00064  * Forward declarations
00065  *
00066  ****************************************************************************/
00067 
00068 
00069 
00070 /****************************************************************************
00071  *
00072  * Namespace
00073  *
00074  ****************************************************************************/
00075 
00076 namespace Async
00077 {
00078 
00079 
00080 /****************************************************************************
00081  *
00082  * Forward declarations of classes inside of the declared namespace
00083  *
00084  ****************************************************************************/
00085 
00086 class AudioIO;
00087 class FdWatch;
00088 
00089 
00090 /****************************************************************************
00091  *
00092  * Defines & typedefs
00093  *
00094  ****************************************************************************/
00095 
00096 
00097 
00098 /****************************************************************************
00099  *
00100  * Exported Global Variables
00101  *
00102  ****************************************************************************/
00103 
00104 
00105 
00106 /****************************************************************************
00107  *
00108  * Class definitions
00109  *
00110  ****************************************************************************/
00111 
00122 class AudioDevice : public SigC::Object
00123 {
00124   public:
00128     typedef enum
00129     {
00130       MODE_NONE,  
00131       MODE_RD,    
00132       MODE_WR,    
00133       MODE_RDWR   
00134     } Mode;
00135   
00147     static AudioDevice *registerAudioIO(const std::string& dev_designator,
00148             AudioIO *audio_io);
00149     
00154     static void unregisterAudioIO(AudioIO *audio_io);
00155     
00165     static void setSampleRate(int rate) { sample_rate = rate; }
00166     
00181     static void setBlocksize(int size)
00182     {
00183       block_size_hint = size;
00184     }
00185     
00190     virtual int blocksize(void) = 0;
00191     
00205     static void setBlockCount(int count)
00206     {
00207       block_count_hint = (count <= 0) ? 0 : count;
00208     }
00209     
00219     static void setChannels(int channels)
00220     {
00221       AudioDevice::channels = channels;
00222     }
00223 
00224     
00230     virtual bool isFullDuplexCapable(void) = 0;
00231     
00237     bool open(Mode mode);
00238     
00242     void close(void);
00243     
00248     Mode mode(void) const { return current_mode; }
00249     
00254     virtual void audioToWriteAvailable(void) = 0;
00255 
00256     /*
00257      * @brief   Tell the audio device to flush its buffers
00258      */
00259     virtual void flushSamples(void) = 0;
00260     
00271     virtual int samplesToWrite(void) const = 0;
00272     
00277     int sampleRate(void) const { return sample_rate; }
00278 
00283     const std::string& devName(void) const { return dev_name; }
00284     
00285     
00286   protected:
00287     static int          sample_rate;
00288     static int          block_size_hint;
00289     static int          block_count_hint;
00290     static int          channels;
00291 
00292     std::string         dev_name;
00293     
00298     explicit AudioDevice(const std::string& dev_name);
00299   
00303     virtual ~AudioDevice(void);
00304     
00310     virtual bool openDevice(Mode mode) = 0;
00311 
00315     virtual void closeDevice(void) = 0;
00316 
00317     void putBlocks(int16_t *buf, int frame_cnt);
00318     int getBlocks(int16_t *buf, int block_cnt);
00319     
00320     
00321   private:
00322     static const int  DEFAULT_SAMPLE_RATE = INTERNAL_SAMPLE_RATE;
00323     static const int  DEFAULT_CHANNELS = 2;
00324     static const int  DEFAULT_BLOCK_COUNT_HINT = 4;
00325     static const int  DEFAULT_BLOCK_SIZE_HINT = 256; // Samples/channel/block
00326     
00327     static std::map<std::string, AudioDevice*>  devices;
00328     
00329     Mode                current_mode;
00330     int                 use_count;
00331     std::list<AudioIO*> aios;
00332 
00333 };  /* class AudioDevice */
00334 
00335 
00336 } /* namespace */
00337 
00338 #endif /* ASYNC_AUDIO_DEVICE_INCLUDED */
00339 
00340 
00341 
00342 /*
00343  * This file has not been truncated
00344  */
00345