X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=RtAudio.cpp;h=8deb5f664ee78faa09bdfc983b74424ed91a0d64;hb=b71d5ba31a0ebc433dcc255de7dbb47a689b937c;hp=fc4418eae52b0c0b66e79f6849b6635ba8e66ba7;hpb=9ee3d84d670af9bc98899b7eef05f039003a6dba;p=rtaudio-cdist.git diff --git a/RtAudio.cpp b/RtAudio.cpp index fc4418e..8deb5f6 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -38,7 +38,7 @@ */ /************************************************************************/ -// RtAudio: Version 4.0 +// RtAudio: Version 4.0.3 #include "RtAudio.h" #include @@ -2291,10 +2291,10 @@ bool RtApiJack :: callbackEvent( unsigned long nframes ) // on information found in // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html. -#include "asio/asiosys.h" -#include "asio/asio.h" -#include "asio/iasiothiscallresolver.h" -#include "asio/asiodrivers.h" +#include "asiosys.h" +#include "asio.h" +#include "iasiothiscallresolver.h" +#include "asiodrivers.h" #include AsioDrivers drivers; @@ -2366,11 +2366,14 @@ RtAudio::DeviceInfo RtApiAsio :: getDeviceInfo( unsigned int device ) error( RtError::INVALID_USE ); } - // Don't probe if a stream is already open. + // If a stream is already open, we cannot probe other devices. Thus, use the saved results. if ( stream_.state != STREAM_CLOSED ) { - errorText_ = "RtApiAsio::getDeviceInfo: unable to probe driver while a stream is open."; - error( RtError::WARNING ); - return info; + if ( device >= devices_.size() ) { + errorText_ = "RtApiAsio::getDeviceInfo: device ID was not present before stream was opened."; + error( RtError::WARNING ); + return info; + } + return devices_[ device ]; } char driverName[32]; @@ -2463,6 +2466,16 @@ void bufferSwitch( long index, ASIOBool processNow ) object->callbackEvent( index ); } +void RtApiAsio :: saveDeviceInfo( void ) +{ + devices_.clear(); + + unsigned int nDevices = getDeviceCount(); + devices_.resize( nDevices ); + for ( unsigned int i=0; isaveDeviceInfo(); + // Only load the driver once for duplex stream. if ( mode != INPUT || stream_.mode != OUTPUT ) { if ( !drivers.loadDriver( driverName ) ) { @@ -3268,7 +3287,7 @@ RtApiDs::RtDsStatistics RtApiDs::getDsStatistics() // Declarations for utility functions, callbacks, and structures // specific to the DirectSound implementation. -static BOOL CALLBACK deviceCountCallback( LPGUID lpguid, +static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext ); @@ -3309,7 +3328,7 @@ unsigned int RtApiDs :: getDefaultInputDevice( void ) { // Count output devices. EnumInfo info; - HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &info ); + HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultOutputDevice: error (" << getErrorString( result ) << ") counting output devices!"; errorText_ = errorStream_.str(); @@ -3320,7 +3339,7 @@ unsigned int RtApiDs :: getDefaultInputDevice( void ) // Now enumerate input devices until we find the id = NULL. info.isInput = true; info.getDefault = true; - result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &info ); + result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultInputDevice: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); @@ -3337,7 +3356,7 @@ unsigned int RtApiDs :: getDefaultOutputDevice( void ) // Enumerate output devices until we find the id = NULL. EnumInfo info; info.getDefault = true; - HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &info ); + HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultOutputDevice: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); @@ -3353,7 +3372,7 @@ unsigned int RtApiDs :: getDeviceCount( void ) { // Count DirectSound devices. EnumInfo info; - HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &info ); + HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceCount: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); @@ -3362,7 +3381,7 @@ unsigned int RtApiDs :: getDeviceCount( void ) // Count DirectSoundCapture devices. info.isInput = true; - result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &info ); + result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceCount: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); @@ -3387,7 +3406,7 @@ RtAudio::DeviceInfo RtApiDs :: getDeviceInfo( unsigned int device ) EnumInfo dsinfo; dsinfo.findIndex = true; dsinfo.index = device; - HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &dsinfo ); + HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); @@ -3445,7 +3464,7 @@ RtAudio::DeviceInfo RtApiDs :: getDeviceInfo( unsigned int device ) probeInput: dsinfo.isInput = true; - result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &dsinfo ); + result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); @@ -3555,7 +3574,7 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned EnumInfo dsinfo; dsinfo.findIndex = true; dsinfo.index = device; - HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &dsinfo ); + HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); @@ -3571,7 +3590,7 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned } else { // mode == INPUT dsinfo.isInput = true; - HRESULT result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceCountCallback, &dsinfo ); + HRESULT result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); @@ -3879,6 +3898,7 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned } // Set various stream parameters + DsHandle *handle = 0; stream_.nDeviceChannels[mode] = channels + firstChannel; stream_.nUserChannels[mode] = channels; stream_.bufferSize = *bufferSize; @@ -3928,7 +3948,6 @@ bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned } // Allocate our DsHandle structures for the stream. - DsHandle *handle; if ( stream_.apiHandle == 0 ) { try { handle = new DsHandle; @@ -4099,7 +4118,7 @@ void RtApiDs :: startStream() duplexPrerollBytes = (int) ( 0.5 * stream_.sampleRate * formatBytes( stream_.deviceFormat[1] ) * stream_.nDeviceChannels[1] ); } - HRESULT result; + HRESULT result = 0; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { //statistics.outputFrameSize = formatBytes( stream_.deviceFormat[0] ) * stream_.nDeviceChannels[0]; @@ -4145,7 +4164,7 @@ void RtApiDs :: stopStream() MUTEX_LOCK( &stream_.mutex ); - HRESULT result; + HRESULT result = 0; LPVOID audioPtr; DWORD dataLen; DsHandle *handle = (DsHandle *) stream_.apiHandle; @@ -4686,7 +4705,7 @@ std::string convertTChar( LPCTSTR name ) return s; } -static BOOL CALLBACK deviceCountCallback( LPGUID lpguid, +static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext ) @@ -5951,7 +5970,7 @@ extern "C" void *alsaCallbackHandler( void *ptr ) #include #include #include -#include "oss/soundcard.h" +#include "soundcard.h" #include #include @@ -6855,11 +6874,11 @@ extern "C" void *ossCallbackHandler( void *ptr ) // message printing. void RtApi :: error( RtError::Type type ) { + errorStream_.str(""); // clear the ostringstream if ( type == RtError::WARNING && showWarnings_ == true ) std::cerr << '\n' << errorText_ << "\n\n"; else throw( RtError( errorText_, type ) ); - errorStream_.str(""); // clear the ostringstream } void RtApi :: verifyStream()