Cherry pick merge: /branches/soc-2011-pepper/intern/audaspace/OpenAL:r38630
authorJoerg Mueller <nexyon@gmail.com>
Sat, 23 Jul 2011 16:08:37 +0000 (16:08 +0000)
committerJoerg Mueller <nexyon@gmail.com>
Sat, 23 Jul 2011 16:08:37 +0000 (16:08 +0000)
Original log: Corrected the OpenAL device's threading code. This is a bugfix for #27913, thanks to Juha Mäki-Kanto for helping to resolve this.

intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
intern/audaspace/OpenAL/AUD_OpenALDevice.h

index b9e30bb..71e7b76 100644 (file)
@@ -105,12 +105,15 @@ void* AUD_openalRunThread(void* device)
        return NULL;
 }
 
-void AUD_OpenALDevice::start()
+void AUD_OpenALDevice::start(bool join)
 {
        lock();
 
        if(!m_playing)
        {
+               if(join)
+                       pthread_join(m_thread, NULL);
+
                pthread_attr_t attr;
                pthread_attr_init(&attr);
                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
@@ -271,8 +274,8 @@ void AUD_OpenALDevice::updateStreams()
                // stop thread
                if(m_playingSounds->empty() || (cerr != ALC_NO_ERROR))
                {
-                       unlock();
                        m_playing = false;
+                       unlock();
                        pthread_exit(NULL);
                }
 
@@ -366,6 +369,8 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize)
        pthread_mutex_init(&m_mutex, &attr);
 
        pthread_mutexattr_destroy(&attr);
+
+       start(false);
 }
 
 AUD_OpenALDevice::~AUD_OpenALDevice()
@@ -414,13 +419,8 @@ AUD_OpenALDevice::~AUD_OpenALDevice()
        alcProcessContext(m_context);
 
        // wait for the thread to stop
-       if(m_playing)
-       {
-               unlock();
-               pthread_join(m_thread, NULL);
-       }
-       else
-               unlock();
+       unlock();
+       pthread_join(m_thread, NULL);
 
        delete m_playingSounds;
        delete m_pausedSounds;
index 3bbbe85..127f69b 100644 (file)
@@ -106,7 +106,7 @@ private:
        /**
         * Starts the streaming thread.
         */
-       void start();
+       void start(bool join = true);
 
        /**
         * Checks if a handle is valid.