]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_win.c
Configure all of the CL_MeshEntities* meshes the same, the material flags decide...
[xonotic/darkplaces.git] / snd_win.c
index 2313e41938a3da2e2a0e53178407b60901006ea5..080122487a821d438a0e25eaad3070e4139294f0 100644 (file)
--- a/snd_win.c
+++ b/snd_win.c
@@ -17,8 +17,6 @@ along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 */
-#include "quakedef.h"
-#include "snd_main.h"
 
 #ifdef SUPPORTDIRECTX
 #ifndef DIRECTSOUND_VERSION
@@ -31,6 +29,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <dsound.h>
 #endif
 
+#include "qtypes.h"
+#include "quakedef.h"
+#include "snd_main.h"
+
 // ==============================================================================
 
 #ifndef _WAVEFORMATEXTENSIBLE_
@@ -82,13 +84,14 @@ static const GUID MY_KSDATAFORMAT_SUBTYPE_PCM =
 // ==============================================================================
 
 extern HWND mainwindow;
+static cvar_t snd_wav_partitionsize = {CVAR_SAVE, "snd_wav_partitionsize", "1024", "controls sound delay in samples, values too low will cause crackling, too high will cause delayed sounds"};
+static qboolean sndsys_registeredcvars = false;
 
 #ifdef SUPPORTDIRECTX
 HRESULT (WINAPI *pDirectSoundCreate)(GUID FAR *lpGUID, LPDIRECTSOUND FAR *lplpDS, IUnknown FAR *pUnkOuter);
 #endif
 
-// Wave output: how much buffer time, and how many partitions in that time
-#define WAV_BUFFERTIME 0.125
+// Wave output: queue of this many sound buffers to play, reused cyclically
 #define        WAV_BUFFERS             16
 #define        WAV_MASK                (WAV_BUFFERS - 1)
 static unsigned int wav_buffer_size;
@@ -237,7 +240,7 @@ static sndinitstat SndSys_InitDirectSound (const snd_format_t* requested)
                        return SIS_FAILURE;
                }
 
-               pDirectSoundCreate = (void *)GetProcAddress(hInstDS,"DirectSoundCreate");
+               pDirectSoundCreate = (HRESULT (__stdcall *)(GUID *, LPDIRECTSOUND *,IUnknown *))GetProcAddress(hInstDS,"DirectSoundCreate");
 
                if (!pDirectSoundCreate)
                {
@@ -458,7 +461,7 @@ static qboolean SndSys_InitMmsystem (const snd_format_t* requested)
                }
        }
 
-       wav_buffer_size = ((int)(requested->speed * WAV_BUFFERTIME) / WAV_BUFFERS) * requested->channels * requested->width;
+       wav_buffer_size = bound(128, snd_wav_partitionsize.integer, 8192) * requested->channels * requested->width;
 
        /*
         * Allocate and lock memory for the waveform data. The memory
@@ -473,7 +476,7 @@ static qboolean SndSys_InitMmsystem (const snd_format_t* requested)
                SndSys_Shutdown ();
                return false;
        }
-       lpData = GlobalLock(hData);
+       lpData = (HPSTR)GlobalLock(hData);
        if (!lpData)
        {
                Con_Print("Sound: Failed to lock.\n");
@@ -550,6 +553,12 @@ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested)
 #endif
        sndinitstat     stat;
 
+       if (!sndsys_registeredcvars)
+       {
+               sndsys_registeredcvars = true;
+               Cvar_RegisterVariable(&snd_wav_partitionsize);
+       }
+
        Con_Print ("SndSys_Init: using the Win32 module\n");
 
 #ifdef SUPPORTDIRECTX
@@ -709,8 +718,8 @@ void SndSys_Submit (void)
                        snd_sent++;
                else if (wResult == WAVERR_STILLPLAYING)
                {
-                       if(developer.integer >= 1000)
-                               Con_Print("waveOutWrite failed (too much sound data)\n");
+                       if(developer_insane.integer)
+                               Con_DPrint("waveOutWrite failed (too much sound data)\n");
                        //h->dwFlags |= WHDR_DONE;
                        //snd_sent++;
                }
@@ -737,8 +746,6 @@ Returns the number of sample frames consumed since the sound started
 unsigned int SndSys_GetSoundTime (void)
 {
        unsigned int factor;
-       MMRESULT res;
-       MMTIME mmtime;
 
        factor = snd_renderbuffer->format.width * snd_renderbuffer->format.channels;
 
@@ -764,7 +771,7 @@ unsigned int SndSys_GetSoundTime (void)
                {
                        if (snd_completed == snd_sent)
                        {
-                               Con_DPrint("Sound overrun\n");
+                       //      Con_DPrint("Sound overrun\n");
                                break;
                        }
 
@@ -779,12 +786,15 @@ unsigned int SndSys_GetSoundTime (void)
                /*
                 * S_PaintAndSubmit: WARNING: newsoundtime (soundtime (275 < 134217707)
                 * apparently this sound time wraps quite early?
+               {
+               MMRESULT res;
+               MMTIME mmtime;
 
                mmtime.wType = TIME_SAMPLES;
                res = waveOutGetPosition(hWaveOut, &mmtime, sizeof(mmtime));
                if(res == MMSYSERR_NOERROR)
                        return mmtime.u.sample;
-
+               }
                */
        }
 
@@ -873,3 +883,15 @@ void SndSys_UnlockRenderBuffer (void)
                IDirectSoundBuffer_Unlock(pDSBuf, dsound_pbuf, dsound_dwSize, dsound_pbuf2, dsound_dwSize2);
 #endif
 }
+
+/*
+====================
+SndSys_SendKeyEvents
+
+Send keyboard events originating from the sound system (e.g. MIDI)
+====================
+*/
+void SndSys_SendKeyEvents(void)
+{
+       // not supported
+}