Files
android_multiviewwer/app/src/main/cpp/Preloader.cpp
T

78 lines
2.1 KiB
C++
Raw Normal View History

2025-08-27 15:09:05 +09:00
#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_ || preloadFailed_) {
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);
std::lock_guard<std::mutex> lock(preloadMutex_);
// MediaAsset의 load(fd) 함수 호출
if (nextMedia_.load(fd)) {
dataReady_ = true;
LOGI("Preloading finished successfully.");
} else {
LOGE("Preloading failed.");
preloadFailed_ = true;
nextMedia_.release();
// 로딩 실패 시 다음 미디어를 요청하여 멈추지 않도록 함
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;
}