C++ FMOD Studio 无法为 FMOD_DSP_PARAMETER_FFT 的频率赋值。分析
C++ FMOD Studio can't give values to FMOD_DSP_PARAMETER_FFT for freq. analisys
我试图在 3D 平面中表示声音的频谱,但我只能播放声音而无法将 dsp 放入结构中 FMOD_DSP_PARAMETER_FFT,numchannels 和 length 总是 = 0
我的代码是这样的:
FMOD::System *system;
FMOD::Sound *sound1;
FMOD::Channel *channel = 0;
FMOD::ChannelGroup *mastergroup;
FMOD::DSP *mydsp, *dsphead, *dspchannelmixer;
FMOD::DSPConnection *conection;
FMOD_RESULT result;
unsigned int version;
result = FMOD::System_Create(&system);
result = system->getVersion(&version);
result = system->init(32, FMOD_INIT_NORMAL, NULL);
result = system->createSound("mysong.mp3",FMOD_DEFAULT, 0, &sound1);
result = sound1->setMode(FMOD_LOOP_NORMAL);
result = system->playSound(sound1, 0, true, &channel);
/*
Create the DSP effect.
*/
result = system->createDSPByType(FMOD_DSP_TYPE_FFT, &mydsp);
result = mydsp->setParameterFloat(FMOD_DSP_FFT_SPECTRUMDATA, 300.0f);
result = system->getMasterChannelGroup(&mastergroup);
result = mastergroup->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &dsphead);
result = dsphead->getInput(0, &dspchannelmixer, 0);
result = dsphead->disconnectFrom(dspchannelmixer);
result = dsphead->addInput(mydsp, &conection);
result = mydsp->addInput(dspchannelmixer);
result = mydsp->setBypass(true);
result = mydsp->setActive(true);
char s[256];
unsigned int len;
float freq[32];
float fft = 0;
std::vector<float> fftheights;
//program loop
while (1) {
unsigned int ms = 0;
unsigned int lenms = 0;
bool playing = 0;
bool paused = 0;
int channelsplaying = 0;
if (channel)
{
FMOD::Sound *currentsound = 0;
result = channel->setPaused(false);
result = channel->setMute(false);
result = channel->isPlaying(&playing);
result = channel->getPaused(&paused);
result = channel->setVolume(0.5);
result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS);
channel->getCurrentSound(¤tsound);
if (currentsound)
{
result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS);
}
}
system->getChannelsPlaying(&channelsplaying);
render_function();
FMOD_DSP_PARAMETER_FFT *fftparameter;
result = mydsp->getParameterData(FMOD_DSP_FFT_SPECTRUMDATA, (void **)&fftparameter, 0, 0, 0);
result = mydsp->getOutput(FMOD_DSP_FFT_SPECTRUMDATA, &mydsp, 0);
for (int channelfft = 0; channelfft < fftparameter->numchannels; channelfft++)
{
for (int bin = 0; bin < fftparameter->length; bin++)
{
float val = fftparameter->spectrum[channelfft][bin];
if (channelfft == 0){
fftheights.push_back(val);
}
else{
fftheights[bin] += val;
}
}
}
result = system->update();
}
由于这个错误,我无法将值推回到 fftheights 向量中,并且始终为空 0,如果你能帮助我,我会同意。
谢谢。
我认为您需要使用以下方法设置这些值:
mydsp->setParameterInt( ... ); // <-- put stuff there
此外,通过查看 "result"
检查函数是否返回任何错误
查看 Here 了解更多信息。
我试图在 3D 平面中表示声音的频谱,但我只能播放声音而无法将 dsp 放入结构中 FMOD_DSP_PARAMETER_FFT,numchannels 和 length 总是 = 0
我的代码是这样的:
FMOD::System *system;
FMOD::Sound *sound1;
FMOD::Channel *channel = 0;
FMOD::ChannelGroup *mastergroup;
FMOD::DSP *mydsp, *dsphead, *dspchannelmixer;
FMOD::DSPConnection *conection;
FMOD_RESULT result;
unsigned int version;
result = FMOD::System_Create(&system);
result = system->getVersion(&version);
result = system->init(32, FMOD_INIT_NORMAL, NULL);
result = system->createSound("mysong.mp3",FMOD_DEFAULT, 0, &sound1);
result = sound1->setMode(FMOD_LOOP_NORMAL);
result = system->playSound(sound1, 0, true, &channel);
/*
Create the DSP effect.
*/
result = system->createDSPByType(FMOD_DSP_TYPE_FFT, &mydsp);
result = mydsp->setParameterFloat(FMOD_DSP_FFT_SPECTRUMDATA, 300.0f);
result = system->getMasterChannelGroup(&mastergroup);
result = mastergroup->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &dsphead);
result = dsphead->getInput(0, &dspchannelmixer, 0);
result = dsphead->disconnectFrom(dspchannelmixer);
result = dsphead->addInput(mydsp, &conection);
result = mydsp->addInput(dspchannelmixer);
result = mydsp->setBypass(true);
result = mydsp->setActive(true);
char s[256];
unsigned int len;
float freq[32];
float fft = 0;
std::vector<float> fftheights;
//program loop
while (1) {
unsigned int ms = 0;
unsigned int lenms = 0;
bool playing = 0;
bool paused = 0;
int channelsplaying = 0;
if (channel)
{
FMOD::Sound *currentsound = 0;
result = channel->setPaused(false);
result = channel->setMute(false);
result = channel->isPlaying(&playing);
result = channel->getPaused(&paused);
result = channel->setVolume(0.5);
result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS);
channel->getCurrentSound(¤tsound);
if (currentsound)
{
result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS);
}
}
system->getChannelsPlaying(&channelsplaying);
render_function();
FMOD_DSP_PARAMETER_FFT *fftparameter;
result = mydsp->getParameterData(FMOD_DSP_FFT_SPECTRUMDATA, (void **)&fftparameter, 0, 0, 0);
result = mydsp->getOutput(FMOD_DSP_FFT_SPECTRUMDATA, &mydsp, 0);
for (int channelfft = 0; channelfft < fftparameter->numchannels; channelfft++)
{
for (int bin = 0; bin < fftparameter->length; bin++)
{
float val = fftparameter->spectrum[channelfft][bin];
if (channelfft == 0){
fftheights.push_back(val);
}
else{
fftheights[bin] += val;
}
}
}
result = system->update();
}
由于这个错误,我无法将值推回到 fftheights 向量中,并且始终为空 0,如果你能帮助我,我会同意。
谢谢。
我认为您需要使用以下方法设置这些值:
mydsp->setParameterInt( ... ); // <-- put stuff there
此外,通过查看 "result"
检查函数是否返回任何错误查看 Here 了解更多信息。