Was working with FMOD Ex before which had setSubSoundSentence to make 2 sounds play one after another.
After i switched to FMOD Studio i saw that this function was gone.
Reading more about it i saw that it got removed due to setDelay being more acurate, however i had problems with finding documentation on how to use it properly so i used the granual_synth example for reference.
However the second sound starts playing way too quickly ( the first song is 30 seconds long and the second one already starts within the first 2 seconds ).
The only modifying to the queue_next_sound i did was making the sound and channel be set in the function ( instead of it being the 2 fixated ones )
Channel *queue_next_sound(int outputrate, Channel *playingchannel, const char* soundname, Sound *pQueuedSound)
Called like this
void CFMODManager::PlayLoopingMusic(const char* pLoopingMusic, const char* pIntroMusic, bool fadeIn)
{
if (pIntroMusic)
{
Sound *pIntroSound = NULL;
Sound *pLoopingSound = NULL;
int outputrate = 0;
result = pSystem->getSoftwareFormat(&outputrate, 0, 0);
pChannel[0] = queue_next_sound(outputrate, NULL, GetFullPathToSound(pIntroMusic), >pIntroSound);
pChannel[1] = queue_next_sound(outputrate, pChannel[0], >GetFullPathToSound(pLoopingMusic), pLoopingSound);
}
…
}
Sequential playback is available in the options of the Multi Instrument:
Im not sure i follow.
Isn’t that the FMOD Studio Tool and not the API?
Does the granual_synth example work as expected?
Are you doing anything very different to the example in queue_next_sound?
I wasn’t able to properly understand granual_synth however after some testing i managed to get a version based on gapeless_playback working
void CFMODManager::PlayLoopingMusic(const char* pLoopingMusic, const char* pIntroMusic)
{
if (pIntroMusic)
{
Sound *pIntroSound = NULL;
Sound *pLoopingSound = NULL;
result = pSystem->createChannelGroup(“Parent”, &pChannelGroup);
int outputrate = 0;
result = pSystem->getSoftwareFormat(&outputrate, 0, 0);
unsigned int dsp_block_len = 0;
result = pSystem->getDSPBufferSize(&dsp_block_len, 0);
unsigned long long clock_start = 0;
result = pSystem->createStream(GetFullPathToSound(pIntroMusic), FMOD_CREATESTREAM, 0, &pIntroSound);
pSystem->playSound(pIntroSound, pChannelGroup, true, &pChannel);
result = pChannel->getDSPClock(0, &clock_start);
clock_start += (dsp_block_len * 2);
result = pChannel->setDelay(clock_start, 0, false);
result = pChannel->setPaused(false);
result = pLoopingSound->setLoopPoints(0, FMOD_TIMEUNIT_PCM, GetSoundLenghtPCM(pLoopingSound), FMOD_TIMEUNIT_PCM);
result = pSystem->createStream(GetFullPathToSound(pLoopingMusic), FMOD_LOOP_NORMAL | FMOD_CREATESTREAM , 0, &pLoopingSound);
pSystem->playSound(pLoopingSound, pChannelGroup, true, &pChannel);
float freq;
unsigned int slen;
result = pIntroSound->getLength(&slen, FMOD_TIMEUNIT_PCM);
result = pIntroSound->getDefaults(&freq, 0);
slen = (unsigned int)((float)slen / freq * outputrate);
clock_start += slen;
result = pChannel->setDelay(clock_start, 0, false);
result = pChannel->setPaused(false);
}
…
}
1 Like