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.c?rev=40454&r1=40453&r2=40454&view=diff
==============================================================================
--- 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/mciqtz32.rbuild?rev=40454&r1=40453&r2=40454&view=diff
==============================================================================
--- 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_private.h?rev=40454&view=auto
==============================================================================
--- 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/mpegl3.c?rev=40454&r1=40453&r2=40454&view=diff
==============================================================================
--- 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
         {

Reply via email to