some more ASIO work
This commit is contained in:
parent
2d368f6ace
commit
90fbd027eb
2 changed files with 39 additions and 87 deletions
|
@ -35,6 +35,14 @@
|
||||||
extern AsioDrivers* asioDrivers;
|
extern AsioDrivers* asioDrivers;
|
||||||
bool loadAsioDriver ( char *name );
|
bool loadAsioDriver ( char *name );
|
||||||
|
|
||||||
|
// ASIO stuff
|
||||||
|
ASIODriverInfo driverInfo;
|
||||||
|
ASIOBufferInfo bufferInfos[2 * NUM_IN_OUT_CHANNELS]; // for input and output buffers -> "2 *"
|
||||||
|
ASIOChannelInfo channelInfos[2 * NUM_IN_OUT_CHANNELS];
|
||||||
|
bool bASIOPostOutput;
|
||||||
|
ASIOCallbacks asioCallbacks;
|
||||||
|
int iBufferSize;
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
* Wave in *
|
* Wave in *
|
||||||
|
@ -692,94 +700,47 @@ ASIOTime* CSound::bufferSwitchTimeInfo ( ASIOTime *timeInfo, long index, ASIOBoo
|
||||||
|
|
||||||
void CSound::bufferSwitch ( long index, ASIOBool processNow )
|
void CSound::bufferSwitch ( long index, ASIOBool processNow )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
static long processedSamples = 0;
|
static long processedSamples = 0;
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
// buffer size in samples
|
// buffer size in samples
|
||||||
// long buffSize = asioDriverInfo.preferredSize;
|
long buffSize = iBufferSize * BYTES_PER_SAMPLE;
|
||||||
|
|
||||||
// perform the processing
|
// perform the processing for input and output
|
||||||
for ( int i = 0; i < asioDriverInfo.inputBuffers + asioDriverInfo.outputBuffers; i++ )
|
for ( int i = 0; i < 2 * NUM_IN_OUT_CHANNELS; i++ )
|
||||||
{
|
{
|
||||||
if ( asioDriverInfo.bufferInfos[i].isInput == false )
|
// only 16 bit is supported
|
||||||
|
if ( channelInfos[i].type != ASIOSTInt16LSB )
|
||||||
{
|
{
|
||||||
// OK do processing for the outputs only
|
// TODO fire error
|
||||||
switch ( asioDriverInfo.channelInfos[i].type )
|
|
||||||
{
|
|
||||||
case ASIOSTInt16LSB:
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 2 );
|
|
||||||
break;
|
|
||||||
case ASIOSTInt24LSB: // used for 20 bits as well
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 3 );
|
|
||||||
break;
|
|
||||||
case ASIOSTInt32LSB:
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4 );
|
|
||||||
break;
|
|
||||||
case ASIOSTFloat32LSB: // IEEE 754 32 bit float, as found on Intel x86 architecture
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4 );
|
|
||||||
break;
|
|
||||||
case ASIOSTFloat64LSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 8 );
|
|
||||||
break;
|
|
||||||
|
|
||||||
// these are used for 32 bit data buffer, with different alignment of the data inside
|
|
||||||
// 32 bit PCI bus systems can more easily used with these
|
|
||||||
case ASIOSTInt32LSB16: // 32 bit data with 18 bit alignment
|
|
||||||
case ASIOSTInt32LSB18: // 32 bit data with 18 bit alignment
|
|
||||||
case ASIOSTInt32LSB20: // 32 bit data with 20 bit alignment
|
|
||||||
case ASIOSTInt32LSB24: // 32 bit data with 24 bit alignment
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4 );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ASIOSTInt16MSB:
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 2 );
|
|
||||||
break;
|
|
||||||
case ASIOSTInt24MSB: // used for 20 bits as well
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 3 );
|
|
||||||
break;
|
|
||||||
case ASIOSTInt32MSB:
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4 );
|
|
||||||
break;
|
|
||||||
case ASIOSTFloat32MSB: // IEEE 754 32 bit float, as found on Intel x86 architecture
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4 );
|
|
||||||
break;
|
|
||||||
case ASIOSTFloat64MSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 8 );
|
|
||||||
break;
|
|
||||||
|
|
||||||
// these are used for 32 bit data buffer, with different alignment of the data inside
|
|
||||||
// 32 bit PCI bus systems can more easily used with these
|
|
||||||
case ASIOSTInt32MSB16: // 32 bit data with 18 bit alignment
|
|
||||||
case ASIOSTInt32MSB18: // 32 bit data with 18 bit alignment
|
|
||||||
case ASIOSTInt32MSB20: // 32 bit data with 20 bit alignment
|
|
||||||
case ASIOSTInt32MSB24: // 32 bit data with 24 bit alignment
|
|
||||||
memset ( asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4 );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// finally if the driver supports the ASIOOutputReady() optimization, do it here, all data are in place
|
if ( bufferInfos[i].isInput == false )
|
||||||
if ( asioDriverInfo.postOutput )
|
|
||||||
{
|
{
|
||||||
ASIOOutputReady();
|
// TODO the following is just a test code
|
||||||
}
|
memset ( bufferInfos[i].buffers[index], 0, buffSize * 2 );
|
||||||
|
|
||||||
if ( processedSamples >= asioDriverInfo.sampleRate * TEST_RUN_TIME ) // roughly measured
|
|
||||||
{
|
|
||||||
asioDriverInfo.stopped = true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
processedSamples += buffSize;
|
|
||||||
|
// TEST
|
||||||
|
static FILE* pFile = fopen ( "test.dat", "w" );
|
||||||
|
for ( int iIdx = 0; iIdx < buffSize * 2; iIdx++ )
|
||||||
|
{
|
||||||
|
fprintf ( pFile, "%d\n", ((short*) bufferInfos[i].buffers[index])[iIdx] );
|
||||||
}
|
}
|
||||||
*/
|
fflush ( pFile );
|
||||||
|
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// finally if the driver supports the ASIOOutputReady() optimization,
|
||||||
|
// do it here, all data are in place
|
||||||
|
if ( bASIOPostOutput )
|
||||||
|
{
|
||||||
|
ASIOOutputReady();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long CSound::asioMessages ( long selector, long value, void* message, double* opt )
|
long CSound::asioMessages ( long selector, long value, void* message, double* opt )
|
||||||
|
|
|
@ -97,13 +97,6 @@ protected:
|
||||||
void AddOutBuffer ( int iBufNum );
|
void AddOutBuffer ( int iBufNum );
|
||||||
void GetDoneBuffer ( int& iCntPrepBuf, int& iIndexDoneBuf );
|
void GetDoneBuffer ( int& iCntPrepBuf, int& iIndexDoneBuf );
|
||||||
|
|
||||||
// ASIO stuff
|
|
||||||
ASIODriverInfo driverInfo;
|
|
||||||
ASIOBufferInfo bufferInfos[2 * NUM_IN_OUT_CHANNELS]; // for input and output buffers -> "2 *"
|
|
||||||
ASIOChannelInfo channelInfos[2 * NUM_IN_OUT_CHANNELS];
|
|
||||||
bool bASIOPostOutput;
|
|
||||||
ASIOCallbacks asioCallbacks;
|
|
||||||
|
|
||||||
// audio hardware buffer info
|
// audio hardware buffer info
|
||||||
struct sHWBufferInfo
|
struct sHWBufferInfo
|
||||||
{
|
{
|
||||||
|
@ -126,8 +119,6 @@ protected:
|
||||||
int iCurNumSndBufIn;
|
int iCurNumSndBufIn;
|
||||||
int iCurNumSndBufOut;
|
int iCurNumSndBufOut;
|
||||||
|
|
||||||
int iBufferSize;
|
|
||||||
|
|
||||||
// wave in
|
// wave in
|
||||||
HANDLE m_WaveInEvent;
|
HANDLE m_WaveInEvent;
|
||||||
int iWhichBufferIn;
|
int iWhichBufferIn;
|
||||||
|
|
Loading…
Reference in a new issue