metaforce/Runtime/CDvdFile.hpp

87 lines
2.7 KiB
C++
Raw Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
2015-08-22 23:42:29 -07:00
#include <atomic>
2016-03-06 19:12:32 -08:00
#include <condition_variable>
#include <memory>
#include <mutex>
#include <string>
#include <thread>
2019-04-06 22:14:48 -07:00
#include <unordered_map>
2016-03-06 19:12:32 -08:00
#include "Runtime/GCNTypes.hpp"
#include "Runtime/RetroTypes.hpp"
//#include <athena/FileReader.hpp>
2022-01-31 16:06:54 -08:00
#include <nod/nod.hpp>
#include <nod/DiscBase.hpp>
#ifndef EMSCRIPTEN
#define HAS_DVD_THREAD
#endif
2021-04-10 01:42:06 -07:00
namespace metaforce {
2015-08-22 23:42:29 -07:00
2018-12-07 21:30:43 -08:00
enum class ESeekOrigin { Begin = 0, Cur = 1, End = 2 };
2015-08-22 23:42:29 -07:00
struct DVDFileInfo;
class IDvdRequest;
2015-08-22 23:42:29 -07:00
struct SDiscInfo {
std::array<char, 6> gameId;
uint8_t version;
std::string gameTitle;
};
2018-12-07 21:30:43 -08:00
class CDvdFile {
friend class CResLoader;
friend class CFileDvdRequest;
2022-01-31 16:06:54 -08:00
static std::unique_ptr<nod::DiscBase> m_DvdRoot;
// static std::unordered_map<std::string, std::string> m_caseInsensitiveMap;
#ifdef HAS_DVD_THREAD
2018-12-07 21:30:43 -08:00
static std::thread m_WorkerThread;
static std::mutex m_WorkerMutex;
static std::condition_variable m_WorkerCV;
static std::mutex m_WaitMutex;
static std::atomic_bool m_WorkerRun;
#endif
2018-12-07 21:30:43 -08:00
static std::vector<std::shared_ptr<IDvdRequest>> m_RequestQueue;
static std::string m_rootDirectory;
static std::unique_ptr<u8[]> m_dolBuf;
2018-12-07 21:30:43 -08:00
static void WorkerProc();
std::string x18_path;
2022-01-31 16:06:54 -08:00
std::shared_ptr<nod::IPartReadStream> m_reader;
uint64_t m_begin;
uint64_t m_size;
2016-03-06 19:12:32 -08:00
2022-01-31 16:06:54 -08:00
static nod::Node* ResolvePath(std::string_view path);
// static void RecursiveBuildCaseInsensitiveMap(const hecl::ProjectPath& path, std::string::size_type prefixLen);
2019-03-09 00:58:27 -08:00
2015-08-22 23:42:29 -07:00
public:
2022-01-31 16:06:54 -08:00
static bool Initialize(const std::string_view& path);
static SDiscInfo DiscInfo();
static void SetRootDirectory(const std::string_view& rootDir);
2018-12-07 21:30:43 -08:00
static void Shutdown();
static u8* GetDolBuf() { return m_dolBuf.get(); }
static void DoWork();
2018-12-07 21:30:43 -08:00
2022-01-31 16:06:54 -08:00
CDvdFile(std::string_view path);
operator bool() const { return m_reader.operator bool(); }
void UpdateFilePos(int pos) { m_reader->seek(pos, SEEK_SET); }
static bool FileExists(std::string_view path) {
nod::Node* node = ResolvePath(path);
return node != nullptr && node->getKind() == nod::Node::Kind::File;
}
void CloseFile() { m_reader.reset(); }
2018-12-07 21:30:43 -08:00
std::shared_ptr<IDvdRequest> AsyncSeekRead(void* buf, u32 len, ESeekOrigin whence, int off,
std::function<void(u32)>&& cb = {});
2022-01-31 16:06:54 -08:00
u32 SyncSeekRead(void* buf, u32 len, ESeekOrigin whence, int offset);
2018-12-07 21:30:43 -08:00
std::shared_ptr<IDvdRequest> AsyncRead(void* buf, u32 len, std::function<void(u32)>&& cb = {}) {
return AsyncSeekRead(buf, len, ESeekOrigin::Cur, 0, std::move(cb));
}
2022-01-31 16:06:54 -08:00
u32 SyncRead(void* buf, u32 len) { return m_reader->read(buf, len); }
u64 Length() const { return m_size; }
2018-12-07 21:30:43 -08:00
std::string_view GetPath() const { return x18_path; }
2015-08-22 23:42:29 -07:00
};
2021-04-10 01:42:06 -07:00
} // namespace metaforce