- switch (state) {
- case SND_PCM_STATE_PREPARED:
- snd_pcm_mmap_commit (pcm, offset, nframes);
- snd_pcm_start (pcm);
- break;
- case SND_PCM_STATE_RUNNING:
- snd_pcm_mmap_commit (pcm, offset, nframes);
- break;
- default:
- break;
+ written = SndSys_Write (&snd_renderbuffer->ring[startoffset * factor], nbframes);
+ if (written < 0)
+ return;
+}
+
+
+/*
+====================
+SndSys_GetSoundTime
+
+Returns the number of sample frames consumed since the sound started
+====================
+*/
+unsigned int SndSys_GetSoundTime (void)
+{
+ snd_pcm_sframes_t delay, timediff;
+ int err;
+
+ if (pcm_handle == NULL)
+ return 0;
+
+ err = snd_pcm_delay (pcm_handle, &delay);
+ if (err < 0)
+ {
+ if (developer_insane.integer && vid_activewindow)
+ Con_DPrintf ("SndSys_GetSoundTime: can't get playback delay (%s)\n",
+ snd_strerror (err));
+
+ if (! SndSys_Recover (err))
+ return 0;
+
+ err = snd_pcm_delay (pcm_handle, &delay);
+ if (err < 0)
+ {
+ Con_DPrintf ("SndSys_GetSoundTime: can't get playback delay, again (%s)\n",
+ snd_strerror (err));
+ return 0;
+ }
+ }
+
+ if (expected_delay < delay)
+ {
+ Con_DPrintf ("SndSys_GetSoundTime: expected_delay(%ld) < delay(%ld)\n",
+ expected_delay, delay);
+ timediff = 0;