aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/audiostream.h13
-rw-r--r--sound/vorbis.cpp7
2 files changed, 19 insertions, 1 deletions
diff --git a/sound/audiostream.h b/sound/audiostream.h
index 97822c0c26..0dde9a61b5 100644
--- a/sound/audiostream.h
+++ b/sound/audiostream.h
@@ -74,6 +74,19 @@ public:
/** Sample rate of the stream. */
virtual int getRate() const = 0;
+
+ /**
+ * This function returns the number of samples that were delivered to
+ * the mixer which is a rough estimate of how moch time of the stream
+ * has been played.
+ * The exact value is not available as it needs information from the
+ * audio device on how many samples have been already played
+ * As our buffer is relatively short the estimate is exact enough
+ * The return -1 is kind of a hack as this function is only required
+ * for the video audio sync in the bs2 cutscenes I am to lazy to
+ * implement it for all subclasses
+ */
+ virtual int getSamplesPlayed() const { return -1; }
};
class AppendableAudioStream : public AudioStream {
diff --git a/sound/vorbis.cpp b/sound/vorbis.cpp
index 9a4904e5ad..99600f8747 100644
--- a/sound/vorbis.cpp
+++ b/sound/vorbis.cpp
@@ -172,6 +172,7 @@ class VorbisInputStream : public AudioStream {
int16 _buffer[4096];
const int16 *_bufferEnd;
const int16 *_pos;
+ int _played;
void refill();
inline bool eosIntern() const;
@@ -184,6 +185,8 @@ public:
bool isStereo() const { return _numChannels >= 2; }
int getRate() const { return ov_info(_ov_file, -1)->rate; }
+ int getSamplesPlayed() const { return _played / _numChannels; }
+
};
@@ -193,7 +196,7 @@ public:
VorbisInputStream::VorbisInputStream(OggVorbis_File *file, int duration)
- : _ov_file(file), _bufferEnd(_buffer + ARRAYSIZE(_buffer)) {
+ : _ov_file(file), _bufferEnd(_buffer + ARRAYSIZE(_buffer)), _played(0) {
// Check the header, determine if this is a stereo stream
_numChannels = ov_info(_ov_file, -1)->channels;
@@ -215,6 +218,7 @@ inline int16 VorbisInputStream::read() {
if (_pos >= _bufferEnd) {
refill();
}
+ _played++;
return sample;
}
@@ -234,6 +238,7 @@ int VorbisInputStream::readBuffer(int16 *buffer, const int numSamples) {
refill();
}
}
+ _played += samples;
return samples;
}