/*============================================================================== Load From Memory Example Copyright (c), Firelight Technologies Pty, Ltd 2004-2020. This example is simply a variant of the [Play Sound Example](play_sound.html), but it loads the data into memory then uses the 'load from memory' feature of System::createSound. ==============================================================================*/ #include "fmod.h" #include "common.h" #include #include #include #include #include class TestSound { public: TestSound(const char * res_name) { Common_LoadFileMemory(Common_MediaPath(res_name), &filebuff, &length); } ~TestSound() { if (channel) { FMOD_RESULT result = FMOD_Channel_Stop(channel); channel = 0; } if (sound) { FMOD_Sound_Release(sound); sound = 0; } Common_UnloadFileMemory(filebuff); filebuff = 0; length = 0; } FMOD_SOUND *sound = 0; FMOD_CHANNEL *channel = 0; void *filebuff = 0; int length = 0; }; int FMOD_Main() { FMOD_RESULT result; unsigned int version; void *extradriverdata = 0; static FMOD_SYSTEM *msystem; Common_Init(&extradriverdata); /* Create a System object and initialize */ result = FMOD_System_Create(&msystem); ERRCHECK(result); result = FMOD_System_GetVersion(msystem, &version); ERRCHECK(result); if (version < FMOD_VERSION) { Common_Fatal("FMOD lib version %08x doesn't match header version %08x", version, FMOD_VERSION); } result = FMOD_System_SetSoftwareChannels(msystem, 32); ERRCHECK(result); FMOD_INITFLAGS initFlags = FMOD_INIT_NORMAL | FMOD_INIT_3D_RIGHTHANDED | FMOD_INIT_VOL0_BECOMES_VIRTUAL | FMOD_INIT_PROFILE_ENABLE; result = FMOD_System_Init(msystem, 1000, initFlags, extradriverdata); ERRCHECK(result); FMOD_ADVANCEDSETTINGS fAdvSettings = { sizeof(FMOD_ADVANCEDSETTINGS), }; result = FMOD_System_GetAdvancedSettings(msystem, &fAdvSettings); ERRCHECK(result); fAdvSettings.vol0virtualvol = 0.001f; result = FMOD_System_SetAdvancedSettings(msystem, &fAdvSettings); ERRCHECK(result); result = FMOD_System_Set3DSettings(msystem, 1.f, 1.f, 1.f); ERRCHECK(result); std::set testSounds; int loopCut = 0; int index = 0; bool hadDel = false; FMOD_BOOL isPlaying = false; do { result = FMOD_System_Update(msystem); ERRCHECK(result); if (testSounds.size() < 50) { TestSound *pSound = new TestSound("stereo.ogg"); FMOD_CREATESOUNDEXINFO exinfo = { 0 };; memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); exinfo.length = pSound->length; result = FMOD_System_CreateSound(msystem, (const char *)pSound->filebuff, FMOD_OPENMEMORY | FMOD_LOOP_OFF | FMOD_2D | FMOD_NONBLOCKING | FMOD_LOWMEM, &exinfo, &pSound->sound); ERRCHECK(result); if (pSound) testSounds.insert(pSound); } for (auto iter = testSounds.begin(); iter != testSounds.end();) { hadDel = false; FMOD_OPENSTATE state = FMOD_OPENSTATE_READY; TestSound *pSound = (*iter); result = FMOD_Sound_GetOpenState(pSound->sound, &state, 0, 0, 0); ERRCHECK(result); if (state == FMOD_OPENSTATE_READY&&pSound->channel==0) { result = FMOD_System_PlaySound(msystem, pSound->sound, 0, 0, &pSound->channel); ERRCHECK(result); } else if(pSound->channel) { FMOD_Channel_IsPlaying(pSound->channel,&isPlaying); hadDel = isPlaying==0 ? true : false; } if (hadDel){ iter = testSounds.erase(iter); } else { ++iter; } } } while (!Common_BtnPress(BTN_QUIT)); result = FMOD_System_Close(msystem); ERRCHECK(result); result = FMOD_System_Release(msystem); ERRCHECK(result); Common_Close(); return 0; }