diff options
-rw-r--r-- | engines/kyra/sound_digital.cpp | 5 | ||||
-rw-r--r-- | sound/audiostream.cpp | 10 | ||||
-rw-r--r-- | sound/audiostream.h | 9 |
3 files changed, 13 insertions, 11 deletions
diff --git a/engines/kyra/sound_digital.cpp b/engines/kyra/sound_digital.cpp index 8c23f05626..a6d89ba7ee 100644 --- a/engines/kyra/sound_digital.cpp +++ b/engines/kyra/sound_digital.cpp @@ -121,7 +121,7 @@ public: int getRate() const { return _rate; } - bool seek(const Audio::Timestamp &); + bool seek(const Audio::Timestamp &where); Audio::Timestamp getLength() const { return _length; } private: Common::SeekableReadStream *_stream; @@ -356,8 +356,7 @@ int AUDStream::readChunk(int16 *buffer, const int maxSamples) { } bool AUDStream::seek(const Audio::Timestamp &where) { - // TODO: A more exact implementation would be nice - const uint32 seekSample = where.msecs() * getRate() / 1000; + const uint32 seekSample = Audio::calculateSampleOffset(where, getRate()); _stream->seek(_streamStart); _processedSize = 0; diff --git a/sound/audiostream.cpp b/sound/audiostream.cpp index acd5398bfd..a3a00a4eba 100644 --- a/sound/audiostream.cpp +++ b/sound/audiostream.cpp @@ -109,14 +109,8 @@ inline int32 calculatePlayTime(int rate, int samples) { } uint32 calculateSampleOffset(const Timestamp &where, int rate) { - const uint32 msecs = where.msecs(); - - const Timestamp msecStamp(msecs, rate); - const uint32 seconds = msecs / 1000; - const uint32 millis = msecs % 1000; - const uint32 samples = msecStamp.frameDiff(where) + (millis * rate) / 1000; - - return seconds * rate + samples; + const Timestamp whereRate = where.convertToFramerate(rate); + return whereRate.secs() * rate + whereRate.getNumberOfFrames(); } /** diff --git a/sound/audiostream.h b/sound/audiostream.h index 8fc485bdb3..3889cffbb4 100644 --- a/sound/audiostream.h +++ b/sound/audiostream.h @@ -205,6 +205,15 @@ public: */ AppendableAudioStream *makeAppendableAudioStream(int rate, byte flags); +/** + * Calculates the sample, which the timestamp describes in a + * AudioStream with the given framerate. + * + * @param where point in time + * @param rate rate of the AudioStream + * @return sample index + */ +uint32 calculateSampleOffset(const Timestamp &where, int rate); } // End of namespace Audio |