aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-08-26 08:27:15 +0200
committerEric Wong <normalperson@yhbt.net>2008-08-31 00:44:32 -0700
commit8c419bb006e376cd0b78453a988976d96027a9f4 (patch)
tree885679cc69196c9bbeaadb1e4a2155828f727842
parent641e530f447771642ac627c91e8bff67fcb71fd3 (diff)
downloadmpd-8c419bb006e376cd0b78453a988976d96027a9f4.tar.gz
mpd-8c419bb006e376cd0b78453a988976d96027a9f4.tar.xz
mpd-8c419bb006e376cd0b78453a988976d96027a9f4.zip
jack: added freeJackClient()
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().
-rw-r--r--src/audioOutputs/audioOutput_jack.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/src/audioOutputs/audioOutput_jack.c b/src/audioOutputs/audioOutput_jack.c
index 4a30e897e..47997df01 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;
}