64 lines
1.1 KiB
C
64 lines
1.1 KiB
C
static void thread_routine(void* arg) {
|
|
driver_t* drv = arg;
|
|
void* data;
|
|
|
|
data = malloc(drv->frames * 2 * 2);
|
|
|
|
while(1) {
|
|
drv->handler(drv, drv->user, data, drv->frames);
|
|
|
|
drv_write(drv, data, drv->frames);
|
|
|
|
MDEMutexLock(drv->mutex);
|
|
if(drv->quit) {
|
|
MDEMutexUnlock(&drv->mutex);
|
|
break;
|
|
}
|
|
MDEMutexUnlock(drv->mutex);
|
|
}
|
|
|
|
free(data);
|
|
}
|
|
|
|
MDEAudio MDEAudioOpen(MDEAudioHandler handler, void* user) {
|
|
int rate = MDEAudioRate;
|
|
driver_t* drv = malloc(sizeof(*drv));
|
|
memset(drv, 0, sizeof(*drv));
|
|
|
|
drv->quit = 0;
|
|
drv->handler = handler;
|
|
drv->user = user;
|
|
drv->init = 0;
|
|
|
|
drv->mutex = MDEMutexCreate();
|
|
|
|
if(!(drv->init = drv_open(drv))) {
|
|
MDEAudioClose(drv);
|
|
return NULL;
|
|
}
|
|
|
|
return drv;
|
|
}
|
|
|
|
void MDEAudioClose(MDEAudio handle) {
|
|
driver_t* drv = handle;
|
|
|
|
if(drv->init) {
|
|
MDEMutexLock(drv->mutex);
|
|
drv->quit = 1;
|
|
MDEMutexLock(drv->mutex);
|
|
MDEThreadJoin(drv->thread);
|
|
}
|
|
|
|
MDEMutexDestroy(drv->mutex);
|
|
|
|
drv_close(drv);
|
|
|
|
free(drv);
|
|
}
|
|
|
|
void MDEAudioStart(MDEAudio handle) {
|
|
driver_t* drv = handle;
|
|
|
|
drv->thread = MDEThreadCreate(thread_routine, handle);
|
|
}
|