diff options
author | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-06-11 14:29:51 +0000 |
---|---|---|
committer | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-06-11 14:29:51 +0000 |
commit | 3be2d75562f99abc2a10098eb63accd0bbacfd5c (patch) | |
tree | e292390d52d5938b2585702c5be6b1799dec1b5a /libmpdemux/demux_rawaudio.c | |
parent | 3339519233aebefabc79610bc89e9edf390ceec3 (diff) | |
download | mpv-3be2d75562f99abc2a10098eb63accd0bbacfd5c.tar.bz2 mpv-3be2d75562f99abc2a10098eb63accd0bbacfd5c.tar.xz |
Support for playing audio cds using cdparanoia. Include a raw audio
demuxer wich can be used for other purpose.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6385 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_rawaudio.c')
-rw-r--r-- | libmpdemux/demux_rawaudio.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/libmpdemux/demux_rawaudio.c b/libmpdemux/demux_rawaudio.c new file mode 100644 index 0000000000..d1ff7514b2 --- /dev/null +++ b/libmpdemux/demux_rawaudio.c @@ -0,0 +1,97 @@ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> + +#include "../cfgparser.h" + +#include "stream.h" +#include "demuxer.h" +#include "stheader.h" + + +int use_rawaudio = 0; +static int channels = 2; +static int samplerate = 44100; +static int samplesize = 2; +static int format = 0x1; // Raw PCM + +static config_t demux_rawaudio_opts[] = { + { "on", &use_rawaudio, CONF_TYPE_FLAG, 0,0, 1, NULL }, + { "channels", &channels, CONF_TYPE_INT,CONF_RANGE,1,8, NULL }, + { "rate", &samplerate, CONF_TYPE_INT,CONF_RANGE,1000,8*48000, NULL }, + { "samplesize", &samplesize, CONF_TYPE_INT,CONF_RANGE,1,8, NULL }, + { "format", &format, CONF_TYPE_INT, CONF_MIN, 0 , 0, NULL }, + {NULL, NULL, 0, 0, 0, 0, NULL} +}; + +static config_t demux_rawaudio_conf[] = { + { "rawaudio", &demux_rawaudio_opts, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL}, + { NULL,NULL, 0, 0, 0, 0, NULL} +}; + +void demux_rwaudio_register_options(m_config_t* cfg) { + m_config_register_options(cfg,demux_rawaudio_conf); +} + +extern void resync_audio_stream(sh_audio_t *sh_audio); + +int demux_rawaudio_open(demuxer_t* demuxer) { + sh_audio_t* sh_audio; + WAVEFORMATEX* w; + + sh_audio = new_sh_audio(demuxer,0); + sh_audio->wf = w = (WAVEFORMATEX*)malloc(sizeof(WAVEFORMATEX)); + w->wFormatTag = sh_audio->format = format; + w->nChannels = sh_audio->channels = channels; + w->nSamplesPerSec = sh_audio->samplerate = samplerate; + w->nAvgBytesPerSec = samplerate*samplesize*channels; + w->nBlockAlign = channels*samplesize; + sh_audio->samplesize = samplesize; + w->wBitsPerSample = 8*samplesize; + w->cbSize = 0; + + demuxer->movi_start = demuxer->stream->start_pos; + demuxer->movi_end = demuxer->stream->end_pos; + + demuxer->audio->sh = sh_audio; + sh_audio->ds = demuxer->audio; + + return 1; +} + +int demux_rawaudio_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) { + sh_audio_t* sh_audio = demuxer->audio->sh; + int l = sh_audio->wf->nAvgBytesPerSec; + off_t spos = stream_tell(demuxer->stream); + demux_packet_t* dp; + + if(demuxer->stream->eof) + return 0; + + dp = new_demux_packet(l); + ds->pts = spos / (float)(sh_audio->wf->nAvgBytesPerSec); + ds->pos = spos; + + stream_read(demuxer->stream,dp->buffer,l); + ds_add_packet(ds,dp); + + return 1; +} + +void demux_rawaudio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ + stream_t* s = demuxer->stream; + sh_audio_t* sh_audio = demuxer->audio->sh; + off_t base,pos; + + base = (flags & 1) ? demuxer->movi_start : stream_tell(s); + if(flags & 2) + pos = base + ((demuxer->movi_end - demuxer->movi_start)*rel_seek_secs); + else + pos = base + (rel_seek_secs*sh_audio->i_bps); + + pos -= (pos % (sh_audio->channels * sh_audio->samplesize) ); + stream_seek(s,pos); + resync_audio_stream(sh_audio); +} |