QYDocs

Spectrum 模块

音频频谱分析与 VU 表处理组件,统一管理软件回采、硬件回采、频谱分析和左右声道 VU 显示。

依赖

implementation("io.github.qytech:spectrum:0.2.3")

功能特性


使用方法

private val spectrumRuntime = SpectrumCaptureRuntime()

fun initializeSpectrum() {
    spectrumRuntime.setListener(object : SpectrumVuUpdateListener {
        override fun onSpectrumDataUpdated(dbList: DoubleArray) {
            // 更新频谱 UI
        }

        override fun onVuDataUpdated(vuData: VuData) {
            // 更新左右声道 VU UI
        }
    })

    spectrumRuntime.setPolicy(SpectrumCapturePolicy.AUTO)
}

fun setSpectrumActive(active: Boolean) {
    spectrumRuntime.setSignalActive(active)
}

fun setSpectrumMode(policy: SpectrumCapturePolicy) {
    spectrumRuntime.setPolicy(policy)
}

fun setVuMode(mode: VuMeterMode) {
    spectrumRuntime.setVuMeterMode(mode)
}

fun releaseSpectrum() {
    spectrumRuntime.close()
}

AUTO 默认使用硬件回采。用户明确选择 SOFTWAREHARDWAREOFF 后,运行时以用户设置为准。

选择 VU 表显示方式

VU 表新增两种显示方式,可根据产品的视觉风格和使用场景选择:

默认使用 LOUDNESS,升级后不会改变现有显示效果。需要更明显的摆动时,可在创建运行时对象时选择 PEAK

import com.qytech.spectrum.capture.SpectrumCaptureRuntime
import com.qytech.spectrum.capture.VuMeterMode

private val spectrumRuntime = SpectrumCaptureRuntime(
    vuMeterMode = VuMeterMode.PEAK,
)

也可以在应用运行期间切换。例如,将该方法连接到应用设置页:

fun applyVuMode(usePeak: Boolean) {
    spectrumRuntime.setVuMeterMode(
        if (usePeak) VuMeterMode.PEAK else VuMeterMode.LOUDNESS,
    )
}

模式切换只影响 VU 表数据,不会改变频谱柱、回采来源或当前播放状态。


更新日志

v0.2.3(2026-08-14)

v0.2.2(2026-08-05)


v0.2.1(2026-07-28)


v0.2.0(2026-07-24)


v0.1.9(2026-07-09)


v0.1.8(2026-07-07)


v0.1.7(2026-06-16)

v0.1.6(2026-06-08)

SpectrumVuProcessor.getInstance(fftSize = 1024)
StereoSpectrumVuProcessor.getInstance(fftSize = 1024)

v0.1.4


v0.1.3

class StereoSpectrumVuProcessor(
    sampleRate: Int = 44100,
    fftSize: Int = 1024,
    windowType: WindowType = WindowType.HANNING,
    muteThreshold: Double = 5e-4,
    private val bandCount: Int = 128,
    private val minFreq: Double = 50.0,
    private val maxFreq: Double = 20000.0,
)

StereoSpectrumVuView(context).apply {
    setBarCount(128)
}

private var spectrumVuProcessor: StereoSpectrumVuProcessor? = null

fun startRecord() {
    spectrumVuProcessor = StereoSpectrumVuProcessor(bandCount = 128)
    spectrumVuProcessor?.setStereoSpectrumListener(object : StereoSpectrumVuUpdateListener {
        override fun onStereoSpectrumUpdated(
            leftDbList: DoubleArray,
            rightDbList: DoubleArray,
        ) {
            _dbLeftList.value = leftDbList
            _dbRightList.value = rightDbList
        }
        
        override fun onVuDataUpdated(vuData: VuData) {
            _vuData.value = vuData
        }
    })
    spectrumVuProcessor?.setCapturePriority(LoopbackPriority.PRIORITY_SOFTWARE_ONLY)
    spectrumVuProcessor?.start()
}

fun stopRecord() {
    spectrumVuProcessor?.removeStereoSpectrumListener()
    spectrumVuProcessor?.stop()
    spectrumVuProcessor?.release()
}

v0.1.2

enum class LoopbackPriority {
    PRIORITY_AUTO,
    PRIORITY_SOFTWARE_FIRST,
    PRIORITY_HARDWARE_FIRST,
    PRIORITY_SOFTWARE_ONLY,
    PRIORITY_HARDWARE_ONLY
}

class SpectrumVuProcessor {
    fun setCapturePriority(priority: LoopbackPriority)
}

v0.0.9

v0.0.7

v0.0.6