Linux Sound Bug [libao] [patch]

Found a bug? Please report it, but remember to follow the bug reporting guidelines.
Missing a sane feature? Let us know!
But please do NOT request ports to other systems.

Moderator: ZSNES Mods

Post Reply
mspang

Linux Sound Bug [libao] [patch]

Post by mspang »

In src/linux/audio.c, pthread_create() is called before pthread_mutex_init() and pthread_cond_init(). The created thread then tries to lock the (possibly uninitialized) mutex.

If the thread gets to pthread_mutex_lock() before the mutex is initialized, the sound thread deadlocks and there is no sound. This affects libao drivers, not SDL, but almost always occurs on my dual core machine (90% or more of the time).

The mutex and condition need to be initialized before creating the thread. Patch:

Code: Select all

diff -ur zsnes-1.510/src/linux/audio.c zsnes-1.510-new/src/linux/audio.c
--- zsnes-1.510/src/linux/audio.c	2007-01-09 20:19:12.000000000 -0500
+++ zsnes-1.510-new/src/linux/audio.c	2007-12-30 20:33:07.000000000 -0500
@@ -177,11 +177,7 @@
   }
   else
   {
-    if (pthread_create(&audio_thread, 0, SoundThread_ao, 0))
-    {
-      puts("pthread_create() failed.");
-    }
-    else if (pthread_mutex_init(&audio_mutex, 0))
+    if (pthread_mutex_init(&audio_mutex, 0))
     {
       puts("pthread_mutex_init() failed.");
     }
@@ -189,6 +185,10 @@
     {
       puts("pthread_cond_init() failed.");
     }
+    else if (pthread_create(&audio_thread, 0, SoundThread_ao, 0))
+    {
+      puts("pthread_create() failed.");
+    }
     InitSampleControl();
   }
Last edited by mspang on Wed Jan 02, 2008 6:14 am, edited 1 time in total.
Nach
ZSNES Developer
ZSNES Developer
Posts: 3904
Joined: Tue Jul 27, 2004 10:54 pm
Location: Solar powered park bench
Contact:

Post by Nach »

Thanks.
May 9 2007 - NSRT 3.4, now with lots of hashing and even more accurate information! Go download it.
_____________
Insane Coding
Post Reply