No need to destroy the JackData object when an error occurs, since
jack_finishDriver() already frees it.  Only deinitialize the jack
library, introduce freeJackClient() for that, and move code from
freeJackData().
---

 src/audioOutputs/audioOutput_jack.c |   38 +++++++++++++++++++++++------------
 1 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/src/audioOutputs/audioOutput_jack.c 
b/src/audioOutputs/audioOutput_jack.c
index 4a30e89..47997df 100644
--- a/src/audioOutputs/audioOutput_jack.c
+++ b/src/audioOutputs/audioOutput_jack.c
@@ -63,14 +63,32 @@ static JackData *newJackData(void)
        return ret;
 }
 
+static void freeJackClient(JackData *jd)
+{
+       assert(jd != NULL);
+
+       if (jd->client != NULL) {
+               jack_deactivate(jd->client);
+               jack_client_close(jd->client);
+               jd->client = NULL;
+       }
+
+       if (jd->ringbuffer[0] != NULL) {
+               jack_ringbuffer_free(jd->ringbuffer[0]);
+               jd->ringbuffer[0] = NULL;
+       }
+
+       if (jd->ringbuffer[1] != NULL) {
+               jack_ringbuffer_free(jd->ringbuffer[1]);
+               jd->ringbuffer[1] = NULL;
+       }
+}
+
 static void freeJackData(AudioOutput *audioOutput)
 {
        JackData *jd = audioOutput->data;
        if (jd) {
-               if (jd->ringbuffer[0])
-                       jack_ringbuffer_free(jd->ringbuffer[0]);
-               if (jd->ringbuffer[1])
-                       jack_ringbuffer_free(jd->ringbuffer[1]);
+               freeJackClient(jd);
                free(jd);
                audioOutput->data = NULL;
        }
@@ -78,13 +96,9 @@ static void freeJackData(AudioOutput *audioOutput)
 
 static void jack_finishDriver(AudioOutput *audioOutput)
 {
-       JackData *jd = audioOutput->data;
        int i;
 
-       if ( jd && jd->client ) {
-               jack_deactivate(jd->client);
-               jack_client_close(jd->client);
-       }
+       freeJackData(audioOutput);
        DEBUG("disconnect_jack (pid=%d)\n", getpid ());
 
        if ( strcmp(name, "mpd") ) {
@@ -98,8 +112,6 @@ static void jack_finishDriver(AudioOutput *audioOutput)
                free(output_ports[i]);
                output_ports[i] = NULL;
        }
-
-       freeJackData(audioOutput);
 }
 
 static int srate(mpd_unused jack_nframes_t rate, void *data)
@@ -340,7 +352,7 @@ static int jack_openDevice(AudioOutput *audioOutput)
        }
 
        if (jd->client == NULL && connect_jack(audioOutput) < 0) {
-               freeJackData(audioOutput);
+               freeJackClient(jd);
                audioOutput->open = 0;
                return -1;
        }
@@ -378,7 +390,7 @@ static int jack_playAudio(AudioOutput * audioOutput,
 
        if ( jd->shutdown ) {
                ERROR("Refusing to play, because there is no client thread.\n");
-               freeJackData(audioOutput);
+               freeJackClient(jd);
                audioOutput->open = 0;
                return 0;
        }


-------------------------------------------------------------------------
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