From 9c971e7df265d35ed0724d8ec64ecd2f1ec3a1ff Mon Sep 17 00:00:00 2001 From: "Andrey A. Chernov" Date: Sat, 12 Nov 1994 14:19:11 +0000 Subject: [PATCH] Changes from bugress@s069.infonet.net NOT installed (expect one cosmetique) because we already have right things there or his changes are incorrect. Fix mcd_subchan to return position, inspired by idea from bugress@s069.infonet.net, but different implementation. --- sys/dev/mcd/mcd.c | 29 +++++++++++++++++++---------- sys/i386/isa/mcd.c | 29 +++++++++++++++++++---------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/sys/dev/mcd/mcd.c b/sys/dev/mcd/mcd.c index 21638ead7b0..48f5339fc94 100644 --- a/sys/dev/mcd/mcd.c +++ b/sys/dev/mcd/mcd.c @@ -2,6 +2,7 @@ * Copyright 1993 by Holger Veit (data part) * Copyright 1993 by Brian Moore (audio part) * Changes Copyright 1993 by Gary Clark II + * Changes Copyright (C) 1994 by Andrew A. Chernov * * Rewrote probe routine to work on newer Mitsumi drives. * Additional changes (C) 1994 by Jordan K. Hubbard @@ -39,7 +40,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: mcd.c,v 1.27 1994/10/27 20:44:50 jkh Exp $ + * $Id: mcd.c,v 1.28 1994/11/12 13:26:11 ache Exp $ */ static char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore"; @@ -1298,9 +1299,11 @@ mcd_getqchan(int unit, struct mcd_qchninfo *q) if (mcd_get(unit, (char *) q, sizeof(struct mcd_qchninfo)) < 0) return -1; if (cd->debug) { - printf("mcd%d: qchannel ctl=%d trk=%d ind=%d pos=%d:%d.%d\n", + printf("mcd%d: getqchan ctl=%d trk=%d ind=%d ttm=%d:%d.%d dtm=%d:%d.%d\n", unit, q->ctrl_adr, bcd2bin(q->trk_no), bcd2bin(q->idx_no), + bcd2bin(q->trk_size_msf[0]), bcd2bin(q->trk_size_msf[1]), + bcd2bin(q->trk_size_msf[2]), bcd2bin(q->hd_pos_msf[0]), bcd2bin(q->hd_pos_msf[1]), bcd2bin(q->hd_pos_msf[2])); } @@ -1334,8 +1337,16 @@ mcd_subchan(int unit, struct ioc_read_subchannel *sc) data.header.audio_status = cd->audio_status; data.what.position.data_format = CD_MSF_FORMAT; data.what.position.track_number = bcd2bin(q.trk_no); + data.what.position.reladdr.msf.unused = 0; + data.what.position.reladdr.msf.minute = bcd2bin(q.trk_size_msf[0]); + data.what.position.reladdr.msf.second = bcd2bin(q.trk_size_msf[1]); + data.what.position.reladdr.msf.frame = bcd2bin(q.trk_size_msf[2]); + data.what.position.absaddr.msf.unused = 0; + data.what.position.absaddr.msf.minute = bcd2bin(q.hd_pos_msf[0]); + data.what.position.absaddr.msf.second = bcd2bin(q.hd_pos_msf[1]); + data.what.position.absaddr.msf.frame = bcd2bin(q.hd_pos_msf[2]); - if (copyout(&data, sc->data, sizeof(struct cd_sub_channel_info))!=0) + if (copyout(&data, sc->data, min(sizeof(struct cd_sub_channel_info), sc->data_len))!=0) return EFAULT; return 0; } @@ -1365,7 +1376,7 @@ mcd_playtracks(int unit, struct ioc_play_track *pt) struct mcd_read2 pb; int a = pt->start_track; int z = pt->end_track; - int rc; + int rc, i; if ((rc = mcd_read_toc(unit)) != 0) return rc; @@ -1381,12 +1392,10 @@ mcd_playtracks(int unit, struct ioc_play_track *pt) || z > bcd2bin(cd->volinfo.trk_high)) return EINVAL; - pb.start_msf[0] = cd->toc[a].hd_pos_msf[0]; - pb.start_msf[1] = cd->toc[a].hd_pos_msf[1]; - pb.start_msf[2] = cd->toc[a].hd_pos_msf[2]; - pb.end_msf[0] = cd->toc[z+1].hd_pos_msf[0]; - pb.end_msf[1] = cd->toc[z+1].hd_pos_msf[1]; - pb.end_msf[2] = cd->toc[z+1].hd_pos_msf[2]; + for (i = 0; i < 3; i++) { + pb.start_msf[i] = cd->toc[a].hd_pos_msf[i]; + pb.end_msf[i] = cd->toc[z+1].hd_pos_msf[i]; + } return mcd_play(unit, &pb); } diff --git a/sys/i386/isa/mcd.c b/sys/i386/isa/mcd.c index 21638ead7b0..48f5339fc94 100644 --- a/sys/i386/isa/mcd.c +++ b/sys/i386/isa/mcd.c @@ -2,6 +2,7 @@ * Copyright 1993 by Holger Veit (data part) * Copyright 1993 by Brian Moore (audio part) * Changes Copyright 1993 by Gary Clark II + * Changes Copyright (C) 1994 by Andrew A. Chernov * * Rewrote probe routine to work on newer Mitsumi drives. * Additional changes (C) 1994 by Jordan K. Hubbard @@ -39,7 +40,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: mcd.c,v 1.27 1994/10/27 20:44:50 jkh Exp $ + * $Id: mcd.c,v 1.28 1994/11/12 13:26:11 ache Exp $ */ static char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore"; @@ -1298,9 +1299,11 @@ mcd_getqchan(int unit, struct mcd_qchninfo *q) if (mcd_get(unit, (char *) q, sizeof(struct mcd_qchninfo)) < 0) return -1; if (cd->debug) { - printf("mcd%d: qchannel ctl=%d trk=%d ind=%d pos=%d:%d.%d\n", + printf("mcd%d: getqchan ctl=%d trk=%d ind=%d ttm=%d:%d.%d dtm=%d:%d.%d\n", unit, q->ctrl_adr, bcd2bin(q->trk_no), bcd2bin(q->idx_no), + bcd2bin(q->trk_size_msf[0]), bcd2bin(q->trk_size_msf[1]), + bcd2bin(q->trk_size_msf[2]), bcd2bin(q->hd_pos_msf[0]), bcd2bin(q->hd_pos_msf[1]), bcd2bin(q->hd_pos_msf[2])); } @@ -1334,8 +1337,16 @@ mcd_subchan(int unit, struct ioc_read_subchannel *sc) data.header.audio_status = cd->audio_status; data.what.position.data_format = CD_MSF_FORMAT; data.what.position.track_number = bcd2bin(q.trk_no); + data.what.position.reladdr.msf.unused = 0; + data.what.position.reladdr.msf.minute = bcd2bin(q.trk_size_msf[0]); + data.what.position.reladdr.msf.second = bcd2bin(q.trk_size_msf[1]); + data.what.position.reladdr.msf.frame = bcd2bin(q.trk_size_msf[2]); + data.what.position.absaddr.msf.unused = 0; + data.what.position.absaddr.msf.minute = bcd2bin(q.hd_pos_msf[0]); + data.what.position.absaddr.msf.second = bcd2bin(q.hd_pos_msf[1]); + data.what.position.absaddr.msf.frame = bcd2bin(q.hd_pos_msf[2]); - if (copyout(&data, sc->data, sizeof(struct cd_sub_channel_info))!=0) + if (copyout(&data, sc->data, min(sizeof(struct cd_sub_channel_info), sc->data_len))!=0) return EFAULT; return 0; } @@ -1365,7 +1376,7 @@ mcd_playtracks(int unit, struct ioc_play_track *pt) struct mcd_read2 pb; int a = pt->start_track; int z = pt->end_track; - int rc; + int rc, i; if ((rc = mcd_read_toc(unit)) != 0) return rc; @@ -1381,12 +1392,10 @@ mcd_playtracks(int unit, struct ioc_play_track *pt) || z > bcd2bin(cd->volinfo.trk_high)) return EINVAL; - pb.start_msf[0] = cd->toc[a].hd_pos_msf[0]; - pb.start_msf[1] = cd->toc[a].hd_pos_msf[1]; - pb.start_msf[2] = cd->toc[a].hd_pos_msf[2]; - pb.end_msf[0] = cd->toc[z+1].hd_pos_msf[0]; - pb.end_msf[1] = cd->toc[z+1].hd_pos_msf[1]; - pb.end_msf[2] = cd->toc[z+1].hd_pos_msf[2]; + for (i = 0; i < 3; i++) { + pb.start_msf[i] = cd->toc[a].hd_pos_msf[i]; + pb.end_msf[i] = cd->toc[z+1].hd_pos_msf[i]; + } return mcd_play(unit, &pb); }