# HG changeset patch # User melanson # Date 1017120881 0 # Node ID a9f3df4ee465e22e4273aeb7ad116e3cefff63da # Parent cf2882606e727afe36845d2eedfd8ee8992759f6 fixed up this audio decoder too diff -r cf2882606e72 -r a9f3df4ee465 libmpcodecs/ad_dk4adpcm.c --- 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); }