ref: 02611e064eceed8d8cda8cc4d6e60f8f1833ea72
dir: /snd_9.c/
#include <u.h>
#include <libc.h>
#include <stdio.h>
#include <thread.h>
#include "quakedef.h"
int audio_fd;
int snd_inited;
int wpos;
int stid = -1;
enum{
Nbuf = 16
};
Channel *schan;
void sproc (void *)
{
int n;
for(;;){
if(recv(schan, nil) < 0){
Sys_Warn("sproc:recv");
break;
}
if((n = write(audio_fd, shm->buffer, shm->samplebits/8 * shm->samples)) < 0){
Sys_Warn("SNDDMA_Submit:write");
break;
}
wpos += n;
}
stid = -1;
}
qboolean SNDDMA_Init(void)
{
int i;
snd_inited = 0;
if((audio_fd = open("/dev/audio", OWRITE)) < 0){
Sys_Warn("SNDDMA_Init:open");
Con_Printf("Could not open /dev/audio\n");
return 0;
}
shm = &sn;
shm->splitbuffer = 0;
if((i = COM_CheckParm("-sndbits")) != 0)
shm->samplebits = atoi(com_argv[i+1]);
if(shm->samplebits != 16 && shm->samplebits != 8)
shm->samplebits = 16;
if((i = COM_CheckParm("-sndspeed")) != 0)
shm->speed = atoi(com_argv[i+1]);
else
shm->speed = 44100;
shm->channels = 2;
if(COM_CheckParm("-sndmono") != 0)
shm->channels = 1;
//else if(COM_CheckParm("-sndstereo") != 0)
// shm->channels = 2;
//shm->samples = info.fragstotal * info.fragsize / (shm->samplebits/8);
shm->samples = 1024;
shm->submission_chunk = 1;
if((shm->buffer = mallocz(shm->samplebits/8 * shm->samples, 1)) == nil){
Sys_Warn("SNDDMA_Init:malloc");
close(audio_fd);
return 0;
}
shm->samplepos = 0;
schan = chancreate(sizeof(int), Nbuf);
if((stid = proccreate(sproc, nil, mainstacksize)) < 0){
Sys_Warn("proccreate sproc");
return 0;
}
snd_inited = 1;
return 1;
}
int SNDDMA_GetDMAPos(void)
{
if(!snd_inited)
return 0;
shm->samplepos = wpos / (shm->samplebits/8);
return shm->samplepos;
}
void SNDDMA_Shutdown(void)
{
if(snd_inited){
close(audio_fd);
free(shm->buffer);
if(stid != -1){
threadkill(stid);
stid = -1;
}
chanclose(schan);
chanfree(schan);
snd_inited = 0;
}
}
void SNDDMA_Submit(void)
{
if(nbsend(schan, nil) < 0){
Sys_Warn("SNDDMA_Submit:send");
SNDDMA_Shutdown();
}
}