diff options
Diffstat (limited to 'src/gaudout/gaudout.c')
-rw-r--r-- | src/gaudout/gaudout.c | 111 |
1 files changed, 109 insertions, 2 deletions
diff --git a/src/gaudout/gaudout.c b/src/gaudout/gaudout.c index 56692453..c0d673a0 100644 --- a/src/gaudout/gaudout.c +++ b/src/gaudout/gaudout.c @@ -16,11 +16,47 @@ #if GFX_USE_GAUDOUT || defined(__DOXYGEN__) - #error "GAUDOUT: Not implemented yet" +#include "src/gaudout/driver.h" + +static gfxQueueASync playlist; +static gfxQueueGSync freelist; + +static uint16_t audFlags; + #define AUDOUTFLG_RUNNING 0x0001 + #define AUDOUTFLG_USE_EVENTS 0x0002 + +#if GFX_USE_GEVENT + static GTimer AudGTimer; + + static void AudGTimerCallback(void *param) { + (void) param; + GSourceListener *psl; + GEventADC *pe; + + psl = 0; + while ((psl = geventGetSourceListener((GSourceHandle)(&aud), psl))) { + if (!(pe = (GEventAudioIn *)geventGetEventBuffer(psl))) { + // This listener is missing - save this. + psl->srcflags |= GAUDIN_LOSTEVENT; + continue; + } + + pe->type = GEVENT_AUDIO_IN; + pe->channel = aud.channel; + pe->count = lastcount; + pe->buffer = lastbuffer; + pe->flags = psl->srcflags; + psl->srcflags = 0; + geventSendEvent(psl); + } + } +#endif + void _gaudoutInit(void) { - /* ToDo */ + gfxQueueASyncInit(&playlist); + gfxQueueGSyncInit(&freelist); } void _gaudoutDeinit(void) @@ -28,6 +64,77 @@ void _gaudoutDeinit(void) /* ToDo */ } +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); +} + +bool_t gaudioPlayInit(uint16_t channel, uint32_t frequency) { + gaudioPlayStop(); + gaudout_lld_deinit(); + return gaudout_lld_init(channel, frequency); +} + +void gaudioPlay(GAudioData *paud) { + if (paud) + gfxQueueASyncPut(&playlist, (gfxQueueASyncItem *)paud); + gaudout_lld_start(); +} + +void gaudioPlayPause(void) { + gaudout_lld_stop(); +} + +void gaudioPlayStop(void) { + GAudioData *paud; + + gaudout_lld_stop(); + while((paud = (GAudioData *)gfxQueueASyncGet(&playlist))) + gfxQueueGSyncPut(&freelist, (gfxQueueGSyncItem *)paud); +} + +bool_t gaudioPlaySetVolume(uint8_t vol) { + return gaudout_lld_set_volume(vol); +} + +/** + * Routines provided for use by drivers. + */ + +GAudioData *gaudoutGetDataBlockI(void) { + return (GAudioData *)gfxQueueASyncGet(&playlist); +} + +void gaudoutReleaseDataBlockI(GAudioData *paud) { + gfxQueueGSyncPut(&freelist, (gfxQueueGSyncItem *)paud); +} + + #endif /* GFX_USE_GAUDOUT */ /** @} */ |