Async
0.18.0
|
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