/*============================================================================== Play Sound Example - Modified by Nikola Sobajic to cause a freeze Copyright (c), Firelight Technologies Pty, Ltd 2004-2023. This example shows how to simply load and play multiple sounds, the simplest usage of FMOD. By default FMOD will decode the entire file into memory when it loads. If the sounds are big and possibly take up a lot of RAM it would be better to use the FMOD_CREATESTREAM flag, this will stream the file in realtime as it plays. For information on using FMOD example code in your own programs, visit https://www.fmod.com/legal ==============================================================================*/ #include "fmod.hpp" #include "common.h" FMOD::System* s_systemPtr; FMOD_RESULT F_CALLBACK FmodLogCallback( FMOD_DEBUG_FLAGS flags, const char* file, int line, const char* func, const char* message ) { FMOD_RESULT res = FMOD_OK; switch( flags ) { case FMOD_DEBUG_LEVEL_ERROR: FMOD::ChannelGroup* channelGroup; res = s_systemPtr->getMasterChannelGroup( &channelGroup ); res = channelGroup->setPaused( true ); res = channelGroup->setPaused( false ); break; default: break; } return FMOD_OK; } int FMOD_Main() { FMOD::Sound *sound1, *sound2, *sound3; FMOD::Channel *channel = 0; FMOD_RESULT result; void *extradriverdata = 0; Common_Init(&extradriverdata); /* Create a System object and initialize */ ERRCHECK( FMOD::Debug_Initialize( FMOD_DEBUG_LEVEL_ERROR, FMOD_DEBUG_MODE_CALLBACK, FmodLogCallback ) ); result = FMOD::System_Create(&s_systemPtr); ERRCHECK(result); result = s_systemPtr->init(32, FMOD_INIT_NORMAL, extradriverdata); ERRCHECK(result); result = s_systemPtr->createSound(Common_MediaPath("drumloop.wav"), FMOD_DEFAULT, 0, &sound1); ERRCHECK(result); result = sound1->setMode(FMOD_LOOP_OFF); /* drumloop.wav has embedded loop points which automatically makes looping turn on, */ ERRCHECK(result); /* so turn it off here. We could have also just put FMOD_LOOP_OFF in the above CreateSound call. */ result = s_systemPtr->createSound(Common_MediaPath("jaguar.wav"), FMOD_DEFAULT, 0, &sound2); ERRCHECK(result); result = s_systemPtr->createSound(Common_MediaPath("swish.wav"), FMOD_DEFAULT, 0, &sound3); ERRCHECK(result); /* Main loop */ do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { result = s_systemPtr->playSound(sound1, 0, false, &channel); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION2)) { result = s_systemPtr->playSound(sound2, 0, false, &channel); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION3)) { result = s_systemPtr->playSound(sound3, 0, false, &channel); ERRCHECK(result); } result = s_systemPtr->update(); ERRCHECK(result); { unsigned int ms = 0; unsigned int lenms = 0; bool playing = 0; bool paused = 0; int channelsplaying = 0; if (channel) { FMOD::Sound *currentsound = 0; result = channel->isPlaying(&playing); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) { ERRCHECK(result); } result = channel->getPaused(&paused); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) { ERRCHECK(result); } result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) { ERRCHECK(result); } channel->getCurrentSound(¤tsound); if (currentsound) { result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) { ERRCHECK(result); } } } s_systemPtr->getChannelsPlaying(&channelsplaying, NULL); Common_Draw("=================================================="); Common_Draw("Play Sound Example."); Common_Draw("Copyright (c) Firelight Technologies 2004-2023."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Press %s to play a mono sound (drumloop)", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to play a mono sound (jaguar)", Common_BtnStr(BTN_ACTION2)); Common_Draw("Press %s to play a stereo sound (swish)", Common_BtnStr(BTN_ACTION3)); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Draw(""); Common_Draw("Time %02d:%02d:%02d/%02d:%02d:%02d : %s", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped"); Common_Draw("Channels Playing %d", channelsplaying); } Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); /* Shut down */ result = sound1->release(); ERRCHECK(result); result = sound2->release(); ERRCHECK(result); result = sound3->release(); ERRCHECK(result); result = s_systemPtr->close(); ERRCHECK(result); result = s_systemPtr->release(); ERRCHECK(result); Common_Close(); return 0; }