Fix AudioAnalyzer

This commit is contained in:
Ralty
2025-07-13 23:41:41 +07:00
parent a3ae8a70d4
commit 17ffdcd6ef
3 changed files with 16 additions and 16 deletions
+2 -2
View File
@@ -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;
+2 -2
View File
@@ -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));
+12 -12
View File
@@ -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);
}