aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/sfx/music.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/sfx/music.cpp')
-rw-r--r--engines/sci/sfx/music.cpp42
1 files changed, 24 insertions, 18 deletions
diff --git a/engines/sci/sfx/music.cpp b/engines/sci/sfx/music.cpp
index 1931bf8757..089ae41afa 100644
--- a/engines/sci/sfx/music.cpp
+++ b/engines/sci/sfx/music.cpp
@@ -123,7 +123,9 @@ bool SciMusic::saveState(Common::OutSaveFile *pFile) {
}
//----------------------------------------
-void SciMusic::stopAll() {
+void SciMusic::clearPlayList() {
+ Common::StackLock lock(_mutex);
+
_pMixer->stopAll();
while (!_playList.empty()) {
@@ -132,6 +134,22 @@ void SciMusic::stopAll() {
}
}
//----------------------------------------
+void SciMusic::stopAll() {
+ Common::StackLock lock(_mutex);
+
+ SegManager *segMan = ((SciEngine *)g_engine)->getEngineState()->_segMan; // HACK
+
+ for (uint32 i = 0; i < _playList.size(); i++) {
+ if (_soundVersion <= SCI_VERSION_0_LATE)
+ PUT_SEL32V(segMan, _playList[i]->soundObj, state, kSndStatusStopped);
+ else
+ PUT_SEL32V(segMan, _playList[i]->soundObj, signal, SIGNAL_OFFSET);
+
+ _playList[i]->dataInc = 0;
+ soundStop(_playList[i]);
+ }
+}
+//----------------------------------------
void SciMusic::miditimerCallback(void *p) {
SciMusic* aud = (SciMusic *)p;
aud->onTimer();
@@ -331,7 +349,7 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {
}
//----------------------------------------
void SciMusic::onTimer() {
- _mutex.lock();
+ Common::StackLock lock(_mutex);
uint sz = _playList.size();
for (uint i = 0; i < sz; i++) {
@@ -359,8 +377,6 @@ void SciMusic::onTimer() {
}
}
}//for()
-
- _mutex.unlock();
}
//---------------------------------------------
void SciMusic::doFade(MusicEntry *pSnd) {
@@ -388,27 +404,24 @@ void SciMusic::doFade(MusicEntry *pSnd) {
//---------------------------------------------
void SciMusic::soundPlay(MusicEntry *pSnd) {
+ Common::StackLock lock(_mutex);
uint sz = _playList.size(), i;
// searching if sound is already in _playList
for (i = 0; i < sz && _playList[i] != pSnd; i++)
;
if (i == sz) {// not found
- _mutex.lock();
_playList.push_back(pSnd);
sortPlayList();
- _mutex.unlock();
}
if (pSnd->pStreamAud && !_pMixer->isSoundHandleActive(pSnd->hCurrentAud)) {
_pMixer->playInputStream(Audio::Mixer::kSFXSoundType, &pSnd->hCurrentAud,
pSnd->pStreamAud, -1, pSnd->volume, 0, false);
} else if (pSnd->pMidiParser) {
- _mutex.lock();
pSnd->pMidiParser->setVolume(pSnd->volume);
if (pSnd->status == kSndStatusStopped)
pSnd->pMidiParser->jumpToTick(0);
- _mutex.unlock();
}
pSnd->status = kSndStatusPlaying;
@@ -430,15 +443,14 @@ void SciMusic::soundSetVolume(MusicEntry *pSnd, byte volume) {
}
//---------------------------------------------
void SciMusic::soundSetPriority(MusicEntry *pSnd, byte prio) {
- _mutex.lock();
+ Common::StackLock lock(_mutex);
pSnd->prio = prio;
sortPlayList();
-
- _mutex.unlock();
}
//---------------------------------------------
void SciMusic::soundKill(MusicEntry *pSnd) {
+ Common::StackLock lock(_mutex);
pSnd->status = kSndStatusStopped;
@@ -452,8 +464,6 @@ void SciMusic::soundKill(MusicEntry *pSnd) {
pSnd->pStreamAud = NULL;
}
- _mutex.lock();
-
uint sz = _playList.size(), i;
// Remove sound from playlist
for (i = 0; i < sz; i++) {
@@ -464,8 +474,6 @@ void SciMusic::soundKill(MusicEntry *pSnd) {
break;
}
}
-
- _mutex.unlock();
}
//---------------------------------------------
void SciMusic::soundPause(MusicEntry *pSnd) {
@@ -491,7 +499,7 @@ void SciMusic::soundSetMasterVolume(uint16 vol) {
}
void SciMusic::reconstructSounds(int savegame_version) {
- _mutex.lock();
+ Common::StackLock lock(_mutex);
SegManager *segMan = ((SciEngine *)g_engine)->getEngineState()->_segMan; // HACK
ResourceManager *resMan = ((SciEngine *)g_engine)->getEngineState()->resMan; // HACK
@@ -509,8 +517,6 @@ void SciMusic::reconstructSounds(int savegame_version) {
_playList[i]->soundRes = new SoundResource(_playList[i]->resnum, resMan, _soundVersion);
soundInitSnd(_playList[i]);
}
-
- _mutex.unlock();
}
} // end of namespace SCI