Cherry pick merge: /branches/soc-2011-pepper/intern/audaspace/OpenAL:r38630

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.
This commit is contained in:
Joerg Mueller
2011-07-23 16:08:37 +00:00
parent 8cbd88aeef
commit f4a30e473b
2 changed files with 10 additions and 10 deletions

View File

@@ -105,12 +105,15 @@ void* AUD_openalRunThread(void* device)
return NULL; return NULL;
} }
void AUD_OpenALDevice::start() void AUD_OpenALDevice::start(bool join)
{ {
lock(); lock();
if(!m_playing) if(!m_playing)
{ {
if(join)
pthread_join(m_thread, NULL);
pthread_attr_t attr; pthread_attr_t attr;
pthread_attr_init(&attr); pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
@@ -271,8 +274,8 @@ void AUD_OpenALDevice::updateStreams()
// stop thread // stop thread
if(m_playingSounds->empty() || (cerr != ALC_NO_ERROR)) if(m_playingSounds->empty() || (cerr != ALC_NO_ERROR))
{ {
unlock();
m_playing = false; m_playing = false;
unlock();
pthread_exit(NULL); pthread_exit(NULL);
} }
@@ -366,6 +369,8 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize)
pthread_mutex_init(&m_mutex, &attr); pthread_mutex_init(&m_mutex, &attr);
pthread_mutexattr_destroy(&attr); pthread_mutexattr_destroy(&attr);
start(false);
} }
AUD_OpenALDevice::~AUD_OpenALDevice() AUD_OpenALDevice::~AUD_OpenALDevice()
@@ -414,13 +419,8 @@ AUD_OpenALDevice::~AUD_OpenALDevice()
alcProcessContext(m_context); alcProcessContext(m_context);
// wait for the thread to stop // wait for the thread to stop
if(m_playing)
{
unlock(); unlock();
pthread_join(m_thread, NULL); pthread_join(m_thread, NULL);
}
else
unlock();
delete m_playingSounds; delete m_playingSounds;
delete m_pausedSounds; delete m_pausedSounds;

View File

@@ -106,7 +106,7 @@ private:
/** /**
* Starts the streaming thread. * Starts the streaming thread.
*/ */
void start(); void start(bool join = true);
/** /**
* Checks if a handle is valid. * Checks if a handle is valid.