Mercurial > hg > apm2s
comparison stk/include/RtAudio.h @ 0:4606bd505630 tip
first import
author | Fiore Martin <f.martin@qmul.ac.uk> |
---|---|
date | Sat, 13 Jun 2015 15:08:10 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4606bd505630 |
---|---|
1 /************************************************************************/ | |
2 /*! \class RtAudio | |
3 \brief Realtime audio i/o C++ classes. | |
4 | |
5 RtAudio provides a common API (Application Programming Interface) | |
6 for realtime audio input/output across Linux (native ALSA, Jack, | |
7 and OSS), Macintosh OS X (CoreAudio and Jack), and Windows | |
8 (DirectSound, ASIO and WASAPI) operating systems. | |
9 | |
10 RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ | |
11 | |
12 RtAudio: realtime audio i/o C++ classes | |
13 Copyright (c) 2001-2014 Gary P. Scavone | |
14 | |
15 Permission is hereby granted, free of charge, to any person | |
16 obtaining a copy of this software and associated documentation files | |
17 (the "Software"), to deal in the Software without restriction, | |
18 including without limitation the rights to use, copy, modify, merge, | |
19 publish, distribute, sublicense, and/or sell copies of the Software, | |
20 and to permit persons to whom the Software is furnished to do so, | |
21 subject to the following conditions: | |
22 | |
23 The above copyright notice and this permission notice shall be | |
24 included in all copies or substantial portions of the Software. | |
25 | |
26 Any person wishing to distribute modifications to the Software is | |
27 asked to send the modifications to the original developer so that | |
28 they can be incorporated into the canonical version. This is, | |
29 however, not a binding provision of this license. | |
30 | |
31 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
32 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
33 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
34 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR | |
35 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |
36 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
37 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
38 */ | |
39 /************************************************************************/ | |
40 | |
41 /*! | |
42 \file RtAudio.h | |
43 */ | |
44 | |
45 #ifndef __RTAUDIO_H | |
46 #define __RTAUDIO_H | |
47 | |
48 #define RTAUDIO_VERSION "4.1.1" | |
49 | |
50 #include <string> | |
51 #include <vector> | |
52 #include <exception> | |
53 #include <iostream> | |
54 | |
55 /*! \typedef typedef unsigned long RtAudioFormat; | |
56 \brief RtAudio data format type. | |
57 | |
58 Support for signed integers and floats. Audio data fed to/from an | |
59 RtAudio stream is assumed to ALWAYS be in host byte order. The | |
60 internal routines will automatically take care of any necessary | |
61 byte-swapping between the host format and the soundcard. Thus, | |
62 endian-ness is not a concern in the following format definitions. | |
63 | |
64 - \e RTAUDIO_SINT8: 8-bit signed integer. | |
65 - \e RTAUDIO_SINT16: 16-bit signed integer. | |
66 - \e RTAUDIO_SINT24: 24-bit signed integer. | |
67 - \e RTAUDIO_SINT32: 32-bit signed integer. | |
68 - \e RTAUDIO_FLOAT32: Normalized between plus/minus 1.0. | |
69 - \e RTAUDIO_FLOAT64: Normalized between plus/minus 1.0. | |
70 */ | |
71 typedef unsigned long RtAudioFormat; | |
72 static const RtAudioFormat RTAUDIO_SINT8 = 0x1; // 8-bit signed integer. | |
73 static const RtAudioFormat RTAUDIO_SINT16 = 0x2; // 16-bit signed integer. | |
74 static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // 24-bit signed integer. | |
75 static const RtAudioFormat RTAUDIO_SINT32 = 0x8; // 32-bit signed integer. | |
76 static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0. | |
77 static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0. | |
78 | |
79 /*! \typedef typedef unsigned long RtAudioStreamFlags; | |
80 \brief RtAudio stream option flags. | |
81 | |
82 The following flags can be OR'ed together to allow a client to | |
83 make changes to the default stream behavior: | |
84 | |
85 - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). | |
86 - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. | |
87 - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. | |
88 - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). | |
89 | |
90 By default, RtAudio streams pass and receive audio data from the | |
91 client in an interleaved format. By passing the | |
92 RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio | |
93 data will instead be presented in non-interleaved buffers. In | |
94 this case, each buffer argument in the RtAudioCallback function | |
95 will point to a single array of data, with \c nFrames samples for | |
96 each channel concatenated back-to-back. For example, the first | |
97 sample of data for the second channel would be located at index \c | |
98 nFrames (assuming the \c buffer pointer was recast to the correct | |
99 data type for the stream). | |
100 | |
101 Certain audio APIs offer a number of parameters that influence the | |
102 I/O latency of a stream. By default, RtAudio will attempt to set | |
103 these parameters internally for robust (glitch-free) performance | |
104 (though some APIs, like Windows Direct Sound, make this difficult). | |
105 By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() | |
106 function, internal stream settings will be influenced in an attempt | |
107 to minimize stream latency, though possibly at the expense of stream | |
108 performance. | |
109 | |
110 If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to | |
111 open the input and/or output stream device(s) for exclusive use. | |
112 Note that this is not possible with all supported audio APIs. | |
113 | |
114 If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt | |
115 to select realtime scheduling (round-robin) for the callback thread. | |
116 | |
117 If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to | |
118 open the "default" PCM device when using the ALSA API. Note that this | |
119 will override any specified input or output device id. | |
120 */ | |
121 typedef unsigned int RtAudioStreamFlags; | |
122 static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1; // Use non-interleaved buffers (default = interleaved). | |
123 static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2; // Attempt to set stream parameters for lowest possible latency. | |
124 static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4; // Attempt grab device and prevent use by others. | |
125 static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread. | |
126 static const RtAudioStreamFlags RTAUDIO_ALSA_USE_DEFAULT = 0x10; // Use the "default" PCM device (ALSA only). | |
127 | |
128 /*! \typedef typedef unsigned long RtAudioStreamStatus; | |
129 \brief RtAudio stream status (over- or underflow) flags. | |
130 | |
131 Notification of a stream over- or underflow is indicated by a | |
132 non-zero stream \c status argument in the RtAudioCallback function. | |
133 The stream status can be one of the following two options, | |
134 depending on whether the stream is open for output and/or input: | |
135 | |
136 - \e RTAUDIO_INPUT_OVERFLOW: Input data was discarded because of an overflow condition at the driver. | |
137 - \e RTAUDIO_OUTPUT_UNDERFLOW: The output buffer ran low, likely producing a break in the output sound. | |
138 */ | |
139 typedef unsigned int RtAudioStreamStatus; | |
140 static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1; // Input data was discarded because of an overflow condition at the driver. | |
141 static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2; // The output buffer ran low, likely causing a gap in the output sound. | |
142 | |
143 //! RtAudio callback function prototype. | |
144 /*! | |
145 All RtAudio clients must create a function of type RtAudioCallback | |
146 to read and/or write data from/to the audio stream. When the | |
147 underlying audio system is ready for new input or output data, this | |
148 function will be invoked. | |
149 | |
150 \param outputBuffer For output (or duplex) streams, the client | |
151 should write \c nFrames of audio sample frames into this | |
152 buffer. This argument should be recast to the datatype | |
153 specified when the stream was opened. For input-only | |
154 streams, this argument will be NULL. | |
155 | |
156 \param inputBuffer For input (or duplex) streams, this buffer will | |
157 hold \c nFrames of input audio sample frames. This | |
158 argument should be recast to the datatype specified when the | |
159 stream was opened. For output-only streams, this argument | |
160 will be NULL. | |
161 | |
162 \param nFrames The number of sample frames of input or output | |
163 data in the buffers. The actual buffer size in bytes is | |
164 dependent on the data type and number of channels in use. | |
165 | |
166 \param streamTime The number of seconds that have elapsed since the | |
167 stream was started. | |
168 | |
169 \param status If non-zero, this argument indicates a data overflow | |
170 or underflow condition for the stream. The particular | |
171 condition can be determined by comparison with the | |
172 RtAudioStreamStatus flags. | |
173 | |
174 \param userData A pointer to optional data provided by the client | |
175 when opening the stream (default = NULL). | |
176 | |
177 To continue normal stream operation, the RtAudioCallback function | |
178 should return a value of zero. To stop the stream and drain the | |
179 output buffer, the function should return a value of one. To abort | |
180 the stream immediately, the client should return a value of two. | |
181 */ | |
182 typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer, | |
183 unsigned int nFrames, | |
184 double streamTime, | |
185 RtAudioStreamStatus status, | |
186 void *userData ); | |
187 | |
188 /************************************************************************/ | |
189 /*! \class RtAudioError | |
190 \brief Exception handling class for RtAudio. | |
191 | |
192 The RtAudioError class is quite simple but it does allow errors to be | |
193 "caught" by RtAudioError::Type. See the RtAudio documentation to know | |
194 which methods can throw an RtAudioError. | |
195 */ | |
196 /************************************************************************/ | |
197 | |
198 class RtAudioError : public std::exception | |
199 { | |
200 public: | |
201 //! Defined RtAudioError types. | |
202 enum Type { | |
203 WARNING, /*!< A non-critical error. */ | |
204 DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ | |
205 UNSPECIFIED, /*!< The default, unspecified error type. */ | |
206 NO_DEVICES_FOUND, /*!< No devices found on system. */ | |
207 INVALID_DEVICE, /*!< An invalid device ID was specified. */ | |
208 MEMORY_ERROR, /*!< An error occured during memory allocation. */ | |
209 INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ | |
210 INVALID_USE, /*!< The function was called incorrectly. */ | |
211 DRIVER_ERROR, /*!< A system driver error occured. */ | |
212 SYSTEM_ERROR, /*!< A system error occured. */ | |
213 THREAD_ERROR /*!< A thread error occured. */ | |
214 }; | |
215 | |
216 //! The constructor. | |
217 RtAudioError( const std::string& message, Type type = RtAudioError::UNSPECIFIED ) throw() : message_(message), type_(type) {} | |
218 | |
219 //! The destructor. | |
220 virtual ~RtAudioError( void ) throw() {} | |
221 | |
222 //! Prints thrown error message to stderr. | |
223 virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } | |
224 | |
225 //! Returns the thrown error message type. | |
226 virtual const Type& getType(void) const throw() { return type_; } | |
227 | |
228 //! Returns the thrown error message string. | |
229 virtual const std::string& getMessage(void) const throw() { return message_; } | |
230 | |
231 //! Returns the thrown error message as a c-style string. | |
232 virtual const char* what( void ) const throw() { return message_.c_str(); } | |
233 | |
234 protected: | |
235 std::string message_; | |
236 Type type_; | |
237 }; | |
238 | |
239 //! RtAudio error callback function prototype. | |
240 /*! | |
241 \param type Type of error. | |
242 \param errorText Error description. | |
243 */ | |
244 typedef void (*RtAudioErrorCallback)( RtAudioError::Type type, const std::string &errorText ); | |
245 | |
246 // **************************************************************** // | |
247 // | |
248 // RtAudio class declaration. | |
249 // | |
250 // RtAudio is a "controller" used to select an available audio i/o | |
251 // interface. It presents a common API for the user to call but all | |
252 // functionality is implemented by the class RtApi and its | |
253 // subclasses. RtAudio creates an instance of an RtApi subclass | |
254 // based on the user's API choice. If no choice is made, RtAudio | |
255 // attempts to make a "logical" API selection. | |
256 // | |
257 // **************************************************************** // | |
258 | |
259 class RtApi; | |
260 | |
261 class RtAudio | |
262 { | |
263 public: | |
264 | |
265 //! Audio API specifier arguments. | |
266 enum Api { | |
267 UNSPECIFIED, /*!< Search for a working compiled API. */ | |
268 LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ | |
269 LINUX_PULSE, /*!< The Linux PulseAudio API. */ | |
270 LINUX_OSS, /*!< The Linux Open Sound System API. */ | |
271 UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ | |
272 MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ | |
273 WINDOWS_WASAPI, /*!< The Microsoft WASAPI API. */ | |
274 WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ | |
275 WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ | |
276 RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ | |
277 }; | |
278 | |
279 //! The public device information structure for returning queried values. | |
280 struct DeviceInfo { | |
281 bool probed; /*!< true if the device capabilities were successfully probed. */ | |
282 std::string name; /*!< Character string device identifier. */ | |
283 unsigned int outputChannels; /*!< Maximum output channels supported by device. */ | |
284 unsigned int inputChannels; /*!< Maximum input channels supported by device. */ | |
285 unsigned int duplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ | |
286 bool isDefaultOutput; /*!< true if this is the default output device. */ | |
287 bool isDefaultInput; /*!< true if this is the default input device. */ | |
288 std::vector<unsigned int> sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ | |
289 RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ | |
290 | |
291 // Default constructor. | |
292 DeviceInfo() | |
293 :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), | |
294 isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {} | |
295 }; | |
296 | |
297 //! The structure for specifying input or ouput stream parameters. | |
298 struct StreamParameters { | |
299 unsigned int deviceId; /*!< Device index (0 to getDeviceCount() - 1). */ | |
300 unsigned int nChannels; /*!< Number of channels. */ | |
301 unsigned int firstChannel; /*!< First channel index on device (default = 0). */ | |
302 | |
303 // Default constructor. | |
304 StreamParameters() | |
305 : deviceId(0), nChannels(0), firstChannel(0) {} | |
306 }; | |
307 | |
308 //! The structure for specifying stream options. | |
309 /*! | |
310 The following flags can be OR'ed together to allow a client to | |
311 make changes to the default stream behavior: | |
312 | |
313 - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). | |
314 - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. | |
315 - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. | |
316 - \e RTAUDIO_SCHEDULE_REALTIME: Attempt to select realtime scheduling for callback thread. | |
317 - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). | |
318 | |
319 By default, RtAudio streams pass and receive audio data from the | |
320 client in an interleaved format. By passing the | |
321 RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio | |
322 data will instead be presented in non-interleaved buffers. In | |
323 this case, each buffer argument in the RtAudioCallback function | |
324 will point to a single array of data, with \c nFrames samples for | |
325 each channel concatenated back-to-back. For example, the first | |
326 sample of data for the second channel would be located at index \c | |
327 nFrames (assuming the \c buffer pointer was recast to the correct | |
328 data type for the stream). | |
329 | |
330 Certain audio APIs offer a number of parameters that influence the | |
331 I/O latency of a stream. By default, RtAudio will attempt to set | |
332 these parameters internally for robust (glitch-free) performance | |
333 (though some APIs, like Windows Direct Sound, make this difficult). | |
334 By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() | |
335 function, internal stream settings will be influenced in an attempt | |
336 to minimize stream latency, though possibly at the expense of stream | |
337 performance. | |
338 | |
339 If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to | |
340 open the input and/or output stream device(s) for exclusive use. | |
341 Note that this is not possible with all supported audio APIs. | |
342 | |
343 If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt | |
344 to select realtime scheduling (round-robin) for the callback thread. | |
345 The \c priority parameter will only be used if the RTAUDIO_SCHEDULE_REALTIME | |
346 flag is set. It defines the thread's realtime priority. | |
347 | |
348 If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to | |
349 open the "default" PCM device when using the ALSA API. Note that this | |
350 will override any specified input or output device id. | |
351 | |
352 The \c numberOfBuffers parameter can be used to control stream | |
353 latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs | |
354 only. A value of two is usually the smallest allowed. Larger | |
355 numbers can potentially result in more robust stream performance, | |
356 though likely at the cost of stream latency. The value set by the | |
357 user is replaced during execution of the RtAudio::openStream() | |
358 function by the value actually used by the system. | |
359 | |
360 The \c streamName parameter can be used to set the client name | |
361 when using the Jack API. By default, the client name is set to | |
362 RtApiJack. However, if you wish to create multiple instances of | |
363 RtAudio with Jack, each instance must have a unique client name. | |
364 */ | |
365 struct StreamOptions { | |
366 RtAudioStreamFlags flags; /*!< A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE, RTAUDIO_ALSA_USE_DEFAULT). */ | |
367 unsigned int numberOfBuffers; /*!< Number of stream buffers. */ | |
368 std::string streamName; /*!< A stream name (currently used only in Jack). */ | |
369 int priority; /*!< Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME). */ | |
370 | |
371 // Default constructor. | |
372 StreamOptions() | |
373 : flags(0), numberOfBuffers(0), priority(0) {} | |
374 }; | |
375 | |
376 //! A static function to determine the current RtAudio version. | |
377 static std::string getVersion( void ) throw(); | |
378 | |
379 //! A static function to determine the available compiled audio APIs. | |
380 /*! | |
381 The values returned in the std::vector can be compared against | |
382 the enumerated list values. Note that there can be more than one | |
383 API compiled for certain operating systems. | |
384 */ | |
385 static void getCompiledApi( std::vector<RtAudio::Api> &apis ) throw(); | |
386 | |
387 //! The class constructor. | |
388 /*! | |
389 The constructor performs minor initialization tasks. An exception | |
390 can be thrown if no API support is compiled. | |
391 | |
392 If no API argument is specified and multiple API support has been | |
393 compiled, the default order of use is JACK, ALSA, OSS (Linux | |
394 systems) and ASIO, DS (Windows systems). | |
395 */ | |
396 RtAudio( RtAudio::Api api=UNSPECIFIED ); | |
397 | |
398 //! The destructor. | |
399 /*! | |
400 If a stream is running or open, it will be stopped and closed | |
401 automatically. | |
402 */ | |
403 ~RtAudio() throw(); | |
404 | |
405 //! Returns the audio API specifier for the current instance of RtAudio. | |
406 RtAudio::Api getCurrentApi( void ) throw(); | |
407 | |
408 //! A public function that queries for the number of audio devices available. | |
409 /*! | |
410 This function performs a system query of available devices each time it | |
411 is called, thus supporting devices connected \e after instantiation. If | |
412 a system error occurs during processing, a warning will be issued. | |
413 */ | |
414 unsigned int getDeviceCount( void ) throw(); | |
415 | |
416 //! Return an RtAudio::DeviceInfo structure for a specified device number. | |
417 /*! | |
418 | |
419 Any device integer between 0 and getDeviceCount() - 1 is valid. | |
420 If an invalid argument is provided, an RtAudioError (type = INVALID_USE) | |
421 will be thrown. If a device is busy or otherwise unavailable, the | |
422 structure member "probed" will have a value of "false" and all | |
423 other members are undefined. If the specified device is the | |
424 current default input or output device, the corresponding | |
425 "isDefault" member will have a value of "true". | |
426 */ | |
427 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
428 | |
429 //! A function that returns the index of the default output device. | |
430 /*! | |
431 If the underlying audio API does not provide a "default | |
432 device", or if no devices are available, the return value will be | |
433 0. Note that this is a valid device identifier and it is the | |
434 client's responsibility to verify that a device is available | |
435 before attempting to open a stream. | |
436 */ | |
437 unsigned int getDefaultOutputDevice( void ) throw(); | |
438 | |
439 //! A function that returns the index of the default input device. | |
440 /*! | |
441 If the underlying audio API does not provide a "default | |
442 device", or if no devices are available, the return value will be | |
443 0. Note that this is a valid device identifier and it is the | |
444 client's responsibility to verify that a device is available | |
445 before attempting to open a stream. | |
446 */ | |
447 unsigned int getDefaultInputDevice( void ) throw(); | |
448 | |
449 //! A public function for opening a stream with the specified parameters. | |
450 /*! | |
451 An RtAudioError (type = SYSTEM_ERROR) is thrown if a stream cannot be | |
452 opened with the specified parameters or an error occurs during | |
453 processing. An RtAudioError (type = INVALID_USE) is thrown if any | |
454 invalid device ID or channel number parameters are specified. | |
455 | |
456 \param outputParameters Specifies output stream parameters to use | |
457 when opening a stream, including a device ID, number of channels, | |
458 and starting channel number. For input-only streams, this | |
459 argument should be NULL. The device ID is an index value between | |
460 0 and getDeviceCount() - 1. | |
461 \param inputParameters Specifies input stream parameters to use | |
462 when opening a stream, including a device ID, number of channels, | |
463 and starting channel number. For output-only streams, this | |
464 argument should be NULL. The device ID is an index value between | |
465 0 and getDeviceCount() - 1. | |
466 \param format An RtAudioFormat specifying the desired sample data format. | |
467 \param sampleRate The desired sample rate (sample frames per second). | |
468 \param *bufferFrames A pointer to a value indicating the desired | |
469 internal buffer size in sample frames. The actual value | |
470 used by the device is returned via the same pointer. A | |
471 value of zero can be specified, in which case the lowest | |
472 allowable value is determined. | |
473 \param callback A client-defined function that will be invoked | |
474 when input data is available and/or output data is needed. | |
475 \param userData An optional pointer to data that can be accessed | |
476 from within the callback function. | |
477 \param options An optional pointer to a structure containing various | |
478 global stream options, including a list of OR'ed RtAudioStreamFlags | |
479 and a suggested number of stream buffers that can be used to | |
480 control stream latency. More buffers typically result in more | |
481 robust performance, though at a cost of greater latency. If a | |
482 value of zero is specified, a system-specific median value is | |
483 chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the | |
484 lowest allowable value is used. The actual value used is | |
485 returned via the structure argument. The parameter is API dependent. | |
486 \param errorCallback A client-defined function that will be invoked | |
487 when an error has occured. | |
488 */ | |
489 void openStream( RtAudio::StreamParameters *outputParameters, | |
490 RtAudio::StreamParameters *inputParameters, | |
491 RtAudioFormat format, unsigned int sampleRate, | |
492 unsigned int *bufferFrames, RtAudioCallback callback, | |
493 void *userData = NULL, RtAudio::StreamOptions *options = NULL, RtAudioErrorCallback errorCallback = NULL ); | |
494 | |
495 //! A function that closes a stream and frees any associated stream memory. | |
496 /*! | |
497 If a stream is not open, this function issues a warning and | |
498 returns (no exception is thrown). | |
499 */ | |
500 void closeStream( void ) throw(); | |
501 | |
502 //! A function that starts a stream. | |
503 /*! | |
504 An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs | |
505 during processing. An RtAudioError (type = INVALID_USE) is thrown if a | |
506 stream is not open. A warning is issued if the stream is already | |
507 running. | |
508 */ | |
509 void startStream( void ); | |
510 | |
511 //! Stop a stream, allowing any samples remaining in the output queue to be played. | |
512 /*! | |
513 An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs | |
514 during processing. An RtAudioError (type = INVALID_USE) is thrown if a | |
515 stream is not open. A warning is issued if the stream is already | |
516 stopped. | |
517 */ | |
518 void stopStream( void ); | |
519 | |
520 //! Stop a stream, discarding any samples remaining in the input/output queue. | |
521 /*! | |
522 An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs | |
523 during processing. An RtAudioError (type = INVALID_USE) is thrown if a | |
524 stream is not open. A warning is issued if the stream is already | |
525 stopped. | |
526 */ | |
527 void abortStream( void ); | |
528 | |
529 //! Returns true if a stream is open and false if not. | |
530 bool isStreamOpen( void ) const throw(); | |
531 | |
532 //! Returns true if the stream is running and false if it is stopped or not open. | |
533 bool isStreamRunning( void ) const throw(); | |
534 | |
535 //! Returns the number of elapsed seconds since the stream was started. | |
536 /*! | |
537 If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. | |
538 */ | |
539 double getStreamTime( void ); | |
540 | |
541 //! Set the stream time to a time in seconds greater than or equal to 0.0. | |
542 /*! | |
543 If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. | |
544 */ | |
545 void setStreamTime( double time ); | |
546 | |
547 //! Returns the internal stream latency in sample frames. | |
548 /*! | |
549 The stream latency refers to delay in audio input and/or output | |
550 caused by internal buffering by the audio system and/or hardware. | |
551 For duplex streams, the returned value will represent the sum of | |
552 the input and output latencies. If a stream is not open, an | |
553 RtAudioError (type = INVALID_USE) will be thrown. If the API does not | |
554 report latency, the return value will be zero. | |
555 */ | |
556 long getStreamLatency( void ); | |
557 | |
558 //! Returns actual sample rate in use by the stream. | |
559 /*! | |
560 On some systems, the sample rate used may be slightly different | |
561 than that specified in the stream parameters. If a stream is not | |
562 open, an RtAudioError (type = INVALID_USE) will be thrown. | |
563 */ | |
564 unsigned int getStreamSampleRate( void ); | |
565 | |
566 //! Specify whether warning messages should be printed to stderr. | |
567 void showWarnings( bool value = true ) throw(); | |
568 | |
569 protected: | |
570 | |
571 void openRtApi( RtAudio::Api api ); | |
572 RtApi *rtapi_; | |
573 }; | |
574 | |
575 // Operating system dependent thread functionality. | |
576 #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) | |
577 | |
578 #ifndef NOMINMAX | |
579 #define NOMINMAX | |
580 #endif | |
581 #include <windows.h> | |
582 #include <process.h> | |
583 | |
584 typedef uintptr_t ThreadHandle; | |
585 typedef CRITICAL_SECTION StreamMutex; | |
586 | |
587 #elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) | |
588 // Using pthread library for various flavors of unix. | |
589 #include <pthread.h> | |
590 | |
591 typedef pthread_t ThreadHandle; | |
592 typedef pthread_mutex_t StreamMutex; | |
593 | |
594 #else // Setup for "dummy" behavior | |
595 | |
596 #define __RTAUDIO_DUMMY__ | |
597 typedef int ThreadHandle; | |
598 typedef int StreamMutex; | |
599 | |
600 #endif | |
601 | |
602 // This global structure type is used to pass callback information | |
603 // between the private RtAudio stream structure and global callback | |
604 // handling functions. | |
605 struct CallbackInfo { | |
606 void *object; // Used as a "this" pointer. | |
607 ThreadHandle thread; | |
608 void *callback; | |
609 void *userData; | |
610 void *errorCallback; | |
611 void *apiInfo; // void pointer for API specific callback information | |
612 bool isRunning; | |
613 bool doRealtime; | |
614 int priority; | |
615 | |
616 // Default constructor. | |
617 CallbackInfo() | |
618 :object(0), callback(0), userData(0), errorCallback(0), apiInfo(0), isRunning(false), doRealtime(false) {} | |
619 }; | |
620 | |
621 // **************************************************************** // | |
622 // | |
623 // RtApi class declaration. | |
624 // | |
625 // Subclasses of RtApi contain all API- and OS-specific code necessary | |
626 // to fully implement the RtAudio API. | |
627 // | |
628 // Note that RtApi is an abstract base class and cannot be | |
629 // explicitly instantiated. The class RtAudio will create an | |
630 // instance of an RtApi subclass (RtApiOss, RtApiAlsa, | |
631 // RtApiJack, RtApiCore, RtApiDs, or RtApiAsio). | |
632 // | |
633 // **************************************************************** // | |
634 | |
635 #pragma pack(push, 1) | |
636 class S24 { | |
637 | |
638 protected: | |
639 unsigned char c3[3]; | |
640 | |
641 public: | |
642 S24() {} | |
643 | |
644 S24& operator = ( const int& i ) { | |
645 c3[0] = (i & 0x000000ff); | |
646 c3[1] = (i & 0x0000ff00) >> 8; | |
647 c3[2] = (i & 0x00ff0000) >> 16; | |
648 return *this; | |
649 } | |
650 | |
651 S24( const S24& v ) { *this = v; } | |
652 S24( const double& d ) { *this = (int) d; } | |
653 S24( const float& f ) { *this = (int) f; } | |
654 S24( const signed short& s ) { *this = (int) s; } | |
655 S24( const char& c ) { *this = (int) c; } | |
656 | |
657 int asInt() { | |
658 int i = c3[0] | (c3[1] << 8) | (c3[2] << 16); | |
659 if (i & 0x800000) i |= ~0xffffff; | |
660 return i; | |
661 } | |
662 }; | |
663 #pragma pack(pop) | |
664 | |
665 #if defined( HAVE_GETTIMEOFDAY ) | |
666 #include <sys/time.h> | |
667 #endif | |
668 | |
669 #include <sstream> | |
670 | |
671 class RtApi | |
672 { | |
673 public: | |
674 | |
675 RtApi(); | |
676 virtual ~RtApi(); | |
677 virtual RtAudio::Api getCurrentApi( void ) = 0; | |
678 virtual unsigned int getDeviceCount( void ) = 0; | |
679 virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0; | |
680 virtual unsigned int getDefaultInputDevice( void ); | |
681 virtual unsigned int getDefaultOutputDevice( void ); | |
682 void openStream( RtAudio::StreamParameters *outputParameters, | |
683 RtAudio::StreamParameters *inputParameters, | |
684 RtAudioFormat format, unsigned int sampleRate, | |
685 unsigned int *bufferFrames, RtAudioCallback callback, | |
686 void *userData, RtAudio::StreamOptions *options, | |
687 RtAudioErrorCallback errorCallback ); | |
688 virtual void closeStream( void ); | |
689 virtual void startStream( void ) = 0; | |
690 virtual void stopStream( void ) = 0; | |
691 virtual void abortStream( void ) = 0; | |
692 long getStreamLatency( void ); | |
693 unsigned int getStreamSampleRate( void ); | |
694 virtual double getStreamTime( void ); | |
695 virtual void setStreamTime( double time ); | |
696 bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; } | |
697 bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; } | |
698 void showWarnings( bool value ) { showWarnings_ = value; } | |
699 | |
700 | |
701 protected: | |
702 | |
703 static const unsigned int MAX_SAMPLE_RATES; | |
704 static const unsigned int SAMPLE_RATES[]; | |
705 | |
706 enum { FAILURE, SUCCESS }; | |
707 | |
708 enum StreamState { | |
709 STREAM_STOPPED, | |
710 STREAM_STOPPING, | |
711 STREAM_RUNNING, | |
712 STREAM_CLOSED = -50 | |
713 }; | |
714 | |
715 enum StreamMode { | |
716 OUTPUT, | |
717 INPUT, | |
718 DUPLEX, | |
719 UNINITIALIZED = -75 | |
720 }; | |
721 | |
722 // A protected structure used for buffer conversion. | |
723 struct ConvertInfo { | |
724 int channels; | |
725 int inJump, outJump; | |
726 RtAudioFormat inFormat, outFormat; | |
727 std::vector<int> inOffset; | |
728 std::vector<int> outOffset; | |
729 }; | |
730 | |
731 // A protected structure for audio streams. | |
732 struct RtApiStream { | |
733 unsigned int device[2]; // Playback and record, respectively. | |
734 void *apiHandle; // void pointer for API specific stream handle information | |
735 StreamMode mode; // OUTPUT, INPUT, or DUPLEX. | |
736 StreamState state; // STOPPED, RUNNING, or CLOSED | |
737 char *userBuffer[2]; // Playback and record, respectively. | |
738 char *deviceBuffer; | |
739 bool doConvertBuffer[2]; // Playback and record, respectively. | |
740 bool userInterleaved; | |
741 bool deviceInterleaved[2]; // Playback and record, respectively. | |
742 bool doByteSwap[2]; // Playback and record, respectively. | |
743 unsigned int sampleRate; | |
744 unsigned int bufferSize; | |
745 unsigned int nBuffers; | |
746 unsigned int nUserChannels[2]; // Playback and record, respectively. | |
747 unsigned int nDeviceChannels[2]; // Playback and record channels, respectively. | |
748 unsigned int channelOffset[2]; // Playback and record, respectively. | |
749 unsigned long latency[2]; // Playback and record, respectively. | |
750 RtAudioFormat userFormat; | |
751 RtAudioFormat deviceFormat[2]; // Playback and record, respectively. | |
752 StreamMutex mutex; | |
753 CallbackInfo callbackInfo; | |
754 ConvertInfo convertInfo[2]; | |
755 double streamTime; // Number of elapsed seconds since the stream started. | |
756 | |
757 #if defined(HAVE_GETTIMEOFDAY) | |
758 struct timeval lastTickTimestamp; | |
759 #endif | |
760 | |
761 RtApiStream() | |
762 :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; } | |
763 }; | |
764 | |
765 typedef S24 Int24; | |
766 typedef signed short Int16; | |
767 typedef signed int Int32; | |
768 typedef float Float32; | |
769 typedef double Float64; | |
770 | |
771 std::ostringstream errorStream_; | |
772 std::string errorText_; | |
773 bool showWarnings_; | |
774 RtApiStream stream_; | |
775 bool firstErrorOccurred_; | |
776 | |
777 /*! | |
778 Protected, api-specific method that attempts to open a device | |
779 with the given parameters. This function MUST be implemented by | |
780 all subclasses. If an error is encountered during the probe, a | |
781 "warning" message is reported and FAILURE is returned. A | |
782 successful probe is indicated by a return value of SUCCESS. | |
783 */ | |
784 virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
785 unsigned int firstChannel, unsigned int sampleRate, | |
786 RtAudioFormat format, unsigned int *bufferSize, | |
787 RtAudio::StreamOptions *options ); | |
788 | |
789 //! A protected function used to increment the stream time. | |
790 void tickStreamTime( void ); | |
791 | |
792 //! Protected common method to clear an RtApiStream structure. | |
793 void clearStreamInfo(); | |
794 | |
795 /*! | |
796 Protected common method that throws an RtAudioError (type = | |
797 INVALID_USE) if a stream is not open. | |
798 */ | |
799 void verifyStream( void ); | |
800 | |
801 //! Protected common error method to allow global control over error handling. | |
802 void error( RtAudioError::Type type ); | |
803 | |
804 /*! | |
805 Protected method used to perform format, channel number, and/or interleaving | |
806 conversions between the user and device buffers. | |
807 */ | |
808 void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ); | |
809 | |
810 //! Protected common method used to perform byte-swapping on buffers. | |
811 void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ); | |
812 | |
813 //! Protected common method that returns the number of bytes for a given format. | |
814 unsigned int formatBytes( RtAudioFormat format ); | |
815 | |
816 //! Protected common method that sets up the parameters for buffer conversion. | |
817 void setConvertInfo( StreamMode mode, unsigned int firstChannel ); | |
818 }; | |
819 | |
820 // **************************************************************** // | |
821 // | |
822 // Inline RtAudio definitions. | |
823 // | |
824 // **************************************************************** // | |
825 | |
826 inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } | |
827 inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); } | |
828 inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); } | |
829 inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); } | |
830 inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); } | |
831 inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); } | |
832 inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); } | |
833 inline void RtAudio :: stopStream( void ) { return rtapi_->stopStream(); } | |
834 inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); } | |
835 inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); } | |
836 inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); } | |
837 inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); } | |
838 inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); } | |
839 inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); } | |
840 inline void RtAudio :: setStreamTime( double time ) { return rtapi_->setStreamTime( time ); } | |
841 inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); } | |
842 | |
843 // RtApi Subclass prototypes. | |
844 | |
845 #if defined(__MACOSX_CORE__) | |
846 | |
847 #include <CoreAudio/AudioHardware.h> | |
848 | |
849 class RtApiCore: public RtApi | |
850 { | |
851 public: | |
852 | |
853 RtApiCore(); | |
854 ~RtApiCore(); | |
855 RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; } | |
856 unsigned int getDeviceCount( void ); | |
857 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
858 unsigned int getDefaultOutputDevice( void ); | |
859 unsigned int getDefaultInputDevice( void ); | |
860 void closeStream( void ); | |
861 void startStream( void ); | |
862 void stopStream( void ); | |
863 void abortStream( void ); | |
864 long getStreamLatency( void ); | |
865 | |
866 // This function is intended for internal use only. It must be | |
867 // public because it is called by the internal callback handler, | |
868 // which is not a member of RtAudio. External use of this function | |
869 // will most likely produce highly undesireable results! | |
870 bool callbackEvent( AudioDeviceID deviceId, | |
871 const AudioBufferList *inBufferList, | |
872 const AudioBufferList *outBufferList ); | |
873 | |
874 private: | |
875 | |
876 bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
877 unsigned int firstChannel, unsigned int sampleRate, | |
878 RtAudioFormat format, unsigned int *bufferSize, | |
879 RtAudio::StreamOptions *options ); | |
880 static const char* getErrorCode( OSStatus code ); | |
881 }; | |
882 | |
883 #endif | |
884 | |
885 #if defined(__UNIX_JACK__) | |
886 | |
887 class RtApiJack: public RtApi | |
888 { | |
889 public: | |
890 | |
891 RtApiJack(); | |
892 ~RtApiJack(); | |
893 RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; } | |
894 unsigned int getDeviceCount( void ); | |
895 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
896 void closeStream( void ); | |
897 void startStream( void ); | |
898 void stopStream( void ); | |
899 void abortStream( void ); | |
900 long getStreamLatency( void ); | |
901 | |
902 // This function is intended for internal use only. It must be | |
903 // public because it is called by the internal callback handler, | |
904 // which is not a member of RtAudio. External use of this function | |
905 // will most likely produce highly undesireable results! | |
906 bool callbackEvent( unsigned long nframes ); | |
907 | |
908 private: | |
909 | |
910 bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
911 unsigned int firstChannel, unsigned int sampleRate, | |
912 RtAudioFormat format, unsigned int *bufferSize, | |
913 RtAudio::StreamOptions *options ); | |
914 }; | |
915 | |
916 #endif | |
917 | |
918 #if defined(__WINDOWS_ASIO__) | |
919 | |
920 class RtApiAsio: public RtApi | |
921 { | |
922 public: | |
923 | |
924 RtApiAsio(); | |
925 ~RtApiAsio(); | |
926 RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; } | |
927 unsigned int getDeviceCount( void ); | |
928 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
929 void closeStream( void ); | |
930 void startStream( void ); | |
931 void stopStream( void ); | |
932 void abortStream( void ); | |
933 long getStreamLatency( void ); | |
934 | |
935 // This function is intended for internal use only. It must be | |
936 // public because it is called by the internal callback handler, | |
937 // which is not a member of RtAudio. External use of this function | |
938 // will most likely produce highly undesireable results! | |
939 bool callbackEvent( long bufferIndex ); | |
940 | |
941 private: | |
942 | |
943 std::vector<RtAudio::DeviceInfo> devices_; | |
944 void saveDeviceInfo( void ); | |
945 bool coInitialized_; | |
946 bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
947 unsigned int firstChannel, unsigned int sampleRate, | |
948 RtAudioFormat format, unsigned int *bufferSize, | |
949 RtAudio::StreamOptions *options ); | |
950 }; | |
951 | |
952 #endif | |
953 | |
954 #if defined(__WINDOWS_DS__) | |
955 | |
956 class RtApiDs: public RtApi | |
957 { | |
958 public: | |
959 | |
960 RtApiDs(); | |
961 ~RtApiDs(); | |
962 RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; } | |
963 unsigned int getDeviceCount( void ); | |
964 unsigned int getDefaultOutputDevice( void ); | |
965 unsigned int getDefaultInputDevice( void ); | |
966 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
967 void closeStream( void ); | |
968 void startStream( void ); | |
969 void stopStream( void ); | |
970 void abortStream( void ); | |
971 long getStreamLatency( void ); | |
972 | |
973 // This function is intended for internal use only. It must be | |
974 // public because it is called by the internal callback handler, | |
975 // which is not a member of RtAudio. External use of this function | |
976 // will most likely produce highly undesireable results! | |
977 void callbackEvent( void ); | |
978 | |
979 private: | |
980 | |
981 bool coInitialized_; | |
982 bool buffersRolling; | |
983 long duplexPrerollBytes; | |
984 std::vector<struct DsDevice> dsDevices; | |
985 bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
986 unsigned int firstChannel, unsigned int sampleRate, | |
987 RtAudioFormat format, unsigned int *bufferSize, | |
988 RtAudio::StreamOptions *options ); | |
989 }; | |
990 | |
991 #endif | |
992 | |
993 #if defined(__WINDOWS_WASAPI__) | |
994 | |
995 struct IMMDeviceEnumerator; | |
996 | |
997 class RtApiWasapi : public RtApi | |
998 { | |
999 public: | |
1000 RtApiWasapi(); | |
1001 ~RtApiWasapi(); | |
1002 | |
1003 RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_WASAPI; } | |
1004 unsigned int getDeviceCount( void ); | |
1005 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
1006 unsigned int getDefaultOutputDevice( void ); | |
1007 unsigned int getDefaultInputDevice( void ); | |
1008 void closeStream( void ); | |
1009 void startStream( void ); | |
1010 void stopStream( void ); | |
1011 void abortStream( void ); | |
1012 | |
1013 private: | |
1014 bool coInitialized_; | |
1015 IMMDeviceEnumerator* deviceEnumerator_; | |
1016 | |
1017 bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
1018 unsigned int firstChannel, unsigned int sampleRate, | |
1019 RtAudioFormat format, unsigned int* bufferSize, | |
1020 RtAudio::StreamOptions* options ); | |
1021 | |
1022 static DWORD WINAPI runWasapiThread( void* wasapiPtr ); | |
1023 static DWORD WINAPI stopWasapiThread( void* wasapiPtr ); | |
1024 static DWORD WINAPI abortWasapiThread( void* wasapiPtr ); | |
1025 void wasapiThread(); | |
1026 }; | |
1027 | |
1028 #endif | |
1029 | |
1030 #if defined(__LINUX_ALSA__) | |
1031 | |
1032 class RtApiAlsa: public RtApi | |
1033 { | |
1034 public: | |
1035 | |
1036 RtApiAlsa(); | |
1037 ~RtApiAlsa(); | |
1038 RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; } | |
1039 unsigned int getDeviceCount( void ); | |
1040 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
1041 void closeStream( void ); | |
1042 void startStream( void ); | |
1043 void stopStream( void ); | |
1044 void abortStream( void ); | |
1045 | |
1046 // This function is intended for internal use only. It must be | |
1047 // public because it is called by the internal callback handler, | |
1048 // which is not a member of RtAudio. External use of this function | |
1049 // will most likely produce highly undesireable results! | |
1050 void callbackEvent( void ); | |
1051 | |
1052 private: | |
1053 | |
1054 std::vector<RtAudio::DeviceInfo> devices_; | |
1055 void saveDeviceInfo( void ); | |
1056 bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
1057 unsigned int firstChannel, unsigned int sampleRate, | |
1058 RtAudioFormat format, unsigned int *bufferSize, | |
1059 RtAudio::StreamOptions *options ); | |
1060 }; | |
1061 | |
1062 #endif | |
1063 | |
1064 #if defined(__LINUX_PULSE__) | |
1065 | |
1066 class RtApiPulse: public RtApi | |
1067 { | |
1068 public: | |
1069 ~RtApiPulse(); | |
1070 RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; } | |
1071 unsigned int getDeviceCount( void ); | |
1072 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
1073 void closeStream( void ); | |
1074 void startStream( void ); | |
1075 void stopStream( void ); | |
1076 void abortStream( void ); | |
1077 | |
1078 // This function is intended for internal use only. It must be | |
1079 // public because it is called by the internal callback handler, | |
1080 // which is not a member of RtAudio. External use of this function | |
1081 // will most likely produce highly undesireable results! | |
1082 void callbackEvent( void ); | |
1083 | |
1084 private: | |
1085 | |
1086 std::vector<RtAudio::DeviceInfo> devices_; | |
1087 void saveDeviceInfo( void ); | |
1088 bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
1089 unsigned int firstChannel, unsigned int sampleRate, | |
1090 RtAudioFormat format, unsigned int *bufferSize, | |
1091 RtAudio::StreamOptions *options ); | |
1092 }; | |
1093 | |
1094 #endif | |
1095 | |
1096 #if defined(__LINUX_OSS__) | |
1097 | |
1098 class RtApiOss: public RtApi | |
1099 { | |
1100 public: | |
1101 | |
1102 RtApiOss(); | |
1103 ~RtApiOss(); | |
1104 RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; } | |
1105 unsigned int getDeviceCount( void ); | |
1106 RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); | |
1107 void closeStream( void ); | |
1108 void startStream( void ); | |
1109 void stopStream( void ); | |
1110 void abortStream( void ); | |
1111 | |
1112 // This function is intended for internal use only. It must be | |
1113 // public because it is called by the internal callback handler, | |
1114 // which is not a member of RtAudio. External use of this function | |
1115 // will most likely produce highly undesireable results! | |
1116 void callbackEvent( void ); | |
1117 | |
1118 private: | |
1119 | |
1120 bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, | |
1121 unsigned int firstChannel, unsigned int sampleRate, | |
1122 RtAudioFormat format, unsigned int *bufferSize, | |
1123 RtAudio::StreamOptions *options ); | |
1124 }; | |
1125 | |
1126 #endif | |
1127 | |
1128 #if defined(__RTAUDIO_DUMMY__) | |
1129 | |
1130 class RtApiDummy: public RtApi | |
1131 { | |
1132 public: | |
1133 | |
1134 RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtAudioError::WARNING ); } | |
1135 RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; } | |
1136 unsigned int getDeviceCount( void ) { return 0; } | |
1137 RtAudio::DeviceInfo getDeviceInfo( unsigned int /*device*/ ) { RtAudio::DeviceInfo info; return info; } | |
1138 void closeStream( void ) {} | |
1139 void startStream( void ) {} | |
1140 void stopStream( void ) {} | |
1141 void abortStream( void ) {} | |
1142 | |
1143 private: | |
1144 | |
1145 bool probeDeviceOpen( unsigned int /*device*/, StreamMode /*mode*/, unsigned int /*channels*/, | |
1146 unsigned int /*firstChannel*/, unsigned int /*sampleRate*/, | |
1147 RtAudioFormat /*format*/, unsigned int * /*bufferSize*/, | |
1148 RtAudio::StreamOptions * /*options*/ ) { return false; } | |
1149 }; | |
1150 | |
1151 #endif | |
1152 | |
1153 #endif | |
1154 | |
1155 // Indentation settings for Vim and Emacs | |
1156 // | |
1157 // Local Variables: | |
1158 // c-basic-offset: 2 | |
1159 // indent-tabs-mode: nil | |
1160 // End: | |
1161 // | |
1162 // vim: et sts=2 sw=2 |