freebsd-ports/games/qudos/files/patch-src__unix__snd_oss.c
Alejandro Pulver a9c3759ed3 - Bump PORTREVISION.
- Remove FreeBSD 4.x support (USE_GCC=3.4+).
- Fix various sound problems, including crashes [1].

Obtained from:	games/q2p [1]
2007-09-14 01:16:49 +00:00

173 lines
3.8 KiB
C

--- src/unix/snd_oss.c.orig Thu Sep 13 20:13:40 2007
+++ src/unix/snd_oss.c Thu Sep 13 20:17:00 2007
@@ -25,12 +25,7 @@
#include <sys/mman.h>
#include <sys/shm.h>
#include <sys/wait.h>
-#if defined(__FreeBSD__)
#include <sys/soundcard.h>
-#endif
-#if defined(__linux__)
-#include <linux/soundcard.h>
-#endif
#include <stdio.h>
#include "../client/client.h"
@@ -43,7 +38,12 @@
struct sndinfo * si;
-static int tryrates[] = { 48000, 44100, 22050, 11025, 8000 };
+static int tryrates[] = {
+ 48000,
+ 44100,
+ 22050,
+ 11025
+};
qboolean
SNDDMA_Init(struct sndinfo * s)
@@ -53,22 +53,22 @@
int fmt;
int tmp;
int i;
- struct audio_buf_info info;
+ struct audio_buf_info info;
int caps;
-
+
if (snd_inited)
return 1;
snd_inited = 0;
si = s;
-
+
+#if defined (__linux__)
if(!strcmp(si->snddevice->string, "default")) //silly alsa default
si->snddevice->string = "/dev/dsp";
-
+#endif
/*
- * open /dev/dsp, confirm capability to mmap, and get size of dma
- * buffer
+ * open /dev/dsp, confirm capability to mmap, and get size of dma buffer
*/
if (audio_fd == -1) {
audio_fd = open(si->snddevice->string, O_RDWR);
@@ -100,8 +100,8 @@
audio_fd = -1;
return 0;
}
- /* set sample bits & speed */
-
+
+ /* set sample bits & speed */
si->dma->samplebits = (int)si->sndbits->value;
if (si->dma->samplebits != 16 && si->dma->samplebits != 8) {
ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &fmt);
@@ -139,22 +139,11 @@
}
si->dma->speed = (int)si->sndspeed->value;
-
- if (!si->dma->speed) {
-
- if (si->s_khz->value == 48) {
- si->dma->speed = 48000;
- }
- else if (si->s_khz->value == 44) {
- si->dma->speed = 44100;
- }
- else if (si->s_khz->value == 22) {
- si->dma->speed = 22050;
- }
- else {
- si->dma->speed = 11025;
- }
- si->dma->speed = 48000; /** Uhh **/
+ if (!si->dma->speed) {
+ if (si->s_khz->value == 48) si->dma->speed = 48000;
+ else if (si->s_khz->value == 44) si->dma->speed = 44100;
+ else if (si->s_khz->value == 22) si->dma->speed = 22050;
+ else si->dma->speed = 11025;
}
if (!si->dma->speed) {
@@ -163,6 +152,7 @@
break;
si->dma->speed = tryrates[i];
}
+
si->dma->channels = (int)si->sndchannels->value;
if (si->dma->channels < 1 || si->dma->channels > 2)
si->dma->channels = 2;
@@ -177,8 +167,9 @@
si->dma->channels);
close(audio_fd);
audio_fd = -1;
- return 0;
+ return 0;
}
+
if (tmp)
si->dma->channels = 2;
else
@@ -204,7 +195,6 @@
si->dma->submission_chunk = 1;
/* memory map the dma buffer */
-
if (!si->dma->buffer)
si->dma->buffer = (unsigned char *)mmap(NULL, info.fragstotal
* info.fragsize, PROT_WRITE, MAP_FILE|MAP_SHARED, audio_fd, 0);
@@ -215,8 +205,8 @@
audio_fd = -1;
return 0;
}
- /* toggle the trigger & start her up */
+ /* toggle the trigger & start her up */
tmp = 0;
rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
if (rc < 0) {
@@ -235,12 +225,12 @@
audio_fd = -1;
return 0;
}
-
-
- si->Com_Printf("\nInitializing OSS Sound System\n");
- si->Com_Printf("Buffer size: %d\n", info.fragstotal * info.fragsize);
-
+
si->dma->samplepos = 0;
+
+ si->Com_Printf("Initializing OSS Sound System\n");
+ si->Com_Printf("Buffer size: %d\n", info.fragstotal * info.fragsize);
+
snd_inited = 1;
return 1;
}
@@ -262,11 +252,6 @@
return 0;
}
- /*
- * dma.samplepos = (count.bytes / (dma.samplebits / 8)) &
- * (dma.samples-1);
- */
- /* fprintf(stderr, "%d \r", count.ptr); */
si->dma->samplepos = count.ptr / (si->dma->samplebits / 8);
return si->dma->samplepos;
@@ -286,7 +271,7 @@
snd_inited = 0;
}
#else
- printf ("SNDDMA_Shutdown\n");
+ si->Com_Printf("SNDDMA_Shutdown\n");
if (snd_inited) {
munmap (si->dma->buffer, si->dma->samples *si->dma->samplebits / 8);
si->dma->buffer = 0L;