2

I'm trying to represent the spectrum of a sound in a 3D plane but I only can play the sound and can't get the dsp into the structure FMOD_DSP_PARAMETER_FFT, numchannels and length are always = 0

My code is something like this:

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(&currentsound);
    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();
}

with this error I can't push back values into fftheights vector and always empty of 0, if you can help me I will agree.

Thank You.

Custodius
  • 63
  • 10

1 Answers1

1

I think you need to set those values using:

    mydsp->setParameterInt( ... ); // <-- put stuff there

Also, check to see if the functions are returning any errors by looking at "result"

Look Here for more info.

  • I tried with this: mydsp->setParameterInt(FMOD_DSP_FFT_WINDOWSIZE, FFT_NUM_BINS); mydsp->setParameterInt(FMOD_DSP_FFT_WINDOWTYPE, FMOD_DSP_FFT_WINDOW_HAMMING); now I receive numbers but are very low values (*10e-34) and never changes :( – Custodius May 17 '15 at 09:50
  • Roddey, what do you mean when you say "put staff here"? Can you give me an example? – Custodius May 17 '15 at 15:56
  • That is what I was getting at when I said "put stuff here". Just adding the arguments to the function. What window size do you intend for the FFT? Try putting in the exact number, and also check all the " result" variable. You might want to head over to the signal processing exchange. They might be more familiar with fmod than I am. – Roddey Frost May 17 '15 at 19:40
  • Ok thank you Roddey I will write in the signal procesing exchange – Custodius May 17 '15 at 20:36