/** Plays the audio data from the given file * \param fileHandle PhysicsFS file handle to stream the audio from * \param volume the volume to play the audio at (in a range of 0.0 to 1.0) * \param onFinished callback to invoke when we're finished playing * \param user_data user-data pointer to pass to the \c onFinished callback * \return a pointer to the currently playing stream when playing started * successfully, NULL otherwise. * \post When a non-NULL pointer is returned the audio stream system will * close the PhysicsFS file handle. Otherwise (when false is returned) * this is left to the user. * \note The returned pointer will become invalid/dangling immediately after * the \c onFinished callback is invoked. * \note You must _never_ manually free() the memory used by the returned * pointer. */ AUDIO_STREAM *sound_PlayStream(PHYSFS_file *fileHandle, float volume, void (*onFinished)(void *), void *user_data) { // Default buffer size static const size_t streamBufferSize = 16 * 1024; // Default buffer count static const unsigned int buffer_count = 2; return sound_PlayStreamWithBuf(fileHandle, volume, onFinished, user_data, streamBufferSize, buffer_count); }
static bool cdAudio_OpenTrack(const char *filename) { if (!music_initialized) { return false; } debug(LOG_SOUND, "called(%s)", filename); cdAudio_Stop(); if (strncasecmp(filename + strlen(filename) - 4, ".ogg", 4) == 0) { PHYSFS_file *music_file = PHYSFS_openRead(filename); debug(LOG_WZ, "Reading...[directory: %s] %s", PHYSFS_getRealDir(filename), filename); if (music_file == nullptr) { debug(LOG_ERROR, "Failed opening file [directory: %s] %s, with error %s", PHYSFS_getRealDir(filename), filename, WZ_PHYSFS_getLastError()); return false; } cdStream = sound_PlayStreamWithBuf(music_file, music_volume, cdAudio_TrackFinished, filename, bufferSize, buffer_count); if (cdStream == nullptr) { PHYSFS_close(music_file); debug(LOG_ERROR, "Failed creating audio stream for %s", filename); return false; } debug(LOG_SOUND, "successful(%s)", filename); stopping = false; return true; } return false; // unhandled }