"""Read TOC from the CD in /dev/cdrom.

Copyright © 1998 Carey Evans.

This code is intended for testing and demonstration purposes only.
You can do what you like with it, but don't blame me if doesn't work.
"""

import sys
import os
from fcntl import ioctl
import struct
from CDROM import *

# ---

fd = os.open('/dev/cdrom', os.O_RDONLY)

# ---

tochdr_fmt = 'BB'

tochdr = struct.pack(tochdr_fmt, 0, 0)
tochdr = ioctl(fd, CDROMREADTOCHDR, tochdr)
start, end = struct.unpack(tochdr_fmt, tochdr)

print "First track:", start, "Last track:", end

# ---

tocentry_fmt = 'BBBix'
addr_fmt = 'BBB' + 'x' * (struct.calcsize('i') - 3)

for trnum in range(start, end + 1) + [CDROM_LEADOUT]:
    tocentry = struct.pack(tocentry_fmt, trnum, 0, CDROM_MSF, 0)
    tocentry = ioctl(fd, CDROMREADTOCENTRY, tocentry)

    track, adrctrl, format, addr = struct.unpack(tocentry_fmt, tocentry)
    m, s, f = struct.unpack(addr_fmt, struct.pack('i', addr))

    # This code is probably dependent on byte ordering.
    adr = adrctrl & 0xf
    ctrl = (adrctrl & 0xf0) >> 4

    data = ''
    if ctrl & CDROM_DATA_TRACK:
        data = ' (DATA)'

    print "%3d: %2d:%02d.%02d =%7d%s" \
          % (track, m, s, f, (m * 60 + s) * 75 + f, data)

print "Disc length:", m * 60 + s

# ---

os.close(fd)
