19fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <unistd.h>
29fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <fcntl.h>
39fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <stdlib.h>
49fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <sys/types.h>
59fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <sys/ioctl.h>
69fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <sys/mman.h>
79fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <sys/shm.h>
89fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <sys/wait.h>
99fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <linux/soundcard.h>
109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <stdio.h>
119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint audio_fd;
149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint snd_inited;
159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int tryrates[] = { 11025, 22051, 44100, 8000 };
179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean SNDDMA_Init(void)
199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int rc;
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    int fmt;
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int tmp;
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    int i;
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    char *s;
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	struct audio_buf_info info;
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int caps;
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	snd_inited = 0;
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// open /dev/dsp, confirm capability to mmap, and get size of dma buffer
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    audio_fd = open("/dev/dsp", O_RDWR);
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (audio_fd < 0)
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        Con_Printf("Could not open /dev/dsp\n");
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    rc = ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (rc < 0)
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Could not reset /dev/dsp\n");
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (ioctl(audio_fd, SNDCTL_DSP_GETCAPS, &caps)==-1)
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        Con_Printf("Sound driver too old\n");
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!(caps & DSP_CAP_TRIGGER) || !(caps & DSP_CAP_MMAP))
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Sorry but your soundcard can't do this\n");
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info)==-1)
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    {
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        perror("GETOSPACE");
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Um, can't do GETOSPACE?\n");
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shm = &sn;
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    shm->splitbuffer = 0;
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// set sample bits & speed
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    s = getenv("QUAKE_SOUND_SAMPLEBITS");
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (s) shm->samplebits = atoi(s);
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if ((i = COM_CheckParm("-sndbits")) != 0)
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		shm->samplebits = atoi(com_argv[i+1]);
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (shm->samplebits != 16 && shm->samplebits != 8)
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    {
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &fmt);
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        if (fmt & AFMT_S16_LE) shm->samplebits = 16;
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        else if (fmt & AFMT_U8) shm->samplebits = 8;
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    s = getenv("QUAKE_SOUND_SPEED");
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (s) shm->speed = atoi(s);
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if ((i = COM_CheckParm("-sndspeed")) != 0)
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		shm->speed = atoi(com_argv[i+1]);
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    else
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    {
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        for (i=0 ; i<sizeof(tryrates)/4 ; i++)
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream            if (!ioctl(audio_fd, SNDCTL_DSP_SPEED, &tryrates[i])) break;
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        shm->speed = tryrates[i];
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    s = getenv("QUAKE_SOUND_CHANNELS");
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (s) shm->channels = atoi(s);
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if ((i = COM_CheckParm("-sndmono")) != 0)
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		shm->channels = 1;
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if ((i = COM_CheckParm("-sndstereo")) != 0)
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		shm->channels = 2;
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    else shm->channels = 2;
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shm->samples = info.fragstotal * info.fragsize / (shm->samplebits/8);
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shm->submission_chunk = 1;
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// memory map the dma buffer
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shm->buffer = (unsigned char *) mmap(NULL, info.fragstotal
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		* info.fragsize, PROT_WRITE, MAP_FILE|MAP_SHARED, audio_fd, 0);
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!shm->buffer)
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Could not mmap /dev/dsp\n");
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	tmp = 0;
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (shm->channels == 2)
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		tmp = 1;
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    rc = ioctl(audio_fd, SNDCTL_DSP_STEREO, &tmp);
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (rc < 0)
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    {
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        Con_Printf("Could not set /dev/dsp to stereo=%d", shm->channels);
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        return 0;
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (tmp)
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		shm->channels = 2;
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		shm->channels = 1;
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    rc = ioctl(audio_fd, SNDCTL_DSP_SPEED, &shm->speed);
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (rc < 0)
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    {
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        Con_Printf("Could not set /dev/dsp speed to %d", shm->speed);
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        return 0;
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (shm->samplebits == 16)
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    {
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        rc = AFMT_S16_LE;
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        if (rc < 0)
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			perror("/dev/dsp");
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf("Could not support 16-bit data.  Try 8-bit.\n");
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			close(audio_fd);
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 0;
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    else if (shm->samplebits == 8)
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    {
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        rc = AFMT_U8;
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        if (rc < 0)
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			perror("/dev/dsp");
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf("Could not support 8-bit data.\n");
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			close(audio_fd);
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 0;
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("%d-bit sound not supported.", shm->samplebits);
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// toggle the trigger & start her up
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    tmp = 0;
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    rc  = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (rc < 0)
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Could not toggle.\n");
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    tmp = PCM_ENABLE_OUTPUT;
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (rc < 0)
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Could not toggle.\n");
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shm->samplepos = 0;
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	snd_inited = 1;
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return 1;
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint SNDDMA_GetDMAPos(void)
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	struct count_info count;
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!snd_inited) return 0;
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &count)==-1)
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		perror("/dev/dsp");
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Uh, sound dead.\n");
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		snd_inited = 0;
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return 0;
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	shm->samplepos = (count.bytes / (shm->samplebits / 8)) & (shm->samples-1);
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	fprintf(stderr, "%d    \r", count.ptr);
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	shm->samplepos = count.ptr / (shm->samplebits / 8);
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return shm->samplepos;
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid SNDDMA_Shutdown(void)
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (snd_inited)
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		close(audio_fd);
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		snd_inited = 0;
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSNDDMA_Submit
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSend sound to device if buffer isn't really the dma buffer
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid SNDDMA_Submit(void)
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
251