CDNblock = 12, /* chosen for CD */
DVDNblock = 16, /* DVD ECC block is 16 sectors */
BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */
/*
* make a single transfer fit in a 9P rpc. if we don't do this,
* remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously.
*/
Readblock = 8192/BScdrom,
};
struct Track
{
/* initialized while obtaining the toc (gettoc) */
vlong size; /* total size in bytes */
long bs; /* block size in bytes */
ulong beg; /* beginning block number */
ulong end; /* ending block number */
int type;
Msf mbeg;
Msf mend;
/* initialized by fs */
char name[32];
int mode;
ulong mtime;
};
struct DTrack /* not used */
{
uchar name[32];
uchar beg[4]; /* msf value; only used for audio */
uchar end[4]; /* msf value; only used for audio */
uchar size[8];
uchar magic[4];
};
struct Otrack
{
Track *track;
Drive *drive;
int nchange;
int omode;
Buf *buf;
int nref; /* kept by file server */
};
struct Dev
{
Otrack* (*openrd)(Drive *d, int trackno);
Otrack* (*create)(Drive *d, int bs);
long (*read)(Otrack *t, void *v, long n, vlong off);
long (*write)(Otrack *t, void *v, long n);
void (*close)(Otrack *t);
int (*gettoc)(Drive*);
int (*fixate)(Drive *d);
char* (*ctl)(Drive *d, int argc, char **argv);
char* (*setspeed)(Drive *d, int r, int w);
};
struct Drive
{
QLock;
Scsi;
int type; /* scsi peripheral device type: Type?? */
/* disc characteristics */
int mmctype; /* cd, dvd, or bd */
char *dvdtype; /* name of dvd flavour */
int firsttrack;
int invistrack;
int ntrack;
int nchange; /* compare with the members in Scsi */
ulong changetime; /* " */
int nameok;
int writeok; /* writable disc? */
/*
* we could combine these attributes into a single variable except
* that we discover them separately sometimes.
*/
Tristate recordable; /* writable by burning? */
Tristate erasable; /* writable after erasing? */
int maxreadspeed;
int maxwritespeed;
int readspeed;
int writespeed;
Dev;
void *aux; /* kept by driver */
};
struct Buf
{
uchar *data; /* buffer */
vlong off; /* data[0] at offset off in file */
int bs; /* block size */
long ndata; /* no. valid bytes in data */
int nblock; /* total buffer size in blocks */
int omode; /* OREAD, OWRITE */
long (*fn)(Buf*, void*, long, ulong); /* read, write */