int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound[6]; FMOD::Channel *channel[6]; FMOD::ChannelGroup *groupA, *groupB, *masterGroup; FMOD_RESULT result; int key, count; unsigned int version; /* Create a System object and initialize. */ result = FMOD::System_Create(&system); ERRCHECK(result); result = system->getVersion(&version); ERRCHECK(result); if (version < FMOD_VERSION) { printf("Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION); return 0; } result = system->init(32, FMOD_INIT_NORMAL, 0); ERRCHECK(result); result = system->createSound("../media/drumloop.wav", FMOD_LOOP_NORMAL, 0, &sound[0]); ERRCHECK(result); result = system->createSound("../media/jaguar.wav", FMOD_LOOP_NORMAL, 0, &sound[1]); ERRCHECK(result); result = system->createSound("../media/swish.wav", FMOD_LOOP_NORMAL, 0, &sound[2]); ERRCHECK(result); result = system->createSound("../media/c.ogg", FMOD_LOOP_NORMAL, 0, &sound[3]); ERRCHECK(result); result = system->createSound("../media/d.ogg", FMOD_LOOP_NORMAL, 0, &sound[4]); ERRCHECK(result); result = system->createSound("../media/e.ogg", FMOD_LOOP_NORMAL, 0, &sound[5]); ERRCHECK(result); result = system->createChannelGroup("Group A", &groupA); ERRCHECK(result); result = system->createChannelGroup("Group B", &groupB); ERRCHECK(result); result = system->getMasterChannelGroup(&masterGroup); ERRCHECK(result); printf("=======================================================================\n"); printf("ChannelGroups Example. Copyright (c) Firelight Technologies 2004-2014.\n"); printf("=======================================================================\n"); printf("\n"); printf("Group A : drumloop.wav, jaguar.wav, swish.wav\n"); printf("Group B : c.ogg, d.ogg, e.ogg\n"); printf("\n"); printf("Press 'A' to mute/unmute group A\n"); printf("Press 'B' to mute/unmute group B\n"); printf("Press 'C' to mute/unmute group A and B (master group)\n"); printf("Press 'Esc' to quit\n"); printf("\n"); /* Instead of being independent, set the group A and B to be children of the master group. */ result = masterGroup->addGroup(groupA); ERRCHECK(result); result = masterGroup->addGroup(groupB); ERRCHECK(result); /* Start all the sounds! */ for (count = 0; count < 6; count++) { result = system->playSound(FMOD_CHANNEL_FREE, sound[count], true, &channel[count]); ERRCHECK(result); if (count < 3) { result = channel[count]->setChannelGroup(groupA); } else { result = channel[count]->setChannelGroup(groupB); } ERRCHECK(result); result = channel[count]->setPaused(false); ERRCHECK(result); } /* Change the volume of each group, just because we can! (And makes it less noise). */ result = groupA->setVolume(0.5f); ERRCHECK(result); result = groupB->setVolume(0.5f); ERRCHECK(result); /* Main loop. */ do { if (kbhit()) { key = getch(); switch (key) { case 'a' : case 'A' : { static bool mute = true; groupA->setMute(mute); mute = !mute; break; } case 'b' : case 'B' : { static bool mute = true; groupB->setMute(mute); mute = !mute; break; } case 'c' : case 'C' : { static bool mute = true; masterGroup->setMute(mute); mute = !mute; break; } } } system->update(); { int channelsplaying = 0; system->getChannelsPlaying(&channelsplaying); printf("Channels Playing %2d\r", channelsplaying); } Sleep(10); } while (key != 27); printf("\n"); /* A little fade out. (over 2 seconds) */ printf("Goodbye!\n"); { float pitch = 1.0f; float vol = 1.0f; for (count = 0; count < 200; count++) { masterGroup->setPitch(pitch); masterGroup->setVolume(vol); vol -= (1.0f / 200.0f); pitch -= (0.5f / 200.0f); Sleep(10); } } /* Shut down */ for (count = 0; count < 6; count++) { result = sound[count]->release(); ERRCHECK(result); } result = groupA->release(); ERRCHECK(result); result = groupB->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }
int FMOD_Main() { FMOD::System *system; FMOD::Sound *sound; FMOD::Channel *channel; FMOD::DSP *mydsp; FMOD::ChannelGroup *mastergroup; FMOD_RESULT result; unsigned int version; void *extradriverdata = 0; Common_Init(&extradriverdata); /* Create a System object and initialize. */ result = FMOD::System_Create(&system); ERRCHECK(result); result = system->getVersion(&version); ERRCHECK(result); if (version < FMOD_VERSION) { Common_Fatal("FMOD lib version %08x doesn't match header version %08x", version, FMOD_VERSION); } result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); ERRCHECK(result); result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_SOFTWARE | FMOD_LOOP_NORMAL, 0, &sound); ERRCHECK(result); result = system->playSound(sound, 0, false, &channel); ERRCHECK(result); /* Create the DSP effect. */ { FMOD_DSP_DESCRIPTION dspdesc; memset(&dspdesc, 0, sizeof(dspdesc)); strncpy(dspdesc.name, "My first DSP unit", sizeof(dspdesc.name)); dspdesc.version = 0x00010000; dspdesc.numinputbuffers = 1; dspdesc.numoutputbuffers = 1; dspdesc.read = myDSPCallback; dspdesc.userdata = (void *)0x12345678; result = system->createDSP(&dspdesc, &mydsp); ERRCHECK(result); } /* Attach the DSP, inactive by default. */ result = mydsp->setBypass(true); ERRCHECK(result); result = system->getMasterChannelGroup(&mastergroup); ERRCHECK(result); result = mastergroup->addDSP(0, mydsp, 0); ERRCHECK(result); /* Main loop. */ do { bool bypass; Common_Update(); result = mydsp->getBypass(&bypass); ERRCHECK(result); if (Common_BtnPress(BTN_ACTION1)) { bypass = !bypass; result = mydsp->setBypass(bypass); ERRCHECK(result); } result = system->update(); ERRCHECK(result); Common_Draw("=================================================="); Common_Draw("Custom DSP Example."); Common_Draw("Copyright (c) Firelight Technologies 2004-2014."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Press %s to toggle filter bypass", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Draw(""); Common_Draw("Filter is %s", bypass ? "inactive" : "active"); Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); /* Shut down */ result = sound->release(); ERRCHECK(result); result = mastergroup->removeDSP(mydsp); ERRCHECK(result); result = mydsp->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); Common_Close(); return 0; }
int FMOD_Main() { FMOD::System *system = 0; FMOD::Sound *sound = 0; FMOD::Channel *channel = 0; FMOD::ChannelGroup *mastergroup = 0; FMOD::DSP *dsplowpass = 0; FMOD::DSP *dsphighpass = 0; FMOD::DSP *dspecho = 0; FMOD::DSP *dspflange = 0; FMOD_RESULT result; unsigned int version; void *extradriverdata = 0; Common_Init(&extradriverdata); /* Create a System object and initialize */ result = FMOD::System_Create(&system); ERRCHECK(result); result = system->getVersion(&version); ERRCHECK(result); if (version < FMOD_VERSION) { Common_Fatal("FMOD lib version %08x doesn't match header version %08x", version, FMOD_VERSION); } result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); ERRCHECK(result); result = system->getMasterChannelGroup(&mastergroup); ERRCHECK(result); result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_DEFAULT, 0, &sound); ERRCHECK(result); result = system->playSound(sound, 0, false, &channel); ERRCHECK(result); /* Create some effects to play with */ result = system->createDSPByType(FMOD_DSP_TYPE_LOWPASS, &dsplowpass); ERRCHECK(result); result = system->createDSPByType(FMOD_DSP_TYPE_HIGHPASS, &dsphighpass); ERRCHECK(result); result = system->createDSPByType(FMOD_DSP_TYPE_ECHO, &dspecho); ERRCHECK(result); result = system->createDSPByType(FMOD_DSP_TYPE_FLANGE, &dspflange); ERRCHECK(result); /* Add them to the master channel group. Each time an effect is added (to position 0) it pushes the others down the list. */ result = mastergroup->addDSP(0, dsplowpass); ERRCHECK(result); result = mastergroup->addDSP(0, dsphighpass); ERRCHECK(result); result = mastergroup->addDSP(0, dspecho); ERRCHECK(result); result = mastergroup->addDSP(0, dspflange); ERRCHECK(result); /* By default, bypass all effects. This means let the original signal go through without processing. It will sound 'dry' until effects are enabled by the user. */ result = dsplowpass->setBypass(true); ERRCHECK(result); result = dsphighpass->setBypass(true); ERRCHECK(result); result = dspecho->setBypass(true); ERRCHECK(result); result = dspflange->setBypass(true); ERRCHECK(result); /* Main loop */ do { Common_Update(); if (Common_BtnPress(BTN_MORE)) { bool paused; result = channel->getPaused(&paused); ERRCHECK(result); paused = !paused; result = channel->setPaused(paused); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION1)) { bool bypass; result = dsplowpass->getBypass(&bypass); ERRCHECK(result); bypass = !bypass; result = dsplowpass->setBypass(bypass); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION2)) { bool bypass; result = dsphighpass->getBypass(&bypass); ERRCHECK(result); bypass = !bypass; result = dsphighpass->setBypass(bypass); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION3)) { bool bypass; result = dspecho->getBypass(&bypass); ERRCHECK(result); bypass = !bypass; result = dspecho->setBypass(bypass); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION4)) { bool bypass; result = dspflange->getBypass(&bypass); ERRCHECK(result); bypass = !bypass; result = dspflange->setBypass(bypass); ERRCHECK(result); } result = system->update(); ERRCHECK(result); { bool paused = 0; bool dsplowpass_bypass; bool dsphighpass_bypass; bool dspecho_bypass; bool dspflange_bypass; dsplowpass ->getBypass(&dsplowpass_bypass); dsphighpass ->getBypass(&dsphighpass_bypass); dspecho ->getBypass(&dspecho_bypass); dspflange ->getBypass(&dspflange_bypass); if (channel) { result = channel->getPaused(&paused); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) { ERRCHECK(result); } } Common_Draw("=================================================="); Common_Draw("Effects Example."); Common_Draw("Copyright (c) Firelight Technologies 2004-2015."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Press %s to pause/unpause sound", Common_BtnStr(BTN_MORE)); Common_Draw("Press %s to toggle dsplowpass effect", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to toggle dsphighpass effect", Common_BtnStr(BTN_ACTION2)); Common_Draw("Press %s to toggle dspecho effect", Common_BtnStr(BTN_ACTION3)); Common_Draw("Press %s to toggle dspflange effect", Common_BtnStr(BTN_ACTION4)); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Draw(""); Common_Draw("%s : lowpass[%c] highpass[%c] echo[%c] flange[%c]", paused ? "Paused " : "Playing", dsplowpass_bypass ? ' ' : 'x', dsphighpass_bypass ? ' ' : 'x', dspecho_bypass ? ' ' : 'x', dspflange_bypass ? ' ' : 'x'); } Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); /* Shut down */ result = mastergroup->removeDSP(dsplowpass); ERRCHECK(result); result = mastergroup->removeDSP(dsphighpass); ERRCHECK(result); result = mastergroup->removeDSP(dspecho); ERRCHECK(result); result = mastergroup->removeDSP(dspflange); ERRCHECK(result); result = dsplowpass->release(); ERRCHECK(result); result = dsphighpass->release(); ERRCHECK(result); result = dspecho->release(); ERRCHECK(result); result = dspflange->release(); ERRCHECK(result); result = sound->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); Common_Close(); return 0; }
int main(int ac, const char **av) { // Create application window WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, _T("Douceur"), NULL }; RegisterClassEx(&wc); HWND hwnd = CreateWindow(_T("Douceur"), _T("Douceur"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); // Initialize Direct3D if (CreateDeviceD3D(hwnd) < 0) { CleanupDeviceD3D(); UnregisterClass(_T("Douceur"), wc.hInstance); return 1; } // Show the window ShowWindow(hwnd, SW_SHOWDEFAULT); UpdateWindow(hwnd); // Setup ImGui binding ImGui_ImplDX11_Init(hwnd, g_pd3dDevice, g_pd3dDeviceContext); // Load Fonts // (there is a default font, this is only if you want to change it. see extra_fonts/README.txt for more details) //ImGuiIO& io = ImGui::GetIO(); //io.Fonts->AddFontDefault(); //io.Fonts->AddFontFromFileTTF("../../extra_fonts/Cousine-Regular.ttf", 15.0f); //io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f); //io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f); //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); bool show_test_window = true; ImVec4 clear_col = ImColor(114, 144, 154); // Main loop MSG msg; ZeroMemory(&msg, sizeof(msg)); std::string arduinoMsg; std::string arduinoDisplayMsg; bool messageEnded = true; FMOD::System *fmodSystem; FMOD::System_Create(&fmodSystem); FMOD::Sound *sound = 0; FMOD::Channel *channel = 0; FMOD::ChannelGroup *mastergroup = 0; fmodSystem->init(128, FMOD_INIT_NORMAL, 0); fmodSystem->getMasterChannelGroup(&mastergroup); fmodSystem->createSound("../DouceurExternal/audio-samples/Yamaha-1.wav", FMOD_LOOP_NORMAL, 0, &sound); unsigned int soundLength = 0; sound->getLength(&soundLength, FMOD_TIMEUNIT_MS); Serial arduino("COM6"); Board board(fmodSystem); while (msg.message != WM_QUIT) { fmodSystem->update(); if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); continue; } ImGui_ImplDX11_NewFrame(); static bool first = true; static int from = 0; static int to = 400; static float freq = 1.f; static float pan = 0.f; static float pitch = 0.f; if (!first) { fmodSystem->playSound(sound, mastergroup, false, &channel); first = true; to = soundLength; channel->getFrequency(&freq); channel->getPitch(&pitch); } { ImGui::SetNextWindowPos(ImVec2(10, 10)); ImGui::Begin("FPS", nullptr, ImVec2(0, 0), 0.3f, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); ImGui::End(); } if (false) { ImGui::Begin("SoloudTest"); bool changed = ImGui::SliderInt("from", (int*)&from, 0, soundLength - 1); changed |= ImGui::SliderInt("to", (int*)&to, 1, soundLength); changed |= ImGui::SliderFloat("freq", &freq, 0, 500000.f); changed |= ImGui::SliderFloat("pan", &pan, -1.f, 1.f); changed |= ImGui::SliderFloat("pitch", &pitch, 0.f, 10.f); if (changed) { if (from >= to) { from = to - 1; } channel->setLoopPoints(from, FMOD_TIMEUNIT_MS, to, FMOD_TIMEUNIT_MS); channel->setFrequency(freq); channel->setPan(pan); } ImGui::End(); } if (false) { ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver); // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly! ImGui::ShowTestWindow(nullptr); } board.updateGui(); //Arduino test { if (arduino.IsConnected()) { if (ImGui::Begin("Arduino test")) { char buffer[2048]; if (messageEnded) { arduino.WriteData("A", 1); messageEnded = false; } while (!messageEnded) { int count = arduino.ReadData(buffer, 2047); if (count) { buffer[count] = '\0'; if (buffer[count - 1] == '@') { buffer[count - 1] = '\0'; messageEnded = true; } arduinoMsg += buffer; } else { break; } } if (messageEnded) { board.updatePadsVoltage(arduinoMsg); arduinoDisplayMsg = arduinoMsg; arduinoMsg.clear(); } ImGui::TextWrapped(arduinoDisplayMsg.c_str()); ImGui::Text("Message size : %i", arduinoDisplayMsg.size()); } ImGui::End(); board.displayPadsVoltage(); } } // Rendering g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, (float*)&clear_col); ImGui::Render(); g_pSwapChain->Present(0, 0); } ImGui_ImplDX11_Shutdown(); CleanupDeviceD3D(); UnregisterClass(_T("Douceur"), wc.hInstance); return EXIT_SUCCESS; }
void FMOD_System::ResumePlayback() { FMOD::ChannelGroup *masterGroup; system->getMasterChannelGroup( &masterGroup ); masterGroup->setPaused( false ); }
int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound; FMOD::Channel *channel = 0; FMOD_RESULT result; int key; unsigned int version; /* Create a System object and initialize. */ result = FMOD::System_Create(&system); ERRCHECK(result); result = system->getVersion(&version); ERRCHECK(result); if (version < FMOD_VERSION) { printf("Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION); return 0; } result = system->init(1, FMOD_INIT_NORMAL, 0); ERRCHECK(result); result = system->createStream("../media/wave.mp3", FMOD_HARDWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound); ERRCHECK(result); printf("====================================================================\n"); printf("PlayStream Example. Copyright (c) Firelight Technologies 2004-2011.\n"); printf("====================================================================\n"); printf("\n"); printf("Press space to pause, Esc to quit\n"); printf("\n"); /* Play the sound. */ result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel); ERRCHECK(result); /* Main loop. */ do { if (_kbhit()) { key = _getch(); switch (key) { case ' ' : { bool paused; channel->getPaused(&paused); channel->setPaused(!paused); break; } case 'p' : { FMOD::ChannelGroup* masterGroup = NULL; system->getMasterChannelGroup(&masterGroup); if (masterGroup) { bool paused; masterGroup->getPaused(&paused); masterGroup->setPaused(!paused); } break; } } } system->update(); if (channel) { unsigned int ms; unsigned int lenms; bool playing; bool paused; result = channel->isPlaying(&playing); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) { ERRCHECK(result); } result = channel->getPaused(&paused); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) { ERRCHECK(result); } result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) { ERRCHECK(result); } result = sound->getLength(&lenms, FMOD_TIMEUNIT_MS); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE)) { ERRCHECK(result); } printf("Time %02d:%02d:%02d/%02d:%02d:%02d : %s\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped"); } Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ result = sound->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }
int FMOD_Main() { FMOD::System *system; FMOD::Sound *sound[6]; FMOD::Channel *channel[6]; FMOD::ChannelGroup *groupA, *groupB, *masterGroup; FMOD_RESULT result; int count; unsigned int version; void *extradriverdata = 0; Common_Init(&extradriverdata); /* Create a System object and initialize. */ result = FMOD::System_Create(&system); ERRCHECK(result); result = system->getVersion(&version); ERRCHECK(result); if (version < FMOD_VERSION) { Common_Fatal("FMOD lib version %08x doesn't match header version %08x", version, FMOD_VERSION); } result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); ERRCHECK(result); result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_LOOP_NORMAL, 0, &sound[0]); ERRCHECK(result); result = system->createSound(Common_MediaPath("jaguar.wav"), FMOD_LOOP_NORMAL, 0, &sound[1]); ERRCHECK(result); result = system->createSound(Common_MediaPath("swish.wav"), FMOD_LOOP_NORMAL, 0, &sound[2]); ERRCHECK(result); result = system->createSound(Common_MediaPath("c.ogg"), FMOD_LOOP_NORMAL, 0, &sound[3]); ERRCHECK(result); result = system->createSound(Common_MediaPath("d.ogg"), FMOD_LOOP_NORMAL, 0, &sound[4]); ERRCHECK(result); result = system->createSound(Common_MediaPath("e.ogg"), FMOD_LOOP_NORMAL, 0, &sound[5]); ERRCHECK(result); result = system->createChannelGroup("Group A", &groupA); ERRCHECK(result); result = system->createChannelGroup("Group B", &groupB); ERRCHECK(result); result = system->getMasterChannelGroup(&masterGroup); ERRCHECK(result); /* Instead of being independent, set the group A and B to be children of the master group. */ result = masterGroup->addGroup(groupA); ERRCHECK(result); result = masterGroup->addGroup(groupB); ERRCHECK(result); /* Start all the sounds. */ for (count = 0; count < 6; count++) { result = system->playSound(sound[count], 0, true, &channel[count]); ERRCHECK(result); result = channel[count]->setChannelGroup((count < 3) ? groupA : groupB); ERRCHECK(result); result = channel[count]->setPaused(false); ERRCHECK(result); } /* Change the volume of each group, just because we can! (reduce overall noise). */ result = groupA->setVolume(0.5f); ERRCHECK(result); result = groupB->setVolume(0.5f); ERRCHECK(result); /* Main loop. */ do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { bool mute = true; groupA->getMute(&mute); groupA->setMute(!mute); } if (Common_BtnPress(BTN_ACTION2)) { bool mute = true; groupB->getMute(&mute); groupB->setMute(!mute); } if (Common_BtnPress(BTN_ACTION3)) { bool mute = true; masterGroup->getMute(&mute); masterGroup->setMute(!mute); } result = system->update(); ERRCHECK(result); { int channelsplaying = 0; result = system->getChannelsPlaying(&channelsplaying); ERRCHECK(result); Common_Draw("=================================================="); Common_Draw("Channel Groups Example."); Common_Draw("Copyright (c) Firelight Technologies 2004-2014."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Group A : drumloop.wav, jaguar.wav, swish.wav"); Common_Draw("Group B : c.ogg, d.ogg, e.ogg"); Common_Draw(""); Common_Draw("Press %s to mute/unmute group A", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to mute/unmute group B", Common_BtnStr(BTN_ACTION2)); Common_Draw("Press %s to mute/unmute master group", Common_BtnStr(BTN_ACTION3)); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Draw(""); Common_Draw("Channels playing %d", channelsplaying); } Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); /* A little fade out over 2 seconds. */ { float pitch = 1.0f; float vol = 1.0f; for (count = 0; count < 200; count++) { masterGroup->setPitch(pitch); masterGroup->setVolume(vol); vol -= (1.0f / 200.0f); pitch -= (0.5f / 200.0f); Common_Sleep(10); } } /* Shut down. */ for (count = 0; count < 6; count++) { result = sound[count]->release(); ERRCHECK(result); } result = groupA->release(); ERRCHECK(result); result = groupB->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); Common_Close(); return 0; }
int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound[5]; FMOD::Channel *channel[5]; FMOD::ChannelGroup *groupA, *groupB, *masterGroup; FMOD::DSP *dspreverb, *dspflange, *dsplowpass; FMOD_RESULT result; int key, count; unsigned int version; /* Create a System object and initialize. */ result = FMOD::System_Create(&system); ERRCHECK(result); result = system->getVersion(&version); ERRCHECK(result); if (version < FMOD_VERSION) { printf("Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION); return 0; } result = system->init(32, FMOD_INIT_NORMAL, 0); ERRCHECK(result); result = system->createSound("../media/drumloop.wav", FMOD_SOFTWARE | FMOD_LOOP_NORMAL, 0, &sound[0]); ERRCHECK(result); result = system->createSound("../media/jaguar.wav", FMOD_SOFTWARE | FMOD_LOOP_NORMAL, 0, &sound[1]); ERRCHECK(result); result = system->createSound("../media/c.ogg", FMOD_SOFTWARE | FMOD_LOOP_NORMAL, 0, &sound[2]); ERRCHECK(result); result = system->createSound("../media/d.ogg", FMOD_SOFTWARE | FMOD_LOOP_NORMAL, 0, &sound[3]); ERRCHECK(result); result = system->createSound("../media/e.ogg", FMOD_SOFTWARE | FMOD_LOOP_NORMAL, 0, &sound[4]); ERRCHECK(result); result = system->createChannelGroup("Group A", &groupA); ERRCHECK(result); result = system->createChannelGroup("Group B", &groupB); ERRCHECK(result); result = system->getMasterChannelGroup(&masterGroup); ERRCHECK(result); result = masterGroup->addGroup(groupA); ERRCHECK(result); result = masterGroup->addGroup(groupB); ERRCHECK(result); printf("======================================================================\n"); printf("Sub-mixing example. Copyright (c) Firelight Technologies 2004-2014.\n"); printf("======================================================================\n"); printf(" (drumloop.wav) \n"); printf(" / \n"); printf(" (groupA) \n"); printf(" (reverb)/ \\ \n"); printf(" / (jaguar.wav) \n"); printf("(soundcard)--(lowpass)--(mastergroup) \n"); printf(" \\ (c.ogg) \n"); printf(" (flange) / \n"); printf(" \\(groupB)--(d.ogg) \n"); printf(" \\ \n"); printf(" (e.ogg) \n"); printf("Press 'A' to mute/unmute group A\n"); printf("Press 'B' to mute/unmute group B\n"); printf("\n"); printf("Press 'R' to place reverb on group A\n"); printf("Press 'F' to place flange on group B\n"); printf("Press 'L' to place lowpass on master group (everything)\n"); printf("Press 'Esc' to quit\n"); printf("\n"); /* Start all the sounds! */ for (count = 0; count < 5; count++) { result = system->playSound(FMOD_CHANNEL_FREE, sound[count], true, &channel[count]); ERRCHECK(result); if (count < 2) { result = channel[count]->setChannelGroup(groupA); } else { result = channel[count]->setChannelGroup(groupB); } ERRCHECK(result); result = channel[count]->setPaused(false); ERRCHECK(result); } /* Create the DSP effects we want to apply to our submixes. */ result = system->createDSPByType(FMOD_DSP_TYPE_SFXREVERB, &dspreverb); ERRCHECK(result); result = system->createDSPByType(FMOD_DSP_TYPE_FLANGE, &dspflange); ERRCHECK(result); result = dspflange->setParameter(FMOD_DSP_FLANGE_RATE, 1.0f); ERRCHECK(result); result = system->createDSPByType(FMOD_DSP_TYPE_LOWPASS, &dsplowpass); ERRCHECK(result); result = dsplowpass->setParameter(FMOD_DSP_LOWPASS_CUTOFF, 500.0f); ERRCHECK(result); /* Main loop. */ do { if (kbhit()) { key = getch(); switch (key) { case 'a' : case 'A' : { static bool mute = true; groupA->setMute(mute); mute = !mute; break; } case 'b' : case 'B' : { static bool mute = true; groupB->setMute(mute); mute = !mute; break; } case 'r' : case 'R' : { static bool reverb = true; if (reverb) { groupA->addDSP(dspreverb, 0); } else { dspreverb->remove(); } reverb = !reverb; break; } case 'f' : case 'F' : { static bool flange = true; if (flange) { groupB->addDSP(dspflange, 0); } else { dspflange->remove(); } flange = !flange; break; } case 'l' : case 'L' : { static bool lowpass = true; if (lowpass) { masterGroup->addDSP(dsplowpass, 0); } else { dsplowpass->remove(); } lowpass = !lowpass; break; } } } system->update(); { int channelsplaying = 0; system->getChannelsPlaying(&channelsplaying); printf("Channels Playing %2d\r", channelsplaying); } fflush(stdout); Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ for (count = 0; count < 5; count++) { result = sound[count]->release(); ERRCHECK(result); } result = dspreverb->release(); ERRCHECK(result); result = dspflange->release(); ERRCHECK(result); result = dsplowpass->release(); ERRCHECK(result); result = groupA->release(); ERRCHECK(result); result = groupB->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }