[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Libcdio-devel] CD_MSF_FORMAT vs LBA on NetBSD

From: Thomas Schmitt
Subject: Re: [Libcdio-devel] CD_MSF_FORMAT vs LBA on NetBSD
Date: Mon, 29 Oct 2018 19:55:01 +0100


independent of the reason why Edd Barrett's branch of libcdio does
not work for libcdio-cdparanoia on Greg Troxel's NetBSD, i give my opinion
about how to complete
  "The TOC needs to be read in LBA format on OpenBSD. "

Function _cdio_read_toc() uses ioctl(CDIOREADTOCENTRIES) to obtain
a table-of-content with entries for each track and for the lead-out
pseudo track.

i see that this is where Greg Troxel started to make experiments.

> > >   -        req.address_format = CD_MSF_FORMAT;
> > >   +        req.address_format = CD_LBA_FORMAT;
> > > So it seems that moving NetBSD to CD_LBA_FORMAT at best needs more work,

I understand it is about union and struct in

  union msf_lba {
        struct {
                u_char unused;
                u_char minute;
                u_char second;
                u_char frame;
        } msf;
        uint32_t lba;
        u_char  addr[4];

  struct cd_toc_entry {
        u_char          nothing1;
        uint32_t        control:4;
        uint32_t        addr_type:4;
        uint32_t        addr_type:4;
        uint32_t        control:4;
        u_char          track;
        u_char          nothing2;
        union msf_lba   addr;

of which an array is delivered by ioctl(CDIOREADTOCENTRIES) into libcdio's

  typedef struct {
        struct cd_toc_entry tocent[100];
  } _img_private_t;

The input parameter req.address_format chooses for the reply between
Minute:Second:Frame address format and LBA (i.e. sector number) format
in tocent[].addr.

So if in _cdio_read_toc() the requested address format is changed from MSF
to LBA, then the consumers of the result would either have to change their
expectations about the address format, or the call will have to convert
the LBA result to MFS.
The latter is of course preferable.

(Consumer would be e.g. cdio_get_track_msf().)

>From get_track_msf_netbsd() i derive this (totally untested) conversion
proposal for the end of _cdio_read_toc() in netbsd.c:

       if (req.address_format != CD_MSF_FORMAT) {
               int track_num;
               msf_t msf;

               for (track_num = 1; track_num <= TOTAL_TRACKS + 1;
                    track_num++) {
                               (lba_t) _obj->tocent[track_num - 1].addr.lba,
                       _obj->tocent[track_num - 1].addr.msf.minute = msf.m;
                       _obj->tocent[track_num - 1].addr.msf.second = msf.s;
                       _obj->tocent[track_num - 1].addr.msf.frame = msf.f;

(... and wonder what happens if the first track number of a CD is not 1,
  which is perfectly legal ... well, if it fails, then get_track_msf_netbsd()
  will fail too ...)

Have a nice day :)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]