Author: dchapyshev
Date: Sat Apr 11 12:16:16 2009
New Revision: 40454
URL:
http://svn.reactos.org/svn/reactos?rev=40454&view=rev
Log:
- Sync mciqtz32 and winemp3 with Wine 1.1.19
Added:
trunk/reactos/dll/win32/mciqtz32/mciqtz_private.h (with props)
Modified:
trunk/reactos/dll/win32/mciqtz32/mciqtz.c
trunk/reactos/dll/win32/mciqtz32/mciqtz32.rbuild
trunk/reactos/dll/win32/winemp3.acm/mpegl3.c
Modified: trunk/reactos/dll/win32/mciqtz32/mciqtz.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mciqtz32/mciqtz.…
==============================================================================
--- trunk/reactos/dll/win32/mciqtz32/mciqtz.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mciqtz32/mciqtz.c [iso-8859-1] Sat Apr 11 12:16:16 2009
@@ -21,10 +21,17 @@
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
+#include "winuser.h"
#include "mmddk.h"
#include "wine/debug.h"
+#include "mciqtz_private.h"
+#include "digitalv.h"
+#include "wownt32.h"
WINE_DEFAULT_DEBUG_CHANNEL(mciqtz);
+
+static DWORD MCIQTZ_mciClose(UINT, DWORD, LPMCI_GENERIC_PARMS);
+static DWORD MCIQTZ_mciStop(UINT, DWORD, LPMCI_GENERIC_PARMS);
/*======================================================================*
* MCI QTZ implementation *
@@ -46,6 +53,367 @@
return TRUE;
}
+/**************************************************************************
+ * MCIQTZ_drvOpen [internal]
+ */
+static DWORD MCIQTZ_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
+{
+ WINE_MCIQTZ* wma;
+
+ TRACE("%s, %p\n", debugstr_w(str), modp);
+
+ /* session instance */
+ if (!modp)
+ return 0xFFFFFFFF;
+
+ wma = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCIQTZ));
+ if (!wma)
+ return 0;
+
+ wma->wDevID = modp->wDeviceID;
+ mciSetDriverData(wma->wDevID, (DWORD_PTR)wma);
+
+ return modp->wDeviceID;
+}
+
+/**************************************************************************
+ * MCIQTZ_drvClose [internal]
+ */
+static DWORD MCIQTZ_drvClose(DWORD dwDevID)
+{
+ WINE_MCIQTZ* wma;
+
+ TRACE("%04x\n", dwDevID);
+
+ /* finish all outstanding things */
+ MCIQTZ_mciClose(dwDevID, MCI_WAIT, NULL);
+
+ wma = (WINE_MCIQTZ*)mciGetDriverData(dwDevID);
+
+ if (wma) {
+ HeapFree(GetProcessHeap(), 0, wma);
+ return 1;
+ }
+
+ return (dwDevID == 0xFFFFFFFF) ? 1 : 0;
+}
+
+/**************************************************************************
+ * MCIQTZ_drvConfigure [internal]
+ */
+static DWORD MCIQTZ_drvConfigure(DWORD dwDevID)
+{
+ WINE_MCIQTZ* wma;
+
+ TRACE("%04x\n", dwDevID);
+
+ MCIQTZ_mciStop(dwDevID, MCI_WAIT, NULL);
+
+ wma = (WINE_MCIQTZ*)mciGetDriverData(dwDevID);
+
+ if (wma) {
+ MessageBoxA(0, "Sample QTZ Wine Driver !", "MM-Wine Driver",
MB_OK);
+ return 1;
+ }
+
+ return 0;
+}
+
+/**************************************************************************
+ * MCIQTZ_mciGetOpenDev [internal]
+ */
+static WINE_MCIQTZ* MCIQTZ_mciGetOpenDev(UINT wDevID)
+{
+ WINE_MCIQTZ* wma = (WINE_MCIQTZ*)mciGetDriverData(wDevID);
+
+ if (!wma) {
+ WARN("Invalid wDevID=%u\n", wDevID);
+ return 0;
+ }
+ return wma;
+}
+
+/***************************************************************************
+ * MCIQTZ_mciOpen [internal]
+ */
+static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
+ LPMCI_DGV_OPEN_PARMSW lpOpenParms)
+{
+ WINE_MCIQTZ* wma;
+ HRESULT hr;
+
+ TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpOpenParms);
+
+ MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
+
+ if (!lpOpenParms)
+ return MCIERR_NULL_PARAMETER_BLOCK;
+
+ wma = (WINE_MCIQTZ*)mciGetDriverData(wDevID);
+ if (!wma)
+ return MCIERR_INVALID_DEVICE_ID;
+
+ CoInitializeEx(NULL, COINIT_MULTITHREADED);
+
+ hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
&IID_IGraphBuilder, (LPVOID*)&wma->pgraph);
+ if (FAILED(hr)) {
+ TRACE("Cannot create filtergraph (hr = %x)\n", hr);
+ goto err;
+ }
+
+ hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaControl,
(LPVOID*)&wma->pmctrl);
+ if (FAILED(hr)) {
+ TRACE("Cannot get IMediaControl interface (hr = %x)\n", hr);
+ goto err;
+ }
+
+ if (!((dwFlags & MCI_OPEN_ELEMENT) && (dwFlags & MCI_OPEN_ELEMENT)))
{
+ TRACE("Wrong dwFlags %x\n", dwFlags);
+ goto err;
+ }
+
+ if (!lpOpenParms->lpstrElementName || !lpOpenParms->lpstrElementName[0]) {
+ TRACE("Invalid filename specified\n");
+ goto err;
+ }
+
+ TRACE("Open file %s\n", debugstr_w(lpOpenParms->lpstrElementName));
+
+ hr = IGraphBuilder_RenderFile(wma->pgraph, lpOpenParms->lpstrElementName,
NULL);
+ if (FAILED(hr)) {
+ TRACE("Cannot render file (hr = %x)\n", hr);
+ goto err;
+ }
+
+ return 0;
+
+err:
+ if (wma->pgraph)
+ IGraphBuilder_Release(wma->pgraph);
+ wma->pgraph = NULL;
+ if (wma->pmctrl)
+ IMediaControl_Release(wma->pmctrl);
+ wma->pmctrl = NULL;
+
+ CoUninitialize();
+
+ return MCIERR_INTERNAL;
+}
+
+/***************************************************************************
+ * MCIQTZ_mciClose [internal]
+ */
+static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+{
+ WINE_MCIQTZ* wma;
+
+ TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
+
+ MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
+
+ wma = MCIQTZ_mciGetOpenDev(wDevID);
+ if (!wma)
+ return MCIERR_INVALID_DEVICE_ID;
+
+ if (wma->pgraph)
+ IGraphBuilder_Release(wma->pgraph);
+ wma->pgraph = NULL;
+ if (wma->pmctrl)
+ IMediaControl_Release(wma->pmctrl);
+ wma->pmctrl = NULL;
+
+ CoUninitialize();
+
+ return 0;
+}
+
+/***************************************************************************
+ * MCIQTZ_mciPlay [internal]
+ */
+static DWORD MCIQTZ_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
+{
+ WINE_MCIQTZ* wma;
+ HRESULT hr;
+
+ TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
+
+ if (!lpParms)
+ return MCIERR_NULL_PARAMETER_BLOCK;
+
+ wma = MCIQTZ_mciGetOpenDev(wDevID);
+
+ hr = IMediaControl_Run(wma->pmctrl);
+ if (FAILED(hr)) {
+ TRACE("Cannot run filtergraph (hr = %x)\n", hr);
+ return MCIERR_INTERNAL;
+ }
+
+ wma->started = TRUE;
+
+ return 0;
+}
+
+/***************************************************************************
+ * MCIQTZ_mciSeek [internal]
+ */
+static DWORD MCIQTZ_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
+{
+ WINE_MCIQTZ* wma;
+ HRESULT hr;
+ IMediaPosition* pmpos;
+ LONGLONG newpos;
+
+ TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
+
+ MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
+
+ if (!lpParms)
+ return MCIERR_NULL_PARAMETER_BLOCK;
+
+ wma = MCIQTZ_mciGetOpenDev(wDevID);
+ if (!wma)
+ return MCIERR_INVALID_DEVICE_ID;
+
+ if (dwFlags & MCI_SEEK_TO_START) {
+ newpos = 0;
+ } else if (dwFlags & MCI_SEEK_TO_END) {
+ FIXME("MCI_SEEK_TO_END not implemented yet\n");
+ return MCIERR_INTERNAL;
+ } else if (dwFlags & MCI_TO) {
+ FIXME("MCI_TO not implemented yet\n");
+ return MCIERR_INTERNAL;
+ } else {
+ WARN("dwFlag doesn't tell where to seek to...\n");
+ return MCIERR_MISSING_PARAMETER;
+ }
+
+ hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaPosition,
(LPVOID*)&pmpos);
+ if (FAILED(hr)) {
+ FIXME("Cannot get IMediaPostion interface (hr = %x)\n", hr);
+ return MCIERR_INTERNAL;
+ }
+
+ hr = IMediaPosition_put_CurrentPosition(pmpos, newpos);
+ if (FAILED(hr)) {
+ FIXME("Cannot set position (hr = %x)\n", hr);
+ IMediaPosition_Release(pmpos);
+ return MCIERR_INTERNAL;
+ }
+
+ IMediaPosition_Release(pmpos);
+
+ if (dwFlags & MCI_NOTIFY)
+ mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wDevID,
MCI_NOTIFY_SUCCESSFUL);
+
+ return 0;
+}
+
+/***************************************************************************
+ * MCIQTZ_mciStop [internal]
+ */
+static DWORD MCIQTZ_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+{
+ WINE_MCIQTZ* wma;
+ HRESULT hr;
+
+ TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
+
+ wma = MCIQTZ_mciGetOpenDev(wDevID);
+ if (!wma)
+ return MCIERR_INVALID_DEVICE_ID;
+
+ if (!wma->started)
+ return 0;
+
+ hr = IMediaControl_Stop(wma->pmctrl);
+ if (FAILED(hr)) {
+ TRACE("Cannot stop filtergraph (hr = %x)\n", hr);
+ return MCIERR_INTERNAL;
+ }
+
+ wma->started = FALSE;
+
+ return 0;
+}
+
+/***************************************************************************
+ * MCIQTZ_mciStatus [internal]
+ */
+static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW
lpParms)
+{
+ WINE_MCIQTZ* wma;
+
+ TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
+
+ if (!lpParms)
+ return MCIERR_NULL_PARAMETER_BLOCK;
+
+ wma = MCIQTZ_mciGetOpenDev(wDevID);
+ if (!wma)
+ return MCIERR_INVALID_DEVICE_ID;
+
+ if (!(dwFlags & MCI_STATUS_ITEM)) {
+ WARN("No status item specified\n");
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+
+ switch (lpParms->dwItem) {
+ case MCI_STATUS_LENGTH:
+ FIXME("MCI_STATUS_LENGTH not implemented yet\n");
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ case MCI_STATUS_POSITION:
+ {
+ HRESULT hr;
+ REFTIME curpos;
+ IMediaPosition* pmpos;
+
+ hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaPosition,
(LPVOID*)&pmpos);
+ if (FAILED(hr)) {
+ FIXME("Cannot get IMediaPostion interface (hr = %x)\n", hr);
+ return MCIERR_INTERNAL;
+ }
+
+ hr = IMediaPosition_get_CurrentPosition(pmpos, &curpos);
+ if (FAILED(hr)) {
+ FIXME("Cannot get position (hr = %x)\n", hr);
+ IMediaPosition_Release(pmpos);
+ return MCIERR_INTERNAL;
+ }
+
+ IMediaPosition_Release(pmpos);
+ lpParms->dwReturn = curpos / 10000;
+
+ break;
+ }
+ case MCI_STATUS_NUMBER_OF_TRACKS:
+ FIXME("MCI_STATUS_NUMBER_OF_TRACKS not implemented yet\n");
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ case MCI_STATUS_MODE:
+ FIXME("MCI_STATUS_MODE not implemented yet\n");
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ case MCI_STATUS_MEDIA_PRESENT:
+ FIXME("MCI_STATUS_MEDIA_PRESENT not implemented yet\n");
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ case MCI_STATUS_TIME_FORMAT:
+ FIXME("MCI_STATUS_TIME_FORMAT not implemented yet\n");
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ case MCI_STATUS_READY:
+ FIXME("MCI_STATUS_READY not implemented yet\n");
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ case MCI_STATUS_CURRENT_TRACK:
+ FIXME("MCI_STATUS_CURRENT_TRACK not implemented yet\n");
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ default:
+ FIXME("Unknown command %08X\n", lpParms->dwItem);
+ return MCIERR_UNRECOGNIZED_COMMAND;
+ }
+
+ if (dwFlags & MCI_NOTIFY)
+ mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wDevID,
MCI_NOTIFY_SUCCESSFUL);
+
+ return 0;
+}
+
/*======================================================================*
* MCI QTZ entry points *
*======================================================================*/
@@ -56,8 +424,80 @@
LRESULT CALLBACK MCIQTZ_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
LPARAM dwParam1, LPARAM dwParam2)
{
- FIXME("(%08lX, %p, %08X, %08lX, %08lX): Stub!\n",
- dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+ TRACE("(%08lX, %p, %08X, %08lX, %08lX)\n",
+ dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+
+ switch (wMsg) {
+ case DRV_LOAD: return 1;
+ case DRV_FREE: return 1;
+ case DRV_OPEN: return MCIQTZ_drvOpen((LPCWSTR)dwParam1,
(LPMCI_OPEN_DRIVER_PARMSW)dwParam2);
+ case DRV_CLOSE: return MCIQTZ_drvClose(dwDevID);
+ case DRV_ENABLE: return 1;
+ case DRV_DISABLE: return 1;
+ case DRV_QUERYCONFIGURE: return 1;
+ case DRV_CONFIGURE: return MCIQTZ_drvConfigure(dwDevID);
+ case DRV_INSTALL: return DRVCNF_RESTART;
+ case DRV_REMOVE: return DRVCNF_RESTART;
+ }
+
+ /* session instance */
+ if (dwDevID == 0xFFFFFFFF)
+ return 1;
+
+ switch (wMsg) {
+ case MCI_OPEN_DRIVER: return MCIQTZ_mciOpen (dwDevID, dwParam1,
(LPMCI_DGV_OPEN_PARMSW) dwParam2);
+ case MCI_CLOSE_DRIVER: return MCIQTZ_mciClose (dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS) dwParam2);
+ case MCI_PLAY: return MCIQTZ_mciPlay (dwDevID, dwParam1,
(LPMCI_PLAY_PARMS) dwParam2);
+ case MCI_SEEK: return MCIQTZ_mciSeek (dwDevID, dwParam1,
(LPMCI_SEEK_PARMS) dwParam2);
+ case MCI_STATUS: return MCIQTZ_mciStatus (dwDevID, dwParam1,
(LPMCI_DGV_STATUS_PARMSW) dwParam2);
+ case MCI_RECORD:
+ case MCI_STOP:
+ case MCI_SET:
+ case MCI_PAUSE:
+ case MCI_RESUME:
+ case MCI_GETDEVCAPS:
+ case MCI_INFO:
+ case MCI_PUT:
+ case MCI_WINDOW:
+ case MCI_LOAD:
+ case MCI_SAVE:
+ case MCI_FREEZE:
+ case MCI_REALIZE:
+ case MCI_UNFREEZE:
+ case MCI_UPDATE:
+ case MCI_WHERE:
+ case MCI_STEP:
+ case MCI_COPY:
+ case MCI_CUT:
+ case MCI_DELETE:
+ case MCI_PASTE:
+ case MCI_CUE:
+ /* Digital Video specific */
+ case MCI_CAPTURE:
+ case MCI_MONITOR:
+ case MCI_RESERVE:
+ case MCI_SETAUDIO:
+ case MCI_SIGNAL:
+ case MCI_SETVIDEO:
+ case MCI_QUALITY:
+ case MCI_LIST:
+ case MCI_UNDO:
+ case MCI_CONFIGURE:
+ case MCI_RESTORE:
+ FIXME("Unimplemented command [%u]\n", wMsg);
+ break;
+ case MCI_SPIN:
+ case MCI_ESCAPE:
+ WARN("Unsupported command [%u]\n", wMsg);
+ break;
+ case MCI_OPEN:
+ case MCI_CLOSE:
+ FIXME("Shouldn't receive a MCI_OPEN or CLOSE message\n");
+ break;
+ default:
+ TRACE("Sending msg [%u] to default driver proc\n", wMsg);
+ return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+ }
return MCIERR_UNRECOGNIZED_COMMAND;
}
Modified: trunk/reactos/dll/win32/mciqtz32/mciqtz32.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mciqtz32/mciqtz3…
==============================================================================
--- trunk/reactos/dll/win32/mciqtz32/mciqtz32.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mciqtz32/mciqtz32.rbuild [iso-8859-1] Sat Apr 11 12:16:16
2009
@@ -7,5 +7,10 @@
<file>version.rc</file>
<library>wine</library>
<library>kernel32</library>
+ <library>oleaut32</library>
+ <library>ole32</library>
+ <library>winmm</library>
+ <library>user32</library>
<library>ntdll</library>
+ <library>strmiids</library>
</module>
Added: trunk/reactos/dll/win32/mciqtz32/mciqtz_private.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mciqtz32/mciqtz_…
==============================================================================
--- trunk/reactos/dll/win32/mciqtz32/mciqtz_private.h (added)
+++ trunk/reactos/dll/win32/mciqtz32/mciqtz_private.h [iso-8859-1] Sat Apr 11 12:16:16
2009
@@ -1,0 +1,35 @@
+/*
+ * DirectShow MCI Driver
+ *
+ * Copyright 2009 Christian Costa
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_PRIVATE_MCIQTZ_H
+#define __WINE_PRIVATE_MCIQTZ_H
+
+#define COBJMACROS
+
+#include "dshow.h"
+
+typedef struct {
+ MCIDEVICEID wDevID;
+ IGraphBuilder* pgraph;
+ IMediaControl* pmctrl;
+ BOOL started;
+} WINE_MCIQTZ;
+
+#endif /* __WINE_PRIVATE_MCIQTZ_H */
Propchange: trunk/reactos/dll/win32/mciqtz32/mciqtz_private.h
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/dll/win32/winemp3.acm/mpegl3.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winemp3.acm/mpeg…
==============================================================================
--- trunk/reactos/dll/win32/winemp3.acm/mpegl3.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/winemp3.acm/mpegl3.c [iso-8859-1] Sat Apr 11 12:16:16 2009
@@ -75,16 +75,26 @@
{
{1, 8, 8000}, {2, 8, 8000}, {1, 16, 8000}, {2, 16, 8000},
{1, 8, 11025}, {2, 8, 11025}, {1, 16, 11025}, {2, 16, 11025},
+ {1, 8, 12000}, {2, 8, 12000}, {1, 16, 12000}, {2, 16, 12000},
+ {1, 8, 16000}, {2, 8, 16000}, {1, 16, 16000}, {2, 16, 16000},
{1, 8, 22050}, {2, 8, 22050}, {1, 16, 22050}, {2, 16, 22050},
+ {1, 8, 24000}, {2, 8, 24000}, {1, 16, 24000}, {2, 16, 24000},
+ {1, 8, 32000}, {2, 8, 32000}, {1, 16, 32000}, {2, 16, 32000},
{1, 8, 44100}, {2, 8, 44100}, {1, 16, 44100}, {2, 16, 44100},
- {1, 8, 48000}, {2, 8, 48000}, {1, 16, 48000}, {2, 16, 48000},
+ {1, 8, 48000}, {2, 8, 48000}, {1, 16, 48000}, {2, 16, 48000}
};
static const Format MPEG3_Formats[] =
{
- {1, 0, 8000}, {2, 0, 8000}, {1, 0, 11025}, {2, 0, 11025},
- {1, 0, 22050}, {2, 0, 22050}, {1, 0, 44100}, {2, 0, 44100},
- {1, 0, 48000}, {2, 0, 48000},
+ {1, 0, 8000}, {2, 0, 8000},
+ {1, 0, 11025}, {2, 0, 11025},
+ {1, 0, 12000}, {2, 0, 12000},
+ {1, 0, 16000}, {2, 0, 16000},
+ {1, 0, 22050}, {2, 0, 22050},
+ {1, 0, 24000}, {2, 0, 24000},
+ {1, 0, 32000}, {2, 0, 32000},
+ {1, 0, 44100}, {2, 0, 44100},
+ {1, 0, 48000}, {2, 0, 48000}
};
#define NUM_PCM_FORMATS (sizeof(PCM_Formats) / sizeof(PCM_Formats[0]))
@@ -471,6 +481,8 @@
*/
static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss)
{
+ DWORD nblocks;
+
switch (adss->fdwSize)
{
case ACM_STREAMSIZEF_DESTINATION:
@@ -478,14 +490,18 @@
if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
{
- /* don't take block overhead into account, doesn't matter too much */
- adss->cbSrcLength = adss->cbDstLength * 12;
+ nblocks = (adss->cbDstLength - 3000) /
(DWORD)(adsi->pwfxDst->nAvgBytesPerSec * 1152 / adsi->pwfxDst->nSamplesPerSec
+ 0.5);
+ if (nblocks == 0)
+ return ACMERR_NOTPOSSIBLE;
+ adss->cbSrcLength = nblocks * 1152 * adsi->pwfxSrc->nBlockAlign;
}
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
{
- FIXME("misses the block header overhead\n");
- adss->cbSrcLength = 256 + adss->cbDstLength / 12;
+ nblocks = adss->cbDstLength / (adsi->pwfxDst->nBlockAlign * 1152);
+ if (nblocks == 0)
+ return ACMERR_NOTPOSSIBLE;
+ adss->cbSrcLength = nblocks * (DWORD)(adsi->pwfxSrc->nAvgBytesPerSec
* 1152 / adsi->pwfxSrc->nSamplesPerSec);
}
else
{
@@ -497,14 +513,24 @@
if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
{
- FIXME("misses the block header overhead\n");
- adss->cbDstLength = 256 + adss->cbSrcLength / 12;
+ nblocks = adss->cbSrcLength / (adsi->pwfxSrc->nBlockAlign * 1152);
+ if (nblocks == 0)
+ return ACMERR_NOTPOSSIBLE;
+ if (adss->cbSrcLength % (DWORD)(adsi->pwfxSrc->nBlockAlign * 1152))
+ /* Round block count up. */
+ nblocks++;
+ adss->cbDstLength = 3000 + nblocks *
(DWORD)(adsi->pwfxDst->nAvgBytesPerSec * 1152 / adsi->pwfxDst->nSamplesPerSec
+ 0.5);
}
else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 &&
adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
{
- /* don't take block overhead into account, doesn't matter too much */
- adss->cbDstLength = adss->cbSrcLength * 12;
+ nblocks = adss->cbSrcLength / (DWORD)(adsi->pwfxSrc->nAvgBytesPerSec
* 1152 / adsi->pwfxSrc->nSamplesPerSec);
+ if (nblocks == 0)
+ return ACMERR_NOTPOSSIBLE;
+ if (adss->cbSrcLength % (DWORD)(adsi->pwfxSrc->nAvgBytesPerSec *
1152 / adsi->pwfxSrc->nSamplesPerSec))
+ /* Round block count up. */
+ nblocks++;
+ adss->cbDstLength = nblocks * 1152 * adsi->pwfxDst->nBlockAlign;
}
else
{