Got rid of recursion in sub device opening.
This commit is contained in:
parent
b4ba9fa7df
commit
60f21c3d58
|
@ -128,7 +128,6 @@ static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
|
||||||
UINT ndlo, ndhi;
|
UINT ndlo, ndhi;
|
||||||
UINT i;
|
UINT i;
|
||||||
WAVEMAPDATA* wom = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
|
WAVEMAPDATA* wom = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
|
||||||
WAVEFORMATEX wfx;
|
|
||||||
|
|
||||||
TRACE("(%p %p %08lx\n", lpdwUser, lpDesc, dwFlags);
|
TRACE("(%p %p %08lx\n", lpdwUser, lpDesc, dwFlags);
|
||||||
|
|
||||||
|
@ -155,18 +154,21 @@ static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
|
||||||
* level, this will be done transparently
|
* level, this will be done transparently
|
||||||
*/
|
*/
|
||||||
if (waveOutOpen(&wom->hInnerWave, i, lpDesc->lpFormat, (DWORD)wodCallback,
|
if (waveOutOpen(&wom->hInnerWave, i, lpDesc->lpFormat, (DWORD)wodCallback,
|
||||||
(DWORD)wom, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION) == MMSYSERR_NOERROR) {
|
(DWORD)wom, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT) == MMSYSERR_NOERROR) {
|
||||||
wom->hAcmStream = 0;
|
wom->hAcmStream = 0;
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((dwFlags & WAVE_FORMAT_DIRECT) == 0) {
|
||||||
|
WAVEFORMATEX wfx;
|
||||||
|
|
||||||
wfx.wFormatTag = WAVE_FORMAT_PCM;
|
wfx.wFormatTag = WAVE_FORMAT_PCM;
|
||||||
wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */
|
wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */
|
||||||
/* try some ACM stuff */
|
/* try some ACM stuff */
|
||||||
|
|
||||||
#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
|
#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
|
||||||
if (wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags) == MMSYSERR_NOERROR) goto found;
|
if (wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT) == MMSYSERR_NOERROR) goto found;
|
||||||
|
|
||||||
for (i = ndlo; i < ndhi; i++) {
|
for (i = ndlo; i < ndhi; i++) {
|
||||||
/* first try with same stereo/mono option as source */
|
/* first try with same stereo/mono option as source */
|
||||||
|
@ -194,6 +196,7 @@ static DWORD wodOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
|
||||||
TRY(11025, 8);
|
TRY(11025, 8);
|
||||||
}
|
}
|
||||||
#undef TRY
|
#undef TRY
|
||||||
|
}
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, wom);
|
HeapFree(GetProcessHeap(), 0, wom);
|
||||||
return MMSYSERR_ALLOCATED;
|
return MMSYSERR_ALLOCATED;
|
||||||
|
@ -239,6 +242,11 @@ static DWORD wodWrite(WAVEMAPDATA* wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2)
|
||||||
return MMSYSERR_ERROR;
|
return MMSYSERR_ERROR;
|
||||||
|
|
||||||
lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));
|
lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));
|
||||||
|
if (ash->cbSrcLength > ash->cbSrcLengthUsed)
|
||||||
|
FIXME("Not all src buffer has been written, expect bogus sound\n");
|
||||||
|
else if (ash->cbSrcLength < ash->cbSrcLengthUsed)
|
||||||
|
ERR("CoDec has read more data than it is allowed to\n");
|
||||||
|
|
||||||
if (ash->cbDstLengthUsed == 0)
|
if (ash->cbDstLengthUsed == 0)
|
||||||
{
|
{
|
||||||
/* something went wrong in decoding */
|
/* something went wrong in decoding */
|
||||||
|
@ -536,7 +544,6 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
|
||||||
UINT ndlo, ndhi;
|
UINT ndlo, ndhi;
|
||||||
UINT i;
|
UINT i;
|
||||||
WAVEMAPDATA* wim = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
|
WAVEMAPDATA* wim = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
|
||||||
WAVEFORMATEX wfx;
|
|
||||||
|
|
||||||
TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags);
|
TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags);
|
||||||
|
|
||||||
|
@ -561,17 +568,22 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
|
||||||
|
|
||||||
for (i = ndlo; i < ndhi; i++) {
|
for (i = ndlo; i < ndhi; i++) {
|
||||||
if (waveInOpen(&wim->hInnerWave, i, lpDesc->lpFormat, (DWORD)widCallback,
|
if (waveInOpen(&wim->hInnerWave, i, lpDesc->lpFormat, (DWORD)widCallback,
|
||||||
(DWORD)wim, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION) == MMSYSERR_NOERROR) {
|
(DWORD)wim, (dwFlags & ~CALLBACK_TYPEMASK) | CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT) == MMSYSERR_NOERROR) {
|
||||||
wim->hAcmStream = 0;
|
wim->hAcmStream = 0;
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((dwFlags & WAVE_FORMAT_DIRECT) == 0)
|
||||||
|
{
|
||||||
|
WAVEFORMATEX wfx;
|
||||||
|
|
||||||
wfx.wFormatTag = WAVE_FORMAT_PCM;
|
wfx.wFormatTag = WAVE_FORMAT_PCM;
|
||||||
wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */
|
wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */
|
||||||
/* try some ACM stuff */
|
/* try some ACM stuff */
|
||||||
|
|
||||||
#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
|
#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
|
||||||
if (widOpenHelper(wim, i, lpDesc, &wfx, dwFlags) == MMSYSERR_NOERROR) goto found;
|
if (widOpenHelper(wim, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT) == MMSYSERR_NOERROR) goto found;
|
||||||
|
|
||||||
for (i = ndlo; i < ndhi; i++) {
|
for (i = ndlo; i < ndhi; i++) {
|
||||||
/* first try with same stereo/mono option as source */
|
/* first try with same stereo/mono option as source */
|
||||||
|
@ -587,6 +599,7 @@ static DWORD widOpen(LPDWORD lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
|
||||||
TRY(11025, 8);
|
TRY(11025, 8);
|
||||||
}
|
}
|
||||||
#undef TRY
|
#undef TRY
|
||||||
|
}
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, wim);
|
HeapFree(GetProcessHeap(), 0, wim);
|
||||||
return MMSYSERR_ALLOCATED;
|
return MMSYSERR_ALLOCATED;
|
||||||
|
|
Loading…
Reference in New Issue