wasapi: provide meaningful error code when opening the stream and error occurred instead of just paInvalidDevice

This commit is contained in:
dmitrykos 2012-04-16 08:16:20 +00:00
commit 4ae4fa0ef9

View file

@ -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);