diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-03-10 02:14:30 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-03-10 02:35:02 +0200 |
commit | bc1d0ca37d9bdfd69a945043650e0246ffeb5f94 (patch) | |
tree | 8269c9cbc1df72afb5715b77669698a0781f6250 /stream/stream_cddb.c | |
parent | f7cc4152f7c55808c5dd6bbd49c216c9345eb686 (diff) | |
parent | e9a5e7f667d1b0c0dec0053ad9ec6f7bc3162b60 (diff) |
Merge svn changes up to r30798
Diffstat (limited to 'stream/stream_cddb.c')
-rw-r--r-- | stream/stream_cddb.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/stream/stream_cddb.c b/stream/stream_cddb.c index d6fe4f1881..811a1c1570 100644 --- a/stream/stream_cddb.c +++ b/stream/stream_cddb.c @@ -68,6 +68,8 @@ #include "mpbswap.h" #endif +#include "osdep/osdep.h" + #include "cdd.h" #include "version.h" #include "stream.h" @@ -112,6 +114,78 @@ static int read_toc(const char *dev) } CloseHandle(drive); +#elif defined(__OS2__) + UCHAR auchParamDisk[4] = {'C', 'D', '0', '1'}; + + struct { + BYTE bFirstTrack; + BYTE bLastTrack; + BYTE bLeadOutF; + BYTE bLeadOutS; + BYTE bLeadOutM; + BYTE bLeadOutReserved; + } __attribute__((packed)) sDataDisk; + + struct { + UCHAR auchSign[4]; + BYTE bTrack; + } __attribute__((packed)) sParamTrack = {{'C', 'D', '0', '1'},}; + + struct { + BYTE bStartF; + BYTE bStartS; + BYTE bStartM; + BYTE bStartReserved; + BYTE bControlInfo; + } __attribute__((packed)) sDataTrack; + + HFILE hcd; + ULONG ulAction; + ULONG ulParamLen; + ULONG ulDataLen; + ULONG rc; + + rc = DosOpen(dev, &hcd, &ulAction, 0, FILE_NORMAL, + OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW, + OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD, + NULL); + if (rc) { + mp_tmsg(MSGT_OPEN, MSGL_ERR, "Failed to read TOC.\n"); + return -1; + } + + rc = DosDevIOCtl(hcd, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK, + auchParamDisk, sizeof(auchParamDisk), &ulParamLen, + &sDataDisk, sizeof(sDataDisk), &ulDataLen); + if (!rc) { + first = sDataDisk.bFirstTrack - 1; + last = sDataDisk.bLastTrack; + for (i = first; i <= last; i++) { + if (i == last) { + sDataTrack.bStartM = sDataDisk.bLeadOutM; + sDataTrack.bStartS = sDataDisk.bLeadOutS; + sDataTrack.bStartF = sDataDisk.bLeadOutF; + } else { + sParamTrack.bTrack = i + 1; + rc = DosDevIOCtl(hcd, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK, + &sParamTrack, sizeof(sParamTrack), &ulParamLen, + &sDataTrack, sizeof(sDataTrack), &ulDataLen); + if (rc) + break; + } + + cdtoc[i].min = sDataTrack.bStartM; + cdtoc[i].sec = sDataTrack.bStartS; + cdtoc[i].frame = sDataTrack.bStartF; + } + } + + DosClose(hcd); + + if (rc) { + mp_tmsg(MSGT_OPEN, MSGL_ERR, "Failed to read TOC.\n"); + return -1; + } #else int drive; drive = open(dev, O_RDONLY | O_NONBLOCK); |