diff options
Diffstat (limited to 'src/audioOutputs')
-rw-r--r-- | src/audioOutputs/audioOutput_osx.c | 94 |
1 files changed, 35 insertions, 59 deletions
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; } |