tweaked dsound callback time info calculations. implemented adc time. resolves #122
This commit is contained in:
parent
01fbe8de7c
commit
fc14177a05
1 changed files with 21 additions and 4 deletions
|
|
@ -2348,7 +2348,8 @@ static int TimeSlice( PaWinDsStream *stream )
|
||||||
long bytesProcessed;
|
long bytesProcessed;
|
||||||
HRESULT hresult;
|
HRESULT hresult;
|
||||||
double outputLatency = 0;
|
double outputLatency = 0;
|
||||||
PaStreamCallbackTimeInfo timeInfo = {0,0,0}; /** @todo implement inputBufferAdcTime */
|
double inputLatency = 0;
|
||||||
|
PaStreamCallbackTimeInfo timeInfo = {0,0,0};
|
||||||
|
|
||||||
/* Input */
|
/* Input */
|
||||||
LPBYTE lpInBuf1 = NULL;
|
LPBYTE lpInBuf1 = NULL;
|
||||||
|
|
@ -2377,11 +2378,12 @@ static int TimeSlice( PaWinDsStream *stream )
|
||||||
filled = readPos - stream->readOffset;
|
filled = readPos - stream->readOffset;
|
||||||
if( filled < 0 ) filled += stream->inputBufferSizeBytes; // unwrap offset
|
if( filled < 0 ) filled += stream->inputBufferSizeBytes; // unwrap offset
|
||||||
bytesFilled = filled;
|
bytesFilled = filled;
|
||||||
|
|
||||||
|
inputLatency = ((double)bytesFilled) * stream->secondsPerHostByte;
|
||||||
}
|
}
|
||||||
// FIXME: what happens if IDirectSoundCaptureBuffer_GetCurrentPosition fails?
|
// FIXME: what happens if IDirectSoundCaptureBuffer_GetCurrentPosition fails?
|
||||||
|
|
||||||
framesToXfer = numInFramesReady = bytesFilled / stream->inputFrameSizeBytes;
|
framesToXfer = numInFramesReady = bytesFilled / stream->inputFrameSizeBytes;
|
||||||
outputLatency = ((double)bytesFilled) * stream->secondsPerHostByte; // FIXME: this doesn't look right. we're calculating output latency in input branch. also secondsPerHostByte is only initialized for the output stream
|
|
||||||
|
|
||||||
/** @todo Check for overflow */
|
/** @todo Check for overflow */
|
||||||
}
|
}
|
||||||
|
|
@ -2396,6 +2398,14 @@ static int TimeSlice( PaWinDsStream *stream )
|
||||||
/* Check for underflow */
|
/* Check for underflow */
|
||||||
if( stream->outputUnderflowCount != previousUnderflowCount )
|
if( stream->outputUnderflowCount != previousUnderflowCount )
|
||||||
stream->callbackFlags |= paOutputUnderflow;
|
stream->callbackFlags |= paOutputUnderflow;
|
||||||
|
|
||||||
|
/* We are about to compute audio into the first byte of empty space in the output buffer.
|
||||||
|
This audio will reach the DAC after all of the current (non-empty) audio
|
||||||
|
in the buffer has played. Therefore the output time is the current time
|
||||||
|
plus the time it takes to play the non-empty bytes in the buffer,
|
||||||
|
computed here:
|
||||||
|
*/
|
||||||
|
outputLatency = ((double)(stream->outputBufferSizeBytes - bytesEmpty)) * stream->secondsPerHostByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if it's a full duplex stream, set framesToXfer to the minimum of input and output frames ready */
|
/* if it's a full duplex stream, set framesToXfer to the minimum of input and output frames ready */
|
||||||
|
|
@ -2411,8 +2421,6 @@ static int TimeSlice( PaWinDsStream *stream )
|
||||||
/* The outputBufferDacTime parameter should indicates the time at which
|
/* The outputBufferDacTime parameter should indicates the time at which
|
||||||
the first sample of the output buffer is heard at the DACs. */
|
the first sample of the output buffer is heard at the DACs. */
|
||||||
timeInfo.currentTime = PaUtil_GetTime();
|
timeInfo.currentTime = PaUtil_GetTime();
|
||||||
timeInfo.outputBufferDacTime = timeInfo.currentTime + outputLatency; // FIXME: QueryOutputSpace gets the playback position, we could use that (?)
|
|
||||||
|
|
||||||
|
|
||||||
PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, stream->callbackFlags );
|
PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, stream->callbackFlags );
|
||||||
stream->callbackFlags = 0;
|
stream->callbackFlags = 0;
|
||||||
|
|
@ -2420,6 +2428,8 @@ static int TimeSlice( PaWinDsStream *stream )
|
||||||
/* Input */
|
/* Input */
|
||||||
if( stream->bufferProcessor.inputChannelCount > 0 )
|
if( stream->bufferProcessor.inputChannelCount > 0 )
|
||||||
{
|
{
|
||||||
|
timeInfo.inputBufferAdcTime = timeInfo.currentTime - inputLatency;
|
||||||
|
|
||||||
bytesToXfer = framesToXfer * stream->inputFrameSizeBytes;
|
bytesToXfer = framesToXfer * stream->inputFrameSizeBytes;
|
||||||
hresult = IDirectSoundCaptureBuffer_Lock ( stream->pDirectSoundInputBuffer,
|
hresult = IDirectSoundCaptureBuffer_Lock ( stream->pDirectSoundInputBuffer,
|
||||||
stream->readOffset, bytesToXfer,
|
stream->readOffset, bytesToXfer,
|
||||||
|
|
@ -2449,6 +2459,13 @@ static int TimeSlice( PaWinDsStream *stream )
|
||||||
/* Output */
|
/* Output */
|
||||||
if( stream->bufferProcessor.outputChannelCount > 0 )
|
if( stream->bufferProcessor.outputChannelCount > 0 )
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
We don't currently add outputLatency here because it appears to produce worse
|
||||||
|
results than non adding it. Need to do more testing to verify this.
|
||||||
|
*/
|
||||||
|
/* timeInfo.outputBufferDacTime = timeInfo.currentTime + outputLatency; */
|
||||||
|
timeInfo.outputBufferDacTime = timeInfo.currentTime;
|
||||||
|
|
||||||
bytesToXfer = framesToXfer * stream->outputFrameSizeBytes;
|
bytesToXfer = framesToXfer * stream->outputFrameSizeBytes;
|
||||||
hresult = IDirectSoundBuffer_Lock ( stream->pDirectSoundOutputBuffer,
|
hresult = IDirectSoundBuffer_Lock ( stream->pDirectSoundOutputBuffer,
|
||||||
stream->outputBufferWriteOffsetBytes, bytesToXfer,
|
stream->outputBufferWriteOffsetBytes, bytesToXfer,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue