aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2010-01-06 15:40:49 +0000
committerJohannes Schickel2010-01-06 15:40:49 +0000
commit297a95557946555e5cc51279abafc0dc362af5f7 (patch)
tree13d590541d406dd55878221d3908feba3b6558e3
parente72707b04e2080c6f780fed54df3a57ce3c6d460 (diff)
downloadscummvm-rg350-297a95557946555e5cc51279abafc0dc362af5f7.tar.gz
scummvm-rg350-297a95557946555e5cc51279abafc0dc362af5f7.tar.bz2
scummvm-rg350-297a95557946555e5cc51279abafc0dc362af5f7.zip
- Simplify Audio::calculateSampleOffset.
- Made Audio::calculateSampleOffset accessable from outside audiostream.cpp. - Adapt KYRA's AUDStream to use Audio::calculateSampleOffset. svn-id: r47082
-rw-r--r--engines/kyra/sound_digital.cpp5
-rw-r--r--sound/audiostream.cpp10
-rw-r--r--sound/audiostream.h9
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