|
|
|
@@ -5,12 +5,12 @@ |
|
|
|
RtAudio provides a common API (Application Programming Interface) |
|
|
|
for realtime audio input/output across Linux (native ALSA, Jack, |
|
|
|
and OSS), Macintosh OS X (CoreAudio and Jack), and Windows |
|
|
|
(DirectSound and ASIO) operating systems. |
|
|
|
(DirectSound, ASIO and WASAPI) operating systems. |
|
|
|
|
|
|
|
RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ |
|
|
|
|
|
|
|
RtAudio: realtime audio i/o C++ classes |
|
|
|
Copyright (c) 2001-2013 Gary P. Scavone |
|
|
|
Copyright (c) 2001-2014 Gary P. Scavone |
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person |
|
|
|
obtaining a copy of this software and associated documentation files |
|
|
|
@@ -45,12 +45,12 @@ |
|
|
|
#ifndef __RTAUDIO_H |
|
|
|
#define __RTAUDIO_H |
|
|
|
|
|
|
|
#define RTAUDIO_VERSION "4.1.1" |
|
|
|
|
|
|
|
#include <string> |
|
|
|
#include <vector> |
|
|
|
#include "RtError.h" |
|
|
|
|
|
|
|
// RtAudio version |
|
|
|
static const std::string VERSION( "4.0.12" ); |
|
|
|
#include <exception> |
|
|
|
#include <iostream> |
|
|
|
|
|
|
|
/*! \typedef typedef unsigned long RtAudioFormat; |
|
|
|
\brief RtAudio data format type. |
|
|
|
@@ -185,12 +185,63 @@ typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer, |
|
|
|
RtAudioStreamStatus status, |
|
|
|
void *userData ); |
|
|
|
|
|
|
|
/************************************************************************/ |
|
|
|
/*! \class RtAudioError |
|
|
|
\brief Exception handling class for RtAudio. |
|
|
|
|
|
|
|
The RtAudioError class is quite simple but it does allow errors to be |
|
|
|
"caught" by RtAudioError::Type. See the RtAudio documentation to know |
|
|
|
which methods can throw an RtAudioError. |
|
|
|
*/ |
|
|
|
/************************************************************************/ |
|
|
|
|
|
|
|
class RtAudioError : public std::exception |
|
|
|
{ |
|
|
|
public: |
|
|
|
//! Defined RtAudioError types. |
|
|
|
enum Type { |
|
|
|
WARNING, /*!< A non-critical error. */ |
|
|
|
DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ |
|
|
|
UNSPECIFIED, /*!< The default, unspecified error type. */ |
|
|
|
NO_DEVICES_FOUND, /*!< No devices found on system. */ |
|
|
|
INVALID_DEVICE, /*!< An invalid device ID was specified. */ |
|
|
|
MEMORY_ERROR, /*!< An error occured during memory allocation. */ |
|
|
|
INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ |
|
|
|
INVALID_USE, /*!< The function was called incorrectly. */ |
|
|
|
DRIVER_ERROR, /*!< A system driver error occured. */ |
|
|
|
SYSTEM_ERROR, /*!< A system error occured. */ |
|
|
|
THREAD_ERROR /*!< A thread error occured. */ |
|
|
|
}; |
|
|
|
|
|
|
|
//! The constructor. |
|
|
|
RtAudioError( const std::string& message, Type type = RtAudioError::UNSPECIFIED ) throw() : message_(message), type_(type) {} |
|
|
|
|
|
|
|
//! The destructor. |
|
|
|
virtual ~RtAudioError( void ) throw() {} |
|
|
|
|
|
|
|
//! Prints thrown error message to stderr. |
|
|
|
virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } |
|
|
|
|
|
|
|
//! Returns the thrown error message type. |
|
|
|
virtual const Type& getType(void) const throw() { return type_; } |
|
|
|
|
|
|
|
//! Returns the thrown error message string. |
|
|
|
virtual const std::string& getMessage(void) const throw() { return message_; } |
|
|
|
|
|
|
|
//! Returns the thrown error message as a c-style string. |
|
|
|
virtual const char* what( void ) const throw() { return message_.c_str(); } |
|
|
|
|
|
|
|
protected: |
|
|
|
std::string message_; |
|
|
|
Type type_; |
|
|
|
}; |
|
|
|
|
|
|
|
//! RtAudio error callback function prototype. |
|
|
|
/*! |
|
|
|
\param type Type of error. |
|
|
|
\param errorText Error description. |
|
|
|
*/ |
|
|
|
typedef void (*RtAudioErrorCallback)( RtError::Type type, const std::string &errorText ); |
|
|
|
typedef void (*RtAudioErrorCallback)( RtAudioError::Type type, const std::string &errorText ); |
|
|
|
|
|
|
|
// **************************************************************** // |
|
|
|
// |
|
|
|
@@ -219,6 +270,7 @@ class RtAudio |
|
|
|
LINUX_OSS, /*!< The Linux Open Sound System API. */ |
|
|
|
UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ |
|
|
|
MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ |
|
|
|
WINDOWS_WASAPI, /*!< The Microsoft WASAPI API. */ |
|
|
|
WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ |
|
|
|
WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ |
|
|
|
RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ |
|
|
|
@@ -322,7 +374,7 @@ class RtAudio |
|
|
|
}; |
|
|
|
|
|
|
|
//! A static function to determine the current RtAudio version. |
|
|
|
static std::string getVersion( void ) { return VERSION; } |
|
|
|
static std::string getVersion( void ) throw(); |
|
|
|
|
|
|
|
//! A static function to determine the available compiled audio APIs. |
|
|
|
/*! |
|
|
|
@@ -334,14 +386,14 @@ class RtAudio |
|
|
|
|
|
|
|
//! The class constructor. |
|
|
|
/*! |
|
|
|
The constructor performs minor initialization tasks. No exceptions |
|
|
|
can be thrown. |
|
|
|
The constructor performs minor initialization tasks. An exception |
|
|
|
can be thrown if no API support is compiled. |
|
|
|
|
|
|
|
If no API argument is specified and multiple API support has been |
|
|
|
compiled, the default order of use is JACK, ALSA, OSS (Linux |
|
|
|
systems) and ASIO, DS (Windows systems). |
|
|
|
*/ |
|
|
|
RtAudio( RtAudio::Api api=UNSPECIFIED ) throw(); |
|
|
|
RtAudio( RtAudio::Api api=UNSPECIFIED ); |
|
|
|
|
|
|
|
//! The destructor. |
|
|
|
/*! |
|
|
|
@@ -351,7 +403,7 @@ class RtAudio |
|
|
|
~RtAudio() throw(); |
|
|
|
|
|
|
|
//! Returns the audio API specifier for the current instance of RtAudio. |
|
|
|
RtAudio::Api getCurrentApi( void ) const throw(); |
|
|
|
RtAudio::Api getCurrentApi( void ) throw(); |
|
|
|
|
|
|
|
//! A public function that queries for the number of audio devices available. |
|
|
|
/*! |
|
|
|
@@ -365,7 +417,7 @@ class RtAudio |
|
|
|
/*! |
|
|
|
|
|
|
|
Any device integer between 0 and getDeviceCount() - 1 is valid. |
|
|
|
If an invalid argument is provided, an RtError (type = INVALID_USE) |
|
|
|
If an invalid argument is provided, an RtAudioError (type = INVALID_USE) |
|
|
|
will be thrown. If a device is busy or otherwise unavailable, the |
|
|
|
structure member "probed" will have a value of "false" and all |
|
|
|
other members are undefined. If the specified device is the |
|
|
|
@@ -396,9 +448,9 @@ class RtAudio |
|
|
|
|
|
|
|
//! A public function for opening a stream with the specified parameters. |
|
|
|
/*! |
|
|
|
An RtError (type = SYSTEM_ERROR) is thrown if a stream cannot be |
|
|
|
An RtAudioError (type = SYSTEM_ERROR) is thrown if a stream cannot be |
|
|
|
opened with the specified parameters or an error occurs during |
|
|
|
processing. An RtError (type = INVALID_USE) is thrown if any |
|
|
|
processing. An RtAudioError (type = INVALID_USE) is thrown if any |
|
|
|
invalid device ID or channel number parameters are specified. |
|
|
|
|
|
|
|
\param outputParameters Specifies output stream parameters to use |
|
|
|
@@ -449,8 +501,8 @@ class RtAudio |
|
|
|
|
|
|
|
//! A function that starts a stream. |
|
|
|
/*! |
|
|
|
An RtError (type = SYSTEM_ERROR) is thrown if an error occurs |
|
|
|
during processing. An RtError (type = INVALID_USE) is thrown if a |
|
|
|
An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs |
|
|
|
during processing. An RtAudioError (type = INVALID_USE) is thrown if a |
|
|
|
stream is not open. A warning is issued if the stream is already |
|
|
|
running. |
|
|
|
*/ |
|
|
|
@@ -458,8 +510,8 @@ class RtAudio |
|
|
|
|
|
|
|
//! Stop a stream, allowing any samples remaining in the output queue to be played. |
|
|
|
/*! |
|
|
|
An RtError (type = SYSTEM_ERROR) is thrown if an error occurs |
|
|
|
during processing. An RtError (type = INVALID_USE) is thrown if a |
|
|
|
An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs |
|
|
|
during processing. An RtAudioError (type = INVALID_USE) is thrown if a |
|
|
|
stream is not open. A warning is issued if the stream is already |
|
|
|
stopped. |
|
|
|
*/ |
|
|
|
@@ -467,8 +519,8 @@ class RtAudio |
|
|
|
|
|
|
|
//! Stop a stream, discarding any samples remaining in the input/output queue. |
|
|
|
/*! |
|
|
|
An RtError (type = SYSTEM_ERROR) is thrown if an error occurs |
|
|
|
during processing. An RtError (type = INVALID_USE) is thrown if a |
|
|
|
An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs |
|
|
|
during processing. An RtAudioError (type = INVALID_USE) is thrown if a |
|
|
|
stream is not open. A warning is issued if the stream is already |
|
|
|
stopped. |
|
|
|
*/ |
|
|
|
@@ -482,17 +534,23 @@ class RtAudio |
|
|
|
|
|
|
|
//! Returns the number of elapsed seconds since the stream was started. |
|
|
|
/*! |
|
|
|
If a stream is not open, an RtError (type = INVALID_USE) will be thrown. |
|
|
|
If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. |
|
|
|
*/ |
|
|
|
double getStreamTime( void ); |
|
|
|
|
|
|
|
//! Set the stream time to a time in seconds greater than or equal to 0.0. |
|
|
|
/*! |
|
|
|
If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. |
|
|
|
*/ |
|
|
|
void setStreamTime( double time ); |
|
|
|
|
|
|
|
//! Returns the internal stream latency in sample frames. |
|
|
|
/*! |
|
|
|
The stream latency refers to delay in audio input and/or output |
|
|
|
caused by internal buffering by the audio system and/or hardware. |
|
|
|
For duplex streams, the returned value will represent the sum of |
|
|
|
the input and output latencies. If a stream is not open, an |
|
|
|
RtError (type = INVALID_USE) will be thrown. If the API does not |
|
|
|
RtAudioError (type = INVALID_USE) will be thrown. If the API does not |
|
|
|
report latency, the return value will be zero. |
|
|
|
*/ |
|
|
|
long getStreamLatency( void ); |
|
|
|
@@ -501,7 +559,7 @@ class RtAudio |
|
|
|
/*! |
|
|
|
On some systems, the sample rate used may be slightly different |
|
|
|
than that specified in the stream parameters. If a stream is not |
|
|
|
open, an RtError (type = INVALID_USE) will be thrown. |
|
|
|
open, an RtAudioError (type = INVALID_USE) will be thrown. |
|
|
|
*/ |
|
|
|
unsigned int getStreamSampleRate( void ); |
|
|
|
|
|
|
|
@@ -515,12 +573,15 @@ class RtAudio |
|
|
|
}; |
|
|
|
|
|
|
|
// Operating system dependent thread functionality. |
|
|
|
#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) |
|
|
|
#include <winsock2.h> |
|
|
|
#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) |
|
|
|
|
|
|
|
#ifndef NOMINMAX |
|
|
|
#define NOMINMAX |
|
|
|
#endif |
|
|
|
#include <windows.h> |
|
|
|
#include <process.h> |
|
|
|
|
|
|
|
typedef unsigned long ThreadHandle; |
|
|
|
typedef uintptr_t ThreadHandle; |
|
|
|
typedef CRITICAL_SECTION StreamMutex; |
|
|
|
|
|
|
|
#elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) |
|
|
|
@@ -613,7 +674,7 @@ public: |
|
|
|
|
|
|
|
RtApi(); |
|
|
|
virtual ~RtApi(); |
|
|
|
virtual RtAudio::Api getCurrentApi( void ) const = 0; |
|
|
|
virtual RtAudio::Api getCurrentApi( void ) = 0; |
|
|
|
virtual unsigned int getDeviceCount( void ) = 0; |
|
|
|
virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0; |
|
|
|
virtual unsigned int getDefaultInputDevice( void ); |
|
|
|
@@ -631,6 +692,7 @@ public: |
|
|
|
long getStreamLatency( void ); |
|
|
|
unsigned int getStreamSampleRate( void ); |
|
|
|
virtual double getStreamTime( void ); |
|
|
|
virtual void setStreamTime( double time ); |
|
|
|
bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; } |
|
|
|
bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; } |
|
|
|
void showWarnings( bool value ) { showWarnings_ = value; } |
|
|
|
@@ -710,6 +772,7 @@ protected: |
|
|
|
std::string errorText_; |
|
|
|
bool showWarnings_; |
|
|
|
RtApiStream stream_; |
|
|
|
bool firstErrorOccurred_; |
|
|
|
|
|
|
|
/*! |
|
|
|
Protected, api-specific method that attempts to open a device |
|
|
|
@@ -730,13 +793,13 @@ protected: |
|
|
|
void clearStreamInfo(); |
|
|
|
|
|
|
|
/*! |
|
|
|
Protected common method that throws an RtError (type = |
|
|
|
Protected common method that throws an RtAudioError (type = |
|
|
|
INVALID_USE) if a stream is not open. |
|
|
|
*/ |
|
|
|
void verifyStream( void ); |
|
|
|
|
|
|
|
//! Protected common error method to allow global control over error handling. |
|
|
|
void error( RtError::Type type ); |
|
|
|
void error( RtAudioError::Type type ); |
|
|
|
|
|
|
|
/*! |
|
|
|
Protected method used to perform format, channel number, and/or interleaving |
|
|
|
@@ -760,7 +823,7 @@ protected: |
|
|
|
// |
|
|
|
// **************************************************************** // |
|
|
|
|
|
|
|
inline RtAudio::Api RtAudio :: getCurrentApi( void ) const throw() { return rtapi_->getCurrentApi(); } |
|
|
|
inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } |
|
|
|
inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); } |
|
|
|
inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); } |
|
|
|
inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); } |
|
|
|
@@ -774,6 +837,7 @@ inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->is |
|
|
|
inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); } |
|
|
|
inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); } |
|
|
|
inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); } |
|
|
|
inline void RtAudio :: setStreamTime( double time ) { return rtapi_->setStreamTime( time ); } |
|
|
|
inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); } |
|
|
|
|
|
|
|
// RtApi Subclass prototypes. |
|
|
|
@@ -788,7 +852,7 @@ public: |
|
|
|
|
|
|
|
RtApiCore(); |
|
|
|
~RtApiCore(); |
|
|
|
RtAudio::Api getCurrentApi( void ) const { return RtAudio::MACOSX_CORE; } |
|
|
|
RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; } |
|
|
|
unsigned int getDeviceCount( void ); |
|
|
|
RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); |
|
|
|
unsigned int getDefaultOutputDevice( void ); |
|
|
|
@@ -826,7 +890,7 @@ public: |
|
|
|
|
|
|
|
RtApiJack(); |
|
|
|
~RtApiJack(); |
|
|
|
RtAudio::Api getCurrentApi( void ) const { return RtAudio::UNIX_JACK; } |
|
|
|
RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; } |
|
|
|
unsigned int getDeviceCount( void ); |
|
|
|
RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); |
|
|
|
void closeStream( void ); |
|
|
|
@@ -859,7 +923,7 @@ public: |
|
|
|
|
|
|
|
RtApiAsio(); |
|
|
|
~RtApiAsio(); |
|
|
|
RtAudio::Api getCurrentApi( void ) const { return RtAudio::WINDOWS_ASIO; } |
|
|
|
RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; } |
|
|
|
unsigned int getDeviceCount( void ); |
|
|
|
RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); |
|
|
|
void closeStream( void ); |
|
|
|
@@ -895,7 +959,7 @@ public: |
|
|
|
|
|
|
|
RtApiDs(); |
|
|
|
~RtApiDs(); |
|
|
|
RtAudio::Api getCurrentApi( void ) const { return RtAudio::WINDOWS_DS; } |
|
|
|
RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; } |
|
|
|
unsigned int getDeviceCount( void ); |
|
|
|
unsigned int getDefaultOutputDevice( void ); |
|
|
|
unsigned int getDefaultInputDevice( void ); |
|
|
|
@@ -926,6 +990,43 @@ public: |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(__WINDOWS_WASAPI__) |
|
|
|
|
|
|
|
struct IMMDeviceEnumerator; |
|
|
|
|
|
|
|
class RtApiWasapi : public RtApi |
|
|
|
{ |
|
|
|
public: |
|
|
|
RtApiWasapi(); |
|
|
|
~RtApiWasapi(); |
|
|
|
|
|
|
|
RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_WASAPI; } |
|
|
|
unsigned int getDeviceCount( void ); |
|
|
|
RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); |
|
|
|
unsigned int getDefaultOutputDevice( void ); |
|
|
|
unsigned int getDefaultInputDevice( void ); |
|
|
|
void closeStream( void ); |
|
|
|
void startStream( void ); |
|
|
|
void stopStream( void ); |
|
|
|
void abortStream( void ); |
|
|
|
|
|
|
|
private: |
|
|
|
bool coInitialized_; |
|
|
|
IMMDeviceEnumerator* deviceEnumerator_; |
|
|
|
|
|
|
|
bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, |
|
|
|
unsigned int firstChannel, unsigned int sampleRate, |
|
|
|
RtAudioFormat format, unsigned int* bufferSize, |
|
|
|
RtAudio::StreamOptions* options ); |
|
|
|
|
|
|
|
static DWORD WINAPI runWasapiThread( void* wasapiPtr ); |
|
|
|
static DWORD WINAPI stopWasapiThread( void* wasapiPtr ); |
|
|
|
static DWORD WINAPI abortWasapiThread( void* wasapiPtr ); |
|
|
|
void wasapiThread(); |
|
|
|
}; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
#if defined(__LINUX_ALSA__) |
|
|
|
|
|
|
|
class RtApiAlsa: public RtApi |
|
|
|
@@ -934,7 +1035,7 @@ public: |
|
|
|
|
|
|
|
RtApiAlsa(); |
|
|
|
~RtApiAlsa(); |
|
|
|
RtAudio::Api getCurrentApi() const { return RtAudio::LINUX_ALSA; } |
|
|
|
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; } |
|
|
|
unsigned int getDeviceCount( void ); |
|
|
|
RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); |
|
|
|
void closeStream( void ); |
|
|
|
@@ -966,7 +1067,7 @@ class RtApiPulse: public RtApi |
|
|
|
{ |
|
|
|
public: |
|
|
|
~RtApiPulse(); |
|
|
|
RtAudio::Api getCurrentApi() const { return RtAudio::LINUX_PULSE; } |
|
|
|
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; } |
|
|
|
unsigned int getDeviceCount( void ); |
|
|
|
RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); |
|
|
|
void closeStream( void ); |
|
|
|
@@ -1000,7 +1101,7 @@ public: |
|
|
|
|
|
|
|
RtApiOss(); |
|
|
|
~RtApiOss(); |
|
|
|
RtAudio::Api getCurrentApi() const { return RtAudio::LINUX_OSS; } |
|
|
|
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; } |
|
|
|
unsigned int getDeviceCount( void ); |
|
|
|
RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); |
|
|
|
void closeStream( void ); |
|
|
|
@@ -1030,8 +1131,8 @@ class RtApiDummy: public RtApi |
|
|
|
{ |
|
|
|
public: |
|
|
|
|
|
|
|
RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtError::WARNING ); } |
|
|
|
RtAudio::Api getCurrentApi( void ) const { return RtAudio::RTAUDIO_DUMMY; } |
|
|
|
RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtAudioError::WARNING ); } |
|
|
|
RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; } |
|
|
|
unsigned int getDeviceCount( void ) { return 0; } |
|
|
|
RtAudio::DeviceInfo getDeviceInfo( unsigned int /*device*/ ) { RtAudio::DeviceInfo info; return info; } |
|
|
|
void closeStream( void ) {} |
|
|
|
|