From 959c05c80698a71233f8e87dc994a8442d0c2d43 Mon Sep 17 00:00:00 2001 From: Alexey Yakovenko Date: Fri, 25 Dec 2009 15:19:19 +0100 Subject: experimental bitrate display --- deadbeef.h | 3 ++- plugins.c | 3 ++- plugins/gtkui/gtkui.c | 6 ++--- plugins/mpgmad/mpgmad.c | 2 +- streamer.c | 66 +++++++++++++++++++++++++++---------------------- streamer.h | 12 ++++----- 6 files changed, 51 insertions(+), 41 deletions(-) diff --git a/deadbeef.h b/deadbeef.h index 30970ba6..96f54c76 100644 --- a/deadbeef.h +++ b/deadbeef.h @@ -233,7 +233,6 @@ typedef struct { void (*playback_random) (void); float (*playback_get_pos) (void); // [0..100] void (*playback_set_pos) (float pos); // [0..100] - void (*playback_update_bitrate) (float bitrate); // streamer access // FIXME: needs to be thread-safe DB_playItem_t *(*streamer_get_playing_track) (void); @@ -243,6 +242,8 @@ typedef struct { int (*streamer_ok_to_read) (int len); void (*streamer_reset) (int full); int (*streamer_read) (char *bytes, int size); + void (*streamer_set_bitrate) (int bitrate); + int (*streamer_get_apx_bitrate) (void); // process control const char *(*get_config_dir) (void); void (*quit) (void); diff --git a/plugins.c b/plugins.c index 3131b908..032bed99 100644 --- a/plugins.c +++ b/plugins.c @@ -60,7 +60,6 @@ static DB_functions_t deadbeef_api = { .playback_random = plug_playback_random, .playback_get_pos = plug_playback_get_pos, .playback_set_pos = plug_playback_set_pos, - .playback_update_bitrate = streamer_update_bitrate, // streamer access .streamer_get_playing_track = (DB_playItem_t *(*) (void))streamer_get_playing_track, .streamer_get_streaming_track = (DB_playItem_t *(*) (void))streamer_get_streaming_track, @@ -69,6 +68,8 @@ static DB_functions_t deadbeef_api = { .streamer_ok_to_read = streamer_ok_to_read, .streamer_reset = streamer_reset, .streamer_read = streamer_read, + .streamer_set_bitrate = streamer_set_bitrate, + .streamer_get_apx_bitrate = streamer_get_apx_bitrate, // process control .get_config_dir = plug_get_config_dir, .quit = plug_quit, diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c index 322d0fc0..c6535055 100644 --- a/plugins/gtkui/gtkui.c +++ b/plugins/gtkui/gtkui.c @@ -104,10 +104,10 @@ update_songinfo (gpointer ctx) { } char sbitrate[20] = ""; -#if 0 // NOTE: do not enable that for stable branch yet - int bitrate = streamer_get_bitrate (); +#if 1 + int bitrate = deadbeef->streamer_get_apx_bitrate (); if (bitrate > 0) { - snprintf (sbitrate, sizeof (sbitrate), "%d kbps ", bitrate); + snprintf (sbitrate, sizeof (sbitrate), " | %d kbps ", bitrate); } #endif const char *spaused = deadbeef->get_output ()->state () == OUTPUT_STATE_PAUSED ? "Paused | " : ""; diff --git a/plugins/mpgmad/mpgmad.c b/plugins/mpgmad/mpgmad.c index 567c8405..abee585b 100644 --- a/plugins/mpgmad/mpgmad.c +++ b/plugins/mpgmad/mpgmad.c @@ -792,7 +792,7 @@ cmp3_stream_frame (void) { // synthesize single frame mad_synth_frame(&synth,&frame); buffer.decode_remaining = synth.pcm.length; - deadbeef->playback_update_bitrate (frame.header.bitrate/1000); + deadbeef->streamer_set_bitrate (frame.header.bitrate/1000); break; } return eof; diff --git a/streamer.c b/streamer.c index abd57c2b..0ecf8e7f 100644 --- a/streamer.c +++ b/streamer.c @@ -78,7 +78,8 @@ static int badsong = -1; static float seekpos = -1; static float playpos = 0; // play position of current song -static float avg_bitrate = -1; // avg bitrate of current song +static int avg_bitrate = -1; // avg bitrate of current song +static int last_bitrate = -1; // last bitrate of current song static int prevtrack_samplerate = -1; @@ -218,14 +219,16 @@ streamer_get_playpos (void) { return playpos; } -float -streamer_get_bitrate (void) { - return avg_bitrate; +void +streamer_set_bitrate (int bitrate) { + if (bytes_until_next_song <= 0) { // prevent next track from resetting current playback bitrate + last_bitrate = bitrate; + } } -void -streamer_update_bitrate (float bitrate) { - avg_bitrate = bitrate; +int +streamer_get_apx_bitrate (void) { + return avg_bitrate; } void @@ -354,6 +357,7 @@ streamer_thread (void *ctx) { pl_item_free (&str_playing_song); // copy streaming into playing pl_item_copy (&str_playing_song, &str_streaming_song); + last_bitrate = -1; orig_playing_song = orig_streaming_song; if (orig_playing_song) { orig_playing_song->played = 1; @@ -366,7 +370,6 @@ streamer_thread (void *ctx) { trace ("sending songstarted to plugins\n"); plug_trigger_event (DB_EV_SONGSTARTED, 0); playpos = 0; - avg_bitrate = -1; // change samplerate if (prevtrack_samplerate != str_playing_song.decoder->info.samplerate) { plug_get_output ()->change_rate (str_playing_song.decoder->info.samplerate); @@ -806,27 +809,6 @@ streamer_read (char *bytes, int size) { memcpy (bytes, streambuffer, sz); memmove (streambuffer, streambuffer+sz, streambuffer_fill-sz); streambuffer_fill -= sz; -#if 0 - int cp = sz; - int readpos = streambuffer_pos & STREAM_BUFFER_MASK; - int part1 = STREAM_BUFFER_SIZE-readpos; - part1 = min (part1, cp); - if (part1 > 0) { - memcpy (bytes, streambuffer+readpos, part1); - streambuffer_pos += part1; - streambuffer_fill -= part1; - cp -= part1; - bytes += part1; - } - if (cp > 0) { - memcpy (bytes, streambuffer, cp); - streambuffer_pos += cp; - streambuffer_fill -= cp; - bytes += cp; - } - assert (streambuffer_fill>=0); - streambuffer_pos &= STREAM_BUFFER_MASK; -#endif playpos += (float)sz/p_get_rate ()/4.f; str_playing_song.playtime += (float)sz/p_get_rate ()/4.f; if (playlist_current_ptr) { @@ -843,6 +825,32 @@ streamer_read (char *bytes, int size) { } } streamer_unlock (); + + // approximate bitrate + if (last_bitrate != -1) { + if (avg_bitrate == -1) { + avg_bitrate = last_bitrate; + } + else { + if (avg_bitrate < last_bitrate) { + avg_bitrate += 5; + if (avg_bitrate > last_bitrate) { + avg_bitrate = last_bitrate; + } + } + else if (avg_bitrate > last_bitrate) { + avg_bitrate -= 5; + if (avg_bitrate < last_bitrate) { + avg_bitrate = last_bitrate; + } + } + } +// printf ("apx bitrate: %d (last %d)\n", avg_bitrate, last_bitrate); + } + else { + avg_bitrate = -1; + } + #if 0 struct timeval tm2; gettimeofday (&tm2, NULL); diff --git a/streamer.h b/streamer.h index 2a74d190..526dd161 100644 --- a/streamer.h +++ b/streamer.h @@ -60,12 +60,6 @@ streamer_ok_to_read (int len); float streamer_get_playpos (void); -float -streamer_get_bitrate (void); - -void -streamer_update_bitrate (float bitrate); - int streamer_is_buffering (void); @@ -84,4 +78,10 @@ streamer_configchanged (void); void streamer_play_current_track (void); +void +streamer_set_bitrate (int bitrate); + +int +streamer_get_apx_bitrate (void); + #endif // __STREAMER_H -- cgit v1.2.3