aboutsummaryrefslogtreecommitdiffstats
path: root/src/gaudio/gaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gaudio/gaudio.c')
-rw-r--r--src/gaudio/gaudio.c75
1 files changed, 20 insertions, 55 deletions
diff --git a/src/gaudio/gaudio.c b/src/gaudio/gaudio.c
index a83dcd85..ee5cfce0 100644
--- a/src/gaudio/gaudio.c
+++ b/src/gaudio/gaudio.c
@@ -16,8 +16,6 @@
#if GFX_USE_GAUDIO
-static gfxQueueGSync freeList;
-
#if GAUDIO_NEED_PLAY
#include "src/gaudio/driver_play.h"
@@ -51,7 +49,6 @@ static gfxQueueGSync freeList;
void _gaudioInit(void)
{
- gfxQueueGSyncInit(&freeList);
#if GAUDIO_NEED_PLAY
gfxQueueASyncInit(&playList);
#if GFX_USE_GEVENT
@@ -70,48 +67,20 @@ void _gaudioInit(void)
void _gaudioDeinit(void)
{
#if GAUDIO_NEED_PLAY
+ gfxQueueASyncDeinit(&playList);
#if GFX_USE_GEVENT
gtimerDeinit(&playTimer);
#endif
gfxSemDestroy(&playComplete);
#endif
#if GAUDIO_NEED_RECORD
+ gfxQueueGSyncDeinit(&recordList);
#if GFX_USE_GEVENT
gtimerDeinit(&recordTimer);
#endif
#endif
}
-bool_t gaudioAllocBuffers(unsigned num, size_t size) {
- GAudioData *paud;
-
- if (num < 1)
- return FALSE;
-
- // Round up to a multiple of 4 to prevent problems with structure alignment
- size = (size + 3) & ~0x03;
-
- // Allocate the memory
- if (!(paud = gfxAlloc((size+sizeof(GAudioData)) * num)))
- return FALSE;
-
- // Add each of them to our free list
- for(;num--; paud = (GAudioData *)((char *)(paud+1)+size)) {
- paud->size = size;
- gfxQueueGSyncPut(&freeList, (gfxQueueGSyncItem *)paud);
- }
-
- return TRUE;
-}
-
-void gaudioReleaseBuffer(GAudioData *paud) {
- gfxQueueGSyncPut(&freeList, (gfxQueueGSyncItem *)paud);
-}
-
-GAudioData *gaudioGetBuffer(delaytime_t ms) {
- return (GAudioData *)gfxQueueGSyncGet(&freeList, ms);
-}
-
#if GAUDIO_NEED_PLAY
bool_t gaudioPlayInit(uint16_t channel, uint32_t frequency, ArrayDataFormat format) {
@@ -123,11 +92,11 @@ GAudioData *gaudioGetBuffer(delaytime_t ms) {
return TRUE;
}
- void gaudioPlay(GAudioData *paud) {
+ void gaudioPlay(GDataBuffer *pd) {
if (!(playFlags & PLAYFLG_ISINIT)) {
// Oops - init failed - return it directly to the free-list
- if (paud) {
- gfxQueueGSyncPut(&freeList, (gfxQueueGSyncItem *)paud);
+ if (pd) {
+ gfxBufferRelease(pd);
gfxYield(); // Make sure we get no endless cpu hogging loops
}
return;
@@ -145,12 +114,12 @@ GAudioData *gaudioGetBuffer(delaytime_t ms) {
}
void gaudioPlayStop(void) {
- GAudioData *paud;
+ GDataBuffer *pd;
if (playFlags & PLAYFLG_PLAYING)
gaudio_play_lld_stop();
- while((paud = (GAudioData *)gfxQueueASyncGet(&playList)))
- gfxQueueGSyncPut(&freeList, (gfxQueueGSyncItem *)paud);
+ while((pd = (GDataBuffer *)gfxQueueASyncGet(&playList)))
+ gfxBufferRelease(pd);
}
bool_t gaudioPlaySetVolume(uint8_t vol) {
@@ -182,7 +151,7 @@ GAudioData *gaudioGetBuffer(delaytime_t ms) {
psl->srcflags = 0;
if ((playFlags & PLAYFLG_PLAYING))
pe->flags |= GAUDIO_PLAY_PLAYING;
- if (!gfxQueueGSyncIsEmpty(&freeList))
+ if (gfxBufferIsAvailable())
pe->flags |= GAUDIO_PLAY_FREEBLOCK;
geventSendEvent(psl);
}
@@ -200,12 +169,12 @@ GAudioData *gaudioGetBuffer(delaytime_t ms) {
* Routines provided for use by drivers.
*/
- GAudioData *gaudioPlayGetDataBlockI(void) {
- return (GAudioData *)gfxQueueASyncGetI(&playList);
+ GDataBuffer *gaudioPlayGetDataBlockI(void) {
+ return (GDataBuffer *)gfxQueueASyncGetI(&playList);
}
- void gaudioPlayReleaseDataBlockI(GAudioData *paud) {
- gfxQueueGSyncPutI(&freeList, (gfxQueueGSyncItem *)paud);
+ void gaudioPlayReleaseDataBlockI(GDataBuffer *pd) {
+ gfxBufferReleaseI(pd);
#if GFX_USE_GEVENT
if (playFlags & PLAYFLG_USEEVENTS)
gtimerJabI(&playTimer);
@@ -242,17 +211,17 @@ GAudioData *gaudioGetBuffer(delaytime_t ms) {
}
void gaudioRecordStop(void) {
- GAudioData *paud;
+ GDataBuffer *pd;
if ((recordFlags & (RECORDFLG_RECORDING|RECORDFLG_STALLED)) == RECORDFLG_RECORDING)
gaudio_record_lld_stop();
recordFlags &= ~(RECORDFLG_RECORDING|RECORDFLG_STALLED);
- while((paud = (GAudioData *)gfxQueueGSyncGet(&recordList, TIME_IMMEDIATE)))
- gfxQueueGSyncPut(&freeList, (gfxQueueGSyncItem *)paud);
+ while((pd = (GDataBuffer *)gfxQueueGSyncGet(&recordList, TIME_IMMEDIATE)))
+ gfxBufferRelease(pd);
}
- GAudioData *gaudioRecordGetData(delaytime_t ms) {
- return (GAudioData *)gfxQueueGSyncGet(&recordList, ms);
+ GDataBuffer *gaudioRecordGetData(delaytime_t ms) {
+ return (GDataBuffer *)gfxQueueGSyncGet(&recordList, ms);
}
#if GFX_USE_GEVENT
@@ -276,7 +245,7 @@ GAudioData *gaudioGetBuffer(delaytime_t ms) {
if ((recordFlags & RECORDFLG_STALLED))
pe->flags |= GAUDIO_RECORD_STALL;
if (!gfxQueueGSyncIsEmpty(&recordList))
- pe->flags |= GAUDIO_RECORD_GOTBLOCK;
+ pe->flags |= GAUDIO_RECORD_GOTBUFFER;
geventSendEvent(psl);
}
}
@@ -293,11 +262,7 @@ GAudioData *gaudioGetBuffer(delaytime_t ms) {
* Routines provided for use by drivers.
*/
- GAudioData *gaudioRecordGetFreeBlockI(void) {
- return (GAudioData *)gfxQueueGSyncGetI(&freeList);
- }
-
- void gaudioRecordSaveDataBlockI(GAudioData *paud) {
+ void gaudioRecordSaveDataBlockI(GDataBuffer *paud) {
gfxQueueGSyncPutI(&recordList, (gfxQueueGSyncItem *)paud);
#if GFX_USE_GEVENT
if (recordFlags & RECORDFLG_USEEVENTS)