]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_win.c
a bit of loading screen bar customization: new cvars scr_loadingscreen_barcolor,...
[xonotic/darkplaces.git] / snd_win.c
index 91fc49135b9b68714e92828142e3615848095eef..a7a2adff12571818a8f74629f8e821498585c7bf 100644 (file)
--- a/snd_win.c
+++ b/snd_win.c
@@ -82,14 +82,15 @@ 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: 64KB in 64 buffers of 1KB
-// (64KB is > 1 sec at 16-bit 22050 Hz mono, and is 1/3 sec at 16-bit 44100 Hz stereo)
-#define        WAV_BUFFERS             64
+// 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 +238,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 +459,7 @@ static qboolean SndSys_InitMmsystem (const snd_format_t* requested)
                }
        }
 
-       wav_buffer_size = (requested->speed / 2 / 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 +474,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 +551,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 +716,10 @@ 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++;
                }
                else
                {
@@ -760,7 +769,7 @@ unsigned int SndSys_GetSoundTime (void)
                {
                        if (snd_completed == snd_sent)
                        {
-                               Con_DPrint("Sound overrun\n");
+                       //      Con_DPrint("Sound overrun\n");
                                break;
                        }
 
@@ -771,6 +780,20 @@ unsigned int SndSys_GetSoundTime (void)
                }
 
                return (snd_completed * wav_buffer_size) / factor;
+
+               /*
+                * 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;
+               }
+               */
        }
 
        return 0;
@@ -858,3 +881,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
+}