Search
lxdream.org :: lxdream/src/drivers/cdrom/cdrom.c :: diff
lxdream 0.9.1
released Jun 29
Download Now
filename src/drivers/cdrom/cdrom.c
changeset 1108:305ef2082079
prev1099:566cdeb157ec
next1109:700c5ab26a63
author nkeynes
date Fri Jun 04 09:13:40 2010 +1000 (13 years ago)
permissions -rw-r--r--
last change Add ability to wrap a binary program up in a virtual cd image (so that we
can boot it normally)
file annotate diff log raw
1.1 --- a/src/drivers/cdrom/cdrom.c Wed Feb 10 18:16:19 2010 +1000
1.2 +++ b/src/drivers/cdrom/cdrom.c Fri Jun 04 09:13:40 2010 +1000
1.3 @@ -24,6 +24,7 @@
1.4 #include "lxdream.h"
1.5 #include "drivers/cdrom/cdrom.h"
1.6 #include "drivers/cdrom/cdimpl.h"
1.7 +#include "drivers/cdrom/isofs.h"
1.8
1.9 extern struct cdrom_disc_factory linux_cdrom_drive_factory;
1.10 extern struct cdrom_disc_factory nrg_disc_factory;
1.11 @@ -193,20 +194,24 @@
1.12
1.13 gboolean cdrom_disc_read_toc( cdrom_disc_t disc, ERROR *err )
1.14 {
1.15 - /* First set the defaults for an empty disc */
1.16 - cdrom_disc_clear_toc(disc);
1.17 + if( disc->read_toc != NULL ) {
1.18 + /* First set the defaults for an empty disc */
1.19 + cdrom_disc_clear_toc(disc);
1.20
1.21 - if( disc->read_toc(disc, err ) ) {
1.22 - /* Success - update disc type and leadout if the TOC read didn't set them */
1.23 - if( disc->disc_type == CDROM_DISC_NONE )
1.24 - cdrom_disc_set_default_disc_type(disc);
1.25 - cdrom_disc_compute_leadout(disc);
1.26 + if( disc->read_toc(disc, err ) ) {
1.27 + /* Success - update disc type and leadout if the TOC read didn't set them */
1.28 + if( disc->disc_type == CDROM_DISC_NONE )
1.29 + cdrom_disc_set_default_disc_type(disc);
1.30 + cdrom_disc_compute_leadout(disc);
1.31 + return TRUE;
1.32 + } else {
1.33 + /* Reset to an empty disc in case the reader left things in an
1.34 + * inconsistent state */
1.35 + cdrom_disc_clear_toc(disc);
1.36 + return FALSE;
1.37 + }
1.38 + } else {
1.39 return TRUE;
1.40 - } else {
1.41 - /* Reset to an empty disc in case the reader left things in an
1.42 - * inconsistent state */
1.43 - cdrom_disc_clear_toc(disc);
1.44 - return FALSE;
1.45 }
1.46 }
1.47
1.48 @@ -273,6 +278,64 @@
1.49 }
1.50
1.51 /**
1.52 + * Construct a disc around a source track.
1.53 + * @param type Disc type, which must be compatible with the track mode
1.54 + * @param track The source of data for the main track
1.55 + * @param lba The position on disc of the main track. If non-zero,
1.56 + * a filler track is added before it, in 2 separate sessions.
1.57 + */
1.58 +cdrom_disc_t cdrom_disc_new_from_track( cdrom_disc_type_t type, sector_source_t track, cdrom_lba_t lba )
1.59 +{
1.60 + cdrom_disc_t disc = cdrom_disc_new( NULL, NULL );
1.61 + if( disc != NULL ) {
1.62 + disc->disc_type = type;
1.63 + int trackno = 0;
1.64 + if( lba != 0 ) {
1.65 + cdrom_count_t size = lba - 150;
1.66 + if( lba < 150 )
1.67 + size = lba;
1.68 + disc->track[0].trackno = 1;
1.69 + disc->track[0].sessionno = 1;
1.70 + disc->track[0].lba = 0;
1.71 + disc->track[0].flags = 0;
1.72 + disc->track[0].source = null_sector_source_new( SECTOR_CDDA, size );
1.73 + sector_source_ref( disc->track[0].source );
1.74 + trackno++;
1.75 + }
1.76 + disc->track[trackno].trackno = trackno+1;
1.77 + disc->track[trackno].sessionno = trackno+1;
1.78 + disc->track[trackno].lba = lba;
1.79 + disc->track[trackno].flags = (track->mode == SECTOR_CDDA ? 0 : TRACK_FLAG_DATA);
1.80 + disc->track[trackno].source = track;
1.81 + sector_source_ref(track);
1.82 +
1.83 + disc->track_count = trackno+1;
1.84 + disc->session_count = trackno+1;
1.85 + cdrom_disc_compute_leadout(disc);
1.86 + }
1.87 + return disc;
1.88 +}
1.89 +
1.90 +/**
1.91 + * Construct a disc around an IsoImage track (convenience function)
1.92 + */
1.93 +cdrom_disc_t cdrom_disc_new_from_iso_image( cdrom_disc_type_t type, IsoImage *iso, cdrom_lba_t lba,
1.94 + const char *bootstrap, ERROR *err )
1.95 +{
1.96 + sector_mode_t mode = (type == CDROM_DISC_NONXA ? SECTOR_MODE1 : SECTOR_MODE2_FORM1 );
1.97 + sector_source_t source = iso_sector_source_new( iso, mode, lba, bootstrap, err );
1.98 + if( source != NULL ) {
1.99 + cdrom_disc_t disc = cdrom_disc_new_from_track(type, source, lba);
1.100 + if( disc == NULL ) {
1.101 + sector_source_unref( source );
1.102 + } else {
1.103 + return disc;
1.104 + }
1.105 + }
1.106 + return NULL;
1.107 +}
1.108 +
1.109 +/**
1.110 * Get the track information for the given track. If there is no such track,
1.111 * return NULL;
1.112 */
.