some potential optimizations for OS X
git-svn-id: https://svn.musicpd.org/mpd/trunk@3105 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
9297ae7fce
commit
cd03365fee
@ -25,6 +25,7 @@
|
||||
#include <pthread.h>
|
||||
|
||||
#include "../log.h"
|
||||
#include "../utils.h"
|
||||
|
||||
typedef struct _OsxData {
|
||||
AudioUnit au;
|
||||
@ -34,7 +35,6 @@ typedef struct _OsxData {
|
||||
int bufferSize;
|
||||
int pos;
|
||||
int len;
|
||||
int go;
|
||||
int started;
|
||||
} OsxData;
|
||||
|
||||
@ -46,7 +46,6 @@ static OsxData * newOsxData() {
|
||||
|
||||
ret->pos = 0;
|
||||
ret->len = 0;
|
||||
ret->go = 0;
|
||||
ret->started = 0;
|
||||
ret->buffer = NULL;
|
||||
ret->bufferSize = 0;
|
||||
@ -104,7 +103,6 @@ static void osx_dropBufferedAudio(AudioOutput * audioOutput) {
|
||||
|
||||
pthread_mutex_lock(&od->mutex);
|
||||
od->len = 0;
|
||||
od->go = 0;
|
||||
pthread_mutex_unlock(&od->mutex);
|
||||
}
|
||||
|
||||
@ -112,7 +110,6 @@ 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);
|
||||
}
|
||||
@ -141,18 +138,42 @@ static OSStatus osx_render(void * vdata,
|
||||
int bytesToCopy;
|
||||
int curpos = 0;
|
||||
|
||||
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->condition);
|
||||
pthread_cond_wait(&od->condition, &od->mutex);
|
||||
/*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");
|
||||
}
|
||||
}*/
|
||||
|
||||
//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) {
|
||||
@ -168,13 +189,18 @@ 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;
|
||||
|
||||
if(!bufferSize) {
|
||||
my_usleep(1000);
|
||||
}
|
||||
|
||||
buffer->mDataByteSize -= bufferSize;
|
||||
|
||||
pthread_cond_signal(&od->condition);
|
||||
pthread_mutex_unlock(&od->mutex);
|
||||
|
||||
//DEBUG("osx_render: leave\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -260,8 +286,9 @@ 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) {
|
||||
@ -272,12 +299,15 @@ static int osx_play(AudioOutput * audioOutput, char * playChunk, int size) {
|
||||
|
||||
pthread_mutex_lock(&od->mutex);
|
||||
|
||||
curpos = od->pos+od->len;
|
||||
if(curpos >= od->bufferSize) curpos -= od->bufferSize;
|
||||
|
||||
while(size) {
|
||||
while(od->len >= od->bufferSize) {
|
||||
pthread_cond_signal(&od->condition);
|
||||
//DEBUG("osx_play: lock\n");
|
||||
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);
|
||||
}
|
||||
|
||||
@ -298,12 +328,11 @@ static int osx_play(AudioOutput * audioOutput, char * playChunk, int size) {
|
||||
curpos += bytesToCopy;
|
||||
playChunk += bytesToCopy;
|
||||
|
||||
if(curpos >= od->bufferSize) curpos = 0;
|
||||
}
|
||||
|
||||
pthread_cond_signal(&od->condition);
|
||||
//DEBUG("osx_play: unlock\n");
|
||||
pthread_mutex_unlock(&od->mutex);
|
||||
|
||||
//DEBUG("osx_play: leave\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user