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.
This commit is contained in:
Andrey A. Chernov 1994-11-12 14:19:11 +00:00
parent 866c34f93a
commit 9c971e7df2
2 changed files with 38 additions and 20 deletions

View file

@ -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);
}

View file

@ -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);
}