use a wakeup signal instead of lame polling (cleanups as a result coming)
This commit is contained in:
@@ -313,9 +313,11 @@ static void StartQueuedSounds()
|
|||||||
|
|
||||||
void GameSoundManager::Flush()
|
void GameSoundManager::Flush()
|
||||||
{
|
{
|
||||||
/* XXX: This is ugly; it'll wait a while, even if there's nothing to flush. */
|
|
||||||
g_Mutex->Lock();
|
g_Mutex->Lock();
|
||||||
g_bFlushing = true;
|
g_bFlushing = true;
|
||||||
|
|
||||||
|
g_Mutex->Broadcast();
|
||||||
|
|
||||||
while( g_bFlushing )
|
while( g_bFlushing )
|
||||||
g_Mutex->Wait();
|
g_Mutex->Wait();
|
||||||
g_Mutex->Unlock();
|
g_Mutex->Unlock();
|
||||||
@@ -330,7 +332,9 @@ int MusicThread_start( void *p )
|
|||||||
{
|
{
|
||||||
while( !g_Shutdown )
|
while( !g_Shutdown )
|
||||||
{
|
{
|
||||||
usleep( 10000 );
|
g_Mutex->Lock();
|
||||||
|
g_Mutex->Wait();
|
||||||
|
g_Mutex->Unlock();
|
||||||
|
|
||||||
/* This is a little hack: we want to make sure that we go through
|
/* This is a little hack: we want to make sure that we go through
|
||||||
* StartQueuedSounds after Flush() is called, to be sure we're flushed,
|
* StartQueuedSounds after Flush() is called, to be sure we're flushed,
|
||||||
@@ -376,8 +380,11 @@ GameSoundManager::GameSoundManager()
|
|||||||
GameSoundManager::~GameSoundManager()
|
GameSoundManager::~GameSoundManager()
|
||||||
{
|
{
|
||||||
/* Signal the mixing thread to quit. */
|
/* Signal the mixing thread to quit. */
|
||||||
g_Shutdown = true;
|
|
||||||
LOG->Trace("Shutting down music start thread ...");
|
LOG->Trace("Shutting down music start thread ...");
|
||||||
|
g_Mutex->Lock();
|
||||||
|
g_Shutdown = true;
|
||||||
|
g_Mutex->Broadcast();
|
||||||
|
g_Mutex->Unlock();
|
||||||
MusicThread.Wait();
|
MusicThread.Wait();
|
||||||
LOG->Trace("Music start thread shut down.");
|
LOG->Trace("Music start thread shut down.");
|
||||||
|
|
||||||
@@ -526,6 +533,10 @@ void GameSoundManager::PlayMusic( const CString &file, const CString &timing_fil
|
|||||||
/* Add the MusicToPlay to the g_MusicsToPlay queue. */
|
/* Add the MusicToPlay to the g_MusicsToPlay queue. */
|
||||||
if( !g_MusicsToPlay.write( &ToPlay, 1 ) )
|
if( !g_MusicsToPlay.write( &ToPlay, 1 ) )
|
||||||
delete ToPlay;
|
delete ToPlay;
|
||||||
|
|
||||||
|
g_Mutex->Lock();
|
||||||
|
g_Mutex->Broadcast();
|
||||||
|
g_Mutex->Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSoundManager::PlayMusic( const CString &file, TimingData *pTiming, bool force_loop, float start_sec, float length_sec, float fade_len, bool align_beat )
|
void GameSoundManager::PlayMusic( const CString &file, TimingData *pTiming, bool force_loop, float start_sec, float length_sec, float fade_len, bool align_beat )
|
||||||
@@ -551,6 +562,10 @@ void GameSoundManager::PlayMusic( const CString &file, TimingData *pTiming, bool
|
|||||||
/* Add the MusicToPlay to the g_MusicsToPlay queue. */
|
/* Add the MusicToPlay to the g_MusicsToPlay queue. */
|
||||||
if( !g_MusicsToPlay.write( &ToPlay, 1 ) )
|
if( !g_MusicsToPlay.write( &ToPlay, 1 ) )
|
||||||
delete ToPlay;
|
delete ToPlay;
|
||||||
|
|
||||||
|
g_Mutex->Lock();
|
||||||
|
g_Mutex->Broadcast();
|
||||||
|
g_Mutex->Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSoundManager::HandleSongTimer( bool on )
|
void GameSoundManager::HandleSongTimer( bool on )
|
||||||
@@ -565,6 +580,10 @@ void GameSoundManager::PlayOnce( CString sPath )
|
|||||||
CString *p = new CString( sPath );
|
CString *p = new CString( sPath );
|
||||||
if( !g_SoundsToPlayOnce.write( &p, 1 ) )
|
if( !g_SoundsToPlayOnce.write( &p, 1 ) )
|
||||||
delete p;
|
delete p;
|
||||||
|
|
||||||
|
g_Mutex->Lock();
|
||||||
|
g_Mutex->Broadcast();
|
||||||
|
g_Mutex->Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSoundManager::PlayOnceFromDir( CString PlayOnceFromDir )
|
void GameSoundManager::PlayOnceFromDir( CString PlayOnceFromDir )
|
||||||
@@ -573,6 +592,10 @@ void GameSoundManager::PlayOnceFromDir( CString PlayOnceFromDir )
|
|||||||
CString *p = new CString( PlayOnceFromDir );
|
CString *p = new CString( PlayOnceFromDir );
|
||||||
if( !g_SoundsToPlayOnceFromDir.write( &p, 1 ) )
|
if( !g_SoundsToPlayOnceFromDir.write( &p, 1 ) )
|
||||||
delete p;
|
delete p;
|
||||||
|
|
||||||
|
g_Mutex->Lock();
|
||||||
|
g_Mutex->Broadcast();
|
||||||
|
g_Mutex->Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSoundManager::PlayOnceFromAnnouncer( CString sFolderName )
|
void GameSoundManager::PlayOnceFromAnnouncer( CString sFolderName )
|
||||||
@@ -581,6 +604,10 @@ void GameSoundManager::PlayOnceFromAnnouncer( CString sFolderName )
|
|||||||
CString *p = new CString( sFolderName );
|
CString *p = new CString( sFolderName );
|
||||||
if( !g_SoundsToPlayOnceFromAnnouncer.write( &p, 1 ) )
|
if( !g_SoundsToPlayOnceFromAnnouncer.write( &p, 1 ) )
|
||||||
delete p;
|
delete p;
|
||||||
|
|
||||||
|
g_Mutex->Lock();
|
||||||
|
g_Mutex->Broadcast();
|
||||||
|
g_Mutex->Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
float GameSoundManager::GetPlayLatency() const
|
float GameSoundManager::GetPlayLatency() const
|
||||||
|
|||||||
Reference in New Issue
Block a user