AudioCache* AudioEngineImpl::preload(const std::string& filePath, std::function<void(bool)> callback) { AudioCache* audioCache = nullptr; do { auto it = _audioCaches.find(filePath); if (it == _audioCaches.end()) { FileFormat fileFormat = FileFormat::UNKNOWN; std::string fileExtension = FileUtils::getInstance()->getFileExtension(filePath); if (fileExtension == ".wav") { fileFormat = FileFormat::WAV; } else if (fileExtension == ".ogg") { fileFormat = FileFormat::OGG; } else if (fileExtension == ".mp3") { fileFormat = FileFormat::MP3; } else { log("Unsupported media type file: %s\n", filePath.c_str()); break; } audioCache = &_audioCaches[filePath]; audioCache->_fileFormat = fileFormat; std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); audioCache->_fileFullPath = fullPath; AudioEngine::addTask(std::bind(&AudioCache::readDataTask, audioCache)); } else { audioCache = &it->second; } } while (false); if (callback) { if (audioCache) { audioCache->addLoadCallback(callback); } else { callback(false); } } return audioCache; }
AudioCache* AudioEngineImpl::preload(const std::string& filePath, std::function<void(bool)> callback) { AudioCache* audioCache = nullptr; do { auto it = _audioCaches.find(filePath); if (it != _audioCaches.end()) { audioCache = &it->second; if (callback && audioCache->_alBufferReady) { callback(true); } break; } AudioCache::FileFormat fileFormat = AudioCache::FileFormat::UNKNOWN; std::string fileExtension = FileUtils::getInstance()->getFileExtension(filePath); if (fileExtension == ".ogg") { fileFormat = AudioCache::FileFormat::OGG; } else if (fileExtension == ".mp3") { fileFormat = AudioCache::FileFormat::MP3; if (MPG123_LAZYINIT) { auto error = mpg123_init(); if (error == MPG123_OK) { MPG123_LAZYINIT = false; } else { log("Basic setup goes wrong: %s", mpg123_plain_strerror(error)); break; } } } else { log("Unsupported media type file: %s\n", filePath.c_str()); break; } audioCache = &_audioCaches[filePath]; audioCache->_fileFormat = fileFormat; audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath); AudioEngine::addTask(std::bind(&AudioCache::readDataTask, audioCache)); } while (false); if (callback) { if (audioCache) { audioCache->addLoadCallback(callback); } else { callback(false); } } return audioCache; }