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

Reply via email to