diff options
author | melanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-03-26 04:41:43 +0000 |
---|---|---|
committer | melanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-03-26 04:41:43 +0000 |
commit | 18f583efc750aedeee3a7a64fcd299c6e8ea69c7 (patch) | |
tree | fd5571bfe709067b6f4cac6eff740e43e43791fb | |
parent | bfe1dcfba96238bb3bfefd26878b77a8b6f6c24f (diff) |
fixed so the decoder cooperates better with the rest of the system
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5351 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | libmpcodecs/ad_msadpcm.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/libmpcodecs/ad_msadpcm.c b/libmpcodecs/ad_msadpcm.c index 046307b30f..8d1b5cebcd 100644 --- a/libmpcodecs/ad_msadpcm.c +++ b/libmpcodecs/ad_msadpcm.c @@ -17,27 +17,35 @@ static ad_info_t info = LIBAD_EXTERN(msadpcm) -#include "../adpcm.h" +#define MS_ADPCM_PREAMBLE_SIZE 7 + +static int preinit(sh_audio_t *sh_audio) +{ + sh_audio->audio_out_minsize = sh_audio->wf->nBlockAlign * 4; + sh_audio->ds->ss_div = + (sh_audio->wf->nBlockAlign - MS_ADPCM_PREAMBLE_SIZE) * 2; + 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) / MS_ADPCM_SAMPLES_PER_BLOCK; - return 1; -} + (sh_audio->channels*sh_audio->samplerate) / sh_audio->ds->ss_div; + + if ((sh_audio->a_in_buffer = + (unsigned char *)malloc(sh_audio->ds->ss_mul)) == NULL) + return 0; -static int preinit(sh_audio_t *sh_audio) -{ - sh_audio->audio_out_minsize=sh_audio->wf->nBlockAlign * 8; - sh_audio->ds->ss_div = MS_ADPCM_SAMPLES_PER_BLOCK; - sh_audio->ds->ss_mul = sh_audio->wf->nBlockAlign; return 1; } -static void uninit(sh_audio_t *sh) +static void uninit(sh_audio_t *sh_audio) { + free(sh_audio->a_in_buffer); } static int control(sh_audio_t *sh,int cmd,void* arg, ...) @@ -48,15 +56,12 @@ static int control(sh_audio_t *sh,int cmd,void* arg, ...) static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) { - static unsigned char *ibuf = NULL; // FIXME!!! TODO!!! use sh->a_in_buffer! - if (!ibuf) - ibuf = (unsigned char *)malloc - (sh_audio->wf->nBlockAlign * sh_audio->wf->nChannels); - if (demux_read_data(sh_audio->ds, ibuf, - sh_audio->wf->nBlockAlign) != - sh_audio->wf->nBlockAlign) + if (demux_read_data(sh_audio->ds, sh_audio->a_in_buffer, + sh_audio->ds->ss_mul) != + sh_audio->ds->ss_mul) return -1; /* EOF */ + return 2 * ms_adpcm_decode_block( - (unsigned short*)buf,ibuf, sh_audio->wf->nChannels, - sh_audio->wf->nBlockAlign); + (unsigned short*)buf, sh_audio->a_in_buffer, + sh_audio->wf->nChannels, sh_audio->wf->nBlockAlign); } |