From b8a0f1ae6d32847270748e92e744606107114737 Mon Sep 17 00:00:00 2001
From: Eric Wong <normalperson@yhbt.net>
Date: Sun, 16 Jul 2006 16:53:04 +0000
Subject: OSS: handle device disconnects and reconnects (w/o needing a mpd
 restart)

Like the ALSA patches, this allows OSS devices to be disconnected
during playback and MPD will be able to reopen and reuse them without
restarting.

git-svn-id: https://svn.musicpd.org/mpd/trunk@4366 09075e82-0dd4-0310-85a5-a0d7c8717e4f
---
 src/audioOutputs/audioOutput_oss.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

(limited to 'src/audioOutputs')

diff --git a/src/audioOutputs/audioOutput_oss.c b/src/audioOutputs/audioOutput_oss.c
index 02403124e..3b52b9807 100644
--- a/src/audioOutputs/audioOutput_oss.c
+++ b/src/audioOutputs/audioOutput_oss.c
@@ -421,6 +421,12 @@ static int setParam(OssData * od, int param, int * value) {
 	return 0;
 }
 
+static void oss_close(OssData * od)
+{
+	if(od->fd >= 0) while (close(od->fd) && errno == EINTR);
+	od->fd = -1;
+}
+
 static int oss_open(AudioOutput * audioOutput) {
 	int tmp;
 	OssData * od = audioOutput->data;
@@ -468,7 +474,7 @@ static int oss_open(AudioOutput * audioOutput) {
 	return 0;
 
 fail:
-	if(od->fd >= 0) close(od->fd);
+	oss_close(od);
 	audioOutput->open = 0;
 	return -1;
 }
@@ -483,7 +489,8 @@ static int oss_openDevice(AudioOutput * audioOutput)
 	od->sampleRate = audioFormat->sampleRate;
 	od->bits = audioFormat->bits;
 
-	ret = oss_open(audioOutput);
+	if ((ret = oss_open(audioOutput)) < 0)
+		return ret;
 
 	audioFormat->channels = od->channels;
 	audioFormat->sampleRate = od->sampleRate;
@@ -496,11 +503,6 @@ static int oss_openDevice(AudioOutput * audioOutput)
 	return ret;
 }
 
-static void oss_close(OssData * od) {
-	if(od->fd >= 0) close(od->fd);
-	od->fd = -1;
-}
-
 static void oss_closeDevice(AudioOutput * audioOutput) {
 	OssData * od = audioOutput->data;
 
@@ -516,8 +518,6 @@ static void oss_dropBufferedAudio(AudioOutput * audioOutput) {
 		ioctl(od->fd, SNDCTL_DSP_RESET, 0);
 		oss_close(od);
 	}
-
-	/*oss_open(audioOutput);*/
 }
 
 static int oss_playAudio(AudioOutput * audioOutput, char * playChunk, 
@@ -527,7 +527,8 @@ static int oss_playAudio(AudioOutput * audioOutput, char * playChunk,
 	int ret;
 
 	/* reopen the device since it was closed by dropBufferedAudio */
-	if(od->fd < 0) oss_open(audioOutput);
+	if(od->fd < 0 && oss_open(audioOutput) < 0)
+		return -1;
 
 	while (size > 0) {
 		ret = write(od->fd, playChunk, size);
-- 
cgit v1.2.3