Author: awy
Date: Fri Aug 22 03:20:23 2008
New Revision: 2883
URL: http://svn.slimdevices.com?rev=2883&root=Jive&view=rev
Log:
Handle skipAhead (strm-a)
Modified:
7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
URL:
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c?rev=2883&root=Jive&r1=2882&r2=2883&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c (original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c Fri Aug 22
03:20:23 2008
@@ -35,6 +35,7 @@
u32_t decode_elapsed_samples = 0;
bool_t decode_first_buffer = FALSE;
u32_t current_sample_rate = 44100;
+u32_t skip_ahead_bytes = 0;
/* decoder fifo used to store decoded samples */
@@ -123,8 +124,8 @@
mqueue_read_complete(&decode_mqueue);
DEBUG_TRACE("decode_skip_ahead_handler interval=%d", interval);
-
- // XXXX
+
+ skip_ahead_bytes = SAMPLES_TO_BYTES((u32_t)((interval *
current_sample_rate) / 1000));
}
Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
URL:
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c?rev=2883&root=Jive&r1=2882&r2=2883&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c Fri
Aug 22 03:20:23 2008
@@ -42,7 +42,7 @@
*/
static void callback(void *outputBuffer,
unsigned long framesPerBuffer) {
- size_t bytes_used, len;
+ size_t bytes_used, len, skip_bytes = 0;
bool_t reached_start_point;
Uint8 *outputArray = (u8_t *)outputBuffer;
@@ -60,7 +60,14 @@
return;
}
- bytes_used = fifo_bytes_used(&decode_fifo);
+ bytes_used = fifo_bytes_used(&decode_fifo);
+
+ /* only skip if it will not cause an underrun */
+ if (bytes_used + skip_ahead_bytes >= len) {
+ skip_bytes = skip_ahead_bytes;
+ bytes_used -= skip_bytes;
+ }
+
if (bytes_used > len) {
bytes_used = len;
}
@@ -69,6 +76,7 @@
if (bytes_used == 0) {
current_audio_state |= DECODE_STATE_UNDERRUN;
memset(outputArray, 0, len);
+ DEBUG_ERROR("Audio underrun: used 0 bytes");
return;
}
@@ -76,9 +84,29 @@
if (bytes_used < len) {
current_audio_state |= DECODE_STATE_UNDERRUN;
memset(outputArray + bytes_used, 0, len - bytes_used);
+ DEBUG_ERROR("Audio underrun: used %d bytes , requested %d
bytes", bytes_used, len);
}
else {
current_audio_state &= ~DECODE_STATE_UNDERRUN;
+ }
+
+ if (skip_bytes) {
+ size_t wrap;
+
+ DEBUG_TRACE("Skipping %d bytes", skip_bytes);
+
+ wrap = fifo_bytes_until_rptr_wrap(&decode_fifo);
+
+ if (wrap < skip_bytes) {
+ fifo_rptr_incby(&decode_fifo, wrap);
+ skip_bytes -= wrap;
+ skip_ahead_bytes -= wrap;
+ decode_elapsed_samples += BYTES_TO_SAMPLES(wrap);
+ }
+
+ fifo_rptr_incby(&decode_fifo, skip_bytes);
+ skip_ahead_bytes -= skip_bytes;
+ decode_elapsed_samples += BYTES_TO_SAMPLES(skip_bytes);
}
while (bytes_used) {
Modified:
7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
URL:
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c?rev=2883&root=Jive&r1=2882&r2=2883&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
Fri Aug 22 03:20:23 2008
@@ -40,7 +40,7 @@
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData) {
- size_t bytes_used, len;
+ size_t bytes_used, len, skip_bytes = 0;
bool_t reached_start_point;
Uint8 *outputArray = (u8_t *)outputBuffer;
@@ -65,6 +65,13 @@
fifo_lock(&decode_fifo);
bytes_used = fifo_bytes_used(&decode_fifo);
+
+ /* only skip if it will not cause an underrun */
+ if (bytes_used + skip_ahead_bytes >= len) {
+ skip_bytes = skip_ahead_bytes;
+ bytes_used -= skip_bytes;
+ }
+
if (bytes_used > len) {
bytes_used = len;
}
@@ -84,6 +91,25 @@
}
else {
current_audio_state &= ~DECODE_STATE_UNDERRUN;
+ }
+
+ if (skip_bytes) {
+ size_t wrap;
+
+ DEBUG_TRACE("Skipping %d bytes", skip_bytes);
+
+ wrap = fifo_bytes_until_rptr_wrap(&decode_fifo);
+
+ if (wrap < skip_bytes) {
+ fifo_rptr_incby(&decode_fifo, wrap);
+ skip_bytes -= wrap;
+ skip_ahead_bytes -= wrap;
+ decode_elapsed_samples += BYTES_TO_SAMPLES(wrap);
+ }
+
+ fifo_rptr_incby(&decode_fifo, skip_bytes);
+ skip_ahead_bytes -= skip_bytes;
+ decode_elapsed_samples += BYTES_TO_SAMPLES(skip_bytes);
}
while (bytes_used) {
Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
URL:
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h?rev=2883&root=Jive&r1=2882&r2=2883&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h Fri
Aug 22 03:20:23 2008
@@ -120,6 +120,7 @@
extern u32_t decode_elapsed_samples;
extern bool_t decode_first_buffer;
extern u32_t current_sample_rate;
+extern u32_t skip_ahead_bytes;
/* The fifo used to store decoded samples */
extern u8_t decode_fifo_buf[DECODE_FIFO_SIZE];
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins