aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-10-29 20:40:33 +0100
committerMax Kellermann <max@duempel.org>2008-10-29 20:40:33 +0100
commit2f76db4c7842ffdb989d2081b0835a83a3219f35 (patch)
tree19c7099501b78a2901a185f23dbb271d8a703f42
parent58c5bee9f0bcb46da7d113b66a4e1e2d7add9837 (diff)
downloadmpd-2f76db4c7842ffdb989d2081b0835a83a3219f35.tar.gz
mpd-2f76db4c7842ffdb989d2081b0835a83a3219f35.tar.xz
mpd-2f76db4c7842ffdb989d2081b0835a83a3219f35.zip
output: close device on play error
When an output plugin fails to play a chunk, close it. This replaces various manual close() calls in nearly all plugins.
-rw-r--r--src/output/alsa_plugin.c1
-rw-r--r--src/output/ao_plugin.c1
-rw-r--r--src/output/fifo_plugin.c1
-rw-r--r--src/output/mvp_plugin.c1
-rw-r--r--src/output/oss_plugin.c1
-rw-r--r--src/output/shout_plugin.c9
-rw-r--r--src/output_thread.c5
7 files changed, 7 insertions, 12 deletions
diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c
index 2d4f9c239..4802778dc 100644
--- a/src/output/alsa_plugin.c
+++ b/src/output/alsa_plugin.c
@@ -412,7 +412,6 @@ alsa_playAudio(void *data, const char *playChunk, size_t size)
ERROR("closing ALSA device \"%s\" due to write "
"error: %s\n", ad->device,
snd_strerror(-errno));
- alsa_closeDevice(ad);
return false;
}
continue;
diff --git a/src/output/ao_plugin.c b/src/output/ao_plugin.c
index d2c7dab6e..20e8cfd58 100644
--- a/src/output/ao_plugin.c
+++ b/src/output/ao_plugin.c
@@ -224,7 +224,6 @@ audioOutputAo_play(void *data, const char *playChunk, size_t size)
if (ao_play_deconst(ad->device, playChunk, chunk_size) == 0) {
audioOutputAo_error();
ERROR("closing audio device due to write error\n");
- audioOutputAo_closeDevice(ad);
return false;
}
diff --git a/src/output/fifo_plugin.c b/src/output/fifo_plugin.c
index fe85d6644..4645948e2 100644
--- a/src/output/fifo_plugin.c
+++ b/src/output/fifo_plugin.c
@@ -259,7 +259,6 @@ fifo_playAudio(void *data, const char *playChunk, size_t size)
ERROR("Closing FIFO output \"%s\" due to write error: "
"%s\n", fd->path, strerror(errno));
- fifo_closeDevice(fd);
return false;
}
diff --git a/src/output/mvp_plugin.c b/src/output/mvp_plugin.c
index 9a56e7943..61b45ba0f 100644
--- a/src/output/mvp_plugin.c
+++ b/src/output/mvp_plugin.c
@@ -253,7 +253,6 @@ mvp_playAudio(void *data, const char *playChunk, size_t size)
continue;
ERROR("closing mvp PCM device due to write error: "
"%s\n", strerror(errno));
- mvp_closeDevice(md);
return false;
}
playChunk += ret;
diff --git a/src/output/oss_plugin.c b/src/output/oss_plugin.c
index 26bc1b3aa..71262fefb 100644
--- a/src/output/oss_plugin.c
+++ b/src/output/oss_plugin.c
@@ -549,7 +549,6 @@ oss_playAudio(void *data, const char *playChunk, size_t size)
continue;
ERROR("closing oss device \"%s\" due to write error: "
"%s\n", od->device, strerror(errno));
- oss_closeDevice(od);
return false;
}
playChunk += ret;
diff --git a/src/output/shout_plugin.c b/src/output/shout_plugin.c
index 7bd806d36..00ce02590 100644
--- a/src/output/shout_plugin.c
+++ b/src/output/shout_plugin.c
@@ -525,7 +525,6 @@ my_shout_play(void *data, const char *chunk, size_t size)
if (!sd->opened) {
status = open_shout_conn(sd);
if (status < 0) {
- my_shout_close_device(sd);
return false;
} else if (status > 0) {
timer_sync(sd->timer);
@@ -533,15 +532,11 @@ my_shout_play(void *data, const char *chunk, size_t size)
}
}
- if (sd->encoder->encode_func(sd, chunk, size)) {
- my_shout_close_device(sd);
+ if (sd->encoder->encode_func(sd, chunk, size))
return false;
- }
- if (write_page(sd) < 0) {
- my_shout_close_device(sd);
+ if (write_page(sd) < 0)
return false;
- }
return true;
}
diff --git a/src/output_thread.c b/src/output_thread.c
index f03520013..825dfa5f5 100644
--- a/src/output_thread.c
+++ b/src/output_thread.c
@@ -62,6 +62,11 @@ static void ao_play(struct audio_output *ao)
convertAudioFormat(ao, &data, &size);
ao->result = ao->plugin->play(ao->data, data, size);
+ if (!ao->result) {
+ ao->plugin->close(ao->data);
+ ao->open = false;
+ }
+
ao_command_finished(ao);
}