Android平台Superpowered库SuperpoweredFrequencyDomain多fftLogSize异常问题
Hey Andy, let's break down why you're hitting this weird behavior when switching between SuperpoweredFrequencyDomain instances with different fftLogSize values. I've worked with Superpowered on Android before, so here are the most likely culprits and fixes:
1. You're not properly releasing the old instance first
Superpowered's core is written in C++, which means it manages native resources under the hood. If you create a new instance with a different fftLogSize without cleaning up the old one, you're probably causing resource conflicts—like overlapping buffer allocations or leftover internal state that messes up the new instance.
Fix it like this:
Always call release() on the old instance and null out the reference before creating a new one. This lets the native layer free up resources and prevents GC confusion:
// Clean up the old instance first if (myFreqDomain != null) { myFreqDomain.release(); myFreqDomain = null; } // Now create your new instance with a different fftLogSize int newFftLogSize = 10; // Example different value myFreqDomain = new SuperpoweredFrequencyDomain(newFftLogSize);
2. Mismatched buffer sizes with the new instance
When you do time-domain ↔ frequency-domain conversions, the buffer sizes have to exactly match the fftLogSize of the active instance. For example, fftLogSize=11 means 2^11 = 2048 samples (and Superpowered uses interleaved complex buffers, so that's 4096 float values total). If you reuse a buffer sized for the old instance with the new one, you'll get corrupted data or silent failures.
Fix it like this:
Every time you create a new instance, recalculate the required buffer size and create fresh buffers (or resize existing ones):
int fftLogSize = 10; int sampleCount = 1 << fftLogSize; // 1024 for log size 10 float[] timeBuffer = new float[sampleCount * 2]; // Interleaved complex format float[] freqBuffer = new float[sampleCount * 2]; // Fill your timeBuffer with audio data... // Now run your conversion safely myFreqDomain.timeToFrequency(timeBuffer, freqBuffer); myFreqDomain.frequencyToTime(freqBuffer, timeBuffer);
3. Thread safety conflicts
Superpowered's audio processing classes aren't always thread-safe. If you're creating instances or running conversions across different threads (like switching between the main thread and an audio processing thread), you could be messing up internal state.
Fix it like this:
Keep all SuperpoweredFrequencyDomain operations confined to a single dedicated thread (usually the audio processing thread that Superpowered recommends). Make sure all operations on the old instance are fully completed before releasing it and creating the new one.
4. Potential bug in your Superpowered version
Older versions of the Superpowered library had edge-case bugs with multiple SuperpoweredFrequencyDomain instances. If the above fixes don't work, try upgrading to the latest stable version of the library—this might resolve the issue out of the box.
内容的提问来源于stack exchange,提问作者Andy S

