This should address an issue reported by Qball to the dev mailing list:

http://sourceforge.net/mailarchive/forum.php?thread_name=48B3CF6F.3090506%40qballcow.nl&forum_name=musicpd-dev-team

The problem was that I wasn't flushing the lame encoder properly.  As a
result bad data were being propagated through the mp3buf.  This was
causing problems when the stream was disabled, or re-enabled.
---
src/audioOutputs/audioOutput_shout_mp3.c |   39 +++++++++++++++++ 
+-----------
1 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/src/audioOutputs/audioOutput_shout_mp3.c b/src/ 
audioOutputs/audioOutput_shout_mp3.c
index da76a21..4ed29d6 100644
--- a/src/audioOutputs/audioOutput_shout_mp3.c
+++ b/src/audioOutputs/audioOutput_shout_mp3.c
@@ -43,7 +43,7 @@ typedef struct _ShoutData {

         lame_global_flags *gfp;
         unsigned char mp3buf[MP3_BUF_SIZE];
-        unsigned int mp3buf_full;
+        int mp3buf_full;

         float quality;
         int bitrate;
@@ -307,8 +307,8 @@ static void finishEncoder(ShoutData * sd)

static int flushEncoder(ShoutData * sd)
{
-        /* Does lame require anything to be done here? */
-        return 0;
+        return ((sd->mp3buf_full = lame_encode_flush(sd->gfp, sd- 
 >mp3buf,
+                                                     MP3_BUF_SIZE)) >  
0);
}

static void clearEncoder(ShoutData * sd)
@@ -320,6 +320,7 @@ static void clearEncoder(ShoutData * sd)
         }

         lame_close(sd->gfp);
+        sd->mp3buf_full = 0;
}

static void myShoutMp3_closeShoutConn(ShoutData * sd)
@@ -406,26 +407,26 @@ static void sendMetadata(ShoutData *sd)

static int initEncoder(ShoutData * sd)
{
-       if (NULL == (sd->gfp = lame_init())) {
-                ERROR("problem setting up lame encoder for  
shout_mp3\n");
+        if (NULL == (sd->gfp = lame_init())) {
+                ERROR("problem initializing lame encoder for  
shout_mp3\n");
                 lame_close(sd->gfp); /* necessary? */
                 return -1;
         }

         if (sd->quality >= -1.0) {
                 if (0 != lame_set_VBR(sd->gfp, vbr_rh)) {
-                        ERROR("problem setting up lame encoder for  
shout_mp3\n");
+                        ERROR("problem setting lame encoder VBR mode  
for shout_mp3\n");
                         lame_close(sd->gfp);
                         return -1;
                 }
                 if (0 != lame_set_VBR_q(sd->gfp, sd->quality)) {
-                        ERROR("problem setting up lame encoder for  
shout_mp3\n");
+                        ERROR("problem setting up lame encoder VBR  
quality for shout_mp3\n");
                         lame_close(sd->gfp);
                         return -1;
                 }
         } else {
                 if (0 != lame_set_brate(sd->gfp, sd->bitrate)) {
-                        ERROR("problem setting up lame encoder for  
shout_mp3\n");
+                        ERROR("problem setting up lame encoder  
bitrate for shout_mp3\n");
                         lame_close(sd->gfp);
                         return -1;
                 }
@@ -433,20 +434,20 @@ static int initEncoder(ShoutData * sd)

         if (0 != lame_set_num_channels(sd->gfp,
                                        sd->audioFormat->channels)) {
-                ERROR("problem setting up lame encoder for shout\n");
+                ERROR("problem setting up lame encoder channels for  
shout_mp3\n");
                 lame_close(sd->gfp);
                 return -1;
         }

         if (0 != lame_set_in_samplerate(sd->gfp,
                                         sd->audioFormat->sampleRate)) {
-                ERROR("problem setting up lame encoder for shout\n");
+                ERROR("problem setting up lame encoder sample rate  
for shout_mp3\n");
                 lame_close(sd->gfp);
                 return -1;
         }

         if (0 > lame_init_params(sd->gfp)) {
-                ERROR("problem setting up lame encoder for shout\n");
+                ERROR("problem setting up lame encoder for  
shout_mp3\n");
                 lame_close(sd->gfp);
                 return -1;
         }
@@ -516,8 +517,9 @@ static int myShoutMp3_openShoutConn(AudioOutput *  
audioOutput)
         int status;

         status = myShoutMp3_connect(sd);
-        if (status != 0)
+        if (status != 0) {
                 return status;
+        }

         if (initEncoder(sd) < 0) {
                 shout_close(sd->shoutConn);
@@ -531,11 +533,14 @@ static int myShoutMp3_openShoutConn(AudioOutput  
* audioOutput)
         sd->opened = 1;
         sd->tagToSend = 0;

-        while (lame_encode_flush(sd->gfp, sd->mp3buf, sd- 
 >mp3buf_full)) {
+        if ((sd->mp3buf_full = lame_encode_flush(sd->gfp, sd->mp3buf,
+                                                 MP3_BUF_SIZE)) >= 0) {
                 if (write_page(sd) < 0) {
                         myShoutMp3_closeShoutConn(sd);
                         return -1;
                 }
+        } else {
+                ERROR("error flushing lame encoder\n");
         }

         sd->connAttempts = 0;
@@ -571,11 +576,14 @@ static void myShoutMp3_sendMetadata(ShoutData *  
sd)

         sendMetadata(sd);

-        while (lame_encode_flush(sd->gfp, sd->mp3buf, sd- 
 >mp3buf_full)) {
+        if ((sd->mp3buf_full = lame_encode_flush(sd->gfp, sd->mp3buf,
+                                                 MP3_BUF_SIZE)) >= 0) {
                 if (write_page(sd) < 0) {
                         myShoutMp3_closeShoutConn(sd);
-                        return -1;
+                        return;
                 }
+        } else {
+                ERROR("error flushing lame encoder\n");
         }

         /*if(sd->tag) freeMpdTag(sd->tag);
@@ -605,6 +613,7 @@ static int myShoutMp3_play(AudioOutput *  
audioOutput,
         if (!sd->opened) {
                 status = myShoutMp3_openShoutConn(audioOutput);
                 if (status < 0) {
+                        ERROR("%s: %s: unable to open shout connection 
\n", __FILE__, __func__);
                         myShoutMp3_closeDevice(audioOutput);
                         return -1;
                 } else if (status > 0) {
-- 
1.5.4.3


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Musicpd-dev-team mailing list
Musicpd-dev-team@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team

Reply via email to