Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 82099
b: refs/heads/master
c: ba3fab2
h: refs/heads/master
i:
  82097: 2370b0c
  82095: 63fee5f
v: v3
  • Loading branch information
Bartlomiej Zolnierkiewicz committed Feb 1, 2008
1 parent cdae20e commit a1bb387
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 68 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 972560fb9d9ea7bc7082c0c79c99c24e3f56606c
refs/heads/master: ba3fab24d210544cba74b3fd640123baf33ed331
142 changes: 75 additions & 67 deletions trunk/drivers/ide/ide-cd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1998,6 +1998,24 @@ static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
return 0;
}

static int ide_cd_read_tochdr(ide_drive_t *drive, void *arg)
{
struct cdrom_info *cd = drive->driver_data;
struct cdrom_tochdr *tochdr = arg;
struct atapi_toc *toc;
int stat;

/* Make sure our saved TOC is valid. */
stat = cdrom_read_toc(drive, NULL);
if (stat)
return stat;

toc = cd->toc;
tochdr->cdth_trk0 = toc->hdr.first_track;
tochdr->cdth_trk1 = toc->hdr.last_track;

return 0;
}

static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf,
int buflen, struct request_sense *sense)
Expand Down Expand Up @@ -2092,6 +2110,55 @@ static int cdrom_get_toc_entry(ide_drive_t *drive, int track,
return 0;
}

static int ide_cd_read_tocentry(ide_drive_t *drive, void *arg)
{
struct cdrom_tocentry *tocentry = arg;
struct atapi_toc_entry *toce;
int stat;

stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
if (stat)
return stat;

tocentry->cdte_ctrl = toce->control;
tocentry->cdte_adr = toce->adr;
if (tocentry->cdte_format == CDROM_MSF) {
lba_to_msf(toce->addr.lba,
&tocentry->cdte_addr.msf.minute,
&tocentry->cdte_addr.msf.second,
&tocentry->cdte_addr.msf.frame);
} else
tocentry->cdte_addr.lba = toce->addr.lba;

return 0;
}

static int ide_cd_fake_play_trkind(ide_drive_t *drive, void *arg)
{
struct cdrom_ti *ti = arg;
struct atapi_toc_entry *first_toc, *last_toc;
unsigned long lba_start, lba_end;
int stat;

stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
if (stat)
return stat;

stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
if (stat)
return stat;

if (ti->cdti_trk1 != CDROM_LEADOUT)
++last_toc;
lba_start = first_toc->addr.lba;
lba_end = last_toc->addr.lba;

if (lba_end <= lba_start)
return -EINVAL;

return cdrom_play_audio(drive, lba_start, lba_end);
}

/* the generic packet interface to cdrom.c */
static int ide_cdrom_packet(struct cdrom_device_info *cdi,
struct packet_command *cgc)
Expand Down Expand Up @@ -2123,81 +2190,22 @@ static int ide_cdrom_packet(struct cdrom_device_info *cdi,
return cgc->stat;
}

static
int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
unsigned int cmd, void *arg)

static int ide_cdrom_audio_ioctl(struct cdrom_device_info *cdi,
unsigned int cmd, void *arg)
{
ide_drive_t *drive = cdi->handle;
struct cdrom_info *info = drive->driver_data;
int stat;

switch (cmd) {
/*
* emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
* atapi doesn't support it
*/
case CDROMPLAYTRKIND: {
unsigned long lba_start, lba_end;
struct cdrom_ti *ti = arg;
struct atapi_toc_entry *first_toc, *last_toc;

stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
if (stat)
return stat;

stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
if (stat)
return stat;

if (ti->cdti_trk1 != CDROM_LEADOUT)
++last_toc;
lba_start = first_toc->addr.lba;
lba_end = last_toc->addr.lba;

if (lba_end <= lba_start)
return -EINVAL;

return cdrom_play_audio(drive, lba_start, lba_end);
}

case CDROMREADTOCHDR: {
struct cdrom_tochdr *tochdr = arg;
struct atapi_toc *toc;

/* Make sure our saved TOC is valid. */
stat = cdrom_read_toc(drive, NULL);
if (stat)
return stat;

toc = info->toc;
tochdr->cdth_trk0 = toc->hdr.first_track;
tochdr->cdth_trk1 = toc->hdr.last_track;

return 0;
}

case CDROMREADTOCENTRY: {
struct cdrom_tocentry *tocentry = arg;
struct atapi_toc_entry *toce;

stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
if (stat)
return stat;

tocentry->cdte_ctrl = toce->control;
tocentry->cdte_adr = toce->adr;
if (tocentry->cdte_format == CDROM_MSF) {
lba_to_msf (toce->addr.lba,
&tocentry->cdte_addr.msf.minute,
&tocentry->cdte_addr.msf.second,
&tocentry->cdte_addr.msf.frame);
} else
tocentry->cdte_addr.lba = toce->addr.lba;

return 0;
}

case CDROMPLAYTRKIND:
return ide_cd_fake_play_trkind(drive, arg);
case CDROMREADTOCHDR:
return ide_cd_read_tochdr(drive, arg);
case CDROMREADTOCENTRY:
return ide_cd_read_tocentry(drive, arg);
default:
return -EINVAL;
}
Expand Down

0 comments on commit a1bb387

Please sign in to comment.