From 731ea9b489ec5e4134a07092f9eeb0a81865d841 Mon Sep 17 00:00:00 2001
From: Yuriy Kaminskiy <yumkam@mail.ru>
Date: Fri, 21 Jan 2011 16:25:46 +0300
Subject: [PATCH] mpg123 decoder: report bitrate

---
 src/decoder/mpg123_decoder_plugin.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/decoder/mpg123_decoder_plugin.c b/src/decoder/mpg123_decoder_plugin.c
index 7b48ebfaf..84f12f29b 100644
--- a/src/decoder/mpg123_decoder_plugin.c
+++ b/src/decoder/mpg123_decoder_plugin.c
@@ -105,6 +105,7 @@ mpd_mpg123_file_decode(struct decoder *decoder, const char *path_fs)
 	int error;
 	off_t num_samples;
 	enum decoder_command cmd;
+	struct mpg123_frameinfo info;
 
 	/* open the file */
 
@@ -128,6 +129,21 @@ mpd_mpg123_file_decode(struct decoder *decoder, const char *path_fs)
 			    (float)num_samples /
 			    (float)audio_format.sample_rate);
 
+	if (mpg123_info(handle, &info) != MPG123_OK) {
+		info.vbr = MPG123_CBR;
+		info.bitrate = 0;
+	}
+
+	switch (info.vbr) {
+	case MPG123_ABR:
+		info.bitrate = info.abr_rate;
+		break;
+	case MPG123_CBR:
+		break;
+	default:
+		info.bitrate = 0;
+	}
+
 	/* the decoder main loop */
 
 	do {
@@ -144,9 +160,17 @@ mpd_mpg123_file_decode(struct decoder *decoder, const char *path_fs)
 			break;
 		}
 
+		/* update bitrate for ABR/VBR */
+		if (info.vbr != MPG123_CBR) {
+			/* FIXME: maybe skip, as too expensive? */
+			/* FIXME: maybe, (info.vbr == MPG123_VBR) ? */
+			if (mpg123_info (handle, &info) != MPG123_OK)
+				info.bitrate = 0;
+		}
+
 		/* send to MPD */
 
-		cmd = decoder_data(decoder, NULL, buffer, nbytes, 0);
+		cmd = decoder_data(decoder, NULL, buffer, nbytes, info.bitrate);
 
 		/* seeking not yet implemented */
 	} while (cmd == DECODE_COMMAND_NONE);