filename | src/drivers/cdrom/cdrom.c |
changeset | 1108:305ef2082079 |
prev | 1099:566cdeb157ec |
next | 1109: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 +10001.2 +++ b/src/drivers/cdrom/cdrom.c Fri Jun 04 09:13:40 2010 +10001.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.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.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.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 an1.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 an1.42 - * inconsistent state */1.43 - cdrom_disc_clear_toc(disc);1.44 - return FALSE;1.45 }1.46 }1.48 @@ -273,6 +278,64 @@1.49 }1.51 /**1.52 + * Construct a disc around a source track.1.53 + * @param type Disc type, which must be compatible with the track mode1.54 + * @param track The source of data for the main track1.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 */
.