#include "Preloader.h" #include extern void callNextMediaCallback(); #define LOG_TAG "Preloader" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) Preloader::Preloader() : dataReady_(false), preloadFailed_(false) {} Preloader::~Preloader() { releasePreloadedData(); } void Preloader::releasePreloadedData() { std::lock_guard lock(preloadMutex_); nextMedia_.release(); dataReady_ = false; preloadFailed_ = false; } // [수정] std::string path 대신 int fd를 인자로 받음 void Preloader::startNextPreload(int fd) { if (dataReady_) { LOGI("Preloader is busy with ready data. Ignoring new preload request."); return; } if (fd < 0) { LOGE("Preloader received an invalid file descriptor."); return; } // 이전에 실패했더라도 새로운 요청이 오면 다시 시도하도록 초기화 preloadFailed_ = false; std::thread([this, fd]() { LOGI("Starting preload thread for media with fd: %d", fd); MediaAsset tempMedia; if (tempMedia.load(fd)) { std::lock_guard lock(preloadMutex_); nextMedia_ = std::move(tempMedia); dataReady_ = true; LOGI("Preloading finished successfully."); } else { // --- ⬇️ 실패 로그 추가 ⬇️ --- LOGE("!!! Preloading FAILED for fd: %d. !!!", fd); preloadFailed_ = true; callNextMediaCallback(); } }).detach(); } bool Preloader::isPreloadedDataReady() const { return dataReady_; } bool Preloader::hasPreloadFailed() const { return preloadFailed_; } MediaAsset Preloader::swapAndRelease() { std::lock_guard lock(preloadMutex_); if (dataReady_) { dataReady_ = false; preloadFailed_ = false; return std::move(nextMedia_); } return MediaAsset(); // 준비되지 않았으면 빈 MediaAsset 반환 } void Preloader::setPreloadedMedia(MediaAsset&& media) { std::lock_guard lock(preloadMutex_); nextMedia_ = std::move(media); dataReady_ = true; preloadFailed_ = false; }