Add RageSoundManager::StopPlayingSoundsForThisThread. We
need to stop playing the sounds that a thread started before exiting the thread, or it causes unpredictable behavior with DirectSound.
This commit is contained in:
@@ -71,6 +71,7 @@ RageSound::RageSound()
|
|||||||
position = 0;
|
position = 0;
|
||||||
stopped_position = 0;
|
stopped_position = 0;
|
||||||
playing = false;
|
playing = false;
|
||||||
|
playing_thread = 0;
|
||||||
databuf.reserve(internal_buffer_size);
|
databuf.reserve(internal_buffer_size);
|
||||||
|
|
||||||
/* Register ourself, so we have a unique ID and receive Update()s. */
|
/* Register ourself, so we have a unique ID and receive Update()s. */
|
||||||
@@ -103,6 +104,7 @@ RageSound::RageSound(const RageSound &cpy):
|
|||||||
position = cpy.position;
|
position = cpy.position;
|
||||||
stopped_position = cpy.stopped_position;
|
stopped_position = cpy.stopped_position;
|
||||||
playing = false;
|
playing = false;
|
||||||
|
playing_thread = 0;
|
||||||
|
|
||||||
databuf.reserve(internal_buffer_size);
|
databuf.reserve(internal_buffer_size);
|
||||||
Sample = cpy.Sample->Copy();
|
Sample = cpy.Sample->Copy();
|
||||||
@@ -579,6 +581,8 @@ void RageSound::StartPlaying()
|
|||||||
|
|
||||||
/* Tell the sound manager to start mixing us. */
|
/* Tell the sound manager to start mixing us. */
|
||||||
playing = true;
|
playing = true;
|
||||||
|
playing_thread = RageThread::GetCurrentThreadID();
|
||||||
|
|
||||||
SOUNDMAN->StartMixing(this);
|
SOUNDMAN->StartMixing(this);
|
||||||
SOUNDMAN->playing_sounds.insert( this );
|
SOUNDMAN->playing_sounds.insert( this );
|
||||||
}
|
}
|
||||||
@@ -598,6 +602,7 @@ void RageSound::StopPlaying()
|
|||||||
SOUNDMAN->lock.Unlock();
|
SOUNDMAN->lock.Unlock();
|
||||||
|
|
||||||
playing = false;
|
playing = false;
|
||||||
|
playing_thread = 0;
|
||||||
|
|
||||||
pos_map.clear();
|
pos_map.clear();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ public:
|
|||||||
bool SetPositionSeconds( float fSeconds );
|
bool SetPositionSeconds( float fSeconds );
|
||||||
CString GetLoadedFilePath() const { return m_sFilePath; }
|
CString GetLoadedFilePath() const { return m_sFilePath; }
|
||||||
bool IsPlaying() const { return playing; }
|
bool IsPlaying() const { return playing; }
|
||||||
|
unsigned GetPlayingThread() const { return playing_thread; }
|
||||||
|
|
||||||
float GetPlaybackRate() const;
|
float GetPlaybackRate() const;
|
||||||
RageTimer GetStartTime() const;
|
RageTimer GetStartTime() const;
|
||||||
@@ -158,6 +159,9 @@ private:
|
|||||||
int stopped_position;
|
int stopped_position;
|
||||||
bool playing;
|
bool playing;
|
||||||
|
|
||||||
|
/* If playing, record the thread that called Play(). */
|
||||||
|
unsigned playing_thread;
|
||||||
|
|
||||||
/* Unique ID number for this instance of RageSound. */
|
/* Unique ID number for this instance of RageSound. */
|
||||||
int ID;
|
int ID;
|
||||||
|
|
||||||
|
|||||||
@@ -195,6 +195,20 @@ void RageSoundManager::StopPlayingAllCopiesOfSound(RageSound &snd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RageSoundManager::StopPlayingSoundsForThisThread()
|
||||||
|
{
|
||||||
|
/* Lock to make sure sounds don't become invalidated below before we get to them. */
|
||||||
|
LockMut(lock);
|
||||||
|
|
||||||
|
set<RageSound *> Sounds = GetPlayingSounds();
|
||||||
|
for( set<RageSound *>::iterator it = Sounds.begin(); it != Sounds.end(); ++it )
|
||||||
|
{
|
||||||
|
if( (*it)->GetPlayingThread() != RageThread::GetCurrentThreadID() )
|
||||||
|
continue;
|
||||||
|
(*it)->Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RageSoundManager::GetCopies(RageSound &snd, vector<RageSound *> &snds)
|
void RageSoundManager::GetCopies(RageSound &snd, vector<RageSound *> &snds)
|
||||||
{
|
{
|
||||||
LockMut(lock);
|
LockMut(lock);
|
||||||
|
|||||||
@@ -56,6 +56,10 @@ public:
|
|||||||
RageSound *PlaySound( RageSound &snd, const RageSoundParams *params );
|
RageSound *PlaySound( RageSound &snd, const RageSoundParams *params );
|
||||||
void StopPlayingAllCopiesOfSound(RageSound &snd);
|
void StopPlayingAllCopiesOfSound(RageSound &snd);
|
||||||
|
|
||||||
|
/* Stop all sounds that were started by this thread. This should be called
|
||||||
|
* before exiting a thread. */
|
||||||
|
void StopPlayingSoundsForThisThread();
|
||||||
|
|
||||||
/* A list of all sounds that currently exist. RageSound adds and removes
|
/* A list of all sounds that currently exist. RageSound adds and removes
|
||||||
* itself to this. */
|
* itself to this. */
|
||||||
set<RageSound *> all_sounds;
|
set<RageSound *> all_sounds;
|
||||||
|
|||||||
Reference in New Issue
Block a user