79 lines
2.2 KiB
C++
79 lines
2.2 KiB
C++
#include "Preloader.h"
|
|
#include <android/log.h>
|
|
|
|
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<std::mutex> 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<std::mutex> 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<std::mutex> lock(preloadMutex_);
|
|
if (dataReady_) {
|
|
dataReady_ = false;
|
|
preloadFailed_ = false;
|
|
return std::move(nextMedia_);
|
|
}
|
|
return MediaAsset(); // 준비되지 않았으면 빈 MediaAsset 반환
|
|
}
|
|
|
|
void Preloader::setPreloadedMedia(MediaAsset&& media) {
|
|
std::lock_guard<std::mutex> lock(preloadMutex_);
|
|
nextMedia_ = std::move(media);
|
|
dataReady_ = true;
|
|
preloadFailed_ = false;
|
|
} |