]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_oss.c
add cvars for world erp and cfm; remove pistons for ODE 0.9 support
[xonotic/darkplaces.git] / snd_oss.c
index 8980069181404aea89782a2669dd2c83b43fd51a..9926b800642fce99d9e6c569a34668b969e8945e 100644 (file)
--- a/snd_oss.c
+++ b/snd_oss.c
@@ -20,13 +20,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 // OSS module, used by Linux and FreeBSD
 
+#include "quakedef.h"
 
+#include <errno.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/soundcard.h>
 #include <unistd.h>
 
-#include "quakedef.h"
 #include "snd_main.h"
 
 
@@ -60,7 +61,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
 
                if (suggested != NULL)
                {
-                       memcpy(suggested, requested, sizeof(suggested));
+                       memcpy(suggested, requested, sizeof(*suggested));
 
                        if (requested->width < 1)
                                suggested->width = 1;
@@ -89,9 +90,9 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        }
        else
                Con_Print("SndSys_Init: fcntl(F_GETFL) failed!\n");
-
+       
        // Set the fragment size (up to "NB_FRAGMENTS" fragments of "fragmentsize" bytes)
-       fragmentsize = requested->speed * requested->channels * requested->width / 5;
+       fragmentsize = requested->speed * requested->channels * requested->width / 10;
        fragmentsize = (unsigned int)ceilf((float)fragmentsize / (float)NB_FRAGMENTS);
        fragmentsize = CeilPowerOf2(fragmentsize);
        ioctl_param = (NB_FRAGMENTS << 16) | log2i(fragmentsize);
@@ -101,6 +102,8 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
                SndSys_Shutdown ();
                return false;
        }
+       Con_Printf ("SndSys_Init: using %u fragments of %u bytes\n",
+                               ioctl_param >> 16, 1 << (ioctl_param & 0xFFFF));
 
        // Set the sound width
        if (requested->width == 1)
@@ -113,7 +116,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        {
                if (ioctl_param != prev_value && suggested != NULL)
                {
-                       memcpy(suggested, requested, sizeof(suggested));
+                       memcpy(suggested, requested, sizeof(*suggested));
 
                        if (ioctl_param == AFMT_S16_NE)
                                suggested->width = 2;
@@ -134,7 +137,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        {
                if (ioctl_param != requested->channels && suggested != NULL)
                {
-                       memcpy(suggested, requested, sizeof(suggested));
+                       memcpy(suggested, requested, sizeof(*suggested));
                        suggested->channels = ioctl_param;
                }
 
@@ -151,7 +154,7 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
        {
                if ((unsigned int)ioctl_param != requested->speed && suggested != NULL)
                {
-                       memcpy(suggested, requested, sizeof(suggested));
+                       memcpy(suggested, requested, sizeof(*suggested));
                        suggested->speed = ioctl_param;
                }
 
@@ -160,7 +163,11 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
                SndSys_Shutdown();
                return false;
        }
-       
+
+       // TOCHECK: I'm not sure which channel layout OSS uses for 5.1 and 7.1
+       if (snd_channellayout.integer == SND_CHANNELLAYOUT_AUTO)
+               Cvar_SetValueQuick (&snd_channellayout, SND_CHANNELLAYOUT_ALSA);
+
        old_osstime = 0;
        osssoundtime = 0;
        snd_renderbuffer = Snd_CreateRingBuffer(requested, 0, NULL);
@@ -180,7 +187,7 @@ void SndSys_Shutdown (void)
        // Stop the sound and close the device
        if (audio_fd >= 0)
        {
-               ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
+               ioctl(audio_fd, SNDCTL_DSP_RESET, NULL);
                close(audio_fd);
                audio_fd = -1;
        }
@@ -194,6 +201,42 @@ void SndSys_Shutdown (void)
 }
 
 
+/*
+====================
+SndSys_Write
+====================
+*/
+static int SndSys_Write (const unsigned char* buffer, unsigned int nb_bytes)
+{
+       int written;
+       unsigned int factor;
+
+       written = write (audio_fd, buffer, nb_bytes);
+       if (written < 0)
+       {
+               if (errno != EAGAIN)
+                       Con_Printf ("SndSys_Write: audio write returned %d! (errno= %d)\n",
+                                               written, errno);
+               return written;
+       }
+
+       factor = snd_renderbuffer->format.width * snd_renderbuffer->format.channels;
+       if (written % factor != 0)
+               Sys_Error ("SndSys_Write: nb of bytes written (%d) isn't aligned to a frame sample!\n",
+                                  written);
+
+       snd_renderbuffer->startframe += written / factor;
+
+       if ((unsigned int)written < nb_bytes)
+       {
+               Con_DPrintf("SndSys_Submit: audio can't keep up! (%u < %u)\n",
+                                       written, nb_bytes);
+       }
+
+       return written;
+}
+
+
 /*
 ====================
 SndSys_Submit
@@ -216,35 +259,15 @@ void SndSys_Submit (void)
        nbframes = snd_renderbuffer->endframe - snd_renderbuffer->startframe;
        if (nbframes > limit)
        {
-               written = write (audio_fd, &snd_renderbuffer->ring[startoffset * factor], limit * factor);
-               if (written < 0)
-               {
-                       Con_Printf("SndSys_Submit: audio write returned %d!\n", written);
-                       return;
-               }
-
-               if (written % factor != 0)
-                       Sys_Error("SndSys_Submit: nb of bytes written (%d) isn't aligned to a frame sample!\n", written);
-
-               snd_renderbuffer->startframe += written / factor;
-
-               if ((unsigned int)written < nbframes * factor)
-               {
-                       Con_Printf("SndSys_Submit: audio can't keep up! (%d < %u)\n", written, nbframes * factor);
+               written = SndSys_Write (&snd_renderbuffer->ring[startoffset * factor], limit * factor);
+               if (written < 0 || (unsigned int)written < limit * factor)
                        return;
-               }
                
                nbframes -= limit;
                startoffset = 0;
        }
 
-       written = write (audio_fd, &snd_renderbuffer->ring[startoffset * factor], nbframes * factor);
-       if (written < 0)
-       {
-               Con_Printf("SndSys_Submit: audio write returned %d!\n", written);
-               return;
-       }
-       snd_renderbuffer->startframe += written / factor;
+       SndSys_Write (&snd_renderbuffer->ring[startoffset * factor], nbframes * factor);
 }
 
 
@@ -261,7 +284,6 @@ unsigned int SndSys_GetSoundTime (void)
        int new_osstime;
        unsigned int timediff;
 
-       // TODO: use SNDCTL_DSP_GETODELAY instead
        if (ioctl (audio_fd, SNDCTL_DSP_GETOPTR, &count) == -1)
        {
                Con_Print ("SndSys_GetSoundTimeDiff: can't ioctl (SNDCTL_DSP_GETOPTR)\n");
@@ -308,3 +330,15 @@ void SndSys_UnlockRenderBuffer (void)
 {
        // Nothing to do
 }
+
+/*
+====================
+SndSys_SendKeyEvents
+
+Send keyboard events originating from the sound system (e.g. MIDI)
+====================
+*/
+void SndSys_SendKeyEvents(void)
+{
+       // not supported
+}