67 lines
1.1 KiB
C
67 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);
|
|
|
|
pthread_mutex_lock(&drv->mutex);
|
|
if(drv->quit){
|
|
pthread_mutex_unlock(&drv->mutex);
|
|
break;
|
|
}
|
|
pthread_mutex_unlock(&drv->mutex);
|
|
}
|
|
|
|
free(data);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void* 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;
|
|
|
|
pthread_mutex_init(&drv->mutex, NULL);
|
|
|
|
if(!(drv->init = drv_open(drv))){
|
|
MDEAudioClose(drv);
|
|
return NULL;
|
|
}
|
|
|
|
return drv;
|
|
}
|
|
|
|
void MDEAudioClose(void* handle){
|
|
driver_t* drv = handle;
|
|
void* ret;
|
|
|
|
if(drv->init){
|
|
pthread_mutex_lock(&drv->mutex);
|
|
drv->quit = 1;
|
|
pthread_mutex_unlock(&drv->mutex);
|
|
pthread_join(drv->thread, &ret);
|
|
}
|
|
|
|
pthread_mutex_destroy(&drv->mutex);
|
|
|
|
drv_close(drv);
|
|
|
|
free(drv);
|
|
}
|
|
|
|
void MDEAudioStart(void* handle){
|
|
driver_t* drv = handle;
|
|
|
|
pthread_create(&drv->thread, NULL, thread_routine, handle);
|
|
}
|