Hi,

My name is Charles Davis, but you all can call me "Chip".

I'm new to Wine development, and frankly, I'm kinda scared because I've
heard and read that getting patches into Wine is very difficult. In
fact, every time I got ready to send this first patch, I chickened out
and couldn't do it. So, I want someone to review this patch to see if
there's anything wrong with it.

Thanks in advance.

Chip

---
 dlls/ntdll/cdrom.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 45 insertions(+), 0 deletions(-)



diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c
index 574f737..a0ca1bf 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -5,6 +5,7 @@
  * Copyright 1999, 2001, 2003 Eric Pouech
  * Copyright 2000 Andreas Mohr
  * Copyright 2005 Ivan Leo Puoti
+ * Copyright 2008, 2009 Charles Davis
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1007,6 +1008,50 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA
 
  end:
     ret = CDROM_GetStatusCode(io);
+#elif defined(HAVE_IOKIT_IOKITLIB_H)
+    SUB_Q_HEADER* hdr = (SUB_Q_HEADER*)data;
+    int io = 0;
+    union
+    {
+        dk_cd_read_mcn_t mcn;
+        dk_cd_read_isrc_t isrc;
+    } ioc;
+    switch(fmt->Format)
+    {
+    case IOCTL_CDROM_CURRENT_POSITION:
+        memset(&data->CurrentPosition, 0, sizeof(data->CurrentPosition));
+        break;
+    case IOCTL_CDROM_MEDIA_CATALOG:
+        memset(&data->MediaCatalog, 0, sizeof(data->MediaCatalog));
+        break;
+    case IOCTL_CDROM_TRACK_ISRC:
+        memset(&data->TrackIsrc, 0, sizeof(data->TrackIsrc));
+    }
+    /* We need IOCDAudioControl for IOCTL_CDROM_CURRENT_POSITION */
+    if (fmt->Format == IOCTL_CDROM_CURRENT_POSITION)
+    {
+        ERR("This version of Mac OS X does not support IOCDAudioControl\n");
+        return STATUS_NOT_SUPPORTED;
+    }
+    /* No IOCDAudioControl support; just set the audio status to none */
+    hdr->AudioStatus = AUDIO_STATUS_NO_STATUS;
+    switch(fmt->Format)
+    {
+    case IOCTL_CDROM_MEDIA_CATALOG:
+        memset(&ioc, 0, sizeof(ioc));
+        if((io = ioctl(fd, DKIOCCDREADMCN, &ioc.mcn)) == -1) break;
+        memcpy(data->MediaCatalog.MediaCatalog, ioc.mcn.mcn, kCDMCNMaxLength);
+        data->MediaCatalog.Mcval = 1;
+        break;
+    case IOCTL_CDROM_TRACK_ISRC:
+        memset(&ioc, 0, sizeof(ioc));
+        ioc.isrc.track = fmt->Track;
+        if((io = ioctl(fd, DKIOCCDREADISRC, &ioc.isrc)) == -1) break;
+        memcpy(data->TrackIsrc.TrackIsrc, ioc.isrc.isrc, kCDISRCMaxLength);
+        data->TrackIsrc.Tcval = 1;
+        data->TrackIsrc.Track = ioc.isrc.track;
+    }
+    ret = CDROM_GetStatusCode(io);
 #endif
     return ret;
 }




Reply via email to