|
|
@@ -2528,15 +2528,27 @@ bool RtApiAsio :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne |
|
|
|
return FAILURE; |
|
|
|
} |
|
|
|
|
|
|
|
// Set the sample rate. |
|
|
|
result = ASIOSetSampleRate( (ASIOSampleRate) sampleRate ); |
|
|
|
// Get the current sample rate |
|
|
|
ASIOSampleRate currentRate; |
|
|
|
result = ASIOGetSampleRate( ¤tRate ); |
|
|
|
if ( result != ASE_OK ) { |
|
|
|
drivers.removeCurrentDriver(); |
|
|
|
errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error setting sample rate (" << sampleRate << ")."; |
|
|
|
errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error getting sample rate."; |
|
|
|
errorText_ = errorStream_.str(); |
|
|
|
return FAILURE; |
|
|
|
} |
|
|
|
|
|
|
|
// Set the sample rate only if necessary |
|
|
|
if ( currentRate != sampleRate ) { |
|
|
|
result = ASIOSetSampleRate( (ASIOSampleRate) sampleRate ); |
|
|
|
if ( result != ASE_OK ) { |
|
|
|
drivers.removeCurrentDriver(); |
|
|
|
errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error setting sample rate (" << sampleRate << ")."; |
|
|
|
errorText_ = errorStream_.str(); |
|
|
|
return FAILURE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Determine the driver data type. |
|
|
|
ASIOChannelInfo channelInfo; |
|
|
|
channelInfo.channel = 0; |
|
|
@@ -2696,7 +2708,8 @@ bool RtApiAsio :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne |
|
|
|
stream_.doConvertBuffer[mode] = true; |
|
|
|
|
|
|
|
// Allocate necessary internal buffers |
|
|
|
unsigned long bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); |
|
|
|
unsigned long bufferBytes; |
|
|
|
bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); |
|
|
|
stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); |
|
|
|
if ( stream_.userBuffer[mode] == NULL ) { |
|
|
|
errorText_ = "RtApiAsio::probeDeviceOpen: error allocating user buffer memory."; |
|
|
@@ -2958,8 +2971,8 @@ bool RtApiAsio :: callbackEvent( long bufferIndex ) |
|
|
|
handle->internalDrain = true; |
|
|
|
} |
|
|
|
|
|
|
|
unsigned int bufferBytes, i, j; |
|
|
|
unsigned int nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; |
|
|
|
unsigned int nChannels, bufferBytes, i, j; |
|
|
|
nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; |
|
|
|
if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { |
|
|
|
|
|
|
|
bufferBytes = stream_.bufferSize * formatBytes( stream_.deviceFormat[0] ); |
|
|
@@ -3187,6 +3200,14 @@ static const char* getAsioErrorString( ASIOError result ) |
|
|
|
#include <dsound.h> |
|
|
|
#include <assert.h> |
|
|
|
|
|
|
|
#if defined(__MINGW32__) |
|
|
|
// missing from latest mingw winapi |
|
|
|
#define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ |
|
|
|
#define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ |
|
|
|
#define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ |
|
|
|
#define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */ |
|
|
|
#endif |
|
|
|
|
|
|
|
#define MINIMUM_DEVICE_BUFFER_SIZE 32768 |
|
|
|
|
|
|
|
#ifdef _MSC_VER // if Microsoft Visual C++ |
|
|
@@ -3247,7 +3268,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 deviceCountCallback( LPGUID lpguid, |
|
|
|
LPCTSTR description, |
|
|
|
LPCTSTR module, |
|
|
|
LPVOID lpContext ); |
|
|
@@ -4665,7 +4686,7 @@ std::string convertTChar( LPCTSTR name ) |
|
|
|
return s; |
|
|
|
} |
|
|
|
|
|
|
|
static bool CALLBACK deviceCountCallback( LPGUID lpguid, |
|
|
|
static BOOL CALLBACK deviceCountCallback( LPGUID lpguid, |
|
|
|
LPCTSTR description, |
|
|
|
LPCTSTR module, |
|
|
|
LPVOID lpContext ) |
|
|
@@ -4678,7 +4699,7 @@ static bool CALLBACK deviceCountCallback( LPGUID lpguid, |
|
|
|
LPDIRECTSOUNDCAPTURE object; |
|
|
|
|
|
|
|
hr = DirectSoundCaptureCreate( lpguid, &object, NULL ); |
|
|
|
if ( hr != DS_OK ) return true; |
|
|
|
if ( hr != DS_OK ) return TRUE; |
|
|
|
|
|
|
|
caps.dwSize = sizeof(caps); |
|
|
|
hr = object->GetCaps( &caps ); |
|
|
@@ -4692,7 +4713,7 @@ static bool CALLBACK deviceCountCallback( LPGUID lpguid, |
|
|
|
DSCAPS caps; |
|
|
|
LPDIRECTSOUND object; |
|
|
|
hr = DirectSoundCreate( lpguid, &object, NULL ); |
|
|
|
if ( hr != DS_OK ) return true; |
|
|
|
if ( hr != DS_OK ) return TRUE; |
|
|
|
|
|
|
|
caps.dwSize = sizeof(caps); |
|
|
|
hr = object->GetCaps( &caps ); |
|
|
@@ -4703,20 +4724,20 @@ static bool CALLBACK deviceCountCallback( LPGUID lpguid, |
|
|
|
object->Release(); |
|
|
|
} |
|
|
|
|
|
|
|
if ( info->getDefault && lpguid == NULL ) return false; |
|
|
|
if ( info->getDefault && lpguid == NULL ) return FALSE; |
|
|
|
|
|
|
|
if ( info->findIndex && info->counter > info->index ) { |
|
|
|
info->id = lpguid; |
|
|
|
info->name = convertTChar( description ); |
|
|
|
return false; |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
return TRUE; |
|
|
|
} |
|
|
|
|
|
|
|
static char* getErrorString( int code ) |
|
|
|
{ |
|
|
|
switch (code) { |
|
|
|
switch ( code ) { |
|
|
|
|
|
|
|
case DSERR_ALLOCATED: |
|
|
|
return "Already allocated"; |
|
|
|