Author: akhaldi
Date: Sun Jun  5 19:20:32 2016
New Revision: 71553

URL: http://svn.reactos.org/svn/reactos?rev=71553&view=rev
Log:
[IMAADP32.ACM] Sync with Wine Staging 1.9.11. CORE-11368

Modified:
    trunk/reactos/dll/win32/imaadp32.acm/imaadp32.c
    trunk/reactos/media/doc/README.WINE

Modified: trunk/reactos/dll/win32/imaadp32.acm/imaadp32.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/imaadp32.acm/imaadp32.c?rev=71553&r1=71552&r2=71553&view=diff
==============================================================================
--- trunk/reactos/dll/win32/imaadp32.acm/imaadp32.c     [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/imaadp32.acm/imaadp32.c     [iso-8859-1] Sun Jun  5 
19:20:32 2016
@@ -179,6 +179,25 @@
 {
     dst[0] = LOBYTE(s);
     dst[1] = HIBYTE(s);
+}
+
+/***********************************************************************
+ *           W8
+ *
+ * Write a 8 bit sample
+ */
+static inline void W8(unsigned char* dst, short s)
+{
+    dst[0] = (unsigned char)((s + 32768) >> 8);
+}
+
+
+static inline void W8_16(unsigned char* dst, short s, int bytes)
+{
+    if(bytes == 1)
+        W8(dst, s);
+    else
+        W16(dst, s);
 }
 
 /* IMA (or DVI) APDCM codec routines */
@@ -341,43 +360,43 @@
     }
 }
 
-static void cvtMMima16K(PACMDRVSTREAMINSTANCE adsi,
-                         const unsigned char* src, LPDWORD nsrc,
-                         unsigned char* dst, LPDWORD ndst)
-{
-    int                sample;
-    int                stepIndex;
-    int                nsamp_blk = 
((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock;
-    int                nsamp;
+static void cvtMMimaK(PACMDRVSTREAMINSTANCE adsi,
+                    const unsigned char* src, LPDWORD nsrc,
+                    unsigned char* dst, LPDWORD ndst)
+{
+    int sample;
+    int stepIndex;
+    int nsamp_blk = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock;
+    int nsamp;
+    int bytesPerSample = adsi->pwfxDst->wBitsPerSample / 8;
     /* compute the number of entire blocks we can decode...
      * it's the min of the number of entire blocks in source buffer and the 
number
      * of entire blocks in destination buffer
      */
-    DWORD      nblock = min(*nsrc / adsi->pwfxSrc->nBlockAlign,
-                             *ndst / (nsamp_blk * 2));
+    DWORD nblock = min(*nsrc / adsi->pwfxSrc->nBlockAlign, *ndst / (nsamp_blk 
* bytesPerSample));
 
     *nsrc = nblock * adsi->pwfxSrc->nBlockAlign;
-    *ndst = nblock * nsamp_blk * 2;
+    *ndst = nblock * nsamp_blk * bytesPerSample;
 
     nsamp_blk--; /* remove the sample in block header */
     for (; nblock > 0; nblock--)
     {
-        const unsigned char*    in_src = src;
-
-       /* handle header first */
-       sample = R16(src);
-       stepIndex = (unsigned)*(src + 2);
+        const unsigned char* in_src = src;
+
+        /* handle header first */
+        sample = R16(src);
+        stepIndex = (unsigned)*(src + 2);
         clamp_step_index(&stepIndex);
-       src += 4;
-       W16(dst, sample);       dst += 2;
-
-       for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 2)
+        src += 4;
+        W8_16(dst, sample, bytesPerSample); dst += bytesPerSample;
+
+        for (nsamp = nsamp_blk; nsamp > 0; nsamp -= 2)
         {
             process_nibble(*src, &stepIndex, &sample);
-           W16(dst, sample); dst += 2;
+            W8_16(dst, sample, bytesPerSample); dst += bytesPerSample;
             process_nibble(*src++ >> 4, &stepIndex, &sample);
-           W16(dst, sample); dst += 2;
-       }
+            W8_16(dst, sample, bytesPerSample); dst += bytesPerSample;
+        }
         /* we have now to realign the source pointer on block */
         src = in_src + adsi->pwfxSrc->nBlockAlign;
     }
@@ -735,13 +754,14 @@
     else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_IMA_ADPCM &&
              adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
     {
-       /* resampling or mono <=> stereo not available
+        /* resampling or mono <=> stereo not available
          * ADPCM algo only define 16 bit per sample output
+         * (The API seems to still allow 8 bit per sample output)
          */
-       if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec ||
-           adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels ||
-            adsi->pwfxDst->wBitsPerSample != 16)
-           goto theEnd;
+        if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec ||
+            adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels ||
+            (adsi->pwfxDst->wBitsPerSample != 16 && 
adsi->pwfxDst->wBitsPerSample != 8))
+            goto theEnd;
 
         nspb = ((LPIMAADPCMWAVEFORMAT)adsi->pwfxSrc)->wSamplesPerBlock;
         TRACE("spb=%u\n", nspb);
@@ -754,11 +774,16 @@
         if ((((nspb - 1) / 2) + 4) * adsi->pwfxSrc->nChannels < 
adsi->pwfxSrc->nBlockAlign)
             goto theEnd;
 
-       /* adpcm decoding... */
-       if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 
2)
-           aad->convert = cvtSSima16K;
-       if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 
1)
-           aad->convert = cvtMMima16K;
+        /* adpcm decoding... */
+        if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 
2)
+            aad->convert = cvtSSima16K;
+        if (adsi->pwfxDst->wBitsPerSample == 16 && adsi->pwfxDst->nChannels == 
1)
+            aad->convert = cvtMMimaK;
+        if (adsi->pwfxDst->wBitsPerSample == 8 && adsi->pwfxDst->nChannels == 
1)
+            aad->convert = cvtMMimaK;
+        /* FIXME: Stereo support for 8bit samples*/
+        if (adsi->pwfxDst->wBitsPerSample == 8 && adsi->pwfxDst->nChannels == 
2)
+            goto theEnd;
     }
     else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
              adsi->pwfxDst->wFormatTag == WAVE_FORMAT_IMA_ADPCM)

Modified: trunk/reactos/media/doc/README.WINE
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=71553&r1=71552&r2=71553&view=diff
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Sun Jun  5 19:20:32 2016
@@ -75,7 +75,7 @@
 reactos/dll/win32/httpapi             # Synced to WineStaging-1.9.4
 reactos/dll/win32/iccvid              # Synced to WineStaging-1.9.11
 reactos/dll/win32/ieframe             # Synced to WineStaging-1.9.11
-reactos/dll/win32/imaadp32.acm        # Synced to WineStaging-1.9.4
+reactos/dll/win32/imaadp32.acm        # Synced to WineStaging-1.9.11
 reactos/dll/win32/imagehlp            # Synced to WineStaging-1.9.4
 reactos/dll/win32/imm32               # Synced to Wine-1.7.27
 reactos/dll/win32/inetcomm            # Synced to WineStaging-1.9.4


Reply via email to