projects
/
rtaudio.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
be212c1
)
#172 : Fix hang in closing logic of wasapiThread()
173/head
author
Marcus Tomlinson
<themarcustomlinson@gmail.com>
Thu, 13 Dec 2018 21:25:23 +0000
(21:25 +0000)
committer
Marcus Tomlinson
<themarcustomlinson@gmail.com>
Thu, 13 Dec 2018 21:25:23 +0000
(21:25 +0000)
RtAudio.cpp
patch
|
blob
|
history
diff --git
a/RtAudio.cpp
b/RtAudio.cpp
index 6b1ca063a9dc5d17ff292b0751a46b5a0cd238d9..c1df43fba4ef15d56836e348567cb72dac76b0f3 100644
(file)
--- a/
RtAudio.cpp
+++ b/
RtAudio.cpp
@@
-4974,7
+4974,7
@@
void RtApiWasapi::wasapiThread()
unsigned int convBuffSize = 0;
unsigned int deviceBuffSize = 0;
unsigned int convBuffSize = 0;
unsigned int deviceBuffSize = 0;
-
errorText_.clear()
;
+
std::string errorText
;
RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR;
// Attempt to assign "Pro Audio" characteristic to thread
RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR;
// Attempt to assign "Pro Audio" characteristic to thread
@@
-4990,7
+4990,7
@@
void RtApiWasapi::wasapiThread()
if ( captureAudioClient ) {
hr = captureAudioClient->GetMixFormat( &captureFormat );
if ( FAILED( hr ) ) {
if ( captureAudioClient ) {
hr = captureAudioClient->GetMixFormat( &captureFormat );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to retrieve device mix format.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to retrieve device mix format.";
goto Exit;
}
goto Exit;
}
@@
-5009,14
+5009,14
@@
void RtApiWasapi::wasapiThread()
captureFormat,
NULL );
if ( FAILED( hr ) ) {
captureFormat,
NULL );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to initialize capture audio client.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to initialize capture audio client.";
goto Exit;
}
hr = captureAudioClient->GetService( __uuidof( IAudioCaptureClient ),
( void** ) &captureClient );
if ( FAILED( hr ) ) {
goto Exit;
}
hr = captureAudioClient->GetService( __uuidof( IAudioCaptureClient ),
( void** ) &captureClient );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to retrieve capture client handle.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to retrieve capture client handle.";
goto Exit;
}
goto Exit;
}
@@
-5027,13
+5027,13
@@
void RtApiWasapi::wasapiThread()
captureEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
if ( !captureEvent ) {
errorType = RtAudioError::SYSTEM_ERROR;
captureEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
if ( !captureEvent ) {
errorType = RtAudioError::SYSTEM_ERROR;
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to create capture event.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to create capture event.";
goto Exit;
}
hr = captureAudioClient->SetEventHandle( captureEvent );
if ( FAILED( hr ) ) {
goto Exit;
}
hr = captureAudioClient->SetEventHandle( captureEvent );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to set capture event handle.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to set capture event handle.";
goto Exit;
}
goto Exit;
}
@@
-5046,7
+5046,7
@@
void RtApiWasapi::wasapiThread()
unsigned int inBufferSize = 0;
hr = captureAudioClient->GetBufferSize( &inBufferSize );
if ( FAILED( hr ) ) {
unsigned int inBufferSize = 0;
hr = captureAudioClient->GetBufferSize( &inBufferSize );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to get capture buffer size.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to get capture buffer size.";
goto Exit;
}
goto Exit;
}
@@
-5060,14
+5060,14
@@
void RtApiWasapi::wasapiThread()
// reset the capture stream
hr = captureAudioClient->Reset();
if ( FAILED( hr ) ) {
// reset the capture stream
hr = captureAudioClient->Reset();
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to reset capture stream.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to reset capture stream.";
goto Exit;
}
// start the capture stream
hr = captureAudioClient->Start();
if ( FAILED( hr ) ) {
goto Exit;
}
// start the capture stream
hr = captureAudioClient->Start();
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to start capture stream.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to start capture stream.";
goto Exit;
}
}
goto Exit;
}
}
@@
-5076,7
+5076,7
@@
void RtApiWasapi::wasapiThread()
if ( renderAudioClient ) {
hr = renderAudioClient->GetMixFormat( &renderFormat );
if ( FAILED( hr ) ) {
if ( renderAudioClient ) {
hr = renderAudioClient->GetMixFormat( &renderFormat );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to retrieve device mix format.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to retrieve device mix format.";
goto Exit;
}
goto Exit;
}
@@
-5095,14
+5095,14
@@
void RtApiWasapi::wasapiThread()
renderFormat,
NULL );
if ( FAILED( hr ) ) {
renderFormat,
NULL );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to initialize render audio client.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to initialize render audio client.";
goto Exit;
}
hr = renderAudioClient->GetService( __uuidof( IAudioRenderClient ),
( void** ) &renderClient );
if ( FAILED( hr ) ) {
goto Exit;
}
hr = renderAudioClient->GetService( __uuidof( IAudioRenderClient ),
( void** ) &renderClient );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to retrieve render client handle.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to retrieve render client handle.";
goto Exit;
}
goto Exit;
}
@@
-5110,13
+5110,13
@@
void RtApiWasapi::wasapiThread()
renderEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
if ( !renderEvent ) {
errorType = RtAudioError::SYSTEM_ERROR;
renderEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
if ( !renderEvent ) {
errorType = RtAudioError::SYSTEM_ERROR;
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to create render event.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to create render event.";
goto Exit;
}
hr = renderAudioClient->SetEventHandle( renderEvent );
if ( FAILED( hr ) ) {
goto Exit;
}
hr = renderAudioClient->SetEventHandle( renderEvent );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to set render event handle.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to set render event handle.";
goto Exit;
}
goto Exit;
}
@@
-5127,7
+5127,7
@@
void RtApiWasapi::wasapiThread()
unsigned int outBufferSize = 0;
hr = renderAudioClient->GetBufferSize( &outBufferSize );
if ( FAILED( hr ) ) {
unsigned int outBufferSize = 0;
hr = renderAudioClient->GetBufferSize( &outBufferSize );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to get render buffer size.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to get render buffer size.";
goto Exit;
}
goto Exit;
}
@@
-5141,14
+5141,14
@@
void RtApiWasapi::wasapiThread()
// reset the render stream
hr = renderAudioClient->Reset();
if ( FAILED( hr ) ) {
// reset the render stream
hr = renderAudioClient->Reset();
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to reset render stream.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to reset render stream.";
goto Exit;
}
// start the render stream
hr = renderAudioClient->Start();
if ( FAILED( hr ) ) {
goto Exit;
}
// start the render stream
hr = renderAudioClient->Start();
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to start render stream.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to start render stream.";
goto Exit;
}
}
goto Exit;
}
}
@@
-5178,7
+5178,7
@@
void RtApiWasapi::wasapiThread()
stream_.deviceBuffer = ( char* ) malloc( deviceBuffSize );
if ( !convBuffer || !stream_.deviceBuffer ) {
errorType = RtAudioError::MEMORY_ERROR;
stream_.deviceBuffer = ( char* ) malloc( deviceBuffSize );
if ( !convBuffer || !stream_.deviceBuffer ) {
errorType = RtAudioError::MEMORY_ERROR;
- errorText
_
= "RtApiWasapi::wasapiThread: Error allocating device buffer memory.";
+ errorText = "RtApiWasapi::wasapiThread: Error allocating device buffer memory.";
goto Exit;
}
goto Exit;
}
@@
-5268,12
+5268,12
@@
void RtApiWasapi::wasapiThread()
HANDLE threadHandle = CreateThread( NULL, 0, stopWasapiThread, this, 0, NULL );
if ( !threadHandle ) {
errorType = RtAudioError::THREAD_ERROR;
HANDLE threadHandle = CreateThread( NULL, 0, stopWasapiThread, this, 0, NULL );
if ( !threadHandle ) {
errorType = RtAudioError::THREAD_ERROR;
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to instantiate stream stop thread.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to instantiate stream stop thread.";
goto Exit;
}
else if ( !CloseHandle( threadHandle ) ) {
errorType = RtAudioError::THREAD_ERROR;
goto Exit;
}
else if ( !CloseHandle( threadHandle ) ) {
errorType = RtAudioError::THREAD_ERROR;
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to close stream stop thread handle.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to close stream stop thread handle.";
goto Exit;
}
goto Exit;
}
@@
-5284,12
+5284,12
@@
void RtApiWasapi::wasapiThread()
HANDLE threadHandle = CreateThread( NULL, 0, abortWasapiThread, this, 0, NULL );
if ( !threadHandle ) {
errorType = RtAudioError::THREAD_ERROR;
HANDLE threadHandle = CreateThread( NULL, 0, abortWasapiThread, this, 0, NULL );
if ( !threadHandle ) {
errorType = RtAudioError::THREAD_ERROR;
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to instantiate stream abort thread.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to instantiate stream abort thread.";
goto Exit;
}
else if ( !CloseHandle( threadHandle ) ) {
errorType = RtAudioError::THREAD_ERROR;
goto Exit;
}
else if ( !CloseHandle( threadHandle ) ) {
errorType = RtAudioError::THREAD_ERROR;
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to close stream abort thread handle.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to close stream abort thread handle.";
goto Exit;
}
goto Exit;
}
@@
-5352,7
+5352,7
@@
void RtApiWasapi::wasapiThread()
&bufferFrameCount,
&captureFlags, NULL, NULL );
if ( FAILED( hr ) ) {
&bufferFrameCount,
&captureFlags, NULL, NULL );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to retrieve capture buffer.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to retrieve capture buffer.";
goto Exit;
}
goto Exit;
}
@@
-5365,7
+5365,7
@@
void RtApiWasapi::wasapiThread()
// Release capture buffer
hr = captureClient->ReleaseBuffer( bufferFrameCount );
if ( FAILED( hr ) ) {
// Release capture buffer
hr = captureClient->ReleaseBuffer( bufferFrameCount );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to release capture buffer.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to release capture buffer.";
goto Exit;
}
}
goto Exit;
}
}
@@
-5374,7
+5374,7
@@
void RtApiWasapi::wasapiThread()
// Inform WASAPI that capture was unsuccessful
hr = captureClient->ReleaseBuffer( 0 );
if ( FAILED( hr ) ) {
// Inform WASAPI that capture was unsuccessful
hr = captureClient->ReleaseBuffer( 0 );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to release capture buffer.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to release capture buffer.";
goto Exit;
}
}
goto Exit;
}
}
@@
-5384,7
+5384,7
@@
void RtApiWasapi::wasapiThread()
// Inform WASAPI that capture was unsuccessful
hr = captureClient->ReleaseBuffer( 0 );
if ( FAILED( hr ) ) {
// Inform WASAPI that capture was unsuccessful
hr = captureClient->ReleaseBuffer( 0 );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to release capture buffer.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to release capture buffer.";
goto Exit;
}
}
goto Exit;
}
}
@@
-5406,13
+5406,13
@@
void RtApiWasapi::wasapiThread()
// Get render buffer from stream
hr = renderAudioClient->GetBufferSize( &bufferFrameCount );
if ( FAILED( hr ) ) {
// Get render buffer from stream
hr = renderAudioClient->GetBufferSize( &bufferFrameCount );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to retrieve render buffer size.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer size.";
goto Exit;
}
hr = renderAudioClient->GetCurrentPadding( &numFramesPadding );
if ( FAILED( hr ) ) {
goto Exit;
}
hr = renderAudioClient->GetCurrentPadding( &numFramesPadding );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to retrieve render buffer padding.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer padding.";
goto Exit;
}
goto Exit;
}
@@
-5421,7
+5421,7
@@
void RtApiWasapi::wasapiThread()
if ( bufferFrameCount != 0 ) {
hr = renderClient->GetBuffer( bufferFrameCount, &streamBuffer );
if ( FAILED( hr ) ) {
if ( bufferFrameCount != 0 ) {
hr = renderClient->GetBuffer( bufferFrameCount, &streamBuffer );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to retrieve render buffer.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer.";
goto Exit;
}
goto Exit;
}
@@
-5434,7
+5434,7
@@
void RtApiWasapi::wasapiThread()
// Release render buffer
hr = renderClient->ReleaseBuffer( bufferFrameCount, 0 );
if ( FAILED( hr ) ) {
// Release render buffer
hr = renderClient->ReleaseBuffer( bufferFrameCount, 0 );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to release render buffer.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to release render buffer.";
goto Exit;
}
}
goto Exit;
}
}
@@
-5443,7
+5443,7
@@
void RtApiWasapi::wasapiThread()
// Inform WASAPI that render was unsuccessful
hr = renderClient->ReleaseBuffer( 0, 0 );
if ( FAILED( hr ) ) {
// Inform WASAPI that render was unsuccessful
hr = renderClient->ReleaseBuffer( 0, 0 );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to release render buffer.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to release render buffer.";
goto Exit;
}
}
goto Exit;
}
}
@@
-5453,7
+5453,7
@@
void RtApiWasapi::wasapiThread()
// Inform WASAPI that render was unsuccessful
hr = renderClient->ReleaseBuffer( 0, 0 );
if ( FAILED( hr ) ) {
// Inform WASAPI that render was unsuccessful
hr = renderClient->ReleaseBuffer( 0, 0 );
if ( FAILED( hr ) ) {
- errorText
_
= "RtApiWasapi::wasapiThread: Unable to release render buffer.";
+ errorText = "RtApiWasapi::wasapiThread: Unable to release render buffer.";
goto Exit;
}
}
goto Exit;
}
}
@@
-5482,11
+5482,14
@@
Exit:
CoUninitialize();
CoUninitialize();
- if ( !errorText_.empty() )
- error( errorType );
-
// update stream state
stream_.state = STREAM_STOPPED;
// update stream state
stream_.state = STREAM_STOPPED;
+
+ if ( !errorText.empty() )
+ {
+ errorText_ = errorText;
+ error( errorType );
+ }
}
//******************** End of __WINDOWS_WASAPI__ *********************//
}
//******************** End of __WINDOWS_WASAPI__ *********************//