wasapi: provide meaningful error code when opening the stream and error occurred instead of just paInvalidDevice
This commit is contained in:
parent
5701b05e0f
commit
4ae4fa0ef9
1 changed files with 25 additions and 8 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue