changeset 30746:7092b8fc23f4

Add cddb:// support for OS/2
author komh
date Sun, 28 Feb 2010 03:26:18 +0000
parents c5a49657b3e4
children 7ac542b9ca24
files osdep/osdep.h stream/stream_cddb.c
diffstat 2 files changed, 107 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/osdep/osdep.h	Sun Feb 28 03:26:18 2010 +0000
@@ -0,0 +1,33 @@
+/*
+ * Header in order to include OS-specific headers, macros, types and so on
+ *
+ * Copyright (c) 2010 by KO Myung-Hun (komh@chollian.net)
+ *
+ * This file is part of MPlayer.
+ *
+ * MPlayer is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MPlayer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef MPLAYER_OSDEP_H
+#define MPLAYER_OSDEP_H
+
+#ifdef __OS2__
+#define INCL_DOS
+#define INCL_DOSDEVIOCTL
+#include <os2.h>
+#endif
+
+#endif /* MPLAYER_OSDEP_H */
+
--- a/stream/stream_cddb.c	Sun Feb 28 02:18:16 2010 +0000
+++ b/stream/stream_cddb.c	Sun Feb 28 03:26:18 2010 +0000
@@ -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 @@
     }
     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_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
+        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_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
+        return -1;
+    }
 #else
     int drive;
     drive = open(dev, O_RDONLY | O_NONBLOCK);