From 8870fe38b5d9a143c78c68a43c95c1be766739b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20H=C3=B6hle?= Date: Mon, 7 Sep 2009 22:29:39 +0200 Subject: [PATCH] wineoss: Enforce invariant about BlockAlign and nAvgBytesPerSec. --- dlls/wineoss.drv/audio.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/dlls/wineoss.drv/audio.c b/dlls/wineoss.drv/audio.c index ca79cd52657..ddf973f85ec 100644 --- a/dlls/wineoss.drv/audio.c +++ b/dlls/wineoss.drv/audio.c @@ -1990,6 +1990,16 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) return MMSYSERR_NOERROR; } + /* nBlockAlign and nAvgBytesPerSec are output variables for dsound */ + if (lpDesc->lpFormat->nBlockAlign != lpDesc->lpFormat->nChannels*lpDesc->lpFormat->wBitsPerSample/8) { + lpDesc->lpFormat->nBlockAlign = lpDesc->lpFormat->nChannels*lpDesc->lpFormat->wBitsPerSample/8; + WARN("Fixing nBlockAlign\n"); + } + if (lpDesc->lpFormat->nAvgBytesPerSec!= lpDesc->lpFormat->nSamplesPerSec*lpDesc->lpFormat->nBlockAlign) { + lpDesc->lpFormat->nAvgBytesPerSec = lpDesc->lpFormat->nSamplesPerSec*lpDesc->lpFormat->nBlockAlign; + WARN("Fixing nAvgBytesPerSec\n"); + } + TRACE("OSS_OpenDevice requested this format: %dx%dx%d %s\n", lpDesc->lpFormat->nSamplesPerSec, lpDesc->lpFormat->wBitsPerSample, @@ -2064,13 +2074,6 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwo->waveDesc = *lpDesc; copy_format(lpDesc->lpFormat, &wwo->waveFormat); - if (wwo->waveFormat.Format.wBitsPerSample == 0) { - WARN("Resetting zeroed wBitsPerSample\n"); - wwo->waveFormat.Format.wBitsPerSample = 8 * - (wwo->waveFormat.Format.nAvgBytesPerSec / - wwo->waveFormat.Format.nSamplesPerSec) / - wwo->waveFormat.Format.nChannels; - } /* Read output space info for future reference */ if (ioctl(wwo->ossdev.fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev.dev_name, strerror(errno)); @@ -2880,6 +2883,16 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) return MMSYSERR_NOERROR; } + /* nBlockAlign and nAvgBytesPerSec are output variables for dsound */ + if (lpDesc->lpFormat->nBlockAlign != lpDesc->lpFormat->nChannels*lpDesc->lpFormat->wBitsPerSample/8) { + lpDesc->lpFormat->nBlockAlign = lpDesc->lpFormat->nChannels*lpDesc->lpFormat->wBitsPerSample/8; + WARN("Fixing nBlockAlign\n"); + } + if (lpDesc->lpFormat->nAvgBytesPerSec!= lpDesc->lpFormat->nSamplesPerSec*lpDesc->lpFormat->nBlockAlign) { + lpDesc->lpFormat->nAvgBytesPerSec = lpDesc->lpFormat->nSamplesPerSec*lpDesc->lpFormat->nBlockAlign; + WARN("Fixing nAvgBytesPerSec\n"); + } + TRACE("OSS_OpenDevice requested this format: %dx%dx%d %s\n", lpDesc->lpFormat->nSamplesPerSec, lpDesc->lpFormat->wBitsPerSample, @@ -2951,14 +2964,6 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwi->waveDesc = *lpDesc; copy_format(lpDesc->lpFormat, &wwi->waveFormat); - if (wwi->waveFormat.Format.wBitsPerSample == 0) { - WARN("Resetting zeroed wBitsPerSample\n"); - wwi->waveFormat.Format.wBitsPerSample = 8 * - (wwi->waveFormat.Format.nAvgBytesPerSec / - wwi->waveFormat.Format.nSamplesPerSec) / - wwi->waveFormat.Format.nChannels; - } - if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info) < 0) { ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));