void * SoundManager::startPlaySound(const char * soundId, const bool isMusic) { if (0 == strcmp(soundId, "")) return nullptr; #ifdef FMOD_ACTIVE FMOD::Studio::ID sndID = {0}; FMOD::Studio::EventDescription * sndDescription = NULL; ERRCHECK(_system->lookupID(soundId, &sndID)); ERRCHECK(_system->getEventByID(&sndID, &sndDescription) ); FMOD::Studio::EventInstance* instance = NULL; ERRCHECK( sndDescription->createInstance(&instance) ); ERRCHECK(instance->start()); this->setVolumeForSound(instance, isMusic); if (isMusic) { _instancesMusic.push_back(instance); } else { _instancesFX.push_back(instance); } return instance; #else return nullptr; #endif }
void * SoundManager::playSoundOnce(const char * soundId, const bool isMusic, const bool update) { if (0 == strcmp(soundId, "")) return nullptr; #ifdef FMOD_ACTIVE FMOD::Studio::ID sndID = {0}; ERRCHECK(_system->lookupID(soundId, &sndID)); FMOD::Studio::EventDescription* sndDescription = NULL; ERRCHECK(_system->getEventByID(&sndID, &sndDescription) ); bool isOneShot; sndDescription->isOneshot(&isOneShot); if (!isOneShot) { CCLOG("ATTENZIONE: Il suono non è fire and forget"); } FMOD::Studio::EventInstance* instance = NULL; ERRCHECK(sndDescription->createInstance(&instance)); this->setVolumeForSound(instance, isMusic); ERRCHECK(instance->start()); ERRCHECK(instance->release()); if (update) { ERRCHECK(_system->update()); } return instance; #else return nullptr; #endif }
void UFMODAudioComponent::Play() { Stop(); if (!FMODUtils::IsWorldAudible(GetWorld())) { return; } UE_LOG(LogFMOD, Verbose, TEXT("UFMODAudioComponent %p Play"), this); // Only play events in PIE/game, not when placing them in the editor FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(Event.Get()); if (EventDesc != nullptr) { FMOD_RESULT result = EventDesc->createInstance(&StudioInstance); if (StudioInstance != nullptr) { FMOD_STUDIO_USER_PROPERTY UserProp = {0}; if (EventDesc->getUserProperty("Ambient", &UserProp) == FMOD_OK) { if (UserProp.type == FMOD_STUDIO_USER_PROPERTY_TYPE_FLOAT) // All numbers are stored as float { bApplyAmbientVolumes = (UserProp.floatValue != 0.0f); } } OnUpdateTransform(true); // Set initial parameters for (auto Kvp : StoredParameters) { FMOD_RESULT Result = StudioInstance->setParameterValue(TCHAR_TO_UTF8(*Kvp.Key.ToString()), Kvp.Value); if (Result != FMOD_OK) { UE_LOG(LogFMOD, Warning, TEXT("Failed to set initial parameter %s"), *Kvp.Key.ToString()); } } if (bEnableTimelineCallbacks) { verifyfmod(StudioInstance->setUserData(this)); verifyfmod(StudioInstance->setCallback(UFMODAudioComponent_EventCallback)); } verifyfmod(StudioInstance->start()); UE_LOG(LogFMOD, Verbose, TEXT("Playing component %p"), this); bIsActive = true; SetComponentTickEnabled(true); } } }
/** Get tags to show in content view */ void UFMODEvent::GetAssetRegistryTags(TArray<FAssetRegistryTag>& OutTags) const { Super::GetAssetRegistryTags(OutTags); FMOD::Studio::EventDescription* EventDesc = IFMODStudioModule::Get().GetEventDescription(this, EFMODSystemContext::Auditioning); bool bOneshot = false; bool bStream = false; bool b3D = false; if (EventDesc) { EventDesc->isOneshot(&bOneshot); EventDesc->isStream(&bStream); EventDesc->is3D(&b3D); } OutTags.Add(UObject::FAssetRegistryTag("Oneshot", bOneshot ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical)); OutTags.Add(UObject::FAssetRegistryTag("Streaming", bStream ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical)); OutTags.Add(UObject::FAssetRegistryTag("3D", b3D ? TEXT("True") : TEXT("False"), UObject::FAssetRegistryTag::TT_Alphabetical)); }
std::vector<std::string> SoundManager::getSoundEventsForVideo(int videoNumber) { std::vector<std::string> list; #ifdef FMOD_ACTIVE static const char * fileTemplate = "event:/sndVideo%d/sndVideo%d_"; static const int nameMaxSize = 200; int eventCount = 0; for (FMOD::Studio::Bank * bank : _banks) { ERRCHECK(bank->getEventCount(&eventCount)); if (eventCount > 0) { char tokenCharArray[nameMaxSize]; snprintf(tokenCharArray, 200, fileTemplate, videoNumber, videoNumber); std::string tokenString = tokenCharArray; FMOD::Studio::EventDescription** eventDescriptionsArray = (FMOD::Studio::EventDescription **)malloc(sizeof(FMOD::Studio::EventDescription *) * eventCount); int count = 0; ERRCHECK(bank->getEventList(eventDescriptionsArray, eventCount, &count)); for (int i = 0; i < count; i++) { char soundPath[nameMaxSize]; FMOD::Studio::EventDescription * currentEvent = *(eventDescriptionsArray + i); ERRCHECK(currentEvent->getPath(soundPath, nameMaxSize, nullptr)); std::string pathString = soundPath; if (pathString.find(tokenString) != std::string::npos) { list.push_back(pathString); } } free(eventDescriptionsArray); } } #endif return list; }
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* ambienceBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("Character.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &ambienceBank) ); FMOD::Studio::EventDescription* eventDescription = NULL; ERRCHECK( system->getEvent("event:/Character/Radio/Command", &eventDescription) ); FMOD::Studio::EventInstance* eventInstance = NULL; ERRCHECK( eventDescription->createInstance(&eventInstance) ); ProgrammerSoundContext programmerSoundContext; ERRCHECK( system->getLowLevelSystem(&programmerSoundContext.system) ); ERRCHECK( eventInstance->setUserData(&programmerSoundContext) ); ERRCHECK( eventInstance->setCallback(programmerSoundCallback) ); do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { programmerSoundContext.soundName = Common_MediaPath("sequence-one.ogg"); ERRCHECK( eventInstance->start() ); } if (Common_BtnPress(BTN_ACTION2)) { programmerSoundContext.soundName = Common_MediaPath("sequence-two.ogg"); ERRCHECK( eventInstance->start() ); } if (Common_BtnPress(BTN_ACTION3)) { programmerSoundContext.soundName = Common_MediaPath("sequence-three.ogg"); ERRCHECK( eventInstance->start() ); } if (Common_BtnPress(BTN_ACTION4)) { programmerSoundContext.soundName = Common_MediaPath("sequence-four.ogg"); ERRCHECK( eventInstance->start() ); } ERRCHECK( system->update() ); Common_Draw("=================================================="); Common_Draw("Event Parameter Example."); Common_Draw("Copyright (c) Firelight Technologies 2014-2014."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Press %s to play event with sound 1", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to play event with sound 2", Common_BtnStr(BTN_ACTION2)); Common_Draw("Press %s to play event with sound 3", Common_BtnStr(BTN_ACTION3)); Common_Draw("Press %s to play event with sound 4", Common_BtnStr(BTN_ACTION4)); Common_Draw(""); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); ERRCHECK( system->release() ); Common_Close(); return 0; }
int FMOD_Main() { void *extraDriverData = NULL; Common_Init(&extraDriverData); FMOD::Studio::System* system = NULL; ERRCHECK( FMOD::Studio::System::create(&system) ); 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* ambienceBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("Character.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &ambienceBank) ); FMOD::Studio::EventDescription* eventDescription = NULL; ERRCHECK( system->getEvent("event:/Character/Footsteps/Footsteps", &eventDescription) ); FMOD::Studio::EventInstance* eventInstance = NULL; ERRCHECK( eventDescription->createInstance(&eventInstance) ); FMOD::Studio::ParameterInstance* surfaceParameter = NULL; ERRCHECK( eventInstance->getParameter("Surface", &surfaceParameter) ); // Make the event audible to start with ERRCHECK( surfaceParameter->setValue(1.0f) ); float surfaceParameterValue = 0; ERRCHECK( surfaceParameter->getValue(&surfaceParameterValue) ); ERRCHECK( eventInstance->start() ); do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { surfaceParameterValue -= 1.0f; ERRCHECK( surfaceParameter->setValue(surfaceParameterValue) ); ERRCHECK( surfaceParameter->getValue(&surfaceParameterValue) ); } if (Common_BtnPress(BTN_ACTION2)) { surfaceParameterValue += 1.0f; ERRCHECK( surfaceParameter->setValue(surfaceParameterValue) ); ERRCHECK( surfaceParameter->getValue(&surfaceParameterValue) ); } ERRCHECK( system->update() ); Common_Draw("=================================================="); Common_Draw("Event Parameter Example."); Common_Draw("Copyright (c) Firelight Technologies 2015-2015."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Surface Parameter = %1.1f", surfaceParameterValue); Common_Draw(""); Common_Draw("Surface Parameter:"); Common_Draw("Press %s to decrease value", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to increase value", Common_BtnStr(BTN_ACTION2)); Common_Draw(""); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); ERRCHECK( system->release() ); Common_Close(); return 0; }
int FMOD_Main() { //void *extraDriverData = NULL; Common_Init(NULL); 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 // //ERRCHECK( lowLevelSystem->setSoftwareFormat(0, FMOD_SPEAKERMODE_5POINT1, 0) ); ERRCHECK( system->initialize(32, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, NULL) ); FMOD::System* lowLevelSystem = NULL; ERRCHECK( system->getLowLevelSystem(&lowLevelSystem) ); FMOD_ADVANCEDSETTINGS set = {0}; set.cbSize = sizeof(FMOD_ADVANCEDSETTINGS); lowLevelSystem->getAdvancedSettings(&set); srand(time(NULL)); set.cbSize = sizeof(FMOD_ADVANCEDSETTINGS); set.randomSeed = rand(); printf("%d\n",set.randomSeed); lowLevelSystem->setAdvancedSettings(&set); 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* ambienceBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("Surround_Ambience.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &ambienceBank) ); FMOD::Studio::Bank* menuBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("UI_Menu.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &menuBank) ); FMOD::Studio::Bank* weaponsBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("Weapons.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &weaponsBank) ); FMOD::Studio::Bank* characterBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("Character.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &characterBank) ); // Get the Looping Ambience event FMOD::Studio::EventDescription* loopingAmbienceDescription = NULL; ERRCHECK( system->getEvent("event:/Ambience/Country", &loopingAmbienceDescription) ); FMOD::Studio::EventInstance* loopingAmbienceInstance = NULL; ERRCHECK( loopingAmbienceDescription->createInstance(&loopingAmbienceInstance) ); // Get the 4 Second Surge event FMOD::Studio::EventDescription* cancelDescription = NULL; ERRCHECK( system->getEvent("event:/Character/Hand Foley/Doorknob", &cancelDescription) ); FMOD::Studio::EventInstance* cancelInstance = NULL; ERRCHECK( cancelDescription->createInstance(&cancelInstance) ); // Get the Single Explosion event FMOD::Studio::EventDescription* explosionDescription = NULL; ERRCHECK( system->getEvent("event:/Explosions/Single Explosion", &explosionDescription) ); // Start loading explosion sample data and keep it in memory ERRCHECK( explosionDescription->loadSampleData() ); do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { // One-shot event FMOD::Studio::EventInstance* eventInstance = NULL; ERRCHECK( explosionDescription->createInstance(&eventInstance) ); ERRCHECK( eventInstance->start() ); // Release will clean up the instance when it completes ERRCHECK( eventInstance->release() ); } if (Common_BtnPress(BTN_ACTION2)) { ERRCHECK( loopingAmbienceInstance->start() ); } if (Common_BtnPress(BTN_ACTION3)) { ERRCHECK( loopingAmbienceInstance->stop(FMOD_STUDIO_STOP_IMMEDIATE) ); } if (Common_BtnPress(BTN_ACTION4)) { // Calling start on an instance will cause it to restart if it's already playing ERRCHECK( cancelInstance->start() ); } ERRCHECK( system->update() ); Common_Draw("=================================================="); Common_Draw("Simple Event Example."); Common_Draw("Copyright (c) Firelight Technologies 2014-2014."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Press %s to fire and forget the explosion", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to start the looping ambience", Common_BtnStr(BTN_ACTION2)); Common_Draw("Press %s to stop the looping ambience", Common_BtnStr(BTN_ACTION3)); Common_Draw("Press %s to start/restart the cancel sound", Common_BtnStr(BTN_ACTION4)); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); ERRCHECK( weaponsBank->unload() ); ERRCHECK( menuBank->unload() ); ERRCHECK( ambienceBank->unload() ); ERRCHECK( stringsBank->unload() ); ERRCHECK( masterBank->unload() ); ERRCHECK( characterBank->unload() ); ERRCHECK( system->release() ); Common_Close(); return 0; }
void outputEventByID(FMOD::Studio::System* system, const char* ID) { FMOD_RESULT result; FMOD::Studio::ID eventID = { 0 }; ERRCHECK(system->lookupID(ID, &eventID)); //Lookup the ID string from the banks //Use the ID to get the event FMOD::Studio::EventDescription* eventDescription = NULL; ERRCHECK(system->getEventByID(&eventID, &eventDescription)); // Create an instance of the event FMOD::Studio::EventInstance* eventInstance = NULL; ERRCHECK(eventDescription->createInstance(&eventInstance)); //Preload sample data - otherwise some sounds just dont play //eventDescription->loadSampleData(); Done need this - docs say it starts loading sample as soon as eventinstance created FMOD_STUDIO_LOADING_STATE loadingState = FMOD_STUDIO_LOADING_STATE_LOADING; system->update(); ERRCHECK(eventDescription->getSampleLoadingState(&loadingState)); while (loadingState != FMOD_STUDIO_LOADING_STATE_LOADED) { //if (eventDescription->getSampleLoadingState(&loadingState) == FMOD_OK) //{ // system->update(); //} //else //{} //Sleep(1); ERRCHECK(eventDescription->getSampleLoadingState(&loadingState)); system->update(); } //Try and stop looping :~ failed //FMOD::ChannelGroup* Channels = NULL; //eventInstance->getChannelGroup(&Channels); //Channels->setMode(FMOD_LOOP_OFF); cout << "Dumping " << ID << endl; //TODO - delete file if length is 0 - no point having empty files around int length = 0; result = eventDescription->getLength(&length); if (length == 0) { return; } float rate = 1024.0f / 48000.0f; float newlength = (float)length / 1000; //turn length into seconds float totalCalls = (newlength) / rate; // calculate how many calls of our loop we need till the sound has been played float totalTime = 0.0f; //bool played = false; //OutputDebugString(ID); OutputDebugString("\n"); //Start playback ERRCHECK(eventInstance->start()); //starting here seems to work ok FMOD_STUDIO_PLAYBACK_STATE playbackState = FMOD_STUDIO_PLAYBACK_STOPPED; //system->update(); eventInstance->getPlaybackState(&playbackState); while (playbackState != FMOD_STUDIO_PLAYBACK_PLAYING) { eventInstance->getPlaybackState(&playbackState); system->update(); } int TimelinePos = 0; int LastPos = -1; //for (int i = 0; i < totalCalls; i++) while (TimelinePos < length) { // if(1000 <= totalTime && !played) // { //// play sound just once // //ERRCHECK( eventInstance->start() ); //played = true; // } eventInstance->getTimelinePosition(&TimelinePos); char buffer[255 + 1]; sprintf(buffer, "Timeline Position is %d\n", TimelinePos); OutputDebugString(buffer); if (LastPos > TimelinePos) //Looping sounds repeat it seems eg mus_loop_tense never reaches timelinepos then starts again { break; } LastPos = TimelinePos; system->update(); Sleep(1); //Sleep(1.5); //Crucial! Slows it down enough so that sounds start and end at correct time //Big hack but still cant fix it. Tried with callbacks and other methods - this //Is the only way that 'reliably' works //totalTime += (rate * 1000); //sprintf(buffer, "TotalTime Position is %f\n", totalTime); //OutputDebugString(buffer); } eventInstance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT); //FMOD_STUDIO_STOP_ALLOWFADEOUT playbackState = FMOD_STUDIO_PLAYBACK_STOPPING; while (playbackState != FMOD_STUDIO_PLAYBACK_STOPPED) { eventInstance->getPlaybackState(&playbackState); system->update(); } eventInstance->release(); //necessary????? eventDescription->unloadSampleData(); system->update(); loadingState = FMOD_STUDIO_LOADING_STATE_LOADED; while (loadingState != FMOD_STUDIO_LOADING_STATE_UNLOADED) { if (eventDescription->getSampleLoadingState(&loadingState) == FMOD_OK) { //system->update(); } else { } } //eventDescription->releaseAllInstances; }
bool outputEventByID(FMOD::Studio::System* system, const char* ID) { FMOD_RESULT result; FMOD::Studio::ID eventID = { 0 }; ERRCHECK(system->lookupID(ID, &eventID)); //Lookup the ID string from the banks //Use the ID to get the event FMOD::Studio::EventDescription* eventDescription = NULL; ERRCHECK(system->getEventByID(&eventID, &eventDescription)); // Create an instance of the event FMOD::Studio::EventInstance* eventInstance = NULL; ERRCHECK(eventDescription->createInstance(&eventInstance)); //Preload sample data - otherwise some sounds just dont play //eventDescription->loadSampleData(); Done need this - docs say it starts loading sample as soon as eventinstance created FMOD_STUDIO_LOADING_STATE loadingState = FMOD_STUDIO_LOADING_STATE_LOADING; system->update(); ERRCHECK(eventDescription->getSampleLoadingState(&loadingState)); while (loadingState != FMOD_STUDIO_LOADING_STATE_LOADED) { ERRCHECK(eventDescription->getSampleLoadingState(&loadingState)); system->update(); } int length = 0; result = eventDescription->getLength(&length); if (length == 0) { return false; } cout << "Dumping " << ID << endl; int TimelinePos = 0; int LastPos = -1; bool played = false; while (TimelinePos < length) { if (!played) { ERRCHECK(eventInstance->start()); //Start playback played = true; } eventInstance->getTimelinePosition(&TimelinePos); //char buffer[255 + 1]; //sprintf(buffer, "Timeline Position is %d\n", TimelinePos); //OutputDebugString(buffer); if (LastPos > TimelinePos) //Looping sounds repeat and have wrong getlength value eg mus_loop_tense never reaches timelinepos { //Seems to report a longer length than reality. So if we dont manually stop it, the track loops forever break; } LastPos = TimelinePos; system->update(); Sleep(1); //Crucial! Slows it down enough so that sounds start and end at correct time //Big hack but still cant fix it. Tried with callbacks and other methods - this //Is the only way that 'reliably' works } eventInstance->stop(FMOD_STUDIO_STOP_IMMEDIATE); //FMOD_STUDIO_STOP_ALLOWFADEOUT FMOD_STUDIO_PLAYBACK_STATE playbackState = FMOD_STUDIO_PLAYBACK_STOPPING; while (playbackState != FMOD_STUDIO_PLAYBACK_STOPPED) { eventInstance->getPlaybackState(&playbackState); system->update(); } eventInstance->release(); //necessary????? eventDescription->unloadSampleData(); system->update(); loadingState = FMOD_STUDIO_LOADING_STATE_LOADED; while (loadingState != FMOD_STUDIO_LOADING_STATE_UNLOADED) { if (eventDescription->getSampleLoadingState(&loadingState) == FMOD_OK) { //system->update(); } else { } } //eventDescription->releaseAllInstances; return true; }
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; }
int FMOD_Main() { void *extraDriverData = 0; Common_Init(&extraDriverData); FMOD::Studio::System system; FMOD_RESULT result = FMOD::Studio::System::create(&system); ERRCHECK(result); result = system.initialize(32, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, extraDriverData); ERRCHECK(result); FMOD::Studio::Bank masterBank; ERRCHECK( system.loadBankFile(Common_MediaPath("Master Bank.bank"), &masterBank) ); FMOD::Studio::Bank stringsBank; ERRCHECK( system.loadBankFile(Common_MediaPath("Master Bank.bank.strings"), &stringsBank) ); FMOD::Studio::Bank vehiclesBank; ERRCHECK( system.loadBankFile(Common_MediaPath("Vehicles.bank"), &vehiclesBank) ); FMOD::Studio::ID eventID = {0}; ERRCHECK( system.lookupEventID("/Vehicles/Basic Engine", &eventID) ); FMOD::Studio::EventDescription eventDescription; ERRCHECK( system.getEvent(&eventID, FMOD_STUDIO_LOAD_BEGIN_NOW, &eventDescription) ); FMOD::Studio::EventInstance eventInstance; ERRCHECK( eventDescription.createInstance(&eventInstance) ); FMOD::Studio::ParameterInstance rpm; ERRCHECK( eventInstance.getParameter("RPM", &rpm) ); ERRCHECK( rpm.setValue(650) ); ERRCHECK( eventInstance.start() ); // Position the listener at the origin FMOD_3D_ATTRIBUTES attributes = { { 0 } }; attributes.forward.z = 1.0f; attributes.up.y = 1.0f; ERRCHECK( system.setListenerAttributes(&attributes) ); // Position the event 2 units in front of the listener attributes.position.z = 2.0f; ERRCHECK( eventInstance.set3DAttributes(&attributes) ); initializeScreenBuffer(); do { Common_Update(); if (Common_BtnPress(BTN_LEFT)) { attributes.position.x -= 1.0f; ERRCHECK( eventInstance.set3DAttributes(&attributes) ); } if (Common_BtnPress(BTN_RIGHT)) { attributes.position.x += 1.0f; ERRCHECK( eventInstance.set3DAttributes(&attributes) ); } if (Common_BtnPress(BTN_UP)) { attributes.position.z += 1.0f; ERRCHECK( eventInstance.set3DAttributes(&attributes) ); } if (Common_BtnPress(BTN_DOWN)) { attributes.position.z -= 1.0f; ERRCHECK( eventInstance.set3DAttributes(&attributes) ); } result = system.update(); ERRCHECK(result); updateScreenPosition(attributes.position); Common_Draw("=================================================="); Common_Draw("Event 3D Example."); Common_Draw("Copyright (c) Firelight Technologies 2012-2013."); Common_Draw("=================================================="); Common_Draw(screenBuffer); Common_Draw("Use the arrow keys (%s, %s, %s, %s) to control the event position", Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT), Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); result = system.release(); ERRCHECK(result); 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(1024, 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* ambienceBank = NULL; ERRCHECK( system->loadBankFile(Common_MediaPath("Character.bank"), FMOD_STUDIO_LOAD_BANK_NORMAL, &ambienceBank) ); FMOD::Studio::EventDescription* eventDescription = NULL; ERRCHECK( system->getEvent("event:/Character/Radio/Command", &eventDescription) ); FMOD::Studio::EventInstance* eventInstance = NULL; ERRCHECK( eventDescription->createInstance(&eventInstance) ); ProgrammerSoundContext programmerSoundContext; ERRCHECK( system->getLowLevelSystem(&programmerSoundContext.system) ); ERRCHECK( eventInstance->setUserData(&programmerSoundContext) ); ERRCHECK( eventInstance->setCallback(programmerSoundCallback, FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND | FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND) ); ERRCHECK( eventInstance->setVolume(0.75f) ); do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { programmerSoundContext.soundName = Common_MediaPath("640166main_MECO.ogg"); ERRCHECK( eventInstance->start() ); } if (Common_BtnPress(BTN_ACTION2)) { programmerSoundContext.soundName = Common_MediaPath("640169main_Press to ATO.ogg"); ERRCHECK( eventInstance->start() ); } if (Common_BtnPress(BTN_ACTION3)) { programmerSoundContext.soundName = Common_MediaPath("640148main_APU Shutdown.ogg"); ERRCHECK( eventInstance->start() ); } if (Common_BtnPress(BTN_ACTION4)) { programmerSoundContext.soundName = Common_MediaPath("640165main_Lookin At It.ogg"); ERRCHECK( eventInstance->start() ); } ERRCHECK( system->update() ); Common_Draw("=================================================="); Common_Draw("Programmer Sound Example."); Common_Draw("Copyright (c) Firelight Technologies 2016-2016."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Press %s to play event with sound 1", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to play event with sound 2", Common_BtnStr(BTN_ACTION2)); Common_Draw("Press %s to play event with sound 3", Common_BtnStr(BTN_ACTION3)); Common_Draw("Press %s to play event with sound 4", Common_BtnStr(BTN_ACTION4)); Common_Draw(""); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); ERRCHECK( system->release() ); Common_Close(); return 0; }