Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void EffectWaveform::Update(double deltaTime)
- {
- auto sound = Simulator::Instance->GetSound();
- auto system = Simulator::Instance->GetSystem();
- auto dsp = Simulator::Instance->GetDSP();
- double timerMargin = 0.04;
- //WAVEFORM
- m_WaveTimer += deltaTime;
- if (m_WaveTimer > timerMargin && sound != nullptr)
- {
- m_WaveTimer -= timerMargin;
- //Get format
- FMOD_SOUND_TYPE type;
- FMOD_SOUND_FORMAT format;
- int channels, bits;
- sound->getFormat(&type, &format, &channels, &bits);
- //Get software format
- int sampleRate;
- system->getSoftwareFormat(&sampleRate, nullptr, nullptr);
- //Get length
- unsigned int length = 0;
- sound->getLength(&length, FMOD_TIMEUNIT_MS);
- //Get dsp data
- float frequency;
- dsp->getParameterFloat(FMOD_DSP_FFT_DOMINANT_FREQ, &frequency, 0, 0);
- FMOD_DSP_PARAMETER_FFT *data;
- char s[256];
- unsigned int len;
- dsp->getParameterData(FMOD_DSP_FFT_SPECTRUMDATA, (void**)(&data), &len, s, 256);
- //Get wave data
- auto windowsize = 1024;
- auto ch = data->numchannels;
- auto ln = data->length;
- m_WaveformLeft.clear();
- m_WaveformRight.clear();
- if (ch > 0 && ln > 0)
- {
- auto largest = 0.0f;
- auto resize = 1.0f;
- auto localVol = Simulator::Instance->GetVolume();
- if (localVol > 0.0f) resize = 1.0f / localVol;
- for (int channel = 0; channel < ch; ++channel)
- {
- for (int bin = 0; bin < ln / 8; ++bin)
- {
- auto val = data->spectrum[channel][bin] * 10.0f;
- if (val > largest) largest = val;
- if (channel == 0)
- m_WaveformLeft.push_back(val*resize);
- else if (channel == 1)
- m_WaveformRight.push_back(val*resize);
- }
- }
- Simulator::Instance->SetCurrentVolume(largest*resize);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement