From 38cb56f168641ddcd8e2b907a04ba5167f6601a1 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 26 May 2019 14:46:52 -0300 Subject: [PATCH] Use doubles instead of floats for the time argument in Source:seek. This probably won't affect anything meaningfully, but in theory it's more precise. --- src/modules/audio/Source.h | 4 ++-- src/modules/audio/null/Source.cpp | 4 ++-- src/modules/audio/null/Source.h | 4 ++-- src/modules/audio/openal/Source.cpp | 20 ++++++++++--------- src/modules/audio/openal/Source.h | 4 ++-- src/modules/audio/wrap_Source.cpp | 2 +- src/modules/sound/Decoder.h | 2 +- .../sound/lullaby/CoreAudioDecoder.cpp | 2 +- src/modules/sound/lullaby/CoreAudioDecoder.h | 2 +- src/modules/sound/lullaby/FLACDecoder.cpp | 4 ++-- src/modules/sound/lullaby/FLACDecoder.h | 2 +- src/modules/sound/lullaby/GmeDecoder.cpp | 4 ++-- src/modules/sound/lullaby/GmeDecoder.h | 2 +- src/modules/sound/lullaby/ModPlugDecoder.cpp | 4 ++-- src/modules/sound/lullaby/ModPlugDecoder.h | 2 +- src/modules/sound/lullaby/Mpg123Decoder.cpp | 2 +- src/modules/sound/lullaby/Mpg123Decoder.h | 2 +- src/modules/sound/lullaby/VorbisDecoder.cpp | 2 +- src/modules/sound/lullaby/VorbisDecoder.h | 2 +- src/modules/sound/lullaby/WaveDecoder.cpp | 2 +- src/modules/sound/lullaby/WaveDecoder.h | 2 +- src/modules/sound/wrap_Decoder.cpp | 2 +- 22 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/modules/audio/Source.h b/src/modules/audio/Source.h index a4749e20d..066441b76 100644 --- a/src/modules/audio/Source.h +++ b/src/modules/audio/Source.h @@ -72,8 +72,8 @@ public: virtual void setVolume(float volume) = 0; virtual float getVolume() const = 0; - virtual void seek(float offset, Unit unit) = 0; - virtual float tell(Unit unit) = 0; + virtual void seek(double offset, Unit unit) = 0; + virtual double tell(Unit unit) = 0; virtual double getDuration(Unit unit) = 0; // all float * v must be of size 3 diff --git a/src/modules/audio/null/Source.cpp b/src/modules/audio/null/Source.cpp index 126935efe..588659ed2 100644 --- a/src/modules/audio/null/Source.cpp +++ b/src/modules/audio/null/Source.cpp @@ -90,11 +90,11 @@ float Source::getVolume() const return volume; } -void Source::seek(float, Source::Unit) +void Source::seek(double, Source::Unit) { } -float Source::tell(Source::Unit) +double Source::tell(Source::Unit) { return 0.0f; } diff --git a/src/modules/audio/null/Source.h b/src/modules/audio/null/Source.h index c681d9615..8aaf34aeb 100644 --- a/src/modules/audio/null/Source.h +++ b/src/modules/audio/null/Source.h @@ -50,8 +50,8 @@ public: virtual float getPitch() const; virtual void setVolume(float volume); virtual float getVolume() const; - virtual void seek(float offset, Unit unit); - virtual float tell(Unit unit); + virtual void seek(double offset, Unit unit); + virtual double tell(Unit unit); virtual double getDuration(Unit unit); virtual void setPosition(float *v); virtual void getPosition(float *v) const; diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 775a297d9..b2cc1ed98 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -506,23 +506,23 @@ float Source::getVolume() const return volume; } -void Source::seek(float offset, Source::Unit unit) +void Source::seek(double offset, Source::Unit unit) { Lock l = pool->lock(); int offsetSamples = 0; - float offsetSeconds = 0.0f; + double offsetSeconds = 0.0f; switch (unit) { case Source::UNIT_SAMPLES: - offsetSamples = offset; - offsetSeconds = offset / sampleRate; + offsetSamples = (int) offset; + offsetSeconds = offset / (double) sampleRate; break; case Source::UNIT_SECONDS: default: offsetSeconds = offset; - offsetSamples = offset * sampleRate; + offsetSamples = (int) (offset * sampleRate); break; } @@ -573,12 +573,13 @@ void Source::seek(float offset, Source::Unit unit) } if (unusedBuffers.empty()) offsetSamples = 0; - offsetSeconds = offsetSamples / sampleRate; + offsetSeconds = offsetSamples / (double) sampleRate; } break; case TYPE_MAX_ENUM: break; } + if (wasPlaying && (alGetError() == AL_INVALID_VALUE || (sourceType == TYPE_STREAM && !isPlaying()))) { stop(); @@ -586,10 +587,11 @@ void Source::seek(float offset, Source::Unit unit) play(); return; } + this->offsetSamples = offsetSamples; } -float Source::tell(Source::Unit unit) +double Source::tell(Source::Unit unit) { Lock l = pool->lock(); @@ -601,7 +603,7 @@ float Source::tell(Source::Unit unit) offset += offsetSamples; if (unit == UNIT_SECONDS) - return offset / (float)sampleRate; + return offset / (double) sampleRate; else return offset; } @@ -867,7 +869,7 @@ void Source::prepareAtomic() } // Seek to the current/pending offset. - alSourcef(source, AL_SAMPLE_OFFSET, offsetSamples); + alSourcei(source, AL_SAMPLE_OFFSET, offsetSamples); } void Source::teardownAtomic() diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index 1f7733fd6..c34a76e4e 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -115,8 +115,8 @@ public: virtual float getPitch() const; virtual void setVolume(float volume); virtual float getVolume() const; - virtual void seek(float offset, Unit unit); - virtual float tell(Unit unit); + virtual void seek(double offset, Unit unit); + virtual double tell(Unit unit); virtual double getDuration(Unit unit); virtual void setPosition(float *v); virtual void getPosition(float *v) const; diff --git a/src/modules/audio/wrap_Source.cpp b/src/modules/audio/wrap_Source.cpp index 3a96f41fc..3db1dcf5a 100644 --- a/src/modules/audio/wrap_Source.cpp +++ b/src/modules/audio/wrap_Source.cpp @@ -105,7 +105,7 @@ int w_Source_getVolume(lua_State *L) int w_Source_seek(lua_State *L) { Source *t = luax_checksource(L, 1); - float offset = (float)luaL_checknumber(L, 2); + double offset = luaL_checknumber(L, 2); if (offset < 0) return luaL_argerror(L, 2, "can't seek to a negative position"); diff --git a/src/modules/sound/Decoder.h b/src/modules/sound/Decoder.h index 89f6c79e2..20c6da9ac 100644 --- a/src/modules/sound/Decoder.h +++ b/src/modules/sound/Decoder.h @@ -98,7 +98,7 @@ public: * @param s The position in the stream in seconds. * @return True if success, false on fail/unsupported. **/ - virtual bool seek(float s) = 0; + virtual bool seek(double s) = 0; /** * Rewinds the stream to the start. diff --git a/src/modules/sound/lullaby/CoreAudioDecoder.cpp b/src/modules/sound/lullaby/CoreAudioDecoder.cpp index e358c6a3b..315cbf4e9 100644 --- a/src/modules/sound/lullaby/CoreAudioDecoder.cpp +++ b/src/modules/sound/lullaby/CoreAudioDecoder.cpp @@ -227,7 +227,7 @@ int CoreAudioDecoder::decode() return size; } -bool CoreAudioDecoder::seek(float s) +bool CoreAudioDecoder::seek(double s) { OSStatus err = ExtAudioFileSeek(extAudioFile, (SInt64) (s * inputInfo.mSampleRate)); diff --git a/src/modules/sound/lullaby/CoreAudioDecoder.h b/src/modules/sound/lullaby/CoreAudioDecoder.h index 1939602d6..2348cca65 100644 --- a/src/modules/sound/lullaby/CoreAudioDecoder.h +++ b/src/modules/sound/lullaby/CoreAudioDecoder.h @@ -54,7 +54,7 @@ public: love::sound::Decoder *clone(); int decode(); - bool seek(float s); + bool seek(double s); bool rewind(); bool isSeekable(); int getChannelCount() const; diff --git a/src/modules/sound/lullaby/FLACDecoder.cpp b/src/modules/sound/lullaby/FLACDecoder.cpp index 5849103f0..49dd179d7 100644 --- a/src/modules/sound/lullaby/FLACDecoder.cpp +++ b/src/modules/sound/lullaby/FLACDecoder.cpp @@ -78,9 +78,9 @@ int FLACDecoder::decode() return bufferSize; } -bool FLACDecoder::seek(float s) +bool FLACDecoder::seek(double s) { - return seek_absolute((int)(s*1000.0f)); + return seek_absolute((int)(s*1000.0)); } bool FLACDecoder::rewind() diff --git a/src/modules/sound/lullaby/FLACDecoder.h b/src/modules/sound/lullaby/FLACDecoder.h index aac85c343..2314f4685 100644 --- a/src/modules/sound/lullaby/FLACDecoder.h +++ b/src/modules/sound/lullaby/FLACDecoder.h @@ -46,7 +46,7 @@ public: static bool accepts(const std::string &ext); love::sound::Decoder *clone(); int decode(); - bool seek(float s); + bool seek(double s); bool rewind(); bool isSeekable(); int getChannelCount() const; diff --git a/src/modules/sound/lullaby/GmeDecoder.cpp b/src/modules/sound/lullaby/GmeDecoder.cpp index f1251ee5e..a518ec6ab 100644 --- a/src/modules/sound/lullaby/GmeDecoder.cpp +++ b/src/modules/sound/lullaby/GmeDecoder.cpp @@ -109,9 +109,9 @@ int GmeDecoder::decode() return bufferSize; } -bool GmeDecoder::seek(float s) +bool GmeDecoder::seek(double s) { - return gme_seek(emu, static_cast(s * 1000.f)) != 0; + return gme_seek(emu, static_cast(s * 1000.0)) != 0; } bool GmeDecoder::rewind() diff --git a/src/modules/sound/lullaby/GmeDecoder.h b/src/modules/sound/lullaby/GmeDecoder.h index f5c093fa2..597da4426 100644 --- a/src/modules/sound/lullaby/GmeDecoder.h +++ b/src/modules/sound/lullaby/GmeDecoder.h @@ -51,7 +51,7 @@ public: love::sound::Decoder *clone(); int decode(); - bool seek(float s); + bool seek(double s); bool rewind(); bool isSeekable(); int getChannelCount() const; diff --git a/src/modules/sound/lullaby/ModPlugDecoder.cpp b/src/modules/sound/lullaby/ModPlugDecoder.cpp index 4c3790f3a..c807894cc 100644 --- a/src/modules/sound/lullaby/ModPlugDecoder.cpp +++ b/src/modules/sound/lullaby/ModPlugDecoder.cpp @@ -111,9 +111,9 @@ int ModPlugDecoder::decode() return r; } -bool ModPlugDecoder::seek(float s) +bool ModPlugDecoder::seek(double s) { - ModPlug_Seek(plug, (int)(s*1000.0f)); + ModPlug_Seek(plug, (int)(s*1000.0)); return true; } diff --git a/src/modules/sound/lullaby/ModPlugDecoder.h b/src/modules/sound/lullaby/ModPlugDecoder.h index 5c9be7f7c..a7e616042 100644 --- a/src/modules/sound/lullaby/ModPlugDecoder.h +++ b/src/modules/sound/lullaby/ModPlugDecoder.h @@ -54,7 +54,7 @@ public: love::sound::Decoder *clone(); int decode(); - bool seek(float s); + bool seek(double s); bool rewind(); bool isSeekable(); int getChannelCount() const; diff --git a/src/modules/sound/lullaby/Mpg123Decoder.cpp b/src/modules/sound/lullaby/Mpg123Decoder.cpp index 8f5668cb7..6b76b82cc 100644 --- a/src/modules/sound/lullaby/Mpg123Decoder.cpp +++ b/src/modules/sound/lullaby/Mpg123Decoder.cpp @@ -232,7 +232,7 @@ int Mpg123Decoder::decode() return size; } -bool Mpg123Decoder::seek(float s) +bool Mpg123Decoder::seek(double s) { off_t offset = (off_t) (s * (double) sampleRate); diff --git a/src/modules/sound/lullaby/Mpg123Decoder.h b/src/modules/sound/lullaby/Mpg123Decoder.h index afa17eea7..5963dcf6f 100644 --- a/src/modules/sound/lullaby/Mpg123Decoder.h +++ b/src/modules/sound/lullaby/Mpg123Decoder.h @@ -66,7 +66,7 @@ public: love::sound::Decoder *clone(); int decode(); - bool seek(float s); + bool seek(double s); bool rewind(); bool isSeekable(); int getChannelCount() const; diff --git a/src/modules/sound/lullaby/VorbisDecoder.cpp b/src/modules/sound/lullaby/VorbisDecoder.cpp index c9b1d9251..31096b94a 100644 --- a/src/modules/sound/lullaby/VorbisDecoder.cpp +++ b/src/modules/sound/lullaby/VorbisDecoder.cpp @@ -209,7 +209,7 @@ int VorbisDecoder::decode() return size; } -bool VorbisDecoder::seek(float s) +bool VorbisDecoder::seek(double s) { int result = 0; diff --git a/src/modules/sound/lullaby/VorbisDecoder.h b/src/modules/sound/lullaby/VorbisDecoder.h index 969afc28d..0a910fab3 100644 --- a/src/modules/sound/lullaby/VorbisDecoder.h +++ b/src/modules/sound/lullaby/VorbisDecoder.h @@ -57,7 +57,7 @@ public: love::sound::Decoder *clone(); int decode(); - bool seek(float s); + bool seek(double s); bool rewind(); bool isSeekable(); int getChannelCount() const; diff --git a/src/modules/sound/lullaby/WaveDecoder.cpp b/src/modules/sound/lullaby/WaveDecoder.cpp index d7dab175e..5a6f3ff3a 100644 --- a/src/modules/sound/lullaby/WaveDecoder.cpp +++ b/src/modules/sound/lullaby/WaveDecoder.cpp @@ -143,7 +143,7 @@ int WaveDecoder::decode() return (int) size; } -bool WaveDecoder::seek(float s) +bool WaveDecoder::seek(double s) { int wuff_status = wuff_seek(handle, (wuff_uint64) (s * info.sample_rate)); diff --git a/src/modules/sound/lullaby/WaveDecoder.h b/src/modules/sound/lullaby/WaveDecoder.h index 05a97cfb6..02a5a3c20 100644 --- a/src/modules/sound/lullaby/WaveDecoder.h +++ b/src/modules/sound/lullaby/WaveDecoder.h @@ -53,7 +53,7 @@ public: love::sound::Decoder *clone(); int decode(); - bool seek(float s); + bool seek(double s); bool rewind(); bool isSeekable(); int getChannelCount() const; diff --git a/src/modules/sound/wrap_Decoder.cpp b/src/modules/sound/wrap_Decoder.cpp index da37b84f0..7feed4223 100644 --- a/src/modules/sound/wrap_Decoder.cpp +++ b/src/modules/sound/wrap_Decoder.cpp @@ -96,7 +96,7 @@ int w_Decoder_decode(lua_State *L) int w_Decoder_seek(lua_State *L) { Decoder *t = luax_checkdecoder(L, 1); - float offset = luaL_checknumber(L, 2); + double offset = luaL_checknumber(L, 2); if (offset < 0) return luaL_argerror(L, 2, "can't seek to a negative position"); else if (offset == 0)