- changed logic of allocation fade tracks, now each normal track have own static fade track, (i know about affect on savagame state of imuse, but it's minor thing),

- added more thread locks, i hope they are create deadlocks somewhere

svn-id: r20417
This commit is contained in:
Paweł Kołodziejski 2006-02-05 19:57:59 +00:00
parent aae00f629c
commit f65e531a6e
3 changed files with 57 additions and 39 deletions

View File

@ -378,10 +378,12 @@ void IMuseDigital::switchToNextRegion(Track *track) {
if (track->curHookId == sampleHookId) {
if (fadeDelay != 0) {
Track *fadeTrack = cloneToFadeOutTrack(track, fadeDelay);
fadeTrack->dataOffset = _sound->getRegionOffset(fadeTrack->soundHandle, fadeTrack->curRegion);
fadeTrack->regionOffset = 0;
debug(5, "switchToNextRegion-sound(%d) select region %d, curHookId: %d", fadeTrack->soundId, fadeTrack->curRegion, fadeTrack->curHookId);
fadeTrack->curHookId = 0;
if (fadeTrack) {
fadeTrack->dataOffset = _sound->getRegionOffset(fadeTrack->soundHandle, fadeTrack->curRegion);
fadeTrack->regionOffset = 0;
debug(5, "switchToNextRegion-sound(%d) select region %d, curHookId: %d", fadeTrack->soundId, fadeTrack->curRegion, fadeTrack->curHookId);
fadeTrack->curHookId = 0;
}
}
track->curRegion = region;
debug(5, "switchToNextRegion-sound(%d) jump to region %d, curHookId: %d", track->soundId, track->curRegion, track->curHookId);
@ -390,9 +392,11 @@ void IMuseDigital::switchToNextRegion(Track *track) {
} else {
if (fadeDelay != 0) {
Track *fadeTrack = cloneToFadeOutTrack(track, fadeDelay);
fadeTrack->dataOffset = _sound->getRegionOffset(fadeTrack->soundHandle, fadeTrack->curRegion);
fadeTrack->regionOffset = 0;
debug(5, "switchToNextRegion-sound(%d) select region %d, curHookId: %d", fadeTrack->soundId, fadeTrack->curRegion, fadeTrack->curHookId);
if (fadeTrack) {
fadeTrack->dataOffset = _sound->getRegionOffset(fadeTrack->soundHandle, fadeTrack->curRegion);
fadeTrack->regionOffset = 0;
debug(5, "switchToNextRegion-sound(%d) select region %d, curHookId: %d", fadeTrack->soundId, fadeTrack->curRegion, fadeTrack->curHookId);
}
}
track->curRegion = region;
debug(5, "switchToNextRegion-sound(%d) jump to region %d, curHookId: %d", track->soundId, track->curRegion, track->curHookId);

View File

@ -160,6 +160,7 @@ void IMuseDigital::parseScriptCmds(int cmd, int b, int c, int d, int e, int f, i
}
void IMuseDigital::flushTracks() {
Common::StackLock lock(_mutex, "IMuseDigital::flushTracks()");
debug(5, "flushTracks()");
for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {
Track *track = _track[l];
@ -190,6 +191,7 @@ void IMuseDigital::flushTracks() {
}
void IMuseDigital::refreshScripts() {
Common::StackLock lock(_mutex, "IMuseDigital::refreshScripts()");
debug(5, "refreshScripts()");
bool found = false;
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
@ -236,6 +238,7 @@ void IMuseDigital::getLipSync(int soundId, int syncId, int32 msPos, int32 &width
msPos /= 16;
if (msPos < 65536) {
Common::StackLock lock(_mutex, "IMuseDigital::getLipSync()");
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
Track *track = _track[l];
if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
@ -263,6 +266,7 @@ void IMuseDigital::getLipSync(int soundId, int syncId, int32 msPos, int32 &width
}
int32 IMuseDigital::getPosInMs(int soundId) {
Common::StackLock lock(_mutex, "IMuseDigital::getPosInMs()");
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
Track *track = _track[l];
if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
@ -275,6 +279,7 @@ int32 IMuseDigital::getPosInMs(int soundId) {
}
int IMuseDigital::getSoundStatus(int sound) const {
Common::StackLock lock(_mutex, "IMuseDigital::getSoundStatus()");
debug(5, "IMuseDigital::getSoundStatus(%d)", sound);
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
Track *track = _track[l];
@ -290,6 +295,7 @@ int IMuseDigital::getSoundStatus(int sound) const {
}
void IMuseDigital::stopSound(int soundId) {
Common::StackLock lock(_mutex, "IMuseDigital::stopSound()");
debug(5, "IMuseDigital::stopSound(%d)", soundId);
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
Track *track = _track[l];
@ -300,6 +306,7 @@ void IMuseDigital::stopSound(int soundId) {
}
int32 IMuseDigital::getCurMusicPosInMs() {
Common::StackLock lock(_mutex, "IMuseDigital::getCurMusicPosInMs()");
int soundId = -1;
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
@ -315,6 +322,7 @@ int32 IMuseDigital::getCurMusicPosInMs() {
}
int32 IMuseDigital::getCurVoiceLipSyncWidth() {
Common::StackLock lock(_mutex, "IMuseDigital::getCurVoiceLipSyncWidth()");
int32 msPos = getPosInMs(kTalkSoundID) + 50;
int32 width = 0, height = 0;
@ -324,6 +332,7 @@ int32 IMuseDigital::getCurVoiceLipSyncWidth() {
}
int32 IMuseDigital::getCurVoiceLipSyncHeight() {
Common::StackLock lock(_mutex, "IMuseDigital::getCurVoiceLipSyncHeight()");
int32 msPos = getPosInMs(kTalkSoundID) + 50;
int32 width = 0, height = 0;
@ -333,6 +342,7 @@ int32 IMuseDigital::getCurVoiceLipSyncHeight() {
}
int32 IMuseDigital::getCurMusicLipSyncWidth(int syncId) {
Common::StackLock lock(_mutex, "IMuseDigital::getCurMusicLipSyncWidth()");
int soundId = -1;
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
@ -351,6 +361,7 @@ int32 IMuseDigital::getCurMusicLipSyncWidth(int syncId) {
}
int32 IMuseDigital::getCurMusicLipSyncHeight(int syncId) {
Common::StackLock lock(_mutex, "IMuseDigital::getCurMusicLipSyncHeight()");
int soundId = -1;
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

View File

@ -186,6 +186,7 @@ void IMuseDigital::startSound(int soundId, const char *soundName, int soundType,
}
void IMuseDigital::setPriority(int soundId, int priority) {
Common::StackLock lock(_mutex, "IMuseDigital::setPriority()");
debug(5, "IMuseDigital::setPriority(%d, %d)", soundId, priority);
assert ((priority >= 0) && (priority <= 127));
@ -198,6 +199,7 @@ void IMuseDigital::setPriority(int soundId, int priority) {
}
void IMuseDigital::setVolume(int soundId, int volume) {
Common::StackLock lock(_mutex, "IMuseDigital::setVolume()");
debug(5, "IMuseDigital::setVolume(%d, %d)", soundId, volume);
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
@ -220,6 +222,7 @@ void IMuseDigital::setHookId(int soundId, int hookId) {
}
int IMuseDigital::getCurMusicSoundId() {
Common::StackLock lock(_mutex, "IMuseDigital::getCurMusicSoundId()");
int soundId = -1;
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
@ -233,6 +236,7 @@ int IMuseDigital::getCurMusicSoundId() {
}
char *IMuseDigital::getCurMusicSoundName() {
Common::StackLock lock(_mutex, "IMuseDigital::getCurMusicSoundName()");
char *soundName = NULL;
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
@ -246,6 +250,7 @@ char *IMuseDigital::getCurMusicSoundName() {
}
void IMuseDigital::setPan(int soundId, int pan) {
Common::StackLock lock(_mutex, "IMuseDigital::setPan()");
debug(5, "IMuseDigital::setPan(%d, %d)", soundId, pan);
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
@ -257,6 +262,7 @@ void IMuseDigital::setPan(int soundId, int pan) {
}
void IMuseDigital::selectVolumeGroup(int soundId, int volGroupId) {
Common::StackLock lock(_mutex, "IMuseDigital::selectVolumeGroup()");
debug(5, "IMuseDigital::setGroupVolume(%d, %d)", soundId, volGroupId);
assert((volGroupId >= 1) && (volGroupId <= 4));
@ -287,7 +293,9 @@ void IMuseDigital::setFade(int soundId, int destVolume, int delay60HzTicks) {
}
void IMuseDigital::fadeOutMusic(int fadeDelay) {
Common::StackLock lock(_mutex, "IMuseDigital::fadeOutMusic()");
debug(5, "IMuseDigital::fadeOutMusic");
for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
Track *track = _track[l];
if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
@ -298,45 +306,40 @@ void IMuseDigital::fadeOutMusic(int fadeDelay) {
}
IMuseDigital::Track *IMuseDigital::cloneToFadeOutTrack(Track *track, int fadeDelay) {
Common::StackLock lock(_mutex, "IMuseDigital::cloneToFadeOutTrack()");
assert(track);
Track *fadeTrack = 0;
debug(5, "IMuseDigital::cloneToFadeOutTrack(%d, %d)", track->trackId, fadeDelay);
{
Common::StackLock lock(_mutex, "IMuseDigital::cloneToFadeOutTrack()");
for (int l = MAX_DIGITAL_TRACKS; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {
if (!_track[l]->used) {
fadeTrack = _track[l];
break;
}
}
if (fadeTrack == 0)
error("IMuseDigital::cloneToFadeOutTrack() Can't find free fade track");
fadeTrack->pan = track->pan;
fadeTrack->vol = track->vol;
fadeTrack->volGroupId = track->volGroupId;
fadeTrack->priority = track->priority;
fadeTrack->soundId = track->soundId;
fadeTrack->dataOffset = track->dataOffset;
fadeTrack->regionOffset = track->regionOffset;
fadeTrack->curRegion = track->curRegion;
fadeTrack->curHookId = track->curHookId;
fadeTrack->iteration = track->iteration;
fadeTrack->mixerFlags = track->mixerFlags;
fadeTrack->mod = track->mod;
fadeTrack->toBeRemoved = track->toBeRemoved;
fadeTrack->readyToRemove = track->readyToRemove;
fadeTrack->souStream = track->souStream;
fadeTrack->started = track->started;
fadeTrack->stream2 = track->stream2;
strcpy(fadeTrack->soundName, track->soundName);
fadeTrack->soundType = track->soundType;
fadeTrack->soundHandle = _sound->cloneSound(track->soundHandle);
assert(fadeTrack->soundHandle);
if (_track[track->trackId + MAX_DIGITAL_TRACKS]->used) {
warning("IMuseDigital::cloneToFadeOutTrack: Not free fade track");
return NULL;
}
fadeTrack = _track[track->trackId + MAX_DIGITAL_TRACKS];
fadeTrack->pan = track->pan;
fadeTrack->vol = track->vol;
fadeTrack->volGroupId = track->volGroupId;
fadeTrack->priority = track->priority;
fadeTrack->soundId = track->soundId;
fadeTrack->dataOffset = track->dataOffset;
fadeTrack->regionOffset = track->regionOffset;
fadeTrack->curRegion = track->curRegion;
fadeTrack->curHookId = track->curHookId;
fadeTrack->iteration = track->iteration;
fadeTrack->mixerFlags = track->mixerFlags;
fadeTrack->mod = track->mod;
fadeTrack->toBeRemoved = track->toBeRemoved;
fadeTrack->readyToRemove = track->readyToRemove;
fadeTrack->souStream = track->souStream;
fadeTrack->started = track->started;
fadeTrack->stream2 = track->stream2;
strcpy(fadeTrack->soundName, track->soundName);
fadeTrack->soundType = track->soundType;
fadeTrack->soundHandle = _sound->cloneSound(track->soundHandle);
assert(fadeTrack->soundHandle);
fadeTrack->volFadeDelay = fadeDelay;
fadeTrack->volFadeDest = 0;
fadeTrack->volFadeStep = (fadeTrack->volFadeDest - fadeTrack->vol) * 60 * (1000 / _callbackFps) / (1000 * fadeDelay);