]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_win.c
Solaris compile fixes
[xonotic/darkplaces.git] / snd_win.c
index 850806316b0645fef175b6351761c832fbcfee2e..fff1e3aaf3c8a7326d9ef37eec78d51405892ce3 100644 (file)
--- a/snd_win.c
+++ b/snd_win.c
@@ -87,9 +87,9 @@ extern HWND mainwindow;
 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: how much buffer time, and how many partitions in that time
+#define WAV_BUFFERTIME 0.125
+#define        WAV_BUFFERS             16
 #define        WAV_MASK                (WAV_BUFFERS - 1)
 static unsigned int wav_buffer_size;
 
@@ -458,7 +458,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 = ((int)(requested->speed * WAV_BUFFERTIME) / WAV_BUFFERS) * requested->channels * requested->width;
 
        /*
         * Allocate and lock memory for the waveform data. The memory
@@ -699,17 +699,24 @@ void SndSys_Submit (void)
        {
                h = lpWaveHdr + (snd_sent & WAV_MASK);
 
-               snd_sent++;
                /*
                 * Now the data block can be sent to the output device. The
                 * waveOutWrite function returns immediately and waveform
                 * data is sent to the output device in the background.
                 */
                wResult = waveOutWrite(hWaveOut, h, sizeof(WAVEHDR));
-
-               if (wResult != MMSYSERR_NOERROR)
+               if (wResult == MMSYSERR_NOERROR)
+                       snd_sent++;
+               else if (wResult == WAVERR_STILLPLAYING)
                {
-                       Con_Print("Failed to write block to device\n");
+                       if(developer.integer >= 1000)
+                               Con_Print("waveOutWrite failed (too much sound data)\n");
+                       //h->dwFlags |= WHDR_DONE;
+                       //snd_sent++;
+               }
+               else
+               {
+                       Con_Printf("waveOutWrite failed, error code %d\n", (int) wResult);
                        SndSys_Shutdown ();
                        return;
                }
@@ -766,6 +773,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;