Author: awy
Date: Thu Sep 25 09:09:40 2008
New Revision: 2972
URL: http://svn.slimdevices.com?rev=2972&root=Jive&view=rev
Log:
Implement pause-for-interval (using silence).
Reduce the idle-loop load - most-likely not the final solution.
Compensate for ALSA output-stage delay in STAT messages.
Modified:
7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
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_output.c
7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
Modified: 7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
URL:
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua?rev=2972&root=Jive&r1=2971&r2=2972&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua Thu Sep
25 09:09:40 2008
@@ -156,6 +156,7 @@
assert(data.outputSize)
assert(data.outputFull)
assert(data.elapsed)
+ assert(data.elapsed_jiffies)
return {
data.event,
@@ -166,7 +167,7 @@
packNumber(data.bytesReceivedH, 4),
packNumber(data.bytesReceivedL, 4),
packNumber(data.signalStrength or 0, 2),
- packNumber(data.jiffies, 4),
+ packNumber(data.elapsed_jiffies, 4),
packNumber(data.outputSize, 4),
packNumber(data.outputFull, 4),
packNumber(data.elapsed / 1000, 4),
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=2972&root=Jive&r1=2971&r2=2972&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 Thu Sep 25
09:09:40 2008
@@ -36,6 +36,7 @@
bool_t decode_first_buffer = FALSE;
u32_t current_sample_rate = 44100;
u32_t skip_ahead_bytes = 0;
+u32_t add_silence_bytes = 0;
/* decoder fifo used to store decoded samples */
@@ -109,10 +110,13 @@
DEBUG_TRACE("decode_pause_handler interval=%d", interval);
- current_decoder_state &= ~DECODE_STATE_RUNNING;
- current_audio_state &= ~DECODE_STATE_RUNNING;
- decode_audio->pause();
-
+ if (interval) {
+ add_silence_bytes = SAMPLES_TO_BYTES((u32_t)((interval *
current_sample_rate) / 1000));
+ } else {
+ current_decoder_state &= ~DECODE_STATE_RUNNING;
+ current_audio_state &= ~DECODE_STATE_RUNNING;
+ decode_audio->pause();
+ }
DEBUG_TRACE("pause decode state: %x audio state %x",
current_decoder_state, current_audio_state);
}
@@ -222,7 +226,15 @@
static Uint32 decode_timer_interval(void) {
+ size_t used;
+
if (decoder) {
+ used = decode_output_percent_used();
+ if (used > 80) {
+ return DECODE_MAX_INTERVAL;
+ } else if (used > 50) {
+ return DECODE_MAX_INTERVAL / 2;
+ }
return decoder->period(decoder_data);
}
return DECODE_MAX_INTERVAL;
@@ -492,7 +504,7 @@
static int decode_status(lua_State *L) {
size_t size, usedbytes;
u32_t bytesL, bytesH;
-
+
lua_newtable(L);
fifo_lock(&decode_fifo);
@@ -502,10 +514,15 @@
lua_pushinteger(L, decode_fifo.size);
lua_setfield(L, -2, "outputSize");
-
- lua_pushinteger(L, (u32_t)(((u64_t)decode_elapsed_samples * 1000) /
current_sample_rate));
+
+ lua_pushinteger(L, (u32_t)(((u64_t)(decode_elapsed_samples -
+ (decode_audio->delay ? decode_audio->delay() : 0)) *
1000) / current_sample_rate));
lua_setfield(L, -2, "elapsed");
-
+
+ /* get jiffies here so they correlate with "elapsed" as closely as
possible */
+ lua_pushinteger(L, (u32_t)SDL_GetTicks());
+ lua_setfield(L, -2, "elapsed_jiffies");
+
lua_pushinteger(L, decode_num_tracks_started);
lua_setfield(L, -2, "tracksStarted");
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=2972&root=Jive&r1=2971&r2=2972&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 Thu
Sep 25 09:09:40 2008
@@ -42,7 +42,7 @@
*/
static void callback(void *outputBuffer,
unsigned long framesPerBuffer) {
- size_t bytes_used, len, skip_bytes = 0;
+ size_t bytes_used, len, skip_bytes = 0, add_bytes = 0;
bool_t reached_start_point;
Uint8 *outputArray = (u8_t *)outputBuffer;
@@ -58,6 +58,16 @@
decode_sample_mix(outputArray, len);
return;
+ }
+
+ if (add_silence_bytes) {
+ add_bytes = add_silence_bytes;
+ if (add_bytes > len) add_bytes = len;
+ memset(outputBuffer, 0, add_bytes);
+ outputBuffer += add_bytes;
+ len -= add_bytes;
+ add_silence_bytes -= add_bytes;
+ if (!len) return;
}
bytes_used = fifo_bytes_used(&decode_fifo);
@@ -84,7 +94,7 @@
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);
+ DEBUG_ERROR("Audio underrun: used %d bytes , requested %d
bytes", (int)bytes_used, (int)len);
}
else {
current_audio_state &= ~DECODE_STATE_UNDERRUN;
@@ -93,7 +103,7 @@
if (skip_bytes) {
size_t wrap;
- DEBUG_TRACE("Skipping %d bytes", skip_bytes);
+ DEBUG_TRACE("Skipping %d bytes", (int)skip_bytes);
wrap = fifo_bytes_until_rptr_wrap(&decode_fifo);
@@ -369,12 +379,25 @@
if (pcm_sample_rate != current_sample_rate) {
new_sample_rate = current_sample_rate;
}
+ // snd_pcm_pause(handle, 1);
fifo_unlock(&decode_fifo);
}
static void decode_alsa_pause(void) {
DEBUG_TRACE("decode_alsa_pause");
+
+ fifo_lock(&decode_fifo);
+// snd_pcm_pause(handle, 0);
+ if (pcm_sample_rate != 44100) {
+ new_sample_rate = 44100;
+ }
+ fifo_unlock(&decode_fifo);
+}
+
+
+static void decode_alsa_stop(void) {
+ DEBUG_TRACE("decode_alsa_stop");
fifo_lock(&decode_fifo);
if (pcm_sample_rate != 44100) {
@@ -384,17 +407,6 @@
}
-static void decode_alsa_stop(void) {
- DEBUG_TRACE("decode_alsa_stop");
-
- fifo_lock(&decode_fifo);
- if (pcm_sample_rate != 44100) {
- new_sample_rate = 44100;
- }
- fifo_unlock(&decode_fifo);
-}
-
-
static int decode_alsa_init(void) {
int err;
@@ -414,6 +426,16 @@
audio_thread = SDL_CreateThread(audio_thread_execute, NULL);
return 1;
+}
+
+static u32_t decode_alsa_delay(void)
+{
+ snd_pcm_status_t* status;
+
+ snd_pcm_status_alloca(&status);
+ snd_pcm_status(handle, status);
+
+ return (u32_t)snd_pcm_status_get_delay(status);
}
@@ -423,6 +445,7 @@
decode_alsa_pause,
decode_alsa_resume,
decode_alsa_stop,
+ decode_alsa_delay,
};
#endif // HAVE_LIBASOUND
Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c
URL:
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c?rev=2972&root=Jive&r1=2971&r2=2972&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c Thu
Sep 25 09:09:40 2008
@@ -456,6 +456,20 @@
}
return FALSE;
+}
+
+u32_t decode_output_percent_used(void) {
+ size_t usedbytes;
+ size_t freebytes;
+
+ fifo_lock(&decode_fifo);
+
+ usedbytes = fifo_bytes_free(&decode_fifo);
+ freebytes = fifo_bytes_free(&decode_fifo);
+
+ fifo_unlock(&decode_fifo);
+
+ return (usedbytes * 100) / (usedbytes + freebytes);
}
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=2972&root=Jive&r1=2971&r2=2972&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 Thu
Sep 25 09:09:40 2008
@@ -49,6 +49,8 @@
extern bool_t decode_output_can_write(u32_t buffer_size, u32_t sample_rate);
+extern u32_t decode_output_percent_used(void);
+
extern void decode_output_samples(sample_t *buffer, u32_t samples, int
sample_rate,
bool_t copyright_asserted);
@@ -82,7 +84,6 @@
extern void decode_queue_metadata(struct decode_metadata *metadata);
-
/* Audio output api */
struct decode_audio {
int (*init)(void);
@@ -90,6 +91,7 @@
void (*pause)(void);
void (*resume)(void);
void (*stop)(void);
+ u32_t (*delay)(void);
};
extern struct decode_audio decode_alsa;
@@ -121,6 +123,7 @@
extern bool_t decode_first_buffer;
extern u32_t current_sample_rate;
extern u32_t skip_ahead_bytes;
+extern u32_t add_silence_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