Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+
+// OSS module, used by Linux and FreeBSD
+
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/soundcard.h>
#include <stdio.h>
#include "quakedef.h"
+#include "snd_main.h"
int audio_fd;
-int snd_inited;
static int tryrates[] = {44100, 22050, 11025, 8000};
#else
format16bit = AFMT_S16_LE;
#endif
- 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");
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;
else if ((i = COM_CheckParm("-sndmono")) != 0)
shm->format.channels = 1;
// COMMANDLINEOPTION: Linux OSS Sound: -sndstereo sets sound output to stereo
- else if ((i = COM_CheckParm("-sndstereo")) != 0)
+ else // if ((i = COM_CheckParm("-sndstereo")) != 0)
shm->format.channels = 2;
- else
- shm->format.channels = 2;
-
- 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_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->format.channels == 2)
- tmp = 1;
+ 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->format.channels);
+ Con_Printf("Could not set /dev/dsp to stereo=%d\n", tmp);
close(audio_fd);
return 0;
}
- if (tmp)
- shm->format.channels = 2;
- else
- shm->format.channels = 1;
rc = ioctl(audio_fd, SNDCTL_DSP_SPEED, &shm->format.speed);
if (rc < 0)
return 0;
}
+ shm->sampleframes = info.fragstotal * info.fragsize / shm->format.width / shm->format.channels;
+ shm->samples = shm->sampleframes * shm->format.channels;
+
+ // 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;
+ }
+
// toggle the trigger & start her up
tmp = 0;
rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
shm->samplepos = 0;
- snd_inited = 1;
return 1;
}
struct count_info count;
- if (!snd_inited) return 0;
+ if (!shm) return 0;
if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &count)==-1)
{
perror("/dev/dsp");
Con_Print("Uh, sound dead.\n");
- close(audio_fd);
- snd_inited = 0;
+ S_Shutdown();
return 0;
}
shm->samplepos = count.ptr / shm->format.width;
void SNDDMA_Shutdown(void)
{
int tmp;
- if (snd_inited)
- {
- // unmap the memory
- munmap(shm->buffer, shm->bufferlength);
- // stop the sound
- tmp = 0;
- ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
- ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
- // close the device
- close(audio_fd);
- audio_fd = -1;
- snd_inited = 0;
- }
+ // unmap the memory
+ munmap(shm->buffer, shm->bufferlength);
+ // stop the sound
+ tmp = 0;
+ ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
+ ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
+ // close the device
+ close(audio_fd);
+ audio_fd = -1;
}
/*