Browse Source

WASAPI : Fixed issue where latency was introduced on stream stop / start

tags/5.1.0
Marcus Tomlinson 6 years ago
parent
commit
4fa4a0f965
1 changed files with 28 additions and 68 deletions
  1. +28
    -68
      RtAudio.cpp

+ 28
- 68
RtAudio.cpp View File

@@ -4606,26 +4606,6 @@ void RtApiWasapi::stopStream( void )
// Wait for the last buffer to play before stopping.
Sleep( 1000 * stream_.bufferSize / stream_.sampleRate );

// stop capture client if applicable
if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient ) {
HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient->Stop();
if ( FAILED( hr ) ) {
errorText_ = "RtApiWasapi::stopStream: Unable to stop capture stream.";
error( RtAudioError::DRIVER_ERROR );
return;
}
}

// stop render client if applicable
if ( ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient ) {
HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient->Stop();
if ( FAILED( hr ) ) {
errorText_ = "RtApiWasapi::stopStream: Unable to stop render stream.";
error( RtAudioError::DRIVER_ERROR );
return;
}
}

// close thread handle
if ( stream_.callbackInfo.thread && !CloseHandle( ( void* ) stream_.callbackInfo.thread ) ) {
errorText_ = "RtApiWasapi::stopStream: Unable to close callback thread.";
@@ -4656,26 +4636,6 @@ void RtApiWasapi::abortStream( void )
Sleep( 1 );
}

// stop capture client if applicable
if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient ) {
HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient->Stop();
if ( FAILED( hr ) ) {
errorText_ = "RtApiWasapi::abortStream: Unable to stop capture stream.";
error( RtAudioError::DRIVER_ERROR );
return;
}
}

// stop render client if applicable
if ( ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient ) {
HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient->Stop();
if ( FAILED( hr ) ) {
errorText_ = "RtApiWasapi::abortStream: Unable to stop render stream.";
error( RtAudioError::DRIVER_ERROR );
return;
}
}

// close thread handle
if ( stream_.callbackInfo.thread && !CloseHandle( ( void* ) stream_.callbackInfo.thread ) ) {
errorText_ = "RtApiWasapi::abortStream: Unable to close callback thread.";
@@ -5058,6 +5018,20 @@ void RtApiWasapi::wasapiThread()
}

( ( WasapiHandle* ) stream_.apiHandle )->captureClient = captureClient;

// reset the capture stream
hr = captureAudioClient->Reset();
if ( FAILED( hr ) ) {
errorText = "RtApiWasapi::wasapiThread: Unable to reset capture stream.";
goto Exit;
}

// start the capture stream
hr = captureAudioClient->Start();
if ( FAILED( hr ) ) {
errorText = "RtApiWasapi::wasapiThread: Unable to start capture stream.";
goto Exit;
}
}

unsigned int inBufferSize = 0;
@@ -5073,20 +5047,6 @@ void RtApiWasapi::wasapiThread()

// set captureBuffer size
captureBuffer.setBufferSize( inBufferSize + outBufferSize, formatBytes( stream_.deviceFormat[INPUT] ) );

// reset the capture stream
hr = captureAudioClient->Reset();
if ( FAILED( hr ) ) {
errorText = "RtApiWasapi::wasapiThread: Unable to reset capture stream.";
goto Exit;
}

// start the capture stream
hr = captureAudioClient->Start();
if ( FAILED( hr ) ) {
errorText = "RtApiWasapi::wasapiThread: Unable to start capture stream.";
goto Exit;
}
}

// start render stream if applicable
@@ -5139,6 +5099,20 @@ void RtApiWasapi::wasapiThread()

( ( WasapiHandle* ) stream_.apiHandle )->renderClient = renderClient;
( ( WasapiHandle* ) stream_.apiHandle )->renderEvent = renderEvent;

// reset the render stream
hr = renderAudioClient->Reset();
if ( FAILED( hr ) ) {
errorText = "RtApiWasapi::wasapiThread: Unable to reset render stream.";
goto Exit;
}

// start the render stream
hr = renderAudioClient->Start();
if ( FAILED( hr ) ) {
errorText = "RtApiWasapi::wasapiThread: Unable to start render stream.";
goto Exit;
}
}

unsigned int outBufferSize = 0;
@@ -5154,20 +5128,6 @@ void RtApiWasapi::wasapiThread()

// set renderBuffer size
renderBuffer.setBufferSize( inBufferSize + outBufferSize, formatBytes( stream_.deviceFormat[OUTPUT] ) );

// reset the render stream
hr = renderAudioClient->Reset();
if ( FAILED( hr ) ) {
errorText = "RtApiWasapi::wasapiThread: Unable to reset render stream.";
goto Exit;
}

// start the render stream
hr = renderAudioClient->Start();
if ( FAILED( hr ) ) {
errorText = "RtApiWasapi::wasapiThread: Unable to start render stream.";
goto Exit;
}
}

// malloc buffer memory


Loading…
Cancel
Save