void set_paused(FMOD_CHANNEL **channel, int paused) { FMOD_RESULT result; unsigned int blocksize; result = FMOD_System_GetDSPBufferSize(gSystem, &blocksize, 0); ERRCHECK(result); if (!paused) { unsigned int pausestart_hi = 0, pausestart_lo = 0; FMOD_System_GetDSPClock(gSystem, &pausestart_hi, &pausestart_lo); FMOD_64BIT_ADD(pausestart_hi, pausestart_lo, 0, blocksize * 2); /* Into the future by 2 mixer blocks. */ printf("\npause BOTH at %d \n", pausestart_lo); /* Make them both pause at exactly the same tick. Mute them both to avoid a click as well. */ FMOD_Channel_SetMute(channel[0], TRUE); FMOD_Channel_SetDelay(channel[0], FMOD_DELAYTYPE_DSPCLOCK_PAUSE, pausestart_hi, pausestart_lo); FMOD_Channel_SetMute(channel[1], TRUE); FMOD_Channel_SetDelay(channel[1], FMOD_DELAYTYPE_DSPCLOCK_PAUSE, pausestart_hi, pausestart_lo); } else { unsigned int syshi, syslo; int count; FMOD_System_GetDSPClock(gSystem, &syshi, &syslo); printf("\nunpause BOTH at %d\n", syslo); for (count = 0; count < 2; count++) { unsigned int starttime_hi, starttime_lo; unsigned int pausetime_hi = 0, pausetime_lo = 0; unsigned int hi = syshi, lo = syslo; FMOD_Channel_GetDelay(channel[count], FMOD_DELAYTYPE_DSPCLOCK_PAUSE, &pausetime_hi, &pausetime_lo); FMOD_Channel_GetDelay(channel[count], FMOD_DELAYTYPE_DSPCLOCK_START, &starttime_hi, &starttime_lo); FMOD_64BIT_ADD(hi, lo, 0, blocksize * 2); /* Push operation into the future by 2 mixer blocks so it doesnt conflict with mixer. */ if (starttime_lo > pausetime_lo) /* Was already playing, unpause immediately. */ { FMOD_64BIT_ADD(hi, lo, starttime_hi, starttime_lo); /* Push forward the delayed start by the gap between starting and pausing */ FMOD_64BIT_SUB(hi, lo, pausetime_hi, pausetime_lo); /* Push forward the delayed start by the gap between starting and pausing */ } printf("restart %d at %d\n", count, lo); FMOD_Channel_SetDelay(channel[count], FMOD_DELAYTYPE_DSPCLOCK_PAUSE, 0, 0); FMOD_Channel_SetDelay(channel[count], FMOD_DELAYTYPE_DSPCLOCK_START, hi, lo); FMOD_Channel_SetMute(channel[count], FALSE); FMOD_Channel_SetPaused(channel[count], FALSE); } } }
//--------------------------------------- // this should only be called once void ofFmodSoundPlayer::initializeFmod(){ if(!bFmodInitialized_){ FMOD_System_Create(&sys); // set buffersize, keep number of buffers unsigned int bsTmp; int nbTmp; FMOD_System_GetDSPBufferSize(sys, &bsTmp, &nbTmp); FMOD_System_SetDSPBufferSize(sys, buffersize, nbTmp); #ifdef TARGET_LINUX FMOD_System_SetOutput(sys,FMOD_OUTPUTTYPE_ALSA); #endif FMOD_System_Init(sys, 32, FMOD_INIT_NORMAL, nullptr); //do we want just 32 channels? FMOD_System_GetMasterChannelGroup(sys, &channelgroup); bFmodInitialized_ = true; } }