Author: titmuss
Date: Fri May 23 13:46:04 2008
New Revision: 2520
URL: http://svn.slimdevices.com?rev=2520&root=Jive&view=rev
Log:
Bug: N/A
Description:
Initial support for Ogg. This is not working correctly, some tracks underrun
and it does not support underruns on the decode buffer correctly.
Added:
7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c
Modified:
7.2/trunk/squeezeplay/src/Makefile.linux
7.2/trunk/squeezeplay/src/Makefile.osx
7.2/trunk/squeezeplay/src/Makefile.squeezeos
7.2/trunk/squeezeplay/src/squeezeplay/Makefile.am
7.2/trunk/squeezeplay/src/squeezeplay/Makefile.in
7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
Modified: 7.2/trunk/squeezeplay/src/Makefile.linux
URL:
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/Makefile.linux?rev=2520&root=Jive&r1=2519&r2=2520&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/Makefile.linux (original)
+++ 7.2/trunk/squeezeplay/src/Makefile.linux Fri May 23 13:46:04 2008
@@ -143,8 +143,8 @@
# squeezeplay
#
-.PHONY: app portaudio flac libmad squeezeplay squeezeplay_desktop
squeezeplay_test freefont freefont-debian
-app: portaudio flac libmad squeezeplay squeezeplay_desktop squeezeplay_test
freefont
+.PHONY: app portaudio flac libmad tremor squeezeplay squeezeplay_desktop
squeezeplay_test freefont freefont-debian
+app: portaudio flac libmad tremor squeezeplay squeezeplay_desktop
squeezeplay_test freefont
# portaudio
portaudio_v19_1360/Makefile:
@@ -166,6 +166,14 @@
libmad: libmad-0.15.1b/Makefile
cd libmad-0.15.1b; make && make install
+
+# ogg
+Tremor/Makefile:
+ cd Tremor; ./configure --prefix=${PREFIX}
+
+tremor: Tremor/Makefile
+ cd Tremor; make && make install
+
# squeezeplay
squeezeplay/Makefile:
Modified: 7.2/trunk/squeezeplay/src/Makefile.osx
URL:
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/Makefile.osx?rev=2520&root=Jive&r1=2519&r2=2520&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/Makefile.osx (original)
+++ 7.2/trunk/squeezeplay/src/Makefile.osx Fri May 23 13:46:04 2008
@@ -160,8 +160,8 @@
# squeezeplay
#
-.PHONY: app portaudio flac libmad squeezeplay squeezeplay_desktop
squeezeplay_test freefont
-app: portaudio flac libmad squeezeplay squeezeplay_desktop squeezeplay_test
freefont
+.PHONY: app portaudio flac libmad tremor squeezeplay squeezeplay_desktop
squeezeplay_test freefont
+app: portaudio flac libmad tremor squeezeplay squeezeplay_desktop
squeezeplay_test freefont
# portaudio
portaudio_v19_1360/Makefile:
@@ -183,6 +183,14 @@
libmad: libmad-0.15.1b/Makefile
cd libmad-0.15.1b; make && make install
+
+# ogg
+Tremor/Makefile:
+ cd Tremor; ./configure --prefix=${PREFIX}
+
+tremor: Tremor/Makefile
+ cd Tremor; make && make install
+
# squeezeplay
squeezeplay/Makefile:
Modified: 7.2/trunk/squeezeplay/src/Makefile.squeezeos
URL:
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/Makefile.squeezeos?rev=2520&root=Jive&r1=2519&r2=2520&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/Makefile.squeezeos (original)
+++ 7.2/trunk/squeezeplay/src/Makefile.squeezeos Fri May 23 13:46:04 2008
@@ -139,8 +139,8 @@
#
# squeezeplay
#
-.PHONY: squeezeplay-all portaudio flac libmad squeezeplay squeezeplay_jive
freefont fonts-clock
-squeezeplay-all: portaudio flac libmad squeezeplay squeezeplay_jive freefont
fonts-clock
+.PHONY: squeezeplay-all portaudio flac libmad tremor squeezeplay
squeezeplay_jive freefont fonts-clock
+squeezeplay-all: portaudio flac libmad tremor squeezeplay squeezeplay_jive
freefont fonts-clock
# portaudio
@@ -163,6 +163,14 @@
libmad: libmad-0.15.1b/Makefile
cd libmad-0.15.1b; make && make install
+
+# ogg
+Tremor/Makefile:
+ cd Tremor; ./configure --host=${TARGET} --target=${TARGET}
--prefix=${PREFIX}
+
+tremor: Tremor/Makefile
+ cd Tremor; make && make install
+
# squeezeplay
squeezeplay/Makefile:
Modified: 7.2/trunk/squeezeplay/src/squeezeplay/Makefile.am
URL:
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/Makefile.am?rev=2520&root=Jive&r1=2519&r2=2520&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/Makefile.am (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/Makefile.am Fri May 23 13:46:04 2008
@@ -68,9 +68,10 @@
src/audio/decode/decode_output.c \
src/audio/decode/decode_pcm.c \
src/audio/decode/decode_portaudio.c \
- src/audio/decode/decode_tones.c
-
-libjiveaudio_la_LIBADD = -lSDL -lportaudio -lFLAC -lmad
+ src/audio/decode/decode_tones.c \
+ src/audio/decode/decode_vorbis.c
+
+libjiveaudio_la_LIBADD = -lSDL -lportaudio -lFLAC -lmad -lvorbisidec
libjivenet_la_SOURCES = \
src/net/jive_dns.c
Modified: 7.2/trunk/squeezeplay/src/squeezeplay/Makefile.in
URL:
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/Makefile.in?rev=2520&root=Jive&r1=2519&r2=2520&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/Makefile.in (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/Makefile.in Fri May 23 13:46:04 2008
@@ -89,7 +89,7 @@
am_libjiveaudio_la_OBJECTS = fifo.lo fixed_math.lo mqueue.lo \
streambuf.lo decode.lo decode_flac.lo decode_mad.lo \
decode_output.lo decode_pcm.lo decode_portaudio.lo \
- decode_tones.lo
+ decode_tones.lo decode_vorbis.lo
libjiveaudio_la_OBJECTS = $(am_libjiveaudio_la_OBJECTS)
libjivenet_la_DEPENDENCIES =
am_libjivenet_la_OBJECTS = jive_dns.lo
@@ -394,9 +394,10 @@
src/audio/decode/decode_output.c \
src/audio/decode/decode_pcm.c \
src/audio/decode/decode_portaudio.c \
- src/audio/decode/decode_tones.c
-
-libjiveaudio_la_LIBADD = -lSDL -lportaudio -lFLAC -lmad
+ src/audio/decode/decode_tones.c \
+ src/audio/decode/decode_vorbis.c
+
+libjiveaudio_la_LIBADD = -lSDL -lportaudio -lFLAC -lmad -lvorbisidec
libjivenet_la_SOURCES = \
src/net/jive_dns.c
@@ -1039,6 +1040,7 @@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@@ -1164,6 +1166,13 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@
source='src/audio/decode/decode_tones.c' object='decode_tones.lo' libtool=yes
@AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE)
$(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS)
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
$(CFLAGS) -c -o decode_tones.lo `test -f 'src/audio/decode/decode_tones.c' ||
echo '$(srcdir)/'`src/audio/decode/decode_tones.c
+
+decode_vorbis.lo: src/audio/decode/decode_vorbis.c
[EMAIL PROTECTED]@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS)
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
$(CFLAGS) -MT decode_vorbis.lo -MD -MP -MF "$(DEPDIR)/decode_vorbis.Tpo" -c -o
decode_vorbis.lo `test -f 'src/audio/decode/decode_vorbis.c' || echo
'$(srcdir)/'`src/audio/decode/decode_vorbis.c; \
[EMAIL PROTECTED]@ then mv -f "$(DEPDIR)/decode_vorbis.Tpo"
"$(DEPDIR)/decode_vorbis.Plo"; else rm -f "$(DEPDIR)/decode_vorbis.Tpo"; exit
1; fi
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@
source='src/audio/decode/decode_vorbis.c' object='decode_vorbis.lo' libtool=yes
@AMDEPBACKSLASH@
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE)
$(depcomp) @AMDEPBACKSLASH@
[EMAIL PROTECTED]@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS)
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
$(CFLAGS) -c -o decode_vorbis.lo `test -f 'src/audio/decode/decode_vorbis.c' ||
echo '$(srcdir)/'`src/audio/decode/decode_vorbis.c
jive_dns.lo: src/net/jive_dns.c
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS)
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
$(CFLAGS) -MT jive_dns.lo -MD -MP -MF "$(DEPDIR)/jive_dns.Tpo" -c -o
jive_dns.lo `test -f 'src/net/jive_dns.c' || echo
'$(srcdir)/'`src/net/jive_dns.c; \
Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
URL:
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c?rev=2520&root=Jive&r1=2519&r2=2520&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c Fri May 23
13:46:04 2008
@@ -66,6 +66,7 @@
&decode_pcm,
&decode_flac,
&decode_mad,
+ &decode_vorbis,
#ifdef _WIN32
&decode_wma_win,
#endif
Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
URL:
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h?rev=2520&root=Jive&r1=2519&r2=2520&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h Fri
May 23 13:46:04 2008
@@ -37,6 +37,7 @@
extern struct decode_module decode_pcm;
extern struct decode_module decode_flac;
extern struct decode_module decode_mad;
+extern struct decode_module decode_vorbis;
#ifdef _WIN32
extern struct decode_module decode_wma_win;
#endif
Added: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c
URL:
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c?rev=2520&root=Jive&view=auto
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c
(added)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c Fri
May 23 13:46:04 2008
@@ -1,0 +1,240 @@
+/*
+** Copyright 2007-2008 Logitech. All Rights Reserved.
+**
+** This file is subject to the Logitech Public Source License Version 1.0.
Please see the LICENCE file for details.
+*/
+
+#define RUNTIME_DEBUG 1
+
+#include "common.h"
+
+#include "audio/streambuf.h"
+#include "audio/decode/decode.h"
+#include "audio/decode/decode_priv.h"
+
+#include <tremor/ivorbiscodec.h>
+#include <tremor/ivorbisfile.h>
+
+
+#define OUTPUT_BUFFER_SIZE 8192
+
+
+struct decode_vorbis {
+ OggVorbis_File vf;
+ int bitstream;
+
+ enum {
+ OGG_STATE_INIT = 0,
+ OGG_STATE_HEADER,
+ OGG_STATE_STREAM,
+ } state;
+
+ char *output_buffer;
+
+ int channels;
+ int sample_rate;
+};
+
+
+static size_t decode_vorbis_read(void *ptr, size_t size, size_t nmemb, void
*datasource) {
+ size_t requested_bytes, read_bytes;
+ bool_t streaming;
+
+ requested_bytes = size * nmemb;
+ if (!requested_bytes) {
+ return 0;
+ }
+
+ read_bytes = streambuf_read(ptr, 0, requested_bytes, &streaming);
+
+ if (read_bytes == 0) {
+ DEBUG_TRACE("ogg decoder underrun");
+
+ current_decoder_state |= DECODE_STATE_UNDERRUN;
+
+ if (!streaming) {
+ return 0; // XXXX OGG_STARVED;
+ }
+ }
+ else {
+ current_decoder_state &= ~DECODE_STATE_UNDERRUN;
+ }
+
+ return read_bytes;
+}
+
+
+static int decode_vorbis_seek(void *datasource, ogg_int64_t offset, int
whence) {
+ return -1; /* stream is not seekable */
+}
+
+
+static int decode_vorbis_close(void *datasource) {
+ return 0;
+}
+
+
+static long decode_vorbis_tell(void *datasource) {
+ return -1; /* stream is not seekable */
+}
+
+
+static ov_callbacks vorbis_callbacks = {
+ decode_vorbis_read,
+ decode_vorbis_seek,
+ decode_vorbis_close,
+ decode_vorbis_tell,
+};
+
+
+static bool_t decode_vorbis_callback(void *data) {
+ struct decode_vorbis *self = (struct decode_vorbis *) data;
+ vorbis_info *vi;
+ size_t nsamples;
+ int i, r, buffer_size;
+ long bytes;
+ s16_t *rptr;
+ sample_t *wptr;
+
+ while (!(current_decoder_state & DECODE_STATE_ERROR) &&
+ decode_output_can_write(OUTPUT_BUFFER_SIZE, self->sample_rate)) {
+
+ switch (self->state) {
+ case OGG_STATE_INIT:
+ DEBUG_TRACE("Calling ov_open_callbacks");
+
+ r = ov_open_callbacks(self, &self->vf, NULL, 0,
vorbis_callbacks);
+ if (r < 0) {
+ DEBUG_ERROR("ov_open_callbacks r=%d", r);
+
+ ov_clear(&self->vf);
+ current_decoder_state |= (DECODE_STATE_ERROR |
DECODE_STATE_NOT_SUPPORTED);
+ return FALSE;
+ }
+
+ self->state = OGG_STATE_HEADER;
+ // fall through
+
+ case OGG_STATE_HEADER:
+ vi = ov_info(&self->vf, -1);
+
+ if (!vi ||
+ vi->channels > 2) {
+ DEBUG_ERROR("too many channels %d",
vi->channels);
+ current_decoder_state |= (DECODE_STATE_ERROR |
DECODE_STATE_NOT_SUPPORTED);
+ return FALSE;
+ }
+
+ self->channels = vi->channels;
+ self->sample_rate = vi->rate;
+
+ DEBUG_TRACE("ov_info channels=%d rate=%d",
self->channels, self->sample_rate);
+
+ self->state = OGG_STATE_STREAM;
+ // fall through
+
+ case OGG_STATE_STREAM:
+
+ buffer_size = OUTPUT_BUFFER_SIZE >> 1;
+
+ if (self->channels == 1) {
+ buffer_size >>= 1;
+ }
+
+ bytes = ov_read(&self->vf, self->output_buffer,
buffer_size, &self->bitstream);
+
+ switch (bytes) {
+ case OV_HOLE:
+ DEBUG_TRACE("OV_HOLE");
+ return FALSE;
+
+ case OV_EBADLINK:
+ case OV_EINVAL:
+ DEBUG_TRACE("OV_EBADLINK or OV_EINVAL");
+
+ current_decoder_state |= DECODE_STATE_ERROR;
+ return FALSE;
+
+ case 0:
+ DEBUG_TRACE("End of ogg stream");
+
+ current_decoder_state |= DECODE_STATE_ERROR;
+ return FALSE;
+
+ default:
+ if (self->channels == 1) {
+ nsamples = bytes / 2;
+
+ /* mono */
+ rptr = ((s16_t *)self->output_buffer) +
nsamples;
+ wptr = ((sample_t
*)self->output_buffer) + (nsamples * 2);
+
+ for (i = 0; i < nsamples; i++) {
+ sample_t s = (*rptr--) << 16;
+ *wptr-- = s;
+ *wptr-- = s;
+ }
+ }
+ else {
+ nsamples = bytes / 4;
+
+ /* stereo */
+ rptr = ((s16_t *)self->output_buffer) +
(nsamples * 2);
+ wptr = ((sample_t
*)self->output_buffer) + (nsamples * 2);
+
+ for (i = 0; i < nsamples; i++) {
+ *wptr-- = (*rptr--) << 16;
+ *wptr-- = (*rptr--) << 16;
+ }
+ }
+
+ decode_output_samples((sample_t
*)self->output_buffer, nsamples, self->sample_rate, FALSE, TRUE, FALSE);
+
+ return TRUE;
+ }
+
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+
+static u32_t decode_vorbis_period(void *data) {
+ return 1;
+}
+
+
+static void *decode_vorbis_start(u8_t *params, u32_t num_params) {
+ struct decode_vorbis *self;
+
+ DEBUG_TRACE("decode_vorbis_start()");
+
+ self = malloc(sizeof(struct decode_vorbis));
+ memset(self, 0, sizeof(struct decode_vorbis));
+
+ self->output_buffer = malloc(OUTPUT_BUFFER_SIZE);
+ self->state = OGG_STATE_INIT;
+
+ return self;
+}
+
+
+static void decode_vorbis_stop(void *data) {
+ struct decode_vorbis *self = (struct decode_vorbis *) data;
+
+ DEBUG_TRACE("decode_vorbis_stop()");
+
+ free(self->output_buffer);
+ free(self);
+}
+
+
+struct decode_module decode_vorbis = {
+ 'o',
+ decode_vorbis_start,
+ decode_vorbis_stop,
+ decode_vorbis_period,
+ decode_vorbis_callback,
+};
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins