diff --git a/source/flixel/sound/FlxSound.hx b/source/flixel/sound/FlxSound.hx index cb3afbe2..fdf59233 100644 --- a/source/flixel/sound/FlxSound.hx +++ b/source/flixel/sound/FlxSound.hx @@ -684,7 +684,7 @@ class FlxSound extends FlxBasic { #end _channel.soundTransform = _transform; - _channel.__lastPeakSamples = 0; + _channel.__lastPeakTime = -10; _channel.__leftPeak = 0; _channel.__rightPeak = 0; _channel.addEventListener(Event.SOUND_COMPLETE, stopped); @@ -772,7 +772,7 @@ class FlxSound extends FlxBasic { @:privateAccess return _sound != null ? _sound.__buffer : null; function update_amplitude():Void @:privateAccess { - if (_channel == null || !_channel.__updatePeaks() || !_amplitudeUpdate) return; + if (_channel == null || !_channel.__updatePeaks(get_time()) || !_amplitudeUpdate) return; _amplitudeUpdate = false; _amplitudeLeft = _channel.__leftPeak; diff --git a/source/funkin/backend/utils/AudioAnalyzer.hx b/source/funkin/backend/utils/AudioAnalyzer.hx index 95f0b174..e3a0fc63 100644 --- a/source/funkin/backend/utils/AudioAnalyzer.hx +++ b/source/funkin/backend/utils/AudioAnalyzer.hx @@ -48,7 +48,7 @@ class AudioAnalyzer { if (useSeperate) { while (c < outSeperate.length) outSeperate[c++] *= __bitSize; while (c++ < buffer.channels) outSeperate.push(0); - c = 0; + c = Math.floor((pos % (__wordSize * buffer.channels)) / __wordSize); } if (__wordSize == 1) { // 8-bit audio data is unsigned (0 is 128, 128 is 256, -128 is 0) while (pos < end) { @@ -113,7 +113,7 @@ class AudioAnalyzer { if (useSeperate) { while (c < outSeperate.length) outSeperate[c++] *= __bitSize; while (c++ < buffer.channels) outSeperate.push(0); - c = 0; + c = Math.floor((pos % (__wordSize * buffer.channels)) / __wordSize); } while (n > 0) { n -= (result = __vorbis.read(__buffer, 0, n < bufferSize ? n : bufferSize, isBigEndian, __wordSize, true)); diff --git a/source/openfl/media/SoundChannel.hx b/source/openfl/media/SoundChannel.hx index 32f24c58..9de0928e 100644 --- a/source/openfl/media/SoundChannel.hx +++ b/source/openfl/media/SoundChannel.hx @@ -82,7 +82,7 @@ import lime.media.openal.AL; @:noCompletion private var __sound:Sound; @:noCompletion private var __isValid:Bool; @:noCompletion private var __soundTransform:SoundTransform; - @:noCompletion private var __lastPeakSamples:Float; + @:noCompletion private var __lastPeakTime:Float; @:noCompletion private var __leftPeak:Float; @:noCompletion private var __rightPeak:Float; #if lime @@ -151,32 +151,32 @@ import lime.media.openal.AL; this.soundTransform = soundTransform; } - @:noCompletion private function __updatePeaks():Bool + @:noCompletion private function __updatePeaks(time:Float):Bool { - var backend = __source.__backend; - var samples = AL.getSourcef(backend.handle, AL.SAMPLE_OFFSET); - if (__lastPeakSamples == samples) return false; + if (Math.abs(time - __lastPeakTime) < 8) return false; - __lastPeakSamples = samples; + __lastPeakTime = time; __leftPeak = __rightPeak = 0; #if (lime_cffi && !macro) if (!__isValid) return false; - var buffer = __source.buffer; + var backend = __source.__backend, buffer = __source.buffer; var wordSize = buffer.bitsPerSample >> 3, bitUnsignedSize = 1 << buffer.bitsPerSample, bitSize = 1 << (buffer.bitsPerSample - 1); - var pos = Math.floor(samples * buffer.channels * wordSize), size = 0, i = 0, buf; - pos -= pos % wordSize; + var pos = Math.floor(time * buffer.sampleRate / 1000 * buffer.channels * wordSize), size = 0, i = 0, buf; if (backend.streamed) { buf = backend.bufferDatas[i = NativeAudioSource.STREAM_MAX_BUFFERS - backend.queuedBuffers] #if !js .buffer #end; size = backend.bufferSize; + pos -= Math.floor(backend.bufferTimes[i] * buffer.sampleRate * buffer.channels * wordSize); } else { buf = buffer.data #if !js .buffer #end; size = #if js buf.byteLength #else buf.length #end; } - var n = Math.floor(Math.min(buffer.sampleRate / 80, 512)), b = 0, w = 0, c = 0; + var n = Math.floor(Math.min(buffer.sampleRate / 80, 512)), c = Math.floor((pos % (wordSize * buffer.channels)) / wordSize), b = 0, w = 0; + pos -= pos % wordSize; + while (n > 0) { if (wordSize == 1) b = #if js buf[pos] #else buf.get(pos) #end - bitSize; else { @@ -378,13 +378,13 @@ import lime.media.openal.AL; @:noCompletion private function get_leftPeak():Float { - __updatePeaks(); + __updatePeaks(get_position()); return __leftPeak * (soundTransform == null ? 1 : soundTransform.volume); } @:noCompletion private function get_rightPeak():Float { - __updatePeaks(); + __updatePeaks(get_position()); return __rightPeak * (soundTransform == null ? 1 : soundTransform.volume); }