whitespace cosmetics: Remove all trailing whitespace.
[mplayer.git] / stream / vcd_read_darwin.h
index d722b8d..d144b5b 100644 (file)
@@ -1,9 +1,20 @@
+#ifndef MPLAYER_VCD_READ_DARWIN_H
+#define MPLAYER_VCD_READ_DARWIN_H
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
 #include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
 #include <CoreFoundation/CFBase.h>
 #include <IOKit/IOKitLib.h>
 #include <IOKit/storage/IOCDTypes.h>
 #include <IOKit/storage/IOCDMedia.h>
 #include <IOKit/storage/IOCDMediaBSDClient.h>
+#include "mpbswap.h"
+#include "mp_msg.h"
+#include "stream.h"
 
 //=================== VideoCD ==========================
 #define        CDROM_LEADOUT   0xAA
@@ -20,25 +31,20 @@ typedef struct
 typedef struct mp_vcd_priv_st
 {
        int fd;
+       cdsector_t buf;
        dk_cd_read_track_info_t entry;
+       struct CDDiscInfo hdr;
        CDMSF msf;
-       cdsector_t buf;
 } mp_vcd_priv_t;
 
 static inline void vcd_set_msf(mp_vcd_priv_t* vcd, unsigned int sect)
 {
-  vcd->msf.frame=sect%75;
-  sect=sect/75;
-  vcd->msf.second=sect%60;
-  sect=sect/60;
-  vcd->msf.minute=sect;
+  vcd->msf = CDConvertLBAToMSF(sect);
 }
 
 static inline unsigned int vcd_get_msf(mp_vcd_priv_t* vcd)
 {
-  return vcd->msf.frame +
-        (vcd->msf.second+
-         vcd->msf.minute*60)*75;
+  return CDConvertMSFToLBA(vcd->msf);
 }
 
 int vcd_seek_to_track(mp_vcd_priv_t* vcd, int track)
@@ -50,45 +56,44 @@ int vcd_seek_to_track(mp_vcd_priv_t* vcd, int track)
        vcd->entry.address = track;
        vcd->entry.bufferLength = sizeof(entry);
        vcd->entry.buffer = &entry;
-  
+
        if (ioctl(vcd->fd, DKIOCCDREADTRACKINFO, &vcd->entry))
        {
                mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif1: %s\n",strerror(errno));
                return -1;
        }
+       vcd->msf = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress));
        return VCD_SECTOR_DATA*vcd_get_msf(vcd);
 }
 
 int vcd_get_track_end(mp_vcd_priv_t* vcd, int track)
 {
-       dk_cd_read_disc_info_t tochdr;
-       struct CDDiscInfo hdr;
-       
        struct CDTrackInfo entry;
-       
-       //read toc header
-    memset(&tochdr, 0, sizeof(tochdr));
-    tochdr.buffer = &hdr;
-    tochdr.bufferLength = sizeof(hdr);
-  
-    if (ioctl(vcd->fd, DKIOCCDREADDISCINFO, &tochdr) < 0)
-       {
-               mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno));
+
+       if (track > vcd->hdr.lastTrackNumberInLastSessionLSB) {
+               mp_msg(MSGT_OPEN, MSGL_ERR,
+                      "track number %d greater than last track number %d\n",
+                      track, vcd->hdr.lastTrackNumberInLastSessionLSB);
                return -1;
-    }
-       
+       }
+
        //read track info
        memset( &vcd->entry, 0, sizeof(vcd->entry));
        vcd->entry.addressType = kCDTrackInfoAddressTypeTrackNumber;
-       vcd->entry.address = track<(hdr.lastTrackNumberInLastSessionLSB+1)?(track):CDROM_LEADOUT;
+       vcd->entry.address = track<vcd->hdr.lastTrackNumberInLastSessionLSB?track+1:vcd->hdr.lastTrackNumberInLastSessionLSB;
        vcd->entry.bufferLength = sizeof(entry);
        vcd->entry.buffer = &entry;
