From 1dfee941a0061f8d6ea7d356e8291332e87f0227 Mon Sep 17 00:00:00 2001 From: nk Date: Thu, 4 Jun 2026 18:25:26 +0300 Subject: [PATCH] =?UTF-8?q?fix(player):=20=D1=8D=D0=BA=D0=B2=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D0=B9=D0=B7=D0=B5=D1=80=20=C2=AB=D0=B2=20=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D0=BC=C2=BB=20=E2=80=94=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=80=D1=8B=D1=82=D0=B8=D0=B5=20=D0=BE=D0=BA=D0=BE=D0=BD=20+?= =?UTF-8?q?=20=D0=B1=D1=8B=D1=81=D1=82=D1=80=D1=8B=D0=B9=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B0=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Визуализатор отставал/висел: медленный спад (бар держался ~300мс после удара) и редкие обновления. Теперь FFT с перекрытием 50% (~43 обновл/с), мгновенный рост на удар и быстрый спад (0.78→0.55), убран искусственный троттл 33мс. Реакция плотнее попадает в бит. Co-Authored-By: Claude Opus 4.8 --- .../java/com/radiola/service/AudioSpectrum.kt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/radiola/service/AudioSpectrum.kt b/app/src/main/java/com/radiola/service/AudioSpectrum.kt index ef2a97d..40c5828 100644 --- a/app/src/main/java/com/radiola/service/AudioSpectrum.kt +++ b/app/src/main/java/com/radiola/service/AudioSpectrum.kt @@ -84,7 +84,6 @@ class AudioSpectrumAnalyzer( private var channelCount = 2 private var pcm16 = true private var sampleRate = 44100 - private var lastEmit = 0L // Автогейн: бегущий пик амплитуды — чтобы столбики всегда использовали всю // высоту независимо от громкости трека. private var agcPeak = 1e-4f @@ -100,22 +99,22 @@ class AudioSpectrumAnalyzer( if (!pcm16) return val b = buffer.duplicate().order(ByteOrder.LITTLE_ENDIAN) val ch = channelCount + val hop = fftSize / 2 while (b.remaining() >= 2 * ch) { var sum = 0f for (c in 0 until ch) sum += b.short.toFloat() sample[filled++] = (sum / ch) / 32768f if (filled >= fftSize) { compute() - filled = 0 + // Перекрытие 50%: оставляем вторую половину — чаще обновляем (~43к/с), + // спектр идёт «впритык» к биту, без рывков. + System.arraycopy(sample, hop, sample, 0, fftSize - hop) + filled = fftSize - hop } } } private fun compute() { - val now = System.nanoTime() - if (now - lastEmit < 33_000_000L) return // ~30 кадров/с - lastEmit = now - for (i in 0 until fftSize) { re[i] = sample[i] * window[i] im[i] = 0f @@ -154,8 +153,8 @@ class AudioSpectrumAnalyzer( // Нормируем по пику + перцептивный лифт (sqrt), чтобы тихое было видно. val v = sqrt((raw[band] / agcPeak).coerceIn(0f, 1f)) val prev = smoothed[band] - // Быстрый рост, плавный спад — как у настоящего эквалайзера. - smoothed[band] = if (v > prev) v else prev * 0.78f + v * 0.22f + // Мгновенный рост на удар, быстрый спад — чтобы попадать в ритм, не «висеть». + smoothed[band] = if (v > prev) v else prev * 0.55f + v * 0.45f out[band] = smoothed[band] } _spectrum.value = out