int DM_Music_PlayFile(const char *filename, int looped) { if(!fmodSystem) return false; // Get rid of the current song. releaseSong(); releaseSongBuffer(); setDefaultStreamBufferSize(); FMOD_CREATESOUNDEXINFO extra; zeroStruct(extra); if(endsWith(soundFontFileName.c_str(), ".dls")) { extra.dlsname = soundFontFileName.c_str(); } FMOD_RESULT result; result = fmodSystem->createSound(filename, FMOD_CREATESTREAM | (looped? FMOD_LOOP_NORMAL : 0), &extra, &song); DSFMOD_TRACE("Music_Play: loaded '" << filename << "' => Sound " << song); DSFMOD_ERRCHECK(result); needReleaseSong = true; return startSong(); }
int DM_Music_Play(int looped) { if(!fmodSystem) return false; if(songBuffer) { // Get rid of the old song. releaseSong(); setDefaultStreamBufferSize(); FMOD_CREATESOUNDEXINFO extra; zeroStruct(extra); extra.length = songBuffer->size; if(endsWith(soundFontFileName.c_str(), ".dls")) { extra.dlsname = soundFontFileName.c_str(); } // Load a new song. FMOD_RESULT result; result = fmodSystem->createSound(songBuffer->data, FMOD_CREATESTREAM | FMOD_OPENMEMORY | (looped? FMOD_LOOP_NORMAL : 0), &extra, &song); DSFMOD_TRACE("Music_Play: songBuffer has " << songBuffer->size << " bytes, created Sound " << song); DSFMOD_ERRCHECK(result); needReleaseSong = true; // The song buffer remains in memory, in case FMOD needs to stream from it. } return startSong(); }
void setDefaultStreamBufferSize() { if(!fmodSystem) return; FMOD_RESULT result; result = fmodSystem->setStreamBufferSize(16*1024, FMOD_TIMEUNIT_RAWBYTES); DSFMOD_ERRCHECK(result); }
int DM_CDAudio_Init() { numDrives = 0; FMOD_RESULT result; result = fmodSystem->getNumCDROMDrives(&numDrives); DSFMOD_ERRCHECK(result); DSFMOD_TRACE("CDAudio_Init: " << numDrives << " CD drives available."); return fmodSystem != nullptr; }
static bool startSong() { if(!fmodSystem || !song) return false; if(music) music->stop(); // Start playing the song. FMOD_RESULT result; result = fmodSystem->playSound(FMOD_CHANNEL_FREE, song, true, &music); DSFMOD_ERRCHECK(result); // Properties. music->setVolume(musicVolume); music->setCallback(musicCallback); // Start playing. music->setPaused(false); return true; }
int DM_CDAudio_Play(int track, int looped) { if(!fmodSystem) return false; if(!numDrives) { DSFMOD_TRACE("CDAudio_Play: No CD drives available."); return false; } // Use a bigger stream buffer for CD audio. fmodSystem->setStreamBufferSize(64*1024, FMOD_TIMEUNIT_RAWBYTES); // Get the drive name. /// @todo Make drive selection configurable. FMOD_RESULT result; char driveName[80]; fmodSystem->getCDROMDriveName(0, driveName, sizeof(driveName), 0, 0, 0, 0); DSFMOD_TRACE("CDAudio_Play: CD drive name: '" << driveName << "'"); FMOD::Sound *trackSound = nullptr; bool needRelease = false; #if MACOSX for(char* ptr = driveName; *ptr; ptr++) { if(*ptr == '/') *ptr = ':'; } // The CD tracks are mapped to files. char trackPath[200]; sprintf(trackPath, "/Volumes/%s/%i Audio Track.aiff", driveName, track); DSFMOD_TRACE("CDAudio_Play: Opening track: " << trackPath); result = fmodSystem->createStream(trackPath, (looped? FMOD_LOOP_NORMAL : 0), 0, &trackSound); DSFMOD_TRACE("CDAudio_Play: Track " << track << " => Sound " << trackSound); DSFMOD_ERRCHECK(result); needRelease = true; #else #ifdef WIN32 /// @todo Check if there is a data track. // (Hexen CD) The audio tracks begin at #1 even though there is a data track. track--; #endif if(!cdSound) { // Get info about the CD tracks. result = fmodSystem->createStream(driveName, FMOD_OPENONLY, 0, &cdSound); DSFMOD_TRACE("CDAudio_Play: Opening CD, cdSound " << cdSound); DSFMOD_ERRCHECK(result); if(result != FMOD_OK) return false; } DENG2_ASSERT(cdSound); int numTracks = 0; result = cdSound->getNumSubSounds(&numTracks); DSFMOD_TRACE("CDAudio_Play: Number of tracks = " << numTracks); if(result != FMOD_OK) return false; // The subsounds are indexed starting from zero (CD track 1 == subsound 0). track--; if(track >= numTracks) { DSFMOD_TRACE("CDAudio_Play: Track " << track << " out of bounds."); return false; } result = cdSound->getSubSound(track, &trackSound); DSFMOD_ERRCHECK(result); DSFMOD_TRACE("CDAudio_Play: Track " << track + 1 << " got subsound " << trackSound); if(looped) { trackSound->setMode(FMOD_LOOP_NORMAL); } #endif return DMFmod_Music_PlaySound(trackSound, needRelease); // takes ownership }