Hi, i’m trying to put an spectrum visualizer into my audio app, I create a new class as a child of the main component class so i can visualize it (spectrum visualizer). But when I run it, it does not show anything. I guess is because there’s no data getting in.
This is the maincomponent class
#include "MainComponent.h"
//==============================================================================
MainComponent::MainComponent() : AudioAppComponent(otherDeviceManager) ,state(Parado), cargarButton("Cargar"), reproducirButton("Reproducir"), pararButton("Parar")
{
otherDeviceManager.initialise(4, 2, nullptr, true);
audioSettings.reset(new AudioDeviceSelectorComponent(otherDeviceManager,0,4,0,2,true,true,true,true));
addAndMakeVisible(audioSettings.get());
setAudioChannels (4, 2);
cargarButton.onClick = [this] {cargarClicked();};
cargarButton.setColour(TextButton::buttonColourId, Colours::darkgoldenrod);
addAndMakeVisible(& cargarButton);
reproducirButton.onClick = [this] {reproducirClicked();};
reproducirButton.setColour(TextButton::buttonColourId, Colours::darkgoldenrod);
reproducirButton.setEnabled(true);
addAndMakeVisible(& reproducirButton);
pararButton.onClick = [this] {pararClicked();};
pararButton.setColour(TextButton::buttonColourId, Colours::darkgoldenrod);
pararButton.setEnabled(false);
addAndMakeVisible(& pararButton);
formatManager.registerBasicFormats();
transport.addChangeListener(this);
addAndMakeVisible(espectro);
setSize (800, 750);
}
MainComponent::~MainComponent()
{
// This shuts down the audio device and clears the audio source.
shutdownAudio();
}
//==============================================================================
void MainComponent::prepareToPlay (int samplesPerBlockExpected, double sampleRate)
{
transport.prepareToPlay(samplesPerBlockExpected, sampleRate);
}
void MainComponent::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill)
{
bufferToFill.clearActiveBufferRegion();
transport.getNextAudioBlock(bufferToFill);
}
Here is the EspectroAnalizador class
AnalizadorEspectro::AnalizadorEspectro(): forwardFFT(fftOrder), window(fftSize, dsp::WindowingFunction<float>::blackmanHarris)
{
startTimerHz (30);
}
AnalizadorEspectro::~AnalizadorEspectro()
{
}
void AnalizadorEspectro::paint (Graphics& g)
{
g.fillAll (Colours::black);
g.setOpacity (1.0f);
g.setColour (Colours::white);
drawFrame (g);
}
void AnalizadorEspectro::resized()
{
}
void AnalizadorEspectro::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill)
{
if (bufferToFill.buffer->getNumChannels() > 0)
{
auto* channelData = bufferToFill.buffer->getReadPointer (0, bufferToFill.startSample);
for (auto i = 0; i < bufferToFill.numSamples; ++i)
pushNextSampleIntoFifo (channelData[i]);
}
}
void AnalizadorEspectro::pushNextSampleIntoFifo(float sample) noexcept
{
if (fifoIndex == fftSize)
{
if (! nextFFTBlockReady)
{
zeromem (fftData, sizeof (fftData));
memcpy (fftData, fifo, sizeof (fifo));
nextFFTBlockReady = true;
}
fifoIndex = 0;
}
fifo[fifoIndex++] = sample;
}
void AnalizadorEspectro::drawNextFrameOfSpectrum()
{
window.multiplyWithWindowingTable (fftData, fftSize);
forwardFFT.performFrequencyOnlyForwardTransform (fftData);
auto mindB = -100.0f;
auto maxdB = 0.0f;
for (int i = 0; i < scopeSize; ++i)
{
auto skewedProportionX = 1.0f - std::exp (std::log (1.0f - i / (float) scopeSize) * 0.2f);
auto fftDataIndex = jlimit (0, fftSize / 2, (int) (skewedProportionX * fftSize / 2));
auto level = jmap (jlimit (mindB, maxdB, Decibels::gainToDecibels (fftData[fftDataIndex])
- Decibels::gainToDecibels ((float) fftSize)),
mindB, maxdB, 0.0f, 1.0f);
scopeData[i] = level;
}
}
void AnalizadorEspectro::drawFrame(Graphics &g)
{
for (int i = 1; i < scopeSize; ++i)
{
auto width = getLocalBounds().getWidth();
auto height = getLocalBounds().getHeight();
g.drawLine ({ (float) jmap (i - 1, 0, scopeSize - 1, 0, width),
jmap (scopeData[i - 1], 0.0f, 1.0f, (float) height, 0.0f),
(float) jmap (i, 0, scopeSize - 1, 0, width),
jmap (scopeData[i], 0.0f, 1.0f, (float) height, 0.0f) });
}
}
void AnalizadorEspectro::timerCallback()
{
if (nextFFTBlockReady)
{
drawNextFrameOfSpectrum();
nextFFTBlockReady = false;
repaint();
}
}
This is the result i got