X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=snd_oss.c;h=eef8e62c9681a851357b69ec8ddba4e79e3b7ee4;hb=c3a1653e58a354780cc920457b7b29482386cbb9;hp=e5fddc2fe2a8978d78dce8ddcb7828b36235d2ba;hpb=4bc2b976a0981156967708a35cb6a68edfd2f5fb;p=xonotic%2Fdarkplaces.git diff --git a/snd_oss.c b/snd_oss.c index e5fddc2f..eef8e62c 100644 --- a/snd_oss.c +++ b/snd_oss.c @@ -17,6 +17,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +// OSS module, used by Linux and FreeBSD + #include #include #include @@ -28,11 +31,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "quakedef.h" +#include "snd_main.h" int audio_fd; int snd_inited; -static int tryrates[] = {44100, 22051, 11025, 8000}; +static int tryrates[] = {44100, 22050, 11025, 8000}; qboolean SNDDMA_Init(void) { @@ -53,7 +57,7 @@ qboolean SNDDMA_Init(void) snd_inited = 0; // open /dev/dsp, confirm capability to mmap, and get size of dma buffer - audio_fd = open("/dev/dsp", O_RDWR); + audio_fd = open("/dev/dsp", O_RDWR); // we have to open it O_RDWR for mmap if (audio_fd < 0) { perror("/dev/dsp"); @@ -95,83 +99,65 @@ qboolean SNDDMA_Init(void) // set sample bits & speed s = getenv("QUAKE_SOUND_SAMPLEBITS"); if (s) - shm->samplebits = atoi(s); + shm->format.width = atoi(s) / 8; +// COMMANDLINEOPTION: Linux OSS Sound: -sndbits chooses 8 bit or 16 bit sound output else if ((i = COM_CheckParm("-sndbits")) != 0) - shm->samplebits = atoi(com_argv[i+1]); + shm->format.width = atoi(com_argv[i+1]) / 8; - if (shm->samplebits != 16 && shm->samplebits != 8) + if (shm->format.width != 2 && shm->format.width != 1) { ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &fmt); if (fmt & format16bit) - shm->samplebits = 16; + shm->format.width = 2; else if (fmt & AFMT_U8) - shm->samplebits = 8; + shm->format.width = 1; } s = getenv("QUAKE_SOUND_SPEED"); if (s) - shm->speed = atoi(s); + shm->format.speed = atoi(s); +// COMMANDLINEOPTION: Linux OSS Sound: -sndspeed chooses 44100 hz, 22100 hz, or 11025 hz sound output rate else if ((i = COM_CheckParm("-sndspeed")) != 0) - shm->speed = atoi(com_argv[i+1]); + shm->format.speed = atoi(com_argv[i+1]); else { - for (i = 0;i < (int) sizeof(tryrates) / 4;i++) + for (i = 0;i < (int) sizeof(tryrates) / (int) sizeof(tryrates[0]);i++) if (!ioctl(audio_fd, SNDCTL_DSP_SPEED, &tryrates[i])) break; - shm->speed = tryrates[i]; + shm->format.speed = tryrates[i]; } s = getenv("QUAKE_SOUND_CHANNELS"); if (s) - shm->channels = atoi(s); + shm->format.channels = atoi(s); +// COMMANDLINEOPTION: Linux OSS Sound: -sndmono sets sound output to mono else if ((i = COM_CheckParm("-sndmono")) != 0) - shm->channels = 1; - else if ((i = COM_CheckParm("-sndstereo")) != 0) - shm->channels = 2; - else - shm->channels = 2; - - shm->samples = info.fragstotal * info.fragsize / (shm->samplebits/8); - - // memory map the dma buffer - shm->bufferlength = info.fragstotal * info.fragsize; - shm->buffer = (unsigned char *) mmap(NULL, shm->bufferlength, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, audio_fd, 0); - if (!shm->buffer || shm->buffer == (unsigned char *)-1) - { - perror("/dev/dsp"); - Con_Print("Could not mmap /dev/dsp\n"); - close(audio_fd); - return 0; - } - - tmp = 0; - if (shm->channels == 2) - tmp = 1; + shm->format.channels = 1; +// COMMANDLINEOPTION: Linux OSS Sound: -sndstereo sets sound output to stereo + else // if ((i = COM_CheckParm("-sndstereo")) != 0) + shm->format.channels = 2; + tmp = (shm->format.channels == 2); rc = ioctl(audio_fd, SNDCTL_DSP_STEREO, &tmp); if (rc < 0) { perror("/dev/dsp"); - Con_Printf("Could not set /dev/dsp to stereo=%d\n", shm->channels); + Con_Printf("Could not set /dev/dsp to stereo=%d\n", tmp); close(audio_fd); return 0; } - if (tmp) - shm->channels = 2; - else - shm->channels = 1; - rc = ioctl(audio_fd, SNDCTL_DSP_SPEED, &shm->speed); + rc = ioctl(audio_fd, SNDCTL_DSP_SPEED, &shm->format.speed); if (rc < 0) { perror("/dev/dsp"); - Con_Printf("Could not set /dev/dsp speed to %d\n", shm->speed); + Con_Printf("Could not set /dev/dsp speed to %d\n", shm->format.speed); close(audio_fd); return 0; } - if (shm->samplebits == 16) + if (shm->format.width == 2) { rc = format16bit; rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc); @@ -183,7 +169,7 @@ qboolean SNDDMA_Init(void) return 0; } } - else if (shm->samplebits == 8) + else if (shm->format.width == 1) { rc = AFMT_U8; rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc); @@ -198,7 +184,20 @@ qboolean SNDDMA_Init(void) else { perror("/dev/dsp"); - Con_Printf("%d-bit sound not supported.\n", shm->samplebits); + Con_Printf("%d-bit sound not supported.\n", shm->format.width * 8); + close(audio_fd); + return 0; + } + + shm->samples = info.fragstotal * info.fragsize / shm->format.width; + + // memory map the dma buffer + shm->bufferlength = info.fragstotal * info.fragsize; + shm->buffer = (unsigned char *) mmap(NULL, shm->bufferlength, PROT_WRITE, MAP_FILE|MAP_SHARED, audio_fd, 0); + if (!shm->buffer || shm->buffer == (unsigned char *)-1) + { + perror("/dev/dsp"); + Con_Print("Could not mmap /dev/dsp\n"); close(audio_fd); return 0; } @@ -244,7 +243,7 @@ int SNDDMA_GetDMAPos(void) snd_inited = 0; return 0; } - shm->samplepos = count.ptr / (shm->samplebits / 8); + shm->samplepos = count.ptr / shm->format.width; return shm->samplepos; }