summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch')
-rw-r--r--app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch145
1 files changed, 145 insertions, 0 deletions
diff --git a/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch b/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch
new file mode 100644
index 0000000..909dead
--- /dev/null
+++ b/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch
@@ -0,0 +1,145 @@
+From ff5414990645653bf43bf64adfc1ca77ffb9edcb Mon Sep 17 00:00:00 2001
+From: malc <av1474@comtv.ru>
+Date: Sun, 17 Jan 2010 00:25:29 +0300
+Subject: [PATCH] Revert "sdlaudio: make it suck less"
+
+This reverts commit 4839abe78fd466a3cf06faa7c362154afd5404f1.
+
+The commit was badly broken, Gentoo has sdl as the default driver,
+consequently 5 gentoo users have hit the breakage and were kind enough
+to report, so thank you:
+
+Claes Gyllenswrd
+vekin
+Chris
+
+But above all thanks to Toralf Foerster who actually provied enough
+information to pinpoint the breakage to sdlaudio.
+
+http://bugs.gentoo.org/show_bug.cgi?id=294269
+---
+ audio/sdlaudio.c | 80 +++++++++++++++++++++++++++++++++--------------------
+ 1 files changed, 50 insertions(+), 30 deletions(-)
+
+diff --git a/audio/sdlaudio.c b/audio/sdlaudio.c
+index aa39c33..8e7e5cb 100644
+--- a/audio/sdlaudio.c
++++ b/audio/sdlaudio.c
+@@ -41,8 +41,8 @@
+ typedef struct SDLVoiceOut {
+ HWVoiceOut hw;
+ int live;
++ int rpos;
+ int decr;
+- int pending;
+ } SDLVoiceOut;
+
+ static struct {
+@@ -225,10 +225,6 @@ static void sdl_callback (void *opaque, Uint8 *buf, int len)
+ HWVoiceOut *hw = &sdl->hw;
+ int samples = len >> hw->info.shift;
+
+- if (sdl_lock (s, "sdl_callback")) {
+- return;
+- }
+-
+ if (s->exit) {
+ return;
+ }
+@@ -236,34 +232,49 @@ static void sdl_callback (void *opaque, Uint8 *buf, int len)
+ while (samples) {
+ int to_mix, decr;
+
+- while (!sdl->pending) {
+- if (sdl_unlock (s, "sdl_callback")) {
+- return;
+- }
+-
+- sdl_wait (s, "sdl_callback");
+- if (s->exit) {
+- return;
+- }
+-
+- if (sdl_lock (s, "sdl_callback")) {
+- return;
+- }
+- sdl->pending += sdl->live;
+- sdl->live = 0;
++ /* dolog ("in callback samples=%d\n", samples); */
++ sdl_wait (s, "sdl_callback");
++ if (s->exit) {
++ return;
++ }
++
++ if (sdl_lock (s, "sdl_callback")) {
++ return;
++ }
++
++ if (audio_bug (AUDIO_FUNC, sdl->live < 0 || sdl->live > hw->samples)) {
++ dolog ("sdl->live=%d hw->samples=%d\n",
++ sdl->live, hw->samples);
++ return;
++ }
++
++ if (!sdl->live) {
++ goto again;
+ }
+
+- to_mix = audio_MIN (samples, sdl->pending);
+- decr = audio_pcm_hw_clip_out (hw, buf, to_mix, 0);
+- buf += decr << hw->info.shift;
++ /* dolog ("in callback live=%d\n", live); */
++ to_mix = audio_MIN (samples, sdl->live);
++ decr = to_mix;
++ while (to_mix) {
++ int chunk = audio_MIN (to_mix, hw->samples - hw->rpos);
++ struct st_sample *src = hw->mix_buf + hw->rpos;
++
++ /* dolog ("in callback to_mix %d, chunk %d\n", to_mix, chunk); */
++ hw->clip (buf, src, chunk);
++ sdl->rpos = (sdl->rpos + chunk) % hw->samples;
++ to_mix -= chunk;
++ buf += chunk << hw->info.shift;
++ }
+ samples -= decr;
++ sdl->live -= decr;
+ sdl->decr += decr;
+- sdl->pending -= decr;
+- }
+
+- if (sdl_unlock (s, "sdl_callback")) {
+- return;
++ again:
++ if (sdl_unlock (s, "sdl_callback")) {
++ return;
++ }
+ }
++ /* dolog ("done len=%d\n", len); */
+ }
+
+ static int sdl_write_out (SWVoiceOut *sw, void *buf, int len)
+@@ -281,9 +292,18 @@ static int sdl_run_out (HWVoiceOut *hw, int live)
+ return 0;
+ }
+
+- sdl->live = live;
+- decr = sdl->decr;
+- sdl->decr = 0;
++ if (sdl->decr > live) {
++ ldebug ("sdl->decr %d live %d sdl->live %d\n",
++ sdl->decr,
++ live,
++ sdl->live);
++ }
++
++ decr = audio_MIN (sdl->decr, live);
++ sdl->decr -= decr;
++
++ sdl->live = live - decr;
++ hw->rpos = sdl->rpos;
+
+ if (sdl->live > 0) {
+ sdl_unlock_and_post (s, "sdl_run_out");
+--
+1.7.0.4
+