From 4ae4fa0ef986e1f063c6075211150c218ff31330 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Mon, 16 Apr 2012 08:16:20 +0000 Subject: [PATCH] wasapi: provide meaningful error code when opening the stream and error occurred instead of just paInvalidDevice --- src/hostapi/wasapi/pa_win_wasapi.c | 33 ++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index ee775c7..b40f777 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -2128,16 +2128,26 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu const UINT32 userFramesPerBuffer = framesPerLatency; IAudioClient *audioClient = NULL; + // Assume default failure due to some reason + (*pa_error) = paInvalidDevice; + // Validate parameters if (!pSub || !pInfo || !params) + { + (*pa_error) = paBadStreamPtr; return E_POINTER; + } if ((UINT32)sampleRate == 0) + { + (*pa_error) = paInvalidSampleRate; return E_INVALIDARG; + } // Get the audio client hr = IMMDevice_Activate(pInfo->device, &pa_IID_IAudioClient, CLSCTX_ALL, NULL, (void **)&audioClient); if (hr != S_OK) { + (*pa_error) = paInsufficientMemory; LogHostError(hr); goto done; } @@ -2145,9 +2155,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu // Get closest format if ((error = GetClosestFormat(audioClient, sampleRate, params, pSub->shareMode, &pSub->wavex, output)) != paFormatIsSupported) { - if (pa_error) - (*pa_error) = error; - + (*pa_error) = error; LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); goto done; // fail, format not supported } @@ -2165,6 +2173,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L)); if (pSub->monoMixer == NULL) { + (*pa_error) = paInvalidChannelCount; LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); goto done; // fail, no mixer for format } @@ -2320,6 +2329,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu hr = IMMDevice_Activate(pInfo->device, &pa_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&audioClient); if (hr != S_OK) { + (*pa_error) = paInsufficientMemory; LogHostError(hr); goto done; } @@ -2350,6 +2360,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu hr = IMMDevice_Activate(pInfo->device, &pa_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&audioClient); if (hr != S_OK) { + (*pa_error) = paInsufficientMemory; LogHostError(hr); goto done; } @@ -2375,6 +2386,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu hr = IAudioClient_GetBufferSize(audioClient, &frames); if (hr != S_OK) { + (*pa_error) = paInvalidDevice; LogHostError(hr); goto done; } @@ -2388,6 +2400,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu hr = IMMDevice_Activate(pInfo->device, &pa_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&audioClient); if (hr != S_OK) { + (*pa_error) = paInsufficientMemory; LogHostError(hr); goto done; } @@ -2395,9 +2408,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu // Get closest format if ((error = GetClosestFormat(audioClient, sampleRate, params, pSub->shareMode, &pSub->wavex, output)) != paFormatIsSupported) { - if (pa_error) - (*pa_error) = error; - + (*pa_error) = error; LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); // fail, format not supported goto done; } @@ -2415,6 +2426,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L)); if (pSub->monoMixer == NULL) { + (*pa_error) = paInvalidChannelCount; LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); goto done; // fail, no mixer for format } @@ -2433,6 +2445,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu NULL); if (hr != S_OK) { + (*pa_error) = paInvalidDevice; LogHostError(hr); goto done; } @@ -2440,6 +2453,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu else if (hr != S_OK) { + (*pa_error) = paInvalidDevice; LogHostError(hr); goto done; } @@ -2454,6 +2468,9 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec), fullDuplex); + // No error, client is succesfully created + (*pa_error) = paNoError; + done: // Clean up @@ -2475,7 +2492,7 @@ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) hr = CreateAudioClient(stream, &stream->out, TRUE, &result); if (hr != S_OK) { - LogPaError(result = paInvalidDevice); + LogPaError(result); goto error; } LogWAVEFORMATEXTENSIBLE(&stream->out.wavex); @@ -2547,7 +2564,7 @@ static PaError ActivateAudioClientInput(PaWasapiStream *stream) hr = CreateAudioClient(stream, &stream->in, FALSE, &result); if (hr != S_OK) { - LogPaError(result = paInvalidDevice); + LogPaError(result); goto error; } LogWAVEFORMATEXTENSIBLE(&stream->in.wavex); -- 2.43.0