summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--deadbeef.h3
-rw-r--r--plugins.c3
-rw-r--r--plugins/gtkui/gtkui.c6
-rw-r--r--plugins/mpgmad/mpgmad.c2
-rw-r--r--streamer.c66
-rw-r--r--streamer.h12
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