From 52cdd0baf61591d45a78b86d1dcd3337887ddca4 Mon Sep 17 00:00:00 2001
From: Warren Dukes <warren.dukes@gmail.com>
Date: Tue, 22 Mar 2005 23:05:29 +0000
Subject: potentially fix OS X woes

git-svn-id: https://svn.musicpd.org/mpd/trunk@3113 09075e82-0dd4-0310-85a5-a0d7c8717e4f
---
 src/audioOutputs/audioOutput_osx.c | 94 ++++++++++++++------------------------
 1 file changed, 35 insertions(+), 59 deletions(-)

(limited to 'src/audioOutputs')

diff --git a/src/audioOutputs/audioOutput_osx.c b/src/audioOutputs/audioOutput_osx.c
index c1098d97c..da18b0676 100644
--- a/src/audioOutputs/audioOutput_osx.c
+++ b/src/audioOutputs/audioOutput_osx.c
@@ -25,16 +25,17 @@
 #include <pthread.h>
 
 #include "../log.h"
-#include "../utils.h"
 
 typedef struct _OsxData {
 	AudioUnit au;
 	pthread_mutex_t	mutex;
-	pthread_cond_t condition;
+	pthread_cond_t conditionFull;
+	pthread_cond_t conditionEmpty;
 	char * buffer;
 	int bufferSize;
 	int pos;
 	int len;
+	int go;
 	int started;
 } OsxData;
 
