aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/gob/cdrom.cpp75
-rw-r--r--engines/gob/cdrom.h7
-rw-r--r--engines/gob/inter_v2.cpp2
3 files changed, 54 insertions, 30 deletions
diff --git a/engines/gob/cdrom.cpp b/engines/gob/cdrom.cpp
index 2ee8595ad3..1c26199bc1 100644
--- a/engines/gob/cdrom.cpp
+++ b/engines/gob/cdrom.cpp
@@ -151,40 +151,27 @@ void CDROM::playMultMusic() {
}
}
-void CDROM::startTrack(const char *trackname) {
- byte *curPtr, *matchPtr;
-
+void CDROM::startTrack(const char *trackName) {
if (!_LICbuffer)
return;
- debugC(1, kDebugMusic, "CDROM::startTrack(%s)", trackname);
-
- matchPtr = 0;
- curPtr = _LICbuffer;
-
- for (int i = 0; i < _numTracks; i++) {
- if (!scumm_stricmp((char *)curPtr, trackname)) {
- matchPtr = curPtr;
- break;
- }
- curPtr += 22;
- }
+ debugC(1, kDebugMusic, "CDROM::startTrack(%s)", trackName);
+ byte *matchPtr = getTrackBuffer(trackName);
if (!matchPtr) {
- warning("Track \"%s\" not found", trackname);
+ warning("Track \"%s\" not found", trackName);
return;
}
- strncpy0(_curTrack, trackname, 15);
+ strncpy0(_curTrack, trackName, 15);
stopPlaying();
+ _curTrackBuffer = matchPtr;
- while (getTrackPos() != -1);
-
- uint32 start, end;
+ while (getTrackPos() >= 0);
- start = READ_LE_UINT32(matchPtr + 12);
- end = READ_LE_UINT32(matchPtr + 16);
+ uint32 start = READ_LE_UINT32(matchPtr + 12);
+ uint32 end = READ_LE_UINT32(matchPtr + 16);
play(start, end);
@@ -205,12 +192,27 @@ void CDROM::play(uint32 from, uint32 to) {
_cdPlaying = true;
}
-int32 CDROM::getTrackPos() {
- uint32 curPos = _vm->_util->getTimeKey() - _startTime;
+int32 CDROM::getTrackPos(const char *keyTrack) {
+ byte *keyBuffer = getTrackBuffer(keyTrack);
+ uint32 curPos = (_vm->_util->getTimeKey() - _startTime) * 3 / 40;
+
+ if (_cdPlaying && (_vm->_util->getTimeKey() < _trackStop)) {
+ if (keyBuffer && _curTrackBuffer && (keyBuffer != _curTrackBuffer)) {
+ uint32 kStart = READ_LE_UINT32(keyBuffer + 12);
+ uint32 kEnd = READ_LE_UINT32(keyBuffer + 16);
+ uint32 cStart = READ_LE_UINT32(_curTrackBuffer + 12);
+ uint32 cEnd = READ_LE_UINT32(_curTrackBuffer + 16);
+
+ if ((kStart >= cStart) && (kEnd <= cEnd)) {
+ if ((kStart - cStart) > curPos)
+ return -2;
+ if ((kEnd - cStart) < curPos)
+ return -1;
+ }
+ }
- if (_cdPlaying && (_vm->_util->getTimeKey() < _trackStop))
- return curPos * 3 / 40;
- else
+ return curPos;
+ } else
return -1;
}
@@ -227,6 +229,7 @@ void CDROM::stopPlaying() {
void CDROM::stop() {
debugC(1, kDebugMusic, "CDROM::stop()");
+ _curTrackBuffer = 0;
AudioCD.stop();
_cdPlaying = false;
}
@@ -245,4 +248,22 @@ void CDROM::testCD(int trySubst, const char *label) {
// CD secor reading
}
+byte *CDROM::getTrackBuffer(const char *trackName) {
+ if (!_LICbuffer || !trackName)
+ return 0;
+
+ byte *matchPtr = 0;
+ byte *curPtr = _LICbuffer;
+
+ for (int i = 0; i < _numTracks; i++) {
+ if (!scumm_stricmp((char *) curPtr, trackName)) {
+ matchPtr = curPtr;
+ break;
+ }
+ curPtr += 22;
+ }
+
+ return matchPtr;
+}
+
} // End of namespace Gob
diff --git a/engines/gob/cdrom.h b/engines/gob/cdrom.h
index e977adcd6d..f847addaeb 100644
--- a/engines/gob/cdrom.h
+++ b/engines/gob/cdrom.h
@@ -35,11 +35,11 @@ public:
void readLIC(const char *fname);
void freeLICbuffer();
- void startTrack(const char *s);
+ void startTrack(const char *trackName);
void playBgMusic();
void playMultMusic();
void play(uint32 from, uint32 to);
- int32 getTrackPos();
+ int32 getTrackPos(const char *keyTrack = 0);
const char *getCurTrack();
void stopPlaying();
void stop();
@@ -49,11 +49,14 @@ public:
protected:
byte *_LICbuffer;
+ byte *_curTrackBuffer;
char _curTrack[16];
uint16 _numTracks;
uint32 _trackStop;
uint32 _startTime;
GobEngine *_vm;
+
+ byte *getTrackBuffer(const char *trackName);
};
} // End of namespace Gob
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index f51578f20b..b2ca8716be 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -1105,7 +1105,7 @@ void Inter_v2::o2_getCDTrackPos() {
varPos = _vm->_parse->parseVarIndex();
varName = _vm->_parse->parseVarIndex();
- WRITE_VAR_OFFSET(varPos, _vm->_cdrom->getTrackPos());
+ WRITE_VAR_OFFSET(varPos, _vm->_cdrom->getTrackPos(GET_VARO_STR(varName)));
WRITE_VARO_STR(varName, _vm->_cdrom->getCurTrack());
}