diff --git a/RtAudio.cpp b/RtAudio.cpp index db4f1afa..ac6bee92 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -52,8 +52,6 @@ #include #if defined(_WIN32) -#include -using Microsoft::WRL::ComPtr; #include #endif @@ -257,6 +255,8 @@ class RtApiDs: public RtApi #endif #if defined(__WINDOWS_WASAPI__) +#include +using Microsoft::WRL::ComPtr; struct IMMDeviceEnumerator; @@ -4691,8 +4691,8 @@ class WasapiResampler outputBufferSize = ( unsigned int ) ceilf( inputBufferSize * _sampleRatio ) + ( _bytesPerSample * _channelCount ); } - ComPtr rInBuffer; - ComPtr rInSample; + ComPtr rInBuffer = NULL; + ComPtr rInSample = NULL; BYTE* rInByteBuffer = NULL; // 5. Create Sample object from input data @@ -4749,7 +4749,6 @@ class WasapiResampler rOutBuffer->Lock( &rOutByteBuffer, NULL, NULL ); memcpy( outBuffer, rOutByteBuffer, rBytes ); rOutBuffer->Unlock(); - rOutByteBuffer = NULL; outSampleCount = rBytes / _bytesPerSample / _channelCount; SAFE_RELEASE( rOutDataBuffer.pSample ); @@ -5090,6 +5089,8 @@ void RtApiWasapi::probeDevices( void ) } Exit: + // Release all references + CoTaskMemFree( defaultCaptureId ); CoTaskMemFree( defaultRenderId ); @@ -5237,6 +5238,8 @@ void RtApiWasapi::closeStream( void ) MUTEX_LOCK( &stream_.mutex ); } + // clean up stream memory + if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent ) CloseHandle( ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent ); @@ -5439,7 +5442,7 @@ bool RtApiWasapi::probeDeviceOpen( unsigned int deviceId, StreamMode mode, unsig // If an output device and is configured for loopback (input mode) if ( isInput == false && mode == INPUT ) { // If renderAudioClient is not initialised, initialise it now - ComPtr renderAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient; + ComPtr& renderAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient; if ( !renderAudioClient ) { MUTEX_UNLOCK( &stream_.mutex ); probeDeviceOpen( deviceId, OUTPUT, channels, firstChannel, sampleRate, format, bufferSize, options ); @@ -5447,7 +5450,7 @@ bool RtApiWasapi::probeDeviceOpen( unsigned int deviceId, StreamMode mode, unsig } // Retrieve captureAudioClient from our stream handle. - ComPtr captureAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient; + ComPtr& captureAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient; hr = devicePtr->Activate( __uuidof( IAudioClient ), CLSCTX_ALL, NULL, ( void** ) &captureAudioClient ); @@ -5469,7 +5472,7 @@ bool RtApiWasapi::probeDeviceOpen( unsigned int deviceId, StreamMode mode, unsig // If output device and is configured for output. if ( isInput == false && mode == OUTPUT ) { // If renderAudioClient is already initialised, don't initialise it again - ComPtr renderAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient; + ComPtr& renderAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient; if ( renderAudioClient ) { methodResult = SUCCESS; goto Exit;