dynamically allocate a buffer for 0.5s of audio for OS X
git-svn-id: https://svn.musicpd.org/mpd/trunk@3097 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
a85438792f
commit
700d7aa2a0
@ -26,13 +26,12 @@
|
|||||||
|
|
||||||
#include "../log.h"
|
#include "../log.h"
|
||||||
|
|
||||||
#define BUFFER_SIZE 131072
|
|
||||||
|
|
||||||
typedef struct _OsxData {
|
typedef struct _OsxData {
|
||||||
AudioUnit au;
|
AudioUnit au;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
pthread_cond_t condition;
|
pthread_cond_t condition;
|
||||||
char buffer[BUFFER_SIZE];
|
char * buffer;
|
||||||
|
int bufferSize;
|
||||||
int pos;
|
int pos;
|
||||||
int len;
|
int len;
|
||||||
int go;
|
int go;
|
||||||
@ -49,6 +48,8 @@ static OsxData * newOsxData() {
|
|||||||
ret->len = 0;
|
ret->len = 0;
|
||||||
ret->go = 0;
|
ret->go = 0;
|
||||||
ret->started = 0;
|
ret->started = 0;
|
||||||
|
ret->buffer = NULL;
|
||||||
|
ret->bufferSize = 0;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -89,6 +90,7 @@ static int osx_initDriver(AudioOutput * audioOutput, ConfigParam * param) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void freeOsxData(OsxData * od) {
|
static void freeOsxData(OsxData * od) {
|
||||||
|
if(od->buffer) free(od->buffer);
|
||||||
free(od);
|
free(od);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +145,7 @@ static OSStatus osx_render(void * vdata,
|
|||||||
|
|
||||||
while((od->go || od->len) && bufferSize) {
|
while((od->go || od->len) && bufferSize) {
|
||||||
while(od->go && od->len < bufferSize &&
|
while(od->go && od->len < bufferSize &&
|
||||||
od->len < BUFFER_SIZE)
|
od->len < od->bufferSize)
|
||||||
{
|
{
|
||||||
pthread_cond_signal(&od->condition);
|
pthread_cond_signal(&od->condition);
|
||||||
pthread_cond_wait(&od->condition, &od->mutex);
|
pthread_cond_wait(&od->condition, &od->mutex);
|
||||||
@ -153,8 +155,8 @@ static OSStatus osx_render(void * vdata,
|
|||||||
bufferSize -= bytesToCopy;
|
bufferSize -= bytesToCopy;
|
||||||
od->len -= bytesToCopy;
|
od->len -= bytesToCopy;
|
||||||
|
|
||||||
if(od->pos+bytesToCopy > BUFFER_SIZE) {
|
if(od->pos+bytesToCopy > od->bufferSize) {
|
||||||
int bytes = BUFFER_SIZE-od->pos;
|
int bytes = od->bufferSize-od->pos;
|
||||||
memcpy(buffer->mData+curpos, od->buffer+od->pos, bytes);
|
memcpy(buffer->mData+curpos, od->buffer+od->pos, bytes);
|
||||||
od->pos = 0;
|
od->pos = 0;
|
||||||
curpos += bytes;
|
curpos += bytes;
|
||||||
@ -165,7 +167,7 @@ static OSStatus osx_render(void * vdata,
|
|||||||
od->pos += bytesToCopy;
|
od->pos += bytesToCopy;
|
||||||
curpos += bytesToCopy;
|
curpos += bytesToCopy;
|
||||||
|
|
||||||
if(od->pos >= BUFFER_SIZE) od->pos = 0;
|
if(od->pos >= od->bufferSize) od->pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->mDataByteSize -= bufferSize;
|
buffer->mDataByteSize -= bufferSize;
|
||||||
@ -240,6 +242,11 @@ static int osx_openDevice(AudioOutput * audioOutput) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* create a buffer of 0.5s */
|
||||||
|
od->bufferSize = (audioFormat->sampleRate >> 1) *
|
||||||
|
(audioFormat->bits>>3) * (audioFormat->channels);
|
||||||
|
od->buffer = realloc(od->buffer, od->bufferSize);
|
||||||
|
|
||||||
od->pos = 0;
|
od->pos = 0;
|
||||||
od->len = 0;
|
od->len = 0;
|
||||||
|
|
||||||
@ -266,21 +273,21 @@ static int osx_play(AudioOutput * audioOutput, char * playChunk, int size) {
|
|||||||
pthread_mutex_lock(&od->mutex);
|
pthread_mutex_lock(&od->mutex);
|
||||||
|
|
||||||
curpos = od->pos+od->len;
|
curpos = od->pos+od->len;
|
||||||
if(curpos >= BUFFER_SIZE) curpos -= BUFFER_SIZE;
|
if(curpos >= od->bufferSize) curpos -= od->bufferSize;
|
||||||
|
|
||||||
while(size) {
|
while(size) {
|
||||||
while(od->len >= BUFFER_SIZE) {
|
while(od->len >= od->bufferSize) {
|
||||||
pthread_cond_signal(&od->condition);
|
pthread_cond_signal(&od->condition);
|
||||||
pthread_cond_wait(&od->condition, &od->mutex);
|
pthread_cond_wait(&od->condition, &od->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
bytesToCopy = BUFFER_SIZE - od->len;
|
bytesToCopy = od->bufferSize - od->len;
|
||||||
bytesToCopy = bytesToCopy < size ? bytesToCopy : size;
|
bytesToCopy = bytesToCopy < size ? bytesToCopy : size;
|
||||||
size -= bytesToCopy;
|
size -= bytesToCopy;
|
||||||
od->len += bytesToCopy;
|
od->len += bytesToCopy;
|
||||||
|
|
||||||
if(curpos+bytesToCopy > BUFFER_SIZE) {
|
if(curpos+bytesToCopy > od->bufferSize) {
|
||||||
int bytes = BUFFER_SIZE-curpos;
|
int bytes = od->bufferSize-curpos;
|
||||||
memcpy(od->buffer+curpos, playChunk, bytes);
|
memcpy(od->buffer+curpos, playChunk, bytes);
|
||||||
curpos = 0;
|
curpos = 0;
|
||||||
playChunk += bytes;
|
playChunk += bytes;
|
||||||
@ -291,7 +298,7 @@ static int osx_play(AudioOutput * audioOutput, char * playChunk, int size) {
|
|||||||
curpos += bytesToCopy;
|
curpos += bytesToCopy;
|
||||||
playChunk += bytesToCopy;
|
playChunk += bytesToCopy;
|
||||||
|
|
||||||
if(curpos >= BUFFER_SIZE) curpos = 0;
|
if(curpos >= od->bufferSize) curpos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_cond_signal(&od->condition);
|
pthread_cond_signal(&od->condition);
|
||||||
|
Loading…
Reference in New Issue
Block a user