ref: 8e4b6f767689d4afc1fc7e365f0c4a6a4a17391e
parent: bad6620faf5b25cd84cc6cd390ca633dc8fd2a97
author: Arne Meyer <meyer.arne83@netcologne.de>
date: Sat Oct 1 06:35:19 EDT 2022
cdfs: handle block sizes correctly The Readblock enum does not work when you try to read audio cds. 4 cdda blocks are lager than 8192 and the command fails (at least when using an usb cd drive). This sets the block count according to the track block size. With this and the fix for libdisk I can rip audio cds on my el cheapo usb dvd drive. Tested with "Midnight Oil - Blue Sky Mining"
--- a/sys/src/cmd/cdfs/dat.h
+++ b/sys/src/cmd/cdfs/dat.h
@@ -133,10 +133,11 @@
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.
+ * number of blocks read/written must fit in this. if we don't do this,
+ * remote access (e.g., via /mnt/term/dev/sd* or nusb/disk) fails mysteriously.
+ * see /sys/src/9/port/devmnt.c MAXRPC.
*/
- Readblock = 8192/BScdrom,
+ Maxrpc = 8192,
};
typedef struct Buf Buf;
--- a/sys/src/cmd/cdfs/mmc.c
+++ b/sys/src/cmd/cdfs/mmc.c
@@ -1171,7 +1171,7 @@
o->track = &drive->track[trackno];
o->nchange = drive->nchange;
o->omode = OREAD;
- o->buf = bopen(mmcread, OREAD, o->track->bs, Readblock);
+ o->buf = bopen(mmcread, OREAD, o->track->bs, Maxrpc/o->track->bs);
o->buf->otrack = o;
aux->nropen++;
@@ -1395,7 +1395,7 @@
o->nchange = drive->nchange;
o->omode = OWRITE;
o->track = t;
- o->buf = bopen(mmcwrite, OWRITE, bs, Readblock);
+ o->buf = bopen(mmcwrite, OWRITE, bs, Maxrpc/bs);
o->buf->otrack = o;
aux->nwopen++;
--
⑨