mirror of
https://github.com/mpv-player/mpv
synced 2024-11-03 03:19:24 +01:00
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
This commit is contained in:
parent
bfe1dcfba9
commit
18f583efc7
@ -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;
|
||||
(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;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user