changeset 5353:a9f3df4ee465

fixed up this audio decoder too
author melanson
date Tue, 26 Mar 2002 05:34:41 +0000
parents cf2882606e72
children 86a202c1c229
files libmpcodecs/ad_dk4adpcm.c
diffstat 1 files changed, 30 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/ad_dk4adpcm.c	Tue Mar 26 05:25:15 2002 +0000
+++ b/libmpcodecs/ad_dk4adpcm.c	Tue Mar 26 05:34:41 2002 +0000
@@ -11,32 +11,43 @@
 	"dk4adpcm",
 	AFM_DK4ADPCM,
 	"Nick Kurshev",
+	"Mike Melanson",
 	"This format number was used by Duck Corp. but not officially registered with Microsoft"
 };
 
 LIBAD_EXTERN(dk4adpcm)
 
-#include "adpcm.h"
+#define DK4_ADPCM_PREAMBLE_SIZE 4
+
+static int preinit(sh_audio_t *sh_audio)
+{
+  sh_audio->audio_out_minsize = 
+    (((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1) * 4;
+  sh_audio->ds->ss_div =
+    ((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1;
+  sh_audio->ds->ss_mul=sh_audio->wf->nBlockAlign;
+
+  return 1;
+}
 
 static int init(sh_audio_t *sh_audio)
 {
   sh_audio->channels=sh_audio->wf->nChannels;
   sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
   sh_audio->i_bps = sh_audio->wf->nBlockAlign *
-    (sh_audio->channels*sh_audio->samplerate) / DK4_ADPCM_SAMPLES_PER_BLOCK;
+    (sh_audio->channels*sh_audio->samplerate) /
+    (((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1);
+
+  if ((sh_audio->a_in_buffer =
+    (unsigned char *)malloc(sh_audio->ds->ss_mul)) == NULL)
+    return 0;
+
   return 1;
 }
 
-static int preinit(sh_audio_t *sh_audio)
+static void uninit(sh_audio_t *sh_audio)
 {
-  sh_audio->audio_out_minsize=DK4_ADPCM_SAMPLES_PER_BLOCK * 4;
-  sh_audio->ds->ss_div=DK4_ADPCM_SAMPLES_PER_BLOCK;
-  sh_audio->ds->ss_mul=sh_audio->wf->nBlockAlign;
-  return 1;
-}
-
-static void uninit(sh_audio_t *sh)
-{
+  free(sh_audio->a_in_buffer);
 }
 
 static int control(sh_audio_t *sh,int cmd,void* arg, ...)
@@ -47,14 +58,12 @@
 
 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
 {
-  int len=-1;
-  static unsigned char *ibuf = NULL;
-  if (!ibuf)
-    ibuf = (unsigned char *)malloc(sh_audio->wf->nBlockAlign);
-  if (demux_read_data(sh_audio->ds, ibuf, sh_audio->wf->nBlockAlign) != 
-      sh_audio->wf->nBlockAlign)
-          return len; /* EOF */
-  len=2*dk4_adpcm_decode_block((unsigned short*)buf,ibuf,
-          sh_audio->wf->nChannels, sh_audio->wf->nBlockAlign);
-  return len;
+  if (demux_read_data(sh_audio->ds, sh_audio->a_in_buffer,
+    sh_audio->wf->nBlockAlign) != 
+    sh_audio->wf->nBlockAlign)
+      return -1; /* EOF */
+
+  return 2 * dk4_adpcm_decode_block((unsigned short*)buf,
+    sh_audio->a_in_buffer,
+    sh_audio->wf->nChannels, sh_audio->wf->nBlockAlign);
 }