diff options
| author | Joerg Wunsch <joerg@FreeBSD.org> | 1997-05-04 15:24:23 +0000 |
|---|---|---|
| committer | Joerg Wunsch <joerg@FreeBSD.org> | 1997-05-04 15:24:23 +0000 |
| commit | 5a9714de76b8f4f0afc78f33075fbc684cb7f46c (patch) | |
| tree | 07a9273f1c3d1bc689566b35a179db5209b387ac /sys/dev | |
| parent | 8189ded32e208c035fadd69697b35754fb2e36db (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/mcd/mcd.c | 54 | ||||
| -rw-r--r-- | sys/dev/scd/scd.c | 44 |
2 files changed, 96 insertions, 2 deletions
diff --git a/sys/dev/mcd/mcd.c b/sys/dev/mcd/mcd.c index 6a7adb3979337..f7eecb8c5584e 100644 --- a/sys/dev/mcd/mcd.c +++ b/sys/dev/mcd/mcd.c @@ -40,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.87 1997/03/24 11:23:55 bde Exp $ + * $Id: mcd.c,v 1.88 1997/04/20 17:26:54 bde Exp $ */ static const char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore"; @@ -195,6 +195,7 @@ static int mcd_subchan(int unit, struct ioc_read_subchannel *sc); static int mcd_toc_header(int unit, struct ioc_toc_header *th); static int mcd_read_toc(int unit); static int mcd_toc_entrys(int unit, struct ioc_read_toc_entry *te); +static int mcd_toc_entry(int unit, struct ioc_read_toc_single_entry *te); static int mcd_stop(int unit); static int mcd_eject(int unit); static int mcd_inject(int unit); @@ -1427,6 +1428,57 @@ mcd_read_toc(int unit) } static int +mcd_toc_entry(int unit, struct ioc_read_toc_single_entry *te) +{ + struct mcd_data *cd = mcd_data + unit; + struct ioc_toc_header th; + int rc, trk; + + if (te->address_format != CD_MSF_FORMAT + && te->address_format != CD_LBA_FORMAT) + return EINVAL; + + /* Copy the toc header */ + if ((rc = mcd_toc_header(unit, &th)) != 0) + return rc; + + /* verify starting track */ + trk = te->track; + if (trk == 0) + trk = th.starting_track; + else if (trk == MCD_LASTPLUS1) + trk = th.ending_track + 1; + else if (trk < th.starting_track || trk > th.ending_track + 1) + return EINVAL; + + /* Make sure we have a valid toc */ + if ((rc=mcd_read_toc(unit)) != 0) + return rc; + + /* Copy the TOC data. */ + if (cd->toc[trk].idx_no == 0) + return EIO; + + te->entry.control = cd->toc[trk].control; + te->entry.addr_type = cd->toc[trk].addr_type; + te->entry.track = + cd->toc[trk].idx_no > 0x99 ? cd->toc[trk].idx_no : + bcd2bin(cd->toc[trk].idx_no); + switch (te->address_format) { + case CD_MSF_FORMAT: + te->entry.addr.msf.unused = 0; + te->entry.addr.msf.minute = bcd2bin(cd->toc[trk].hd_pos_msf[0]); + te->entry.addr.msf.second = bcd2bin(cd->toc[trk].hd_pos_msf[1]); + te->entry.addr.msf.frame = bcd2bin(cd->toc[trk].hd_pos_msf[2]); + break; + case CD_LBA_FORMAT: + te->entry.addr.lba = htonl(msf2hsg(cd->toc[trk].hd_pos_msf, 0)); + break; + } + return 0; +} + +static int mcd_toc_entrys(int unit, struct ioc_read_toc_entry *te) { struct mcd_data *cd = mcd_data + unit; diff --git a/sys/dev/scd/scd.c b/sys/dev/scd/scd.c index 33d77f8c3240e..acd1968bd17b3 100644 --- a/sys/dev/scd/scd.c +++ b/sys/dev/scd/scd.c @@ -41,7 +41,7 @@ */ -/* $Id: scd.c,v 1.28 1997/03/24 11:24:01 bde Exp $ */ +/* $Id: scd.c,v 1.29 1997/04/20 17:26:55 bde Exp $ */ /* Please send any comments to micke@dynas.se */ @@ -180,6 +180,7 @@ static int read_subcode(int unit, struct sony_subchannel_position_data *sc); /* for xcdplayer */ static int scd_toc_header(int unit, struct ioc_toc_header *th); static int scd_toc_entrys(int unit, struct ioc_read_toc_entry *te); +static int scd_toc_entry(int unit, struct ioc_read_toc_single_entry *te); #define SCD_LASTPLUS1 170 /* don't ask, xcdplayer passes this in */ static int scd_probe(struct isa_device *dev); @@ -456,6 +457,8 @@ scdioctl(dev_t dev, int cmd, caddr_t addr, int flags, struct proc *p) return scd_toc_header (unit, (struct ioc_toc_header *) addr); case CDIOREADTOCENTRYS: return scd_toc_entrys (unit, (struct ioc_read_toc_entry*) addr); + case CDIOREADTOCENTRY: + return scd_toc_entry (unit, (struct ioc_read_toc_single_entry*) addr); case CDIOCSETPATCH: case CDIOCGETVOL: case CDIOCSETVOL: @@ -1517,6 +1520,45 @@ scd_toc_entrys (int unit, struct ioc_read_toc_entry *te) } +static int +scd_toc_entry (int unit, struct ioc_read_toc_single_entry *te) +{ + struct scd_data *cd = scd_data + unit; + struct cd_toc_entry toc_entry; + int rc, i; + + if (!(cd->flags & SCDTOC) && (rc = read_toc(unit)) != 0) { + print_error(unit, rc); + return EIO; + } + + /* find the toc to copy*/ + i = te->track; + if (i == SCD_LASTPLUS1) + i = cd->last_track + 1; + + /* verify starting track */ + if (i < cd->first_track || i > cd->last_track+1) + return EINVAL; + + /* copy the toc data */ + toc_entry.control = cd->toc[i].ctl; + toc_entry.addr_type = te->address_format; + toc_entry.track = i; + if (te->address_format == CD_MSF_FORMAT) { + toc_entry.addr.msf.unused = 0; + toc_entry.addr.msf.minute = bcd2bin(cd->toc[i].start_msf[0]); + toc_entry.addr.msf.second = bcd2bin(cd->toc[i].start_msf[1]); + toc_entry.addr.msf.frame = bcd2bin(cd->toc[i].start_msf[2]); + } + + /* copy the data back */ + bcopy(&toc_entry, &te->entry, sizeof(struct cd_toc_entry)); + + return 0; +} + + static scd_devsw_installed = 0; static void scd_drvinit(void *unused) |