@@ -42,10 +43,12 @@ static OsxData * newOsxData() {
 	OsxData * ret = malloc(sizeof(OsxData));
 
 	pthread_mutex_init(&ret->mutex, NULL);
-	pthread_cond_init(&ret->condition, NULL);
+	pthread_cond_init(&ret->conditionFull, NULL);
+	pthread_cond_init(&ret->conditionEmpty, NULL);
 
 	ret->pos = 0;
 	ret->len = 0;
+	ret->go = 0;
 	ret->started = 0;
 	ret->buffer = NULL;
 	ret->bufferSize = 0;
@@ -90,6 +93,9 @@ static int osx_initDriver(AudioOutput * audioOutput, ConfigParam * param) {
 
 static void freeOsxData(OsxData * od) {
 	if(od->buffer) free(od->buffer);
+	pthread_mutex_destroy(&ret->mutex);
+	pthread_cond_destroy(&ret->conditionFull);
+	pthread_cond_destroy(&ret->conditionEmpty);
 	free(od);
 }
 
@@ -103,6 +109,7 @@ static void osx_dropBufferedAudio(AudioOutput * audioOutput) {
 
 	pthread_mutex_lock(&od->mutex);
 	od->len = 0;
+	od->go = 0;
 	pthread_mutex_unlock(&od->mutex);
 }
 
@@ -110,8 +117,9 @@ static void osx_closeDevice(AudioOutput * audioOutput) {
 	OsxData * od = (OsxData *) audioOutput->data;
 
 	pthread_mutex_lock(&od->mutex);
+	od->go = 0;
 	while(od->len) {
-		pthread_cond_wait(&od->condition, &od->mutex);
+		pthread_cond_wait(&od->conditionEmpty, &od->mutex);
 	}
 	pthread_mutex_unlock(&od->mutex);
 
@@ -138,42 +146,18 @@ static OSStatus osx_render(void * vdata,
 	int bytesToCopy;
 	int curpos = 0;
 
-	/*DEBUG("osx_render: enter : %i\n", (int)bufferList->mNumberBuffers);
-	DEBUG("osx_render: ioActionFlags: %p\n", ioActionFlags);
-	if(ioActionFlags) {
-		if(*ioActionFlags & kAudioUnitRenderAction_PreRender) {
-			DEBUG("prerender\n");
-		}
-		if(*ioActionFlags & kAudioUnitRenderAction_PostRender) {
-			DEBUG("post render\n");
-		}
-		if(*ioActionFlags & kAudioUnitRenderAction_OutputIsSilence) {
-			DEBUG("post render\n");
-		}
-		if(*ioActionFlags & kAudioOfflineUnitRenderAction_Preflight) {
-			DEBUG("prefilight\n");
-		}
-		if(*ioActionFlags & kAudioOfflineUnitRenderAction_Render) {
-			DEBUG("render\n");
-		}
-		if(*ioActionFlags & kAudioOfflineUnitRenderAction_Complete) {
-			DEBUG("complete\n");
+	pthread_mutex_lock(&od->mutex);
+
+	while((od->go || od->len) && bufferSize) {
+		while(od->go && od->len < bufferSize && 
+				od->len < od->bufferSize)
+		{
+			pthread_cond_signal(&od->conditionEmpty);
+			pthread_cond_wait(&od->conditionFull, &od->mutex);
 		}
-	}*/
-
-	//while(bufferSize) {
-		//DEBUG("osx_render: lock\n");
-		pthread_mutex_lock(&od->mutex);
-		//DEBUG("%i:%i\n", bufferSize, od->len);
-		//while(od->go && od->len < bufferSize && 
-		//		od->len < od->bufferSize)
-		//{
-		//	DEBUG("osx_render: wait\n");
-		//	pthread_cond_wait(&od->condition, &od->mutex);
-		//}
 
 		bytesToCopy = od->len < bufferSize ? od->len : bufferSize;
-		bufferSize = bytesToCopy;
+		bufferSize -= bytesToCopy;
 		od->len -= bytesToCopy;
 
 		if(od->pos+bytesToCopy > od->bufferSize) {
@@ -189,18 +173,13 @@ static OSStatus osx_render(void * vdata,
 		curpos += bytesToCopy;
 
 		if(od->pos >= od->bufferSize) od->pos = 0;
-		//DEBUG("osx_render: unlock\n");
-		pthread_mutex_unlock(&od->mutex);
-		pthread_cond_signal(&od->condition);
-	//}
+	}
 
-	buffer->mDataByteSize = bufferSize;
+	buffer->mDataByteSize -= bufferSize;
 
-	if(!bufferSize) {
-		my_usleep(1000);
-	}
+	pthread_cond_signal(&od->conditionEmpty);
+	pthread_mutex_unlock(&od->mutex);
 
-	//DEBUG("osx_render: leave\n");
 	return 0;
 }
 
@@ -286,9 +265,8 @@ static int osx_play(AudioOutput * audioOutput, char * playChunk, int size) {
 	int bytesToCopy;
 	int curpos;
 
-	//DEBUG("osx_play: enter\n");
-
 	if(!od->started) {
+		od->go = 1;
 		od->started = 1;
 		int err = AudioOutputUnitStart(od->au);
 		if(err) {
@@ -299,16 +277,13 @@ static int osx_play(AudioOutput * audioOutput, char * playChunk, int size) {
 
 	pthread_mutex_lock(&od->mutex);
 
-	while(size) {
-		//DEBUG("osx_play: lock\n");
-		curpos = od->pos+od->len;
-		if(curpos >= od->bufferSize) curpos -= od->bufferSize;
+	curpos = od->pos+od->len;
+	if(curpos >= od->bufferSize) curpos -= od->bufferSize;
 
-		bytesToCopy = od->bufferSize < size ? od->bufferSize : size;
-
-		while(od->len > od->bufferSize-bytesToCopy) {
-			//DEBUG("osx_play: wait\n");
-			pthread_cond_wait(&od->condition, &od->mutex);
+	while(size) {
+		while(od->len >= od->bufferSize) {
+			pthread_cond_signal(&od->conditionFull);
+			pthread_cond_wait(&od->conditionEmpty, &od->mutex);
 		}
 
 		bytesToCopy = od->bufferSize - od->len;
@@ -328,11 +303,12 @@ static int osx_play(AudioOutput * audioOutput, char * playChunk, int size) {
 		curpos += bytesToCopy;
 		playChunk += bytesToCopy;
 
+		if(curpos >= od->bufferSize) curpos = 0;
 	}
-	//DEBUG("osx_play: unlock\n");
+
+	pthread_cond_signal(&od->conditionFull);
 	pthread_mutex_unlock(&od->mutex);
 
-	//DEBUG("osx_play: leave\n");
 	return 0;
 }
 
-- 
cgit v1.2.3