int FMOD_Main() { void *extraDriverData = 0; Common_Init(&extraDriverData); RunData data; Common_Mutex_Create(&data.criticalSection); FMOD::Studio::System* system; ERRCHECK( FMOD::Studio::System::create(&system) ); FMOD::System* lowLevelSystem; ERRCHECK( system->getLowLevelSystem(&lowLevelSystem) ); ERRCHECK( lowLevelSystem->setCallback(SystemCallback) ); ERRCHECK( lowLevelSystem->setUserData(&data) ); ERRCHECK( system->initialize(32, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); for (int i=0; i<BANK_COUNT; ++i) { data.banks[i] = NULL; } bool wantSampleLoad = false; do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { // Start loading all the banks for (int i=0; i<BANK_COUNT; ++i) { if (data.banks[i] == NULL || !data.banks[i]->isValid()) { FMOD_RESULT result = system->loadBankFile(Common_MediaPath(BANK_NAMES[i]), FMOD_STUDIO_LOAD_BANK_NONBLOCKING, &data.banks[i]); if (result != FMOD_OK) { } } } } if (Common_BtnPress(BTN_ACTION2)) { // Unload all banks for (int i=0; i<BANK_COUNT; ++i) { FMOD_RESULT result = data.banks[i]->unload(); if (result != FMOD_OK) { } } } if (Common_BtnPress(BTN_MORE)) { wantSampleLoad = !wantSampleLoad; } // Load bank sample data for (int i=0; i<BANK_COUNT; ++i) { FMOD_STUDIO_LOADING_STATE bankLoadState = FMOD_STUDIO_LOADING_STATE_UNLOADED; FMOD_STUDIO_LOADING_STATE sampleLoadState = FMOD_STUDIO_LOADING_STATE_UNLOADED; if (data.banks[i] && data.banks[i]->isValid()) { data.banks[i]->getLoadingState(&bankLoadState); data.banks[i]->getSampleLoadingState(&sampleLoadState); } if (bankLoadState == FMOD_STUDIO_LOADING_STATE_LOADED) { if (wantSampleLoad && sampleLoadState == FMOD_STUDIO_LOADING_STATE_UNLOADED) { ERRCHECK(data.banks[i]->loadSampleData()); } else if (!wantSampleLoad && (sampleLoadState == FMOD_STUDIO_LOADING_STATE_LOADING || sampleLoadState == FMOD_STUDIO_LOADING_STATE_LOADED)) { ERRCHECK(data.banks[i]->unloadSampleData()); } } } ERRCHECK( system->update() ); Common_Draw("=================================================="); Common_Draw("Bank Load Example."); Common_Draw("Copyright (c) Firelight Technologies 2014-2014."); Common_Draw("=================================================="); Common_Draw("Name Handle Bank-State Sample-State"); for (int i=0; i<BANK_COUNT; ++i) { FMOD_STUDIO_LOADING_STATE bankLoadState = FMOD_STUDIO_LOADING_STATE_UNLOADED; FMOD_STUDIO_LOADING_STATE sampleLoadState = FMOD_STUDIO_LOADING_STATE_UNLOADED; if (data.banks[i] && data.banks[i]->isValid()) { data.banks[i]->getLoadingState(&bankLoadState); data.banks[i]->getSampleLoadingState(&sampleLoadState); } char namePad[64]; int bankNameLen = strlen(BANK_NAMES[i]); memset(namePad, ' ', 63); namePad[16] = '\0'; strncpy(namePad, BANK_NAMES[i], bankNameLen); Common_Draw("%s %s %s %s", namePad, getHandleStateString(data.banks[i]), getLoadingStateString(bankLoadState), getLoadingStateString(sampleLoadState)); } Common_Draw(""); Common_Draw("Press %s to load banks, %s to unload banks", Common_BtnStr(BTN_ACTION1), Common_BtnStr(BTN_ACTION2)); Common_Draw("Press %s to toggle sample data: %s", Common_BtnStr(BTN_MORE), wantSampleLoad ? "loaded" : "unloaded"); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); { Common_Mutex_Enter(&data.criticalSection); int errorCount = (int)data.errorStrings.size(); Common_Draw("Errors (%d):", errorCount); int startIndex = errorCount - 6; if (startIndex < 0) startIndex = 0; for (int i=startIndex; i<errorCount; ++i) { Common_Draw(" %s", data.errorStrings[i].c_str()); } Common_Mutex_Leave(&data.criticalSection); } Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); for (int i=0; i<BANK_COUNT; ++i) { if (data.banks[i] != NULL && data.banks[i]->isValid()) { data.banks[i]->unload(); } } ERRCHECK( system->release() ); Common_Mutex_Destroy(&data.criticalSection); Common_Close(); return 0; }
int FMOD_Main() { void *extraDriverData = NULL; Common_Init(&extraDriverData); FMOD::Studio::System* system = NULL; ERRCHECK( FMOD::Studio::System::create(&system) ); // The example Studio project is authored for 5.1 sound, so set up the system output mode to match FMOD::System* lowLevelSystem = NULL; ERRCHECK( system->getLowLevelSystem(&lowLevelSystem) ); ERRCHECK( lowLevelSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); ERRCHECK( system->initialize(32, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData) ); FMOD::Studio::Bank* masterBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("Master Bank.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &masterBank) ); FMOD::Studio::Bank* stringsBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("Master Bank.strings.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &stringsBank) ); FMOD::Studio::Bank* musicBank = NULL; FMOD_RESULT result = system->loadBankFile(Common_MediaPath("Music.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &musicBank); if (result != FMOD_OK) { // Music bank is not exported by default, you will have to export from the tool first Common_Fatal("Please export music.bank from the Studio tool to run this example"); } FMOD::Studio::EventDescription* eventDescription = NULL; ERRCHECK( system->getEvent("event:/Music/Music", &eventDescription) ); FMOD::Studio::EventInstance* eventInstance = NULL; ERRCHECK( eventDescription->createInstance(&eventInstance) ); CallbackInfo info; Common_Mutex_Create(&info.mMutex); ERRCHECK( eventInstance->setUserData(&info) ); ERRCHECK( eventInstance->setCallback(markerCallback, FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_MARKER | FMOD_STUDIO_EVENT_CALLBACK_TIMELINE_BEAT) ); ERRCHECK( eventInstance->start() ); do { Common_Update(); ERRCHECK( system->update() ); int position; ERRCHECK( eventInstance->getTimelinePosition(&position) ); Common_Draw("=================================================="); Common_Draw("Music Callback Example."); Common_Draw("Copyright (c) Firelight Technologies 2015-2015."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Timeline = %d", position); Common_Draw(""); // Obtain lock and look at our strings Common_Mutex_Enter(&info.mMutex); for (size_t i=0; i<info.mEntries.size(); ++i) { Common_Draw(" %s\n", info.mEntries[i].c_str()); } Common_Mutex_Leave(&info.mMutex); Common_Draw(""); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); ERRCHECK( system->release() ); Common_Mutex_Destroy(&info.mMutex); Common_Close(); return 0; }