-  
+
        if (ioctl(vcd->fd, DKIOCCDREADTRACKINFO, &vcd->entry))
        {
                mp_msg(MSGT_STREAM,MSGL_ERR,"ioctl dif2: %s\n",strerror(errno));
                return -1;
        }
+       if (track == vcd->hdr.lastTrackNumberInLastSessionLSB)
+               vcd->msf = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress) +
+                                            be2me_32(entry.trackSize));
+       else
+       vcd->msf = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress));
        return VCD_SECTOR_DATA*vcd_get_msf(vcd);
 }
 
@@ -96,33 +101,34 @@ mp_vcd_priv_t* vcd_read_toc(int fd)
 {
        dk_cd_read_disc_info_t tochdr;
        struct CDDiscInfo hdr;
-       
+
        dk_cd_read_track_info_t tocentry;
        struct CDTrackInfo entry;
        CDMSF trackMSF;
-       
+
        mp_vcd_priv_t* vcd;
        int i, min = 0, sec = 0, frame = 0;
-  
+
        //read toc header
     memset(&tochdr, 0, sizeof(tochdr));
     tochdr.buffer = &hdr;
     tochdr.bufferLength = sizeof(hdr);
-  
+
     if (ioctl(fd, DKIOCCDREADDISCINFO, &tochdr) < 0)
        {
                mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc header: %s\n",strerror(errno));
                return NULL;
     }
-       
+
        //print all track info
        mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_START_TRACK=%d\n", hdr.firstTrackNumberInLastSessionLSB);
        mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VCD_END_TRACK=%d\n", hdr.lastTrackNumberInLastSessionLSB);
        for (i=hdr.firstTrackNumberInLastSessionLSB ; i<=hdr.lastTrackNumberInLastSessionLSB + 1; i++)
        {
+               if (i <= hdr.lastTrackNumberInLastSessionLSB) {
                memset( &tocentry, 0, sizeof(tocentry));
                tocentry.addressType = kCDTrackInfoAddressTypeTrackNumber;
-               tocentry.address = i<=hdr.lastTrackNumberInLastSessionLSB ? i : CDROM_LEADOUT;
+               tocentry.address = i;
                tocentry.bufferLength = sizeof(entry);
                tocentry.buffer = &entry;
 
@@ -131,9 +137,13 @@ mp_vcd_priv_t* vcd_read_toc(int fd)
                        mp_msg(MSGT_OPEN,MSGL_ERR,"read CDROM toc entry: %s\n",strerror(errno));
                        return NULL;
                }
-               
-               trackMSF = CDConvertLBAToMSF(entry.trackStartAddress);
-        
+
+               trackMSF = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress));
+               }
+               else
+                       trackMSF = CDConvertLBAToMSF(be2me_32(entry.trackStartAddress)
+                                                    + be2me_32(entry.trackSize));
+
                //mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d:  adr=%d  ctrl=%d  format=%d  %02d:%02d:%02d\n",
                if (i<=hdr.lastTrackNumberInLastSessionLSB)
                mp_msg(MSGT_OPEN,MSGL_INFO,"track %02d: format=%d  %02d:%02d:%02d\n",
@@ -170,9 +180,10 @@ mp_vcd_priv_t* vcd_read_toc(int fd)
                  frame = trackMSF.frame;
                }
        }
+
        vcd = malloc(sizeof(mp_vcd_priv_t));
        vcd->fd = fd;
+       vcd->hdr = hdr;
        vcd->msf = trackMSF;
        return vcd;
 }
@@ -187,15 +198,16 @@ static int vcd_read(mp_vcd_priv_t* vcd,char *mem)
        {
                vcd->msf.frame=0;
                vcd->msf.second++;
-        
+
                if (vcd->msf.second==60)
                {
                        vcd->msf.second=0;
                        vcd->msf.minute++;
         }
       }
-         
+
       memcpy(mem,vcd->buf.data,VCD_SECTOR_DATA);
       return VCD_SECTOR_DATA;
 }
 
+#endif /* MPLAYER_VCD_READ_DARWIN_H */