Merge pull request #123 from gameblabla/diablofix_hack
[pcsx_rearmed.git] / plugins / dfsound / alsa.c
index 1c02d37..6b9f83e 100644 (file)
@@ -16,6 +16,7 @@
  ***************************************************************************/
 
 #include <stdio.h>
+#include <string.h>
 #define ALSA_PCM_NEW_HW_PARAMS_API
 #define ALSA_PCM_NEW_SW_PARAMS_API
 #include <alsa/asoundlib.h>
@@ -184,11 +185,31 @@ static int alsa_busy(void)
 // FEED SOUND DATA
 static void alsa_feed(void *pSound, int lBytes)
 {
+ char sbuf[4096];
+
  if (handle == NULL) return;
 
  if (snd_pcm_state(handle) == SND_PCM_STATE_XRUN)
-  snd_pcm_prepare(handle);
- snd_pcm_writei(handle,pSound, lBytes / 4);
+  {
+   memset(sbuf, 0, sizeof(sbuf));
+   snd_pcm_prepare(handle);
+   snd_pcm_writei(handle, sbuf, sizeof(sbuf) / 4);
+   snd_pcm_writei(handle, sbuf, sizeof(sbuf) / 4);
+   snd_pcm_writei(handle, sbuf, sizeof(sbuf) / 4);
+  }
+ else
+  {
+   int l = snd_pcm_avail(handle);
+   if (l < lBytes / 4)
+    {
+     if (l == 0)
+      return;
+
+     lBytes = l * 4;
+    }
+  }
+
+ snd_pcm_writei(handle, pSound, lBytes / 4);
 }
 
 void out_register_alsa(struct out_driver *drv)