| @@ -270,6 +270,7 @@ class RtAudio | |||||
| LINUX_OSS, /*!< The Linux Open Sound System API. */ | LINUX_OSS, /*!< The Linux Open Sound System API. */ | ||||
| UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ | UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ | ||||
| MACOSX_CORE, /*!< Macintosh OS-X Core Audio 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_ASIO, /*!< The Steinberg Audio Stream I/O API. */ | ||||
| WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ | WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ | ||||
| RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ | RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ | ||||
| @@ -566,7 +567,7 @@ class RtAudio | |||||
| }; | }; | ||||
| // Operating system dependent thread functionality. | // Operating system dependent thread functionality. | ||||
| #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) | |||||
| #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) | |||||
| #include <windows.h> | #include <windows.h> | ||||
| #include <process.h> | #include <process.h> | ||||
| @@ -977,6 +978,43 @@ public: | |||||
| #endif | #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__) | #if defined(__LINUX_ALSA__) | ||||
| class RtApiAlsa: public RtApi | class RtApiAlsa: public RtApi | ||||
| @@ -48,8 +48,8 @@ void usage( void ) { | |||||
| exit( 0 ); | exit( 0 ); | ||||
| } | } | ||||
| int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double streamTime, RtAudioStreamStatus status, void *data ) | |||||
| int inout( void *outputBuffer, void *inputBuffer, unsigned int /*nBufferFrames*/, | |||||
| double /*streamTime*/, RtAudioStreamStatus status, void *data ) | |||||
| { | { | ||||
| // Since the number of input and output channels is equal, we can do | // Since the number of input and output channels is equal, we can do | ||||
| // a simple buffer copy operation here. | // a simple buffer copy operation here. | ||||
| @@ -70,8 +70,8 @@ struct OutputData { | |||||
| }; | }; | ||||
| // Interleaved buffers | // Interleaved buffers | ||||
| int output( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double streamTime, RtAudioStreamStatus status, void *data ) | |||||
| int output( void *outputBuffer, void * /*inputBuffer*/, unsigned int nBufferFrames, | |||||
| double /*streamTime*/, RtAudioStreamStatus /*status*/, void *data ) | |||||
| { | { | ||||
| OutputData *oData = (OutputData*) data; | OutputData *oData = (OutputData*) data; | ||||
| @@ -112,8 +112,8 @@ int saw( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| #else // Use non-interleaved buffers | #else // Use non-interleaved buffers | ||||
| int saw( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double streamTime, RtAudioStreamStatus status, void *data ) | |||||
| int saw( void *outputBuffer, void * /*inputBuffer*/, unsigned int nBufferFrames, | |||||
| double /*streamTime*/, RtAudioStreamStatus status, void *data ) | |||||
| { | { | ||||
| unsigned int i, j; | unsigned int i, j; | ||||
| extern unsigned int channels; | extern unsigned int channels; | ||||
| @@ -67,8 +67,8 @@ struct InputData { | |||||
| }; | }; | ||||
| // Interleaved buffers | // Interleaved buffers | ||||
| int input( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double streamTime, RtAudioStreamStatus status, void *data ) | |||||
| int input( void * /*outputBuffer*/, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double /*streamTime*/, RtAudioStreamStatus /*status*/, void *data ) | |||||
| { | { | ||||
| InputData *iData = (InputData *) data; | InputData *iData = (InputData *) data; | ||||
| @@ -32,8 +32,8 @@ void usage( void ) { | |||||
| unsigned int channels; | unsigned int channels; | ||||
| // Interleaved buffers | // Interleaved buffers | ||||
| int sawi( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double streamTime, RtAudioStreamStatus status, void *data ) | |||||
| int sawi( void *outputBuffer, void * /*inputBuffer*/, unsigned int nBufferFrames, | |||||
| double /*streamTime*/, RtAudioStreamStatus status, void *data ) | |||||
| { | { | ||||
| unsigned int i, j; | unsigned int i, j; | ||||
| extern unsigned int channels; | extern unsigned int channels; | ||||
| @@ -55,8 +55,8 @@ int sawi( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| } | } | ||||
| // Non-interleaved buffers | // Non-interleaved buffers | ||||
| int sawni( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double streamTime, RtAudioStreamStatus status, void *data ) | |||||
| int sawni( void *outputBuffer, void * /*inputBuffer*/, unsigned int nBufferFrames, | |||||
| double /*streamTime*/, RtAudioStreamStatus status, void *data ) | |||||
| { | { | ||||
| unsigned int i, j; | unsigned int i, j; | ||||
| extern unsigned int channels; | extern unsigned int channels; | ||||
| @@ -79,8 +79,8 @@ int sawni( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double streamTime, RtAudioStreamStatus status, void *data ) | |||||
| int inout( void *outputBuffer, void *inputBuffer, unsigned int /*nBufferFrames*/, | |||||
| double /*streamTime*/, RtAudioStreamStatus status, void *data ) | |||||
| { | { | ||||
| // Since the number of input and output channels is equal, we can do | // Since the number of input and output channels is equal, we can do | ||||
| // a simple buffer copy operation here. | // a simple buffer copy operation here. | ||||
| @@ -51,8 +51,8 @@ struct MyData { | |||||
| }; | }; | ||||
| // Interleaved buffers | // Interleaved buffers | ||||
| int pulse( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, | |||||
| double streamTime, RtAudioStreamStatus status, void *mydata ) | |||||
| int pulse( void *outputBuffer, void * /*inputBuffer*/, unsigned int nBufferFrames, | |||||
| double /*streamTime*/, RtAudioStreamStatus status, void *mydata ) | |||||
| { | { | ||||
| // Write out a pulse signal and ignore the input buffer. | // Write out a pulse signal and ignore the input buffer. | ||||
| unsigned int i, j; | unsigned int i, j; | ||||