18 #include "threads/CriticalSection.h" 25 #include "PlatformDefs.h" 27 #include <cdio/cdio.h> 32 #define STRONG "__________________________________\n" 36 #define FS_HIGH_SIERRA 1 38 #define FS_INTERACTIVE 3 43 #define FS_ISO_9660_INTERACTIVE 8 51 #define MULTISESSION 32 53 #define HIDDEN_TRACK 128 57 #define ROCKRIDGE 2048 71 #define IS_BOOTABLE 10 72 #define IS_VIDEO_CD 11 81 const char *description;
85 typedef std::map<cdtext_field_t, std::string> xbmc_cdtext_t;
102 enum class CdioTrayStatus
119 m_bHasCDDBInfo =
true;
120 m_nLength = m_nFirstTrack = m_nNumTrack = m_nNumAudio = m_nFirstAudio = m_nNumData = m_nFirstData = 0;
123 trackinfo GetTrackInformation(
int nTrack ) {
return m_ti[nTrack -1]; }
124 xbmc_cdtext_t GetDiscCDTextInformation() {
return m_cdtext; }
126 bool HasDataTracks() {
return (m_nNumData > 0); }
127 bool HasAudioTracks() {
return (m_nNumAudio > 0); }
128 int GetFirstTrack() {
return m_nFirstTrack; }
129 int GetTrackCount() {
return m_nNumTrack; }
130 int GetFirstAudioTrack() {
return m_nFirstAudio; }
131 int GetFirstDataTrack() {
return m_nFirstData; }
132 int GetDataTrackCount() {
return m_nNumData; }
133 int GetAudioTrackCount() {
return m_nNumAudio; }
134 uint32_t GetCddbDiscId() {
return m_ulCddbDiscId; }
135 int GetDiscLength() {
return m_nLength; }
136 std::string GetDiscLabel(){
return m_strDiscLabel; }
139 bool IsIso9660(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_ISO_9660); }
141 bool IsJoliet(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & JOLIET) ? false :
true; }
143 int GetJolietLevel(
int nTrack ) {
return m_ti[nTrack - 1].nJolietLevel; }
145 int GetIsoSize(
int nTrack ) {
return m_ti[nTrack - 1].isofs_size; }
147 bool IsRockridge(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & ROCKRIDGE) ? false :
true; }
150 bool IsIso9660Interactive(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_ISO_9660_INTERACTIVE); }
153 bool IsHighSierra(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_HIGH_SIERRA); }
156 bool IsCDInteractive(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_INTERACTIVE); }
159 bool IsHFS(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_HFS); }
162 bool IsISOHFS(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_ISO_HFS); }
165 bool IsISOUDF(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_ISO_UDF); }
168 bool IsUFS(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_UFS); }
171 bool IsEXT2(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_EXT2); }
174 bool Is3DO(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_3DO); }
177 bool IsMixedMode(
int nTrack ) {
return (m_nFirstData == 1 && m_nNumAudio > 0); }
180 bool IsXA(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & XA) ? false :
true; }
183 bool IsMultiSession(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & MULTISESSION) ? false :
true; }
185 int GetMultisessionOffset(
int nTrack ) {
return m_ti[nTrack - 1].ms_offset; }
188 bool IsHiddenTrack(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & HIDDEN_TRACK) ? false :
true; }
191 bool IsPhotoCd(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & PHOTO_CD) ? false :
true; }
194 bool IsCdTv(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & CDTV) ? false :
true; }
197 bool IsCDExtra(
int nTrack ) {
return (m_nFirstData > 1); }
200 bool IsBootable(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & BOOTABLE) ? false :
true; }
203 bool IsVideoCd(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & VIDEOCDI && m_nNumAudio == 0); }
206 bool IsChaojiVideoCD(
int nTrack ) {
return (m_ti[nTrack - 1].nfsInfo & CVD) ? false :
true; }
209 bool IsAudio(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_NO_DATA); }
212 bool IsUDF(
int nTrack ) {
return ((m_ti[nTrack - 1].nfsInfo & FS_MASK) == FS_UDF); }
215 bool IsValidFs() {
return (IsISOHFS(1) || IsIso9660(1) || IsIso9660Interactive(1) || IsISOUDF(1) || IsUDF(1) || IsAudio(1)); }
217 void SetFirstTrack(
int nTrack ) { m_nFirstTrack = nTrack; }
218 void SetTrackCount(
int nCount ) { m_nNumTrack = nCount; }
219 void SetFirstAudioTrack(
int nTrack ) { m_nFirstAudio = nTrack; }
220 void SetFirstDataTrack(
int nTrack ) { m_nFirstData = nTrack; }
221 void SetDataTrackCount(
int nCount ) { m_nNumData = nCount; }
222 void SetAudioTrackCount(
int nCount ) { m_nNumAudio = nCount; }
223 void SetTrackInformation(
int nTrack,
trackinfo nInfo)
225 if (nTrack > 0 && nTrack <= 99)
226 m_ti[nTrack - 1] = std::move(nInfo);
228 void SetDiscCDTextInformation(xbmc_cdtext_t cdtext) { m_cdtext = std::move(cdtext); }
230 void SetCddbDiscId( uint32_t ulCddbDiscId ) { m_ulCddbDiscId = ulCddbDiscId; }
231 void SetDiscLength(
int nLength ) { m_nLength = nLength; }
232 bool HasCDDBInfo() {
return m_bHasCDDBInfo; }
233 void SetNoCDDBInfo() { m_bHasCDDBInfo =
false; }
235 void SetDiscLabel(
const std::string& strDiscLabel){ m_strDiscLabel = strDiscLabel; }
245 uint32_t m_ulCddbDiscId;
248 std::string m_strDiscLabel;
249 xbmc_cdtext_t m_cdtext;
259 static void ReleaseInstance();
260 static std::shared_ptr<CLibcdio> GetInstance();
263 CdIo_t* cdio_open(
const char *psz_source, driver_id_t driver_id);
264 CdIo_t* cdio_open_win32(
const char *psz_source);
265 void cdio_destroy(CdIo_t *p_cdio);
266 discmode_t cdio_get_discmode(CdIo_t *p_cdio);
267 CdioTrayStatus mmc_get_tray_status(
const CdIo_t* p_cdio);
268 driver_return_code_t cdio_eject_media(CdIo_t** p_cdio);
269 track_t cdio_get_last_track_num(
const CdIo_t *p_cdio);
270 lsn_t cdio_get_track_lsn(
const CdIo_t *p_cdio, track_t i_track);
271 lsn_t cdio_get_track_last_lsn(
const CdIo_t *p_cdio, track_t i_track);
272 driver_return_code_t cdio_read_audio_sectors(
const CdIo_t *p_cdio,
void *p_buf, lsn_t i_lsn, uint32_t i_blocks);
273 driver_return_code_t cdio_close_tray(
const char* psz_source, driver_id_t* driver_id);
274 const char* cdio_driver_errmsg(driver_return_code_t drc);
276 char* GetDeviceFileName();
279 char* s_defaultDevice;
280 CCriticalSection m_critSection;
281 static std::shared_ptr<CLibcdio> m_pInstance;
294 HANDLE OpenIMAGE( std::string& strFilename );
295 int ReadSector(
HANDLE hDevice, DWORD dwSector,
char* lpczBuffer);
296 int ReadSectorMode2(
HANDLE hDevice, DWORD dwSector,
char* lpczBuffer);
297 int ReadSectorCDDA(
HANDLE hDevice, DWORD dwSector,
char* lpczBuffer);
298 void CloseCDROM(
HANDLE hDevice);
300 void PrintAnalysis(
int fs,
int num_audio);
302 CCdInfo* GetCdInfo(
char* cDeviceFileName=NULL);
303 void GetCdTextInfo(xbmc_cdtext_t &xcdt,
int trackNum);
306 int ReadBlock(
int superblock, uint32_t offset, uint8_t bufnum, track_t track_num);
313 int GetJolietLevel(
void );
314 int GuessFilesystem(
int start_session, track_t track_num);
316 uint32_t CddbDiscId();
317 int CddbDecDigitSum(
int n);
318 unsigned int MsfSeconds(msf_t *msf);
321 char buffer[7][CDIO_CD_FRAMESIZE_RAW];
334 track_t m_nNumTracks = CDIO_INVALID_TRACK;
335 track_t m_nFirstTrackNum = CDIO_INVALID_TRACK;
337 std::string m_strDiscLabel;
344 std::shared_ptr<CLibcdio> m_cdio;