void USwFMOD::UnregisterMusic( UMusic* Music ) { guard(USwFMOD::UnregisterMusic); //SWF_LOG( NAME_DevSound, TEXT("%s -- %s :: [%s]"), SWF_LOGP, *ToStr(Music) ); FMOD_RESULT result; check(Music); if( Music->Handle ) { SWF_LOG( NAME_DevSound, TEXT("Unregister music: %s"), Music->GetFullName() ); // Stop this sound. FMOD::Sound* sound = GetMusicSample(Music); if( sound ) { SWF_FMOD_CALL( sound->setUserData(NULL) ); SWF_FMOD_CALL( sound->release() ); } // Reset handle Music->Handle = NULL; // Unload Music->Data.Unload(); } unguard; }
void USwFMOD::UnregisterSound( USound* Sound ) { guard(USwFMOD::UnregisterSound); //SWF_LOG( NAME_DevSound, TEXT("%s -- %s :: [%s]"), SWF_LOGP, *ToStr(Sound) ); FMOD_RESULT result; check(Sound); if( Sound->Handle ) { SWF_LOG( NAME_DevSound, TEXT("Unregister sound: %s"), Sound->GetFullName() ); // Stop this sound. FMOD::Sound* sound = GetSoundSample(Sound); if( sound ) { SWF_FMOD_CALL( sound->setUserData(NULL) ); SWF_FMOD_CALL( sound->release() ); } // Reset handle Sound->Handle = NULL; } unguard; }
int Game::playEnvironment() { bool soundDone=false; FMOD::System* system; FMOD_RESULT result = FMOD::System_Create(&system); system->init(32, FMOD_INIT_NORMAL, NULL); FMOD::Sound* sound; result = system->createSound("Ocean.WAV",FMOD_LOOP_NORMAL,NULL, &sound); FMOD::Channel* channel = 0; bool pauseSound = false; channel->isPlaying(&pauseSound); result = system->playSound(FMOD_CHANNEL_FREE, sound,false, &channel); soundDone=true; while (soundDone!=true) { channel->setPaused(false); system->update(); result = sound->release(); result = system->close(); result = system->release(); } return 0; }
FMOD::Sound *SoundManager::CreatePlayList(std::string &fileName) { FMOD_RESULT result; FMOD::Sound *playlist; std::string fullPathName; bool isPlayList = false; FMOD_SOUND_TYPE soundType; fullPathName = SOUND_DIRECTORY + fileName; result = system->createSound(fullPathName.c_str(), FMOD_DEFAULT, 0, &playlist); if(result != FMOD_OK) { Ogre::LogManager::getSingleton().logMessage( "SoundManager::CreateSound could not load sound '" + fileName + "' (invalid soundType)"); return NULL; } result = playlist->getFormat(&soundType,0,0,0); isPlayList = (soundType == FMOD_SOUND_TYPE_PLAYLIST); if(isPlayList) { return playlist; } else { playlist->release(); return NULL; } }
FMOD_RESULT F_CALLBACK programmerSoundCallback(FMOD_STUDIO_EVENT_CALLBACK_TYPE type, FMOD_STUDIO_EVENTINSTANCE* event, void *parameters) { FMOD::Studio::EventInstance* eventInstance = (FMOD::Studio::EventInstance*)event; if (type == FMOD_STUDIO_EVENT_CALLBACK_CREATE_PROGRAMMER_SOUND) { FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props = (FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters; // Get our context from the event instance user data ProgrammerSoundContext* context = NULL; CHECK_RESULT( eventInstance->getUserData((void**)&context) ); // Create the sound FMOD::Sound* sound = NULL; CHECK_RESULT( context->system->createSound(context->soundName, FMOD_CREATECOMPRESSEDSAMPLE | FMOD_NONBLOCKING, NULL, &sound) ); // Pass the sound to FMOD props->sound = (FMOD_SOUND*)sound; } else if (type == FMOD_STUDIO_EVENT_CALLBACK_DESTROY_PROGRAMMER_SOUND) { FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES* props = (FMOD_STUDIO_PROGRAMMER_SOUND_PROPERTIES*)parameters; // Obtain the sound FMOD::Sound* sound = (FMOD::Sound*)props->sound; // Release the sound CHECK_RESULT( sound->release() ); } return FMOD_OK; }
UINT64 InformacionArchivoEx::_ObtenerTiempoCancion(const TCHAR *Path, FMOD::System *InstanciaFMOD) { UINT Milisegundos = 0; FMOD::Sound *Stream; InstanciaFMOD->createStream(reinterpret_cast<const char *>(Path), FMOD_OPENONLY | FMOD_UNICODE, 0, &Stream); Stream->getLength(&Milisegundos, FMOD_TIMEUNIT_MS); FMOD_RESULT R = Stream->release(); return Milisegundos; }
bool cgFMODSoundPlayerImpl::ReleaseSound( cgID sound ) { FMOD::Sound * pkSound = m_pkSoundStorage->Remove(sound); if (!pkSound) return false; pkSound->release(); return true; }
UINT64 InformacionArchivoEx::_ObtenerTiempoCancionCDAudio(const TCHAR *Path, FMOD::System *InstanciaFMOD) { char Letra[3]; Letra[0] = static_cast<char>(Path[0]); Letra[1] = ':'; Letra[2] = '\0'; UINT Milisegundos = 0; FMOD::Sound *Stream = NULL; FMOD::Sound *PistaCD = NULL; FMOD_RESULT Error = InstanciaFMOD->createStream(Letra, FMOD_OPENONLY, 0, &Stream); if (Stream != NULL) { Stream->getSubSound(InfoPath.Pista - 1, &PistaCD); // no s'identifica la pista en els cds d'audio posible error en funcio Info if (PistaCD != NULL) { PistaCD->getLength(&Milisegundos, FMOD_TIMEUNIT_MS); PistaCD->release(); Stream->release(); } } return Milisegundos; }
void AudioEngineImpl::uncache(const std::string& path){ std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); std::map<std::string, FMOD::Sound *>::const_iterator it = mapSound.find(fullPath); if(it!=mapSound.end()){ FMOD::Sound * sound = it->second; if(sound){ sound->release(); } mapSound.erase(it); } };
void SoundManager::clearLocalSounds() { #ifdef BBGE_BUILD_FMODEX for (LocalSounds::iterator i = localSounds.begin(); i != localSounds.end(); i++) { std::string snd = (*i); debugLog("unloading sound [" + snd + "]"); FMOD::Sound *samp = (FMOD::Sound*)soundMap[snd]; samp->release(); soundMap[snd] = 0; } localSounds.clear(); #endif }
void FmodAudioPlayer::unloadEffect(const char* pszFilePath) { FMOD::Sound* pSound; pSystem->update(); map<string, FMOD::Sound*>::iterator l_it = mapEffectSound.find( string(pszFilePath)); if (l_it == mapEffectSound.end()) { //no load yet return; } pSound = l_it->second; //release the sound; pSound->release(); //delete from the map mapEffectSound.erase(string(pszFilePath)); }
int Game::playSound(bool Sound) { bool soundDone= false; //declare variable for FMOD system object FMOD::System* system; //allocate memory for the FMOD system object FMOD_RESULT result = FMOD::System_Create(&system); //initialize the FMOD system object system->init(32, FMOD_INIT_NORMAL, NULL); //declare variable for the sound object FMOD::Sound* sound; //created sound object and specify the sound result = system->createSound("Cathedral_of_Light.mp3",FMOD_LOOP_NORMAL,NULL, &sound); // play sound - 1st parameter can be combined flags (| separator) FMOD::Channel* channel = 0; //start sound bool pauseSound=false; channel->isPlaying(&pauseSound); result = system->playSound(FMOD_CHANNEL_FREE, sound, Sound, &channel); soundDone=true; while (soundDone!=true) { channel->setPaused(false); system->update(); //} // release resources result = sound->release(); result = system->close(); result = system->release(); } return 0; }
void SoundManager::loadPlaylist(std::string filename) { FMOD::Sound* playlist; mSystem->createSound(filename.c_str(), FMOD_DEFAULT, 0, &playlist); FMOD_SOUND_TYPE type; playlist->getFormat(&type, 0, 0, 0); if(type != FMOD_SOUND_TYPE_PLAYLIST) { printf("%s, wasn't a playlist! Make sure it exists and it's in .m3u format.\n", filename.c_str()); return; } printf("loading playlist %s\n", filename.c_str()); int count = 0; FMOD_TAG tag; result = FMOD_OK; //go through the m3u file and extract the playlist info result = playlist->getTag("FILE", count, &tag); while(result == FMOD_OK) { unsigned int trackTime = 0; FMOD::Sound* music; //attempt to load the song result = mSystem->createSound((char*)tag.data, FMOD_CREATESTREAM | FMOD_SOFTWARE | FMOD_2D, 0, &music); //if we successfully found the file, get its length and close it if(result == FMOD_OK) { music->getLength(&trackTime, FMOD_TIMEUNIT_MS); music->release(); PlayListEntry p(std::string((char*)tag.data), 0.001 * trackTime + 2.f); mPlayList.push_back(p); // printf("our file is...%s at %f seconds\n", p.filename.c_str(), p.trackTime); } else printf("%s not found, but is listed in the playlist\n", (char*)tag.data); count++; //check to see if we have another file in the playlist result = playlist->getTag("FILE", count, &tag); } mUsePlayList = true; }
void AudioVisualizerApp::stopAudio() { FMOD_RESULT err; mIsAudioPlaying = false; if( !mFMODChannel || !mFMODSound ) return; // we don't want to be notified of channel events any longer mFMODChannel->setCallback( 0 ); bool isPlaying; err = mFMODChannel->isPlaying( &isPlaying ); if( isPlaying ) err = mFMODChannel->stop(); err = mFMODSound->release(); mFMODSound = nullptr; mFMODChannel = nullptr; }
SoundManager::~SoundManager() { // release if (!enabled) return; for (SoundMap::iterator i = soundMap.begin(); i != soundMap.end(); i++) { std::string snd = (*i).first; debugLog("unloading sound [" + snd + "]"); #ifndef BBGE_DISABLE_SOUND_CACHE FMOD::Sound *samp = (FMOD::Sound*)((*i).second); samp->release(); #else SoundInfo *info = (SoundInfo*)((*i).second); delete info; #endif } soundMap.clear(); #ifdef BBGE_BUILD_FMODEX SoundCore::system->release(); #endif }
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; }
SPtr<Resource> FMODImporter::import(const Path& filePath, SPtr<const ImportOptions> importOptions) { WString extension = filePath.getWExtension(); StringUtil::toLowerCase(extension); AudioFileInfo info; FMOD::Sound* sound; String pathStr = filePath.toString(); if(gFMODAudio()._getFMOD()->createSound(pathStr.c_str(), FMOD_CREATESAMPLE, nullptr, &sound) != FMOD_OK) { LOGERR("Failed importing audio file: " + pathStr); return nullptr; } FMOD_SOUND_FORMAT format; INT32 numChannels = 0; INT32 numBits = 0; sound->getFormat(nullptr, &format, &numChannels, &numBits); if(format != FMOD_SOUND_FORMAT_PCM8 && format != FMOD_SOUND_FORMAT_PCM16 && format != FMOD_SOUND_FORMAT_PCM24 && format != FMOD_SOUND_FORMAT_PCM32 && format != FMOD_SOUND_FORMAT_PCMFLOAT) { LOGERR("Failed importing audio file, invalid imported format: " + pathStr); return nullptr; } float frequency = 0.0f; sound->getDefaults(&frequency, nullptr); UINT32 size; sound->getLength(&size, FMOD_TIMEUNIT_PCMBYTES); info.bitDepth = numBits; info.numChannels = numChannels; info.sampleRate = (UINT32)frequency; info.numSamples = size / (info.bitDepth / 8); UINT32 bytesPerSample = info.bitDepth / 8; UINT32 bufferSize = info.numSamples * bytesPerSample; UINT8* sampleBuffer = (UINT8*)bs_alloc(bufferSize); assert(bufferSize == size); UINT8* startData = nullptr; UINT8* endData = nullptr; UINT32 startSize = 0; UINT32 endSize = 0; sound->lock(0, size, (void**)&startData, (void**)&endData, &startSize, &endSize); if(format == FMOD_SOUND_FORMAT_PCMFLOAT) { assert(info.bitDepth == 32); UINT32* output = (UINT32*)sampleBuffer; for(UINT32 i = 0; i < info.numSamples; i++) { float value = *(((float*)startData) + i); *output = (UINT32)(value * 2147483647.0f); output++; } } else { memcpy(sampleBuffer, startData, bufferSize); } sound->unlock((void**)&startData, (void**)&endData, startSize, endSize); sound->release(); SPtr<const AudioClipImportOptions> clipIO = std::static_pointer_cast<const AudioClipImportOptions>(importOptions); // If 3D, convert to mono if (clipIO->getIs3D() && info.numChannels > 1) { UINT32 numSamplesPerChannel = info.numSamples / info.numChannels; UINT32 monoBufferSize = numSamplesPerChannel * bytesPerSample; UINT8* monoBuffer = (UINT8*)bs_alloc(monoBufferSize); AudioUtility::convertToMono(sampleBuffer, monoBuffer, info.bitDepth, numSamplesPerChannel, info.numChannels); info.numSamples = numSamplesPerChannel; info.numChannels = 1; bs_free(sampleBuffer); sampleBuffer = monoBuffer; bufferSize = monoBufferSize; } // Convert bit depth if needed if (clipIO->getBitDepth() != info.bitDepth) { UINT32 outBufferSize = info.numSamples * (clipIO->getBitDepth() / 8); UINT8* outBuffer = (UINT8*)bs_alloc(outBufferSize); AudioUtility::convertBitDepth(sampleBuffer, info.bitDepth, outBuffer, clipIO->getBitDepth(), info.numSamples); info.bitDepth = clipIO->getBitDepth(); bs_free(sampleBuffer); sampleBuffer = outBuffer; bufferSize = outBufferSize; } // Encode to Ogg Vorbis if needed if (clipIO->getFormat() == AudioFormat::VORBIS) { // TODO - Encode to Ogg Vorbis! } SPtr<MemoryDataStream> sampleStream = bs_shared_ptr_new<MemoryDataStream>(sampleBuffer, bufferSize); AUDIO_CLIP_DESC clipDesc; clipDesc.bitDepth = info.bitDepth; clipDesc.format = clipIO->getFormat(); clipDesc.frequency = info.sampleRate; clipDesc.numChannels = info.numChannels; clipDesc.readMode = clipIO->getReadMode(); clipDesc.is3D = clipIO->getIs3D(); SPtr<AudioClip> clip = AudioClip::_createPtr(sampleStream, bufferSize, info.numSamples, clipDesc); WString fileName = filePath.getWFilename(false); clip->setName(fileName); return clip; }
int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound; FMOD::Channel *channel = 0; FMOD_RESULT result; FMOD_MODE mode = FMOD_2D | FMOD_HARDWARE | FMOD_CREATESTREAM; unsigned int version; if (argc != 3) { std::cout << "unpacker.exe fsbPath outdirPath" << std::endl; return 1; } auto fsbPath = std::string(argv[1]); auto outPath = std::string(argv[2]); //fsbPath = "LoL_SFX_ziggs.fsb"; //fsbPath = "LoL_SFX_karma_base.fsb"; //fsbPath = "LoL_SFX_fiddlesticks.fsb"; 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; } //system->setOutput(FMOD_OUTPUTTYPE_WAVWRITER); result = system->init(1, FMOD_INIT_NORMAL, 0); ERRCHECK(result); auto codecHandle = registerLeagueCodec(system, 50); int numsubsounds; FMOD::Sound *subSound = nullptr; char name[256]; int soundNum = 0; try { result = system->createSound(fsbPath.c_str(), mode, nullptr, &sound); ERRCHECK(result); result = sound->getNumSubSounds(&numsubsounds); ERRCHECK(result); soundNum = 0; sound->getSubSound(0, &subSound); subSound->getName(name, 256); subSound->release(); makePath(outPath.c_str()); sound->release(); system->close(); system->release(); std::set<std::string> writtenFiles; FMOD::Channel* channel; bool playing; for (int sndIdx = 0; sndIdx < numsubsounds; sndIdx++) { ERRCHECK(FMOD::System_Create(&system)); ERRCHECK(system->getVersion(&version)); system->setOutput(FMOD_OUTPUTTYPE_WAVWRITER_NRT); auto outFilePath = outPath + "\\" + std::string(name) + ".wav"; if (writtenFiles.find(outFilePath) != writtenFiles.end()) { int cnt = 1; char arr[80]; do { _itoa_s(cnt, arr, 10); outFilePath = outPath + "\\" + std::string(name) + "_" + std::string(arr) + ".wav"; cnt++; } while (writtenFiles.find(outFilePath) != writtenFiles.end()); } writtenFiles.insert(outFilePath); ERRCHECK(system->init(1, FMOD_INIT_STREAM_FROM_UPDATE, (void*)outFilePath.c_str())); auto codecHandle = registerLeagueCodec(system, 50); system->createSound(fsbPath.c_str(), mode, nullptr, &sound); sound->getSubSound(sndIdx, &subSound); system->playSound(FMOD_CHANNEL_FREE, subSound, false, &channel); do { system->update(); channel->isPlaying(&playing); } while (playing); subSound->release(); if (sndIdx < numsubsounds - 1) { sound->getSubSound(sndIdx+1, &subSound); subSound->getName(name, 256); subSound->release(); outFilePath = outPath + "\\" + std::string(name) + ".wav"; } sound->release(); system->close(); system->release(); } } catch (const std::runtime_error& error) { std::cout << "Exception caught:" << std::endl; std::cout << " " << error.what() << std::endl; } return 0; }
int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound; FMOD::Channel *channel = 0; FMOD_RESULT result; FMOD_MODE mode = FMOD_2D | FMOD_OPENUSER | FMOD_LOOP_NORMAL | FMOD_HARDWARE; int key; int channels = 2; FMOD_CREATESOUNDEXINFO createsoundexinfo; 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); printf("============================================================================\n"); printf("User Created Sound Example. Copyright (c) Firelight Technologies 2004-2014.\n"); printf("============================================================================\n"); printf("Sound played here is generated in realtime. It will either play as a stream\n"); printf("which means it is continually filled as it is playing, or it will play as a \n"); printf("static sample, which means it is filled once as the sound is created, then \n"); printf("when played it will just play that short loop of data. \n"); printf("============================================================================\n"); printf("\n"); do { printf("Press 1 to play as a runtime decoded stream. (will carry on infinitely)\n"); printf("Press 2 to play as a static in memory sample. (loops a short block of data)\n"); printf("Press Esc to quit.\n\n"); key = _getch(); } while (key != 27 && key != '1' && key != '2'); if (key == 27) { return 0; } else if (key == '1') { mode |= FMOD_CREATESTREAM; } memset(&createsoundexinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); createsoundexinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); /* required. */ createsoundexinfo.decodebuffersize = 44100; /* Chunk size of stream update in samples. This will be the amount of data passed to the user callback. */ createsoundexinfo.length = 44100 * channels * sizeof(signed short) * 5; /* Length of PCM data in bytes of whole song (for Sound::getLength) */ createsoundexinfo.numchannels = channels; /* Number of channels in the sound. */ createsoundexinfo.defaultfrequency = 44100; /* Default playback rate of sound. */ createsoundexinfo.format = FMOD_SOUND_FORMAT_PCM16; /* Data format of sound. */ createsoundexinfo.pcmreadcallback = pcmreadcallback; /* User callback for reading. */ createsoundexinfo.pcmsetposcallback = pcmsetposcallback; /* User callback for seeking. */ result = system->createSound(0, mode, &createsoundexinfo, &sound); ERRCHECK(result); printf("Press space to pause, Esc to quit\n"); printf("\n"); /* Play the sound. */ result = system->playSound(FMOD_CHANNEL_FREE, sound, 0, &channel); ERRCHECK(result); /* Main loop. */ do { if (_kbhit()) { key = _getch(); switch (key) { case ' ' : { bool paused; channel->getPaused(&paused); channel->setPaused(!paused); break; } } } system->update(); if (channel) { unsigned int ms; unsigned int lenms; bool playing; bool paused; 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); } result = sound->getLength(&lenms, FMOD_TIMEUNIT_MS); if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN)) { 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(20); } 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 main(int argc, char *argv[]) { int numSounds = 1; FMOD::System *system; FMOD::Sound *sound[numSounds]; FMOD::Sound *applause; FMOD::Channel *channel[numSounds]; FMOD::Channel *applauseChannel; FMOD::DSP *dsppitch; FMOD::DSP *dsplowpass = 0; FMOD::DSP *dsphighpass = 0; FMOD::DSP *dspecho = 0; FMOD::DSP *dspflange = 0; FMOD::DSP *dspdistortion = 0; FMOD::DSP *dspchorus = 0; FMOD::DSP *dspparameq = 0; FMOD_RESULT result; int key; unsigned int version; float pan = 0; float volume; float frequency; int tempFrequency = 0; int tempPitch = 0; int frequencyCount = 0; int pitchCount = 0; int tempoChange = 0; float speed; float pitch = 1; float originalFrequency; string line; int lineCount = 0; int inc = 0; int count; float frequencyArray[numSounds]; float frequencyCountArray[numSounds]; float pitchfArray[numSounds]; float volumeArray[numSounds]; float panArray[numSounds]; float pitchf = 1.0f; /* 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("../Config/Seven Nation Army Drum.mp3", FMOD_SOFTWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound[0]); ERRCHECK(result); printf("===============================================================================\n"); printf(" Maestro \n"); printf("===============================================================================\n"); printf("Press '1' to play left speaker only\n"); printf("Press '2' to play right speaker only\n"); printf("Press '3' to play from both speakers\n"); printf("Press '[' to pan sound left\n"); printf("Press ']' to pan sound right\n"); printf("Press 'v/V' to increase volume\n"); printf("Press 'd/D' to decrease volume\n"); printf("Press '6' pitch octave down\n"); printf("Press '7' pitch semitone down\n"); printf("Press '8' pitch semitone up\n"); printf("Press '9' pitch octave up\n"); printf("Press 'Esc' to quit\n"); printf("Press 'n' pitch scale down\n"); printf("Press 'm' pitch scale up\n"); printf("\n"); for (count = 0; count < numSounds; count++) { result = system->playSound(FMOD_CHANNEL_FREE, sound[count], false, &channel[count]); ERRCHECK(result); bool paused; channel[0]->getPaused(&paused); ERRCHECK(result); paused = !paused; result = channel[0]->setPaused(paused); ERRCHECK(result); } //Create the DSP effects. result = system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsppitch); ERRCHECK(result); 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); result = system->createDSPByType(FMOD_DSP_TYPE_DISTORTION, &dspdistortion); ERRCHECK(result); result = system->createDSPByType(FMOD_DSP_TYPE_CHORUS, &dspchorus); ERRCHECK(result); result = system->createDSPByType(FMOD_DSP_TYPE_PARAMEQ, &dspparameq); ERRCHECK(result); for (count = 0; count < numSounds; count++) { channel[count]->getVolume(&volume); channel[count]->setVolume(.3); channel[count]->getVolume(&volume); } printf("Initial Volume: %f \n", volume); channel[0]->getFrequency(&frequency); channel[0]->getFrequency(&originalFrequency); printf("Initial Frequency: %f \n", frequency); /* Main loop. */ do { ifstream myfile; myfile.open("../../Config/groupb.txt"); while ( myfile.good() ) { //printf("Line Count: %d \n", lineCount); for(int i = 0; i < lineCount; i++){ getline (myfile,line); } getline (myfile,line); if (line.compare("start") == 0){ bool paused; channel[0]->getPaused(&paused); ERRCHECK(result); paused = !paused; result = channel[0]->setPaused(paused); ERRCHECK(result); lineCount++; //printf("Line Count: %d \n", lineCount); break; } if (line.compare("iVol") == 0){ channel[0]->getVolume(&volume); channel[0]->setVolume(1.0f); lineCount++; //printf("Line Count: %d \n", lineCount); break; } if (line.compare("dVol") == 0){ channel[0]->getVolume(&volume); channel[0]->setVolume(.1); lineCount++; //printf("Line Count: %d \n", lineCount); break; } if (line.compare("iPitch") == 0){ result = dsppitch->remove(); ERRCHECK(result); result = system->addDSP(dsppitch, 0); ERRCHECK(result); inc++; pitch = pow(1.059f,inc); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, pitch); ERRCHECK(result); lineCount++; //printf("Line Count: %d \n", lineCount); break; } if (line.compare("dPitch") == 0){ result = dsppitch->remove(); ERRCHECK(result); result = system->addDSP(dsppitch, 0); ERRCHECK(result); inc--; pitch = pow(1.059,inc); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, pitch); ERRCHECK(result); lineCount++; //printf("Line Count: %d \n", lineCount); break; } if (line.compare("left") == 0){ result = channel[0]->setSpeakerMix(1.0f, 0, 0, 0, 0, 0, 0, 0); ERRCHECK(result); lineCount++; //printf("Line Count: %d \n", lineCount); break; } if (line.compare("right") == 0){ result = channel[0]->setSpeakerMix(0, 1.0f, 0, 0, 0, 0, 0, 0); ERRCHECK(result); lineCount++; //printf("Line Count: %d \n", lineCount); break; } if (line.compare("forward") == 0){ result = channel[0]->setSpeakerMix(1.0f, 1.0f, 0, 0, 0, 0, 0, 0); ERRCHECK(result); lineCount++; //printf("Line Count: %d \n", lineCount); break; } if (line.compare("pitch") == 0){ bool active; result = dsppitch->getActive(&active); ERRCHECK(result); if (active) { result = dsppitch->remove(); ERRCHECK(result); } else { result = system->addDSP(dsppitch, 0); ERRCHECK(result); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, 1.2f); ERRCHECK(result); } lineCount++; break; } if (line.compare("pause") == 0){ bool paused; channel[0]->getPaused(&paused); ERRCHECK(result); paused = !paused; result = channel[0]->setPaused(paused); ERRCHECK(result); lineCount++; break; } if (line.compare("lowpass") == 0){ bool active; result = dsplowpass->getActive(&active); ERRCHECK(result); if (active) { result = dsplowpass->remove(); ERRCHECK(result); } else { result = system->addDSP(dsplowpass, 0); ERRCHECK(result); } lineCount++; break; } if (line.compare("highpass") == 0){ bool active; result = dsphighpass->getActive(&active); ERRCHECK(result); if (active) { result = dsphighpass->remove(); ERRCHECK(result); } else { result = system->addDSP(dsphighpass, 0); ERRCHECK(result); } lineCount++; break; } if (line.compare("echo") == 0){ bool active; result = dspecho->getActive(&active); ERRCHECK(result); if (active) { result = dspecho->remove(); ERRCHECK(result); } else { result = system->addDSP(dspecho, 0); ERRCHECK(result); result = dspecho->setParameter(FMOD_DSP_ECHO_DELAY, 50.0f); ERRCHECK(result); } lineCount++; break; } if (line.compare("flange") == 0){ bool active; result = dspflange->getActive(&active); ERRCHECK(result); if (active) { result = dspflange->remove(); ERRCHECK(result); } else { result = system->addDSP(dspflange, 0); ERRCHECK(result); } lineCount++; break; } if (line.compare("distortion") == 0){ bool active; result = dspdistortion->getActive(&active); ERRCHECK(result); if (active) { result = dspdistortion->remove(); ERRCHECK(result); } else { result = system->addDSP(dspdistortion, 0); ERRCHECK(result); result = dspdistortion->setParameter(FMOD_DSP_DISTORTION_LEVEL, 0.8f); ERRCHECK(result); } lineCount++; break; } if (line.compare("chorus") == 0){ bool active; result = dspchorus->getActive(&active); ERRCHECK(result); if (active) { result = dspchorus->remove(); ERRCHECK(result); } else { result = system->addDSP(dspchorus, 0); ERRCHECK(result); } lineCount++; break; } if (line.compare("parameq") == 0){ bool active; result = dspparameq->getActive(&active); ERRCHECK(result); if (active) { result = dspparameq->remove(); ERRCHECK(result); } else { result = system->addDSP(dspparameq, 0); ERRCHECK(result); result = dspparameq->setParameter(FMOD_DSP_PARAMEQ_CENTER, 5000.0f); ERRCHECK(result); result = dspparameq->setParameter(FMOD_DSP_PARAMEQ_GAIN, 0.0f); ERRCHECK(result); } lineCount++; break; } if (line.compare("iTempo") == 0){ //44100 //62366.816406 channel[0]->getFrequency(&frequency); float base = 2.0f; float newTempo = frequency * pow(base,(6.0f/12.0f)); float pitchf = 1.0f; pitchf = pow(.9438f,6); result = dsppitch->remove(); ERRCHECK(result); result = system->addDSP(dsppitch, 0); ERRCHECK(result); channel[0]->setFrequency(newTempo); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, pitchf); ERRCHECK(result); channel[0]->getFrequency(&frequency); lineCount++; break; } if (line.compare("dTempo") == 0){ channel[0]->getFrequency(&frequency); float base = 2.0f; float newTempo = frequency * pow(base,(-6.0f/12.0f)); float pitchf = 1.0f; result = dsppitch->remove(); ERRCHECK(result); result = system->addDSP(dsppitch, 0); ERRCHECK(result); channel[0]->setFrequency(newTempo); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, pitchf); ERRCHECK(result); channel[0]->getFrequency(&frequency); lineCount++; break; } if (line.compare("quit") == 0){ key = 27; lineCount++; //printf("Line Count: %d \n", lineCount); break; } } myfile.close(); if (kbhit()) { key = getch(); switch (key) { case 's' : { bool paused; channel[0]->getPaused(&paused); ERRCHECK(result); paused = !paused; result = channel[0]->setPaused(paused); ERRCHECK(result); break; } case '1' : { // Play Sound From Left Speakers for (count = 0; count < numSounds; count++) { channel[count]->getVolume(&volume); result = channel[count]->setSpeakerMix(1.0f, 0, 0, 0, 0, 0, 0, 0); ERRCHECK(result); } break; } case '2' : { // Play Sound From Right Speakers for (count = 0; count < numSounds; count++) { channel[count]->getVolume(&volume); printf("Volume: %f\n", volume); result = channel[count]->setSpeakerMix(0, 1.0f, 0, 0, 0, 0, 0, 0); ERRCHECK(result); } break; } case '3' : { // Play Sound From Both Speakers for (count = 0; count < numSounds; count++) { channel[count]->getVolume(&volume); result = channel[count]->setSpeakerMix(1.0f, 1.0f, 0, 0, 0, 0, 0, 0); ERRCHECK(result); } break; } case '4' : { // Decrmenent Tempo //if(frequencyCount > -12){ //if (tempoChange + pitchCount > -12 && abs(pitchCount) < 12 && tempoChange > -12) { if (pitchf < 1.98f) { frequencyCount--; tempoChange++; printf("Pitch Count: %d\n", pitchCount); printf("Tempo Count: %d\n", tempoChange); channel[0]->getFrequency(&frequency); //printf("Z Initial Frequency: %f \n", frequency); float base = 2.0f; //printf("inc by: %f \n", pow(base,(-1.0f/12.0f))); float newTempo = frequency * pow(base,(-1.0f/12.0f)); //float pitchf = 1.0f; //if (pitchCount == 0 && tempoChange == 0) { // pitchf = 1.0f; //} if (pitchf == 1.0f) { pitchf = pow(1.059f,abs(tempoChange + pitchCount)); } else if (pitchf > 1.0f) { pitchf = pow(1.059f,abs(tempoChange + pitchCount)); } else if (pitchf < 1.0f) { pitchf = pow(.9438f,abs(tempoChange + pitchCount)); } printf("pitchf: %f\n", pitchf); printf("Frequency: %f \n", newTempo); result = dsppitch->remove(); ERRCHECK(result); result = system->addDSP(dsppitch, 0); ERRCHECK(result); channel[0]->setFrequency(newTempo); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, pitchf); ERRCHECK(result); } else { printf("Reached Min Tempo\n"); } break; } case '5' : { // Incrmenent Tempo if (pitchf > 0.52f) { frequencyCount++; tempoChange--; printf("Pitch Count: %d\n", pitchCount); printf("Tempo Count: %d\n", tempoChange); channel[0]->getFrequency(&frequency); //printf("Z Initial Frequency: %f \n", frequency); float base = 2.0f; float newTempo = frequency * pow(base,(1.0f/12.0f)); if (pitchf == 1.0f) { //printf("tempo one\n"); pitchf = pow(.9438f,abs(tempoChange + pitchCount)); } else if (pitchf > 1.0f) { //printf("tempo inc\n"); pitchf = pow(1.059f,abs(tempoChange + pitchCount)); } else if (pitchf < 1.0f) { //printf("tempo dec\n"); pitchf = pow(.9438f,abs(tempoChange + pitchCount)); } printf("pitchf: %f\n", pitchf); printf("Frequency: %f \n", newTempo); result = dsppitch->remove(); ERRCHECK(result); result = system->addDSP(dsppitch, 0); ERRCHECK(result); channel[0]->setFrequency(newTempo); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, pitchf); ERRCHECK(result); } else { printf("Reached Max Tempo\n"); } break; } case '6' : { // Pitch Shift Down Octave bool active; result = dsppitch->getActive(&active); ERRCHECK(result); if (active) { result = dsppitch->remove(); ERRCHECK(result); } else { result = system->addDSP(dsppitch, 0); ERRCHECK(result); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, 0.5f); ERRCHECK(result); } break; } case '7' : { // Pitch Shift Down One Note bool active; result = dsppitch->getActive(&active); ERRCHECK(result); if (active) { result = dsppitch->remove(); ERRCHECK(result); } else { result = system->addDSP(dsppitch, 0); ERRCHECK(result); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, .9438f); ERRCHECK(result); } break; } case '8' : { // Pitch Shift Up One Note bool active; result = dsppitch->getActive(&active); ERRCHECK(result); if (active) { result = dsppitch->remove(); ERRCHECK(result); } else { result = system->addDSP(dsppitch, 0); ERRCHECK(result); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, 1.059f); ERRCHECK(result); } break; } case '9' : { // Pitch Shift Up Octave bool active; result = dsppitch->getActive(&active); ERRCHECK(result); if (active) { result = dsppitch->remove(); ERRCHECK(result); } else { result = system->addDSP(dsppitch, 0); ERRCHECK(result); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, 2.0f); ERRCHECK(result); } break; } case 'v' : case 'V' : { // Increment Volume for (count = 0; count < numSounds; count++) { channel[count]->getVolume(&volume); volume += 0.1f; if (volume > 1) { volume = 1; } //printf("Volume: %f \n", volume); channel[count]->setVolume(volume); } break; } case 'd' : case 'D' : { // Decrement Volume for (count = 0; count < numSounds; count++) { channel[count]->getVolume(&volume); volume -= 0.1f; if (volume < 0) { volume = 0; } //printf("Volume: %f \n", volume); channel[count]->setVolume(volume); } break; } case '[' : { // Pan Left for (count = 0; count < numSounds; count++) { channel[count]->getPan(&pan); pan -= 0.1f; if (pan < -1) { pan = -1; } channel[count]->setPan(pan); } break; } case ']' : { // Pan Right for (count = 0; count < numSounds; count++) { channel[count]->getPan(&pan); pan += 0.1f; if (pan > 1) { pan = 1; } channel[count]->setPan(pan); } break; } case 'n' : { // Decremental Pitch if (pitchf > 0.52f) { frequencyCount--; pitchCount--; printf("Pitch Count: %d\n", pitchCount); printf("Tempo Count: %d\n", tempoChange); if (pitchf == 1.0f) { pitchf = pow(.9438f,abs(tempoChange + pitchCount)); } else if (pitchf > 1.0f) { pitchf = pow(1.059f,tempoChange + pitchCount); } else if (pitchf < 1.0f) { pitchf = pow(.9438f,abs(tempoChange + pitchCount)); } printf("pitchf: %f\n", pitchf); result = dsppitch->remove(); ERRCHECK(result); result = system->addDSP(dsppitch, 0); ERRCHECK(result); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, pitchf); ERRCHECK(result); } else { printf("Reached Min Pitch\n"); } break; } case 'm' : { // Incremental Pitch if (pitchf < 1.98f) { frequencyCount++; pitchCount++; printf("Pitch Count: %d\n", pitchCount); printf("Tempo Count: %d\n", tempoChange); if (pitchf == 1.0f) { pitchf = pow(1.059f,abs(tempoChange + pitchCount)); } else if (pitchf > 1.0f) { pitchf = pow(1.059f,tempoChange + pitchCount); } else if (pitchf < 1.0f) { pitchf = pow(.9438f,abs(tempoChange + pitchCount)); } printf("pitchf: %f\n", pitchf); result = dsppitch->remove(); ERRCHECK(result); result = system->addDSP(dsppitch, 0); ERRCHECK(result); result = dsppitch->setParameter(FMOD_DSP_PITCHSHIFT_PITCH, pitchf); ERRCHECK(result); } else { printf("Reached Max Pitch\n"); } break; } case 'r' : { // Lowpass bool active; result = dsplowpass->getActive(&active); ERRCHECK(result); if (active) { result = dsplowpass->remove(); ERRCHECK(result); } else { result = system->addDSP(dsplowpass, 0); ERRCHECK(result); } break; } case 't' : { // Highpass bool active; result = dsphighpass->getActive(&active); ERRCHECK(result); if (active) { result = dsphighpass->remove(); ERRCHECK(result); } else { result = system->addDSP(dsphighpass, 0); ERRCHECK(result); } break; } case 'y' : { // Echo bool active; result = dspecho->getActive(&active); ERRCHECK(result); if (active) { result = dspecho->remove(); ERRCHECK(result); } else { result = system->addDSP(dspecho, 0); ERRCHECK(result); result = dspecho->setParameter(FMOD_DSP_ECHO_DELAY, 50.0f); ERRCHECK(result); } break; } case 'u' : { // Flange bool active; result = dspflange->getActive(&active); ERRCHECK(result); if (active) { result = dspflange->remove(); ERRCHECK(result); } else { result = system->addDSP(dspflange, 0); ERRCHECK(result); } break; } case 'i' : { // Distortion bool active; result = dspdistortion->getActive(&active); ERRCHECK(result); if (active) { result = dspdistortion->remove(); ERRCHECK(result); } else { result = system->addDSP(dspdistortion, 0); ERRCHECK(result); result = dspdistortion->setParameter(FMOD_DSP_DISTORTION_LEVEL, 0.8f); ERRCHECK(result); } break; } case 'o' : { // Chorus bool active; result = dspchorus->getActive(&active); ERRCHECK(result); if (active) { result = dspchorus->remove(); ERRCHECK(result); } else { result = system->addDSP(dspchorus, 0); ERRCHECK(result); } break; } case 'p' : { // Parameq bool active; result = dspparameq->getActive(&active); ERRCHECK(result); if (active) { result = dspparameq->remove(); ERRCHECK(result); } else { result = system->addDSP(dspparameq, 0); ERRCHECK(result); result = dspparameq->setParameter(FMOD_DSP_PARAMEQ_CENTER, 5000.0f); ERRCHECK(result); result = dspparameq->setParameter(FMOD_DSP_PARAMEQ_GAIN, 0.0f); ERRCHECK(result); } break; } } } system->update(); { int channelsplaying = 0; bool dsppitch_active; dsppitch ->getActive(&dsppitch_active); system->getChannelsPlaying(&channelsplaying); } fflush(stdout); Sleep(10); } while (key != 27); { for (count = 0; count < numSounds; count++) { //channel[count]->getFrequency(&frequency); channel[count]->getVolume(&volume); int count; //float initFreq = frequency; float initVol = volume; for (count = 0; count < 200; count++) { //printf("Volume: %f \n", volume); //channel[count]->setFrequency(frequency); channel[count]->setVolume(volume); volume -= (initVol / 200.0f); //frequency -= (initFreq / 200.0f); Sleep(2); } } } printf("\n"); /* Shut down */ channel[0]->setFrequency(originalFrequency); result = dsppitch->remove(); ERRCHECK(result); result = dspparameq->remove(); ERRCHECK(result); result = dspchorus->remove(); ERRCHECK(result); result = dspdistortion->remove(); ERRCHECK(result); result = dspflange->remove(); ERRCHECK(result); result = dspecho->remove(); ERRCHECK(result); result = dsplowpass->remove(); ERRCHECK(result); result = dsphighpass->remove(); ERRCHECK(result); for (count = 0; count < numSounds; count++) { result = sound[count]->release(); ERRCHECK(result); } result = system->createSound("../../Config/Recital Crowd Applause.aif", FMOD_SOFTWARE, 0, &applause); ERRCHECK(result); wait(.5); result = system->playSound(FMOD_CHANNEL_FREE, applause, false, &applauseChannel); ERRCHECK(result); wait(10); result = applause->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); 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 argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound; FMOD_RESULT result; 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_OPENONLY | FMOD_ACCURATETIME, 0, &sound); ERRCHECK(result); printf("==========================================================================\n"); printf("Offline Decoding Example. Copyright (c) Firelight Technologies 2004-2011.\n"); printf("==========================================================================\n"); printf("\n"); printf("This program will open wave.mp3 and decode it into wave.raw using the\n"); printf("Sound::readData function.\n"); printf("\n"); /* Decode the sound and write it to a .raw file. */ { void *data; unsigned int length = 0, read; unsigned int bytesread; FILE *outfp; #define CHUNKSIZE 4096 result = sound->getLength(&length, FMOD_TIMEUNIT_PCMBYTES); ERRCHECK(result); outfp = fopen("output.raw", "wb"); if (!outfp) { printf("Error! Could not open output.raw output file.\n"); return 0; } data = malloc(CHUNKSIZE); if (!data) { printf("Error! Failed to allocate %d bytes.\n", CHUNKSIZE); return 0; } bytesread = 0; do { result = sound->readData((char *)data, CHUNKSIZE, &read); fwrite((char *)data, read, 1, outfp); bytesread += read; printf("writing %d bytes of %d to output.raw\r", bytesread, length); } while (result == FMOD_OK && read == CHUNKSIZE); /* Loop terminates when either 1. the read function returns an error. (ie FMOD_ERR_FILE_EOF etc). 2. the amount requested was different to the amount returned. (somehow got an EOF without the file error, maybe a non stream file format like mod/s3m/xm/it/midi). If 'bytesread' is bigger than 'length' then it just means that FMOD miscalculated the size, but this will not usually happen if FMOD_ACCURATETIME is used. (this will give the correct length for VBR formats) */ printf("\n"); if (outfp) { fclose(outfp); } } printf("\n"); /* Shut down */ result = sound->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }
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->setFileSystem(myopen, myclose, myread, myseek, 0, 0, 2048); ERRCHECK(result); result = system->createStream("../media/wave.mp3", FMOD_HARDWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound); ERRCHECK(result); printf("========================================================================\n"); printf("File Callbacks Example. Copyright (c) Firelight Technologies 2004-2015.\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; } } } system->update(); if (channel) { unsigned int ms; unsigned int lenms; bool playing; bool paused; 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"); fflush(stdout); } 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 main(int argc, char *argv[]) { FMOD::System *system = 0; FMOD::Sound *sound = 0; FMOD::Channel *channel = 0; FMOD_RESULT result; FMOD_CREATESOUNDEXINFO exinfo; int key, driver, recorddriver, numdrivers, 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; } /* System initialization */ printf("---------------------------------------------------------\n"); printf("Select OUTPUT type\n"); printf("---------------------------------------------------------\n"); printf("1 : OSS - Open Sound System\n"); printf("2 : ALSA - Advanced Linux Sound Architecture\n"); printf("3 : ESD - Enlightenment Sound Daemon\n"); printf("4 : PULSEAUDIO - Pulse Audio Sound Server\n"); printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); } while (key != 27 && key < '1' && key > '5'); switch (key) { case '1' : result = system->setOutput(FMOD_OUTPUTTYPE_OSS); break; case '2' : result = system->setOutput(FMOD_OUTPUTTYPE_ALSA); break; case '3' : result = system->setOutput(FMOD_OUTPUTTYPE_ESD); break; case '4' : result = system->setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO); break; default : return 1; } ERRCHECK(result); /* Enumerate playback devices */ result = system->getNumDrivers(&numdrivers); ERRCHECK(result); printf("---------------------------------------------------------\n"); printf("Choose a PLAYBACK driver\n"); printf("---------------------------------------------------------\n"); for (count=0; count < numdrivers; count++) { char name[256]; result = system->getDriverInfo(count, name, 256, 0); ERRCHECK(result); printf("%d : %s\n", count + 1, name); } printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); if (key == 27) { return 0; } driver = key - '1'; } while (driver < 0 || driver >= numdrivers); result = system->setDriver(driver); ERRCHECK(result); /* Enumerate record devices */ result = system->getRecordNumDrivers(&numdrivers); ERRCHECK(result); printf("---------------------------------------------------------\n"); printf("Choose a RECORD driver\n"); printf("---------------------------------------------------------\n"); for (count=0; count < numdrivers; count++) { char name[256]; result = system->getRecordDriverInfo(count, name, 256, 0); ERRCHECK(result); printf("%d : %s\n", count + 1, name); } printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); recorddriver = 0; do { key = getch(); if (key == 27) { return 0; } recorddriver = key - '1'; } while (recorddriver < 0 || recorddriver >= numdrivers); printf("\n"); result = system->init(32, FMOD_INIT_NORMAL, 0); ERRCHECK(result); memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); exinfo.numchannels = 2; exinfo.format = FMOD_SOUND_FORMAT_PCM16; exinfo.defaultfrequency = 44100; exinfo.length = exinfo.defaultfrequency * sizeof(short) * exinfo.numchannels * 5; result = system->createSound(0, FMOD_2D | FMOD_SOFTWARE | FMOD_OPENUSER, &exinfo, &sound); ERRCHECK(result); printf("===================================================================\n"); printf("Recording example. Copyright (c) Firelight Technologies 2004-2011.\n"); printf("===================================================================\n"); printf("\n"); printf("Press 'r' to record a 5 second segment of audio and write it to a wav file.\n"); printf("Press 'p' to play the 5 second segment of audio.\n"); printf("Press 'l' to turn looping on/off.\n"); printf("Press 's' to stop recording and playback.\n"); printf("Press 'w' to save the 5 second segment to a wav file.\n"); printf("Press 'Esc' to quit\n"); printf("\n"); /* Main loop. */ do { static FMOD::Channel *channel = 0; static bool looping = false; bool recording = false; bool playing = false; unsigned int recordpos = 0; unsigned int playpos = 0; unsigned int length; if (kbhit()) { key = getch(); switch (key) { case 'r' : case 'R' : { result = system->recordStart(recorddriver, sound, looping); ERRCHECK(result); break; } case 'p' : case 'P' : { if (looping) { sound->setMode(FMOD_LOOP_NORMAL); } else { sound->setMode(FMOD_LOOP_OFF); } ERRCHECK(result); result = system->playSound(FMOD_CHANNEL_REUSE, sound, false, &channel); ERRCHECK(result); break; } case 'l' : case 'L' : { looping = !looping; break; } case 's' : case 'S' : { result = system->recordStop(recorddriver); if (channel) { channel->stop(); channel = 0; } break; } case 'w' : case 'W' : { printf("Writing to record.wav ... \r"); SaveToWav(sound); Sleep(500); break; } } } sound->getLength(&length, FMOD_TIMEUNIT_PCM); ERRCHECK(result); system->isRecording(recorddriver, &recording); ERRCHECK(result); system->getRecordPosition(recorddriver, &recordpos); ERRCHECK(result); if (channel) { channel->isPlaying(&playing); ERRCHECK(result); channel->getPosition(&playpos, FMOD_TIMEUNIT_PCM); ERRCHECK(result); } printf("State: %-19s. Record pos = %6d : Play pos = %6d : Loop %-3s\r", recording ? playing ? "Recording / playing" : "Recording" : playing ? "Playing" : "Idle", recordpos, playpos, looping ? "On" : "Off"); fflush(stdout); system->update(); fflush(stdout); Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ result = sound->release(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }
int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound; FMOD::Channel *channel = 0; FMOD_RESULT result; int key; unsigned int version; memset(gCurrentTrackArtist, 0, 256); memset(gCurrentTrackTitle, 0, 256); strcpy(gOutputFileName, "output.mp3"); /* Start off like this then rename if a title tag comes along */ printf("======================================================================\n"); printf("RipNetStream Example. Copyright (c) Firelight Technologies 2004-2014.\n"); printf("======================================================================\n\n"); if (argc < 2) { printf("Usage: ripnetstream <url>\n"); return -1; } /* 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(100, FMOD_INIT_NORMAL, 0); ERRCHECK(result); result = system->setStreamBufferSize(gFileBufferSize, FMOD_TIMEUNIT_RAWBYTES); ERRCHECK(result); result = system->attachFileSystem(myopen, myclose, myread, 0); ERRCHECK(result); printf("Buffering...\n\n"); result = system->createSound(argv[1], FMOD_HARDWARE | FMOD_2D | FMOD_CREATESTREAM | FMOD_NONBLOCKING, 0, &sound); ERRCHECK(result); /* Main loop */ do { static bool mute = false; if (sound && !channel) { result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel); } if (_kbhit()) { key = _getch(); switch (key) { case ' ' : { if (channel) { bool paused; channel->getPaused(&paused); channel->setPaused(!paused); } break; } case 'm' : case 'M' : { if (channel) { channel->getMute(&mute); channel->setMute(!mute); } break; } } } system->update(); if (channel) { bool playing = false; int tagsupdated = 0; sound->getNumTags(0, &tagsupdated); if (tagsupdated) { printf("\n"); printf("\n"); for (;;) { FMOD_TAG tag; if (sound->getTag(0, -1, &tag) != FMOD_OK) { break; } if (tag.datatype == FMOD_TAGDATATYPE_STRING) { printf("[%-11s] %s (%d bytes)\n", tag.name, tag.data, tag.datalen); sound->getFormat(&gSoundType, 0, 0, 0); if (!strcmp(tag.name, "ARTIST")) { if (strncmp(gCurrentTrackArtist, (const char *)tag.data, 256)) { strncpy(gCurrentTrackArtist, (const char *)tag.data, 256); gUpdateFileName = true; } } if (!strcmp(tag.name, "TITLE")) { if (strncmp(gCurrentTrackTitle, (const char *)tag.data, 256)) { strncpy(gCurrentTrackTitle, (const char *)tag.data, 256); gUpdateFileName = true; } } } } printf("\n"); } result = channel->isPlaying(&playing); if (result != FMOD_OK || !playing) { sound->release(); sound = 0; channel = 0; } else { unsigned int ms = 0, percent = 0; bool paused = false; bool starving = false; FMOD_OPENSTATE openstate; result = sound->getOpenState(&openstate, &percent, &starving, 0); ERRCHECK(result); channel->setVolume(starving ? 0.0f : 1.0f); /* Don't use mute because the user is setting that. */ ERRCHECK(result); result = channel->getPaused(&paused); result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS); printf("Time %02d:%02d:%02d : (%3d%%%) %s SPACE = pause. 'm' = mute. ESC = quit.\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, percent, (openstate == FMOD_OPENSTATE_BUFFERING || starving) ? "Buffering..." : openstate == FMOD_OPENSTATE_CONNECTING ? "Connecting..." : paused ? "Paused " : playing ? "Playing " : "Stopped ", percent, starving ? "STARVING" : " "); } } if (sound) { FMOD_OPENSTATE openstate = FMOD_OPENSTATE_READY; sound->getOpenState(&openstate, 0, 0, 0); if (openstate == FMOD_OPENSTATE_ERROR) { sound->release(); sound = 0; channel = 0; } } if (!sound) { printf("\n"); printf("Error occurred or stream ended. Restarting stream..\n"); result = system->createSound(argv[1], FMOD_HARDWARE | FMOD_2D | FMOD_CREATESTREAM | FMOD_NONBLOCKING, 0, &sound); ERRCHECK(result); Sleep(1000); } 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 main(int argc, char *argv[]) { FMOD::System *system = 0; FMOD::Sound *sound = 0; FMOD::Channel *channel = 0; FMOD_RESULT result; FMOD_CREATESOUNDEXINFO exinfo; int key, driver, recorddriver, numdrivers, count, outputfreq, bin; 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; } /* System initialization */ printf("---------------------------------------------------------\n"); printf("Select OUTPUT type\n"); printf("---------------------------------------------------------\n"); printf("1 : OSS - Open Sound System\n"); printf("2 : ALSA - Advanced Linux Sound Architecture\n"); printf("3 : ESD - Enlightenment Sound Daemon\n"); printf("4 : PULSEAUDIO - Pulse Audio Sound Server\n"); printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); } while (key != 27 && key < '1' && key > '5'); switch (key) { case '1' : result = system->setOutput(FMOD_OUTPUTTYPE_OSS); break; case '2' : result = system->setOutput(FMOD_OUTPUTTYPE_ALSA); break; case '3' : result = system->setOutput(FMOD_OUTPUTTYPE_ESD); break; case '4' : result = system->setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO); break; default : return 1; } ERRCHECK(result); /* Enumerate playback devices */ result = system->getNumDrivers(&numdrivers); ERRCHECK(result); printf("---------------------------------------------------------\n"); printf("Choose a PLAYBACK driver\n"); printf("---------------------------------------------------------\n"); for (count=0; count < numdrivers; count++) { char name[256]; result = system->getDriverInfo(count, name, 256, 0); ERRCHECK(result); printf("%d : %s\n", count + 1, name); } printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); do { key = getch(); if (key == 27) { return 0; } driver = key - '1'; } while (driver < 0 || driver >= numdrivers); result = system->setDriver(driver); ERRCHECK(result); /* Enumerate record devices */ result = system->getRecordNumDrivers(&numdrivers); ERRCHECK(result); printf("---------------------------------------------------------\n"); printf("Choose a RECORD driver\n"); printf("---------------------------------------------------------\n"); for (count=0; count < numdrivers; count++) { char name[256]; result = system->getRecordDriverInfo(count, name, 256, 0); ERRCHECK(result); printf("%d : %s\n", count + 1, name); } printf("---------------------------------------------------------\n"); printf("Press a corresponding number or ESC to quit\n"); recorddriver = 0; do { key = getch(); if (key == 27) { return 0; } recorddriver = key - '1'; } while (recorddriver < 0 || recorddriver >= numdrivers); printf("\n"); result = system->setSoftwareFormat(OUTPUTRATE, FMOD_SOUND_FORMAT_PCM16, 1, 0, FMOD_DSP_RESAMPLER_LINEAR); ERRCHECK(result); result = system->init(32, FMOD_INIT_NORMAL, 0); ERRCHECK(result); system->getSoftwareFormat(&outputfreq, 0, 0, 0, 0, 0); ERRCHECK(result); /* Create a sound to record to. */ memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); exinfo.numchannels = 1; exinfo.format = FMOD_SOUND_FORMAT_PCM16; exinfo.defaultfrequency = OUTPUTRATE; exinfo.length = exinfo.defaultfrequency * sizeof(short) * exinfo.numchannels * 5; result = system->createSound(0, FMOD_2D | FMOD_SOFTWARE | FMOD_LOOP_NORMAL | FMOD_OPENUSER, &exinfo, &sound); ERRCHECK(result); /* Start the interface */ printf("=========================================================================\n"); printf("Pitch detection example. Copyright (c) Firelight Technologies 2004-2014.\n"); printf("=========================================================================\n"); printf("\n"); printf("Record something through the selected recording device and FMOD will\n"); printf("Determine the pitch. Sustain the tone for at least a second to get an\n"); printf("accurate reading.\n"); printf("Press 'Esc' to quit\n"); printf("\n"); result = system->recordStart(recorddriver, sound, true); ERRCHECK(result); Sleep(200); /* Give it some time to record something */ result = system->playSound(FMOD_CHANNEL_REUSE, sound, false, &channel); ERRCHECK(result); /* Dont hear what is being recorded otherwise it will feedback. Spectrum analysis is done before volume scaling in the DSP chain */ result = channel->setVolume(0); ERRCHECK(result); bin = 0; /* Main loop. */ do { static float spectrum[SPECTRUMSIZE]; float dominanthz = 0; float max; int dominantnote = 0; float binsize = BINSIZE; if (kbhit()) { key = getch(); } result = channel->getSpectrum(spectrum, SPECTRUMSIZE, 0, FMOD_DSP_FFT_WINDOW_TRIANGLE); ERRCHECK(result); max = 0; for (count = 0; count < SPECTRUMSIZE; count++) { if (spectrum[count] > 0.01f && spectrum[count] > max) { max = spectrum[count]; bin = count; } } dominanthz = (float)bin * BINSIZE; /* dominant frequency min */ dominantnote = 0; for (count = 0; count < 120; count++) { if (dominanthz >= notefreq[count] && dominanthz < notefreq[count + 1]) { /* which is it closer to. This note or the next note */ if (fabs(dominanthz - notefreq[count]) < fabs(dominanthz - notefreq[count+1])) { dominantnote = count; } else { dominantnote = count + 1; } break; } } printf("Detected rate : %7.1f -> %7.1f hz. Detected musical note. %-3s (%7.1f hz)\r", dominanthz, ((float)bin + 0.99f) * BINSIZE, note[dominantnote], notefreq[dominantnote]); fflush(stdout); system->update(); Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ result = sound->release(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }
/*============================================================================== Record example Copyright (c), Firelight Technologies Pty, Ltd 2004-2014. This example shows how to record continuously, and play back the same data as closely to the record cursor as possible without stuttering. ==============================================================================*/ #include "fmod.hpp" #include "common.h" #define LATENCY_MS (50) /* Some devices will require higher latency to avoid glitches */ int FMOD_Main() { FMOD::System *system = 0; FMOD::Sound *sound = 0; FMOD::Channel *channel = 0; FMOD_RESULT result = FMOD_OK; unsigned int version = 0; unsigned int soundlength = 0; bool dspenabled = false; void *extradriverdata = 0; unsigned int recordpos = 0; unsigned int recorddelta = 0; unsigned int minrecorddelta = (unsigned int)-1; unsigned int lastrecordpos = 0; unsigned int samplesrecorded = 0; unsigned int playpos = 0; float smootheddelta = 0; FMOD_CREATESOUNDEXINFO exinfo; 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(100, FMOD_INIT_NORMAL, extradriverdata); ERRCHECK(result); int recordrate; int recordchannels; result = system->getRecordDriverInfo(0, NULL, NULL, 0, 0, &recordrate, 0, &recordchannels); ERRCHECK(result); unsigned int adjustedlatency = (recordrate * LATENCY_MS) / 1000; unsigned int driftthreshold = adjustedlatency / 2; /* Create user sound to record into. */ memset(&exinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO)); exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); exinfo.numchannels = recordchannels; exinfo.format = FMOD_SOUND_FORMAT_PCM16; exinfo.defaultfrequency = recordrate; exinfo.length = exinfo.defaultfrequency * sizeof(short) * exinfo.numchannels * 5; /* 5 second buffer, doesnt really matter how big this is, but not too small of course. */ result = system->createSound(0, FMOD_LOOP_NORMAL | FMOD_OPENUSER, &exinfo, &sound); ERRCHECK(result); result = system->recordStart(0, sound, true); ERRCHECK(result); result = sound->getLength(&soundlength, FMOD_TIMEUNIT_PCM); ERRCHECK(result); /* Main loop */ do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { FMOD_REVERB_PROPERTIES propon = FMOD_PRESET_CONCERTHALL; FMOD_REVERB_PROPERTIES propoff = FMOD_PRESET_OFF; dspenabled = !dspenabled; result = system->setReverbProperties(0, dspenabled ? &propon : &propoff); ERRCHECK(result); } result = system->update(); ERRCHECK(result); system->getRecordPosition(0, &recordpos); ERRCHECK(result); recorddelta = (recordpos >= lastrecordpos) ? (recordpos - lastrecordpos) : (recordpos + soundlength - lastrecordpos); lastrecordpos = recordpos; samplesrecorded += recorddelta; if (samplesrecorded >= adjustedlatency && !channel) { result = system->playSound(sound, 0, false, &channel); ERRCHECK(result); } if (channel && recorddelta) { /* If the record driver steps the position of the record cursor in larger increments than the user defined latency value, then we should increase our latency value to match. */ if (recorddelta < minrecorddelta) { minrecorddelta = recorddelta; if (adjustedlatency < recorddelta) { adjustedlatency = recorddelta; } } result = channel->getPosition(&playpos, FMOD_TIMEUNIT_PCM); ERRCHECK(result); /* Smooth total */ { const float dampratio = 0.97f; static float total = 0; total *= dampratio; total += (recordpos >= playpos) ? (recordpos - playpos) : (recordpos + soundlength - playpos); smootheddelta = total * (1.0f - dampratio); } if (smootheddelta < (adjustedlatency - driftthreshold) || smootheddelta > soundlength / 2) /* If play cursor is catching up to record (or passed it), slow playback down */ { channel->setFrequency(recordrate - (recordrate / 50)); /* Decrease speed by 2% */ } else if (smootheddelta > (adjustedlatency + driftthreshold)) /* If play cursor is falling too far behind record, speed playback up */ { channel->setFrequency(recordrate + (recordrate / 50)); /* Increase speed by 2% */ } else { channel->setFrequency(recordrate); /* Otherwise set to normal rate */ } } Common_Draw("=================================================="); Common_Draw("Record Example."); Common_Draw("Copyright (c) Firelight Technologies 2004-2014."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Adjust LATENCY define to compensate for stuttering"); Common_Draw(""); Common_Draw("Press %s to %s DSP effect", Common_BtnStr(BTN_ACTION1), dspenabled ? "disable" : "enable"); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Draw(""); Common_Draw("Default playback latency: %4d (%dms)", (recordrate * LATENCY_MS) / 1000, LATENCY_MS); Common_Draw("Current playback latency: %4d (%dms)", (int)smootheddelta, (int)smootheddelta * 1000 / recordrate); Common_Draw("Record position: %6d", recordpos); Common_Draw("Play Position: %6d", playpos); Common_Sleep(10); } while (!Common_BtnPress(BTN_QUIT)); /* Shut down */ result = sound->release(); ERRCHECK(result); result = system->release(); ERRCHECK(result); Common_Close(); return 0; }
int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound; FMOD::Channel *channel; FMOD::DSP *mydsp; FMOD_RESULT result; int key; unsigned int version; float pan = 0; /* 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); ERRCHECK(result); printf("===============================================================================\n"); printf("Custom DSP example. Copyright (c) Firelight Technologies 2004-2011.\n"); printf("===============================================================================\n"); printf("Press 'f' to activate, deactivate user filter\n"); printf("Press 'Esc' to quit\n"); printf("\n"); result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel); ERRCHECK(result); /* Create the DSP effects. */ { FMOD_DSP_DESCRIPTION dspdesc; memset(&dspdesc, 0, sizeof(FMOD_DSP_DESCRIPTION)); strcpy(dspdesc.name, "My first DSP unit"); dspdesc.channels = 0; // 0 = whatever comes in, else specify. dspdesc.read = myDSPCallback; dspdesc.userdata = (void *)0x12345678; result = system->createDSP(&dspdesc, &mydsp); ERRCHECK(result); } /* Inactive by default. */ mydsp->setBypass(true); /* Main loop. */ result = system->addDSP(mydsp, 0); /* Main loop. */ do { if (kbhit()) { key = getch(); switch (key) { case 'f' : case 'F' : { static bool active = false; mydsp->setBypass(active); active = !active; break; } } } system->update(); Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ result = sound->release(); ERRCHECK(result); result = mydsp->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }
int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound; FMOD::Channel *channel = 0; FMOD_RESULT result; int key; unsigned int version; HANDLE threadhandle; InitializeCriticalSection(&gCrit); threadhandle = (HANDLE)_beginthreadex(NULL, 0, ProcessQueue, 0, 0, 0); if (!threadhandle) { printf("Failed to create file thread.\n"); return 0; } /* 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->setStreamBufferSize(32768, FMOD_TIMEUNIT_RAWBYTES); ERRCHECK(result); result = system->setFileSystem(myopen, myclose, myread, myseek, myasyncread, myasynccancel, 2048); ERRCHECK(result); printf("====================================================================\n"); printf("Stream IO Example. Copyright (c) Firelight Technologies 2004-2014.\n"); printf("====================================================================\n"); printf("\n"); printf("\n"); printf("====================== CALLING CREATESOUND ON MP3 =======================\n"); result = system->createStream("../media/wave.mp3", FMOD_SOFTWARE | FMOD_LOOP_NORMAL | FMOD_2D | FMOD_IGNORETAGS, 0, &sound); ERRCHECK(result); printf("====================== CALLING PLAYSOUND ON MP3 =======================\n"); result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel); ERRCHECK(result); /* Main loop. */ do { if (sound) { FMOD_OPENSTATE openstate; bool starving; sound->getOpenState(&openstate, 0, &starving, 0); if (starving) { printf("Starving\n"); result = channel->setMute(true); } else { result = channel->setMute(false); ERRCHECK(result); } } if (_kbhit()) { key = _getch(); switch (key) { case ' ' : { result = sound->release(); if (result == FMOD_OK) { sound = 0; printf("Released sound.\n"); } break; } } } system->update(); Sleep(10); } while (key != 27); printf("\n"); /* Shut down */ if (sound) { result = sound->release(); ERRCHECK(result); } result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); gThreadQuit = true; return 0; }
int main(int argc, char *argv[]) { FMOD::System *system; FMOD::Sound *sound; FMOD_RESULT result; FMOD_TAG tag; int numtags, numtagsupdated, count; unsigned int version; printf("==================================================================\n"); printf("ReadTags Example. Copyright (c) Firelight Technologies 2004-2011.\n"); printf("==================================================================\n\n"); /* Global Settings */ 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); getch(); return 0; } result = system->init(100, FMOD_INIT_NORMAL, 0); ERRCHECK(result); /* Open the specified file. Use FMOD_CREATESTREAM and FMOD_OPENONLY so it opens quickly */ result = system->createSound("../media/wave.mp3", FMOD_SOFTWARE | FMOD_2D | FMOD_CREATESTREAM | FMOD_OPENONLY, 0, &sound); ERRCHECK(result); /* Read and display all tags associated with this file */ for (;;) { /* An index of -1 means "get the first tag that's new or updated". If no tags are new or updated then getTag will return FMOD_ERR_TAGNOTFOUND. This is the first time we've read any tags so they'll all be new but after we've read them, they won't be new any more. */ if (sound->getTag(0, -1, &tag) != FMOD_OK) { break; } if (tag.datatype == FMOD_TAGDATATYPE_STRING) { printf("%s = %s (%d bytes)\n", tag.name, (char *)tag.data, tag.datalen); } else { printf("%s = <binary> (%d bytes)\n", tag.name, tag.datalen); } } printf("\n"); /* Read all the tags regardless of whether they're updated or not. Also show the tag type. */ result = sound->getNumTags(&numtags, &numtagsupdated); ERRCHECK(result); for (count=0; count < numtags; count++) { result = sound->getTag(0, count, &tag); ERRCHECK(result); switch (tag.type) { case FMOD_TAGTYPE_UNKNOWN : printf("FMOD_TAGTYPE_UNKNOWN "); break; case FMOD_TAGTYPE_ID3V1 : printf("FMOD_TAGTYPE_ID3V1 "); break; case FMOD_TAGTYPE_ID3V2 : printf("FMOD_TAGTYPE_ID3V2 "); break; case FMOD_TAGTYPE_VORBISCOMMENT : printf("FMOD_TAGTYPE_VORBISCOMMENT "); break; case FMOD_TAGTYPE_SHOUTCAST : printf("FMOD_TAGTYPE_SHOUTCAST "); break; case FMOD_TAGTYPE_ICECAST : printf("FMOD_TAGTYPE_ICECAST "); break; case FMOD_TAGTYPE_ASF : printf("FMOD_TAGTYPE_ASF "); break; case FMOD_TAGTYPE_FMOD : printf("FMOD_TAGTYPE_FMOD "); break; case FMOD_TAGTYPE_USER : printf("FMOD_TAGTYPE_USER "); break; } if (tag.datatype == FMOD_TAGDATATYPE_STRING) { printf("%s = %s (%d bytes)\n", tag.name, (char *)tag.data, tag.datalen); } else { printf("%s = ??? (%d bytes)\n", tag.name, tag.datalen); } } printf("\n"); /* Find a specific tag by name. Specify an index > 0 to get access to multiple tags of the same name. */ result = sound->getTag("ARTIST", 0, &tag); ERRCHECK(result); printf("%s = %s (%d bytes)\n", tag.name, (char *)tag.data, tag.datalen); printf("\n"); /* Shut down */ result = sound->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); return 0; }