aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorJoerg Wunsch <joerg@FreeBSD.org>1997-05-04 15:24:23 +0000
committerJoerg Wunsch <joerg@FreeBSD.org>1997-05-04 15:24:23 +0000
commit5a9714de76b8f4f0afc78f33075fbc684cb7f46c (patch)
tree07a9273f1c3d1bc689566b35a179db5209b387ac /sys/dev
parent8189ded32e208c035fadd69697b35754fb2e36db (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/mcd/mcd.c54
-rw-r--r--sys/dev/scd/scd.c44
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)