/** * Construct a disc around a source track. * @param type Disc type, which must be compatible with the track mode * @param track The source of data for the main track * @param lba The position on disc of the main track. If non-zero, * a filler track is added before it, in 2 separate sessions. */ cdrom_disc_t cdrom_disc_new_from_track( cdrom_disc_type_t type, sector_source_t track, cdrom_lba_t lba, ERROR *err ) { cdrom_disc_t disc = cdrom_disc_new( NULL, NULL ); if( disc != NULL ) { disc->disc_type = type; int trackno = 0; if( lba != 0 ) { cdrom_count_t size = lba - 150; if( lba < 150 ) size = lba; disc->track[0].trackno = 1; disc->track[0].sessionno = 1; disc->track[0].lba = 0; disc->track[0].flags = 0; disc->track[0].source = null_sector_source_new( SECTOR_CDDA, size ); sector_source_ref( disc->track[0].source ); trackno++; } disc->track[trackno].trackno = trackno+1; disc->track[trackno].sessionno = trackno+1; disc->track[trackno].lba = lba; disc->track[trackno].flags = (track->mode == SECTOR_CDDA ? 0 : TRACK_FLAG_DATA); disc->track[trackno].source = track; sector_source_ref(track); disc->track_count = trackno+1; disc->session_count = trackno+1; cdrom_disc_compute_leadout(disc); } else { SET_ERROR(err, LX_ERR_NOMEM, "Unable to allocate memory for cdrom disc"); } return disc; }
static IsoDataSource *iso_data_source_new( sector_source_t source ) { IsoDataSource *src = g_malloc0(sizeof(IsoDataSource)); src->refcount = 1; src->open = isofs_dummy_fn; src->close = isofs_dummy_fn; src->read_block = isofs_read_block; src->free_data = isofs_release; src->data = source; sector_source_ref(source); return src; }
/** * Construct a new image-based disc using the given filename as the base source. * TOC is initialized to the empty values. */ static cdrom_disc_t cdrom_disc_image_new( const char *filename, ERROR *err ) { cdrom_disc_t disc = cdrom_disc_new( filename, err ); if( disc != NULL && filename != NULL ) { disc->base_source = file_sector_source_new_filename( filename, SECTOR_UNKNOWN, 0, FILE_SECTOR_FULL_FILE ); if( disc->base_source == NULL ) { SET_ERROR( err, LX_ERR_FILE_NOOPEN, "Unable to open cdrom file '%s': %s", filename, strerror(errno) ); cdrom_disc_unref(disc); disc = NULL; } else { sector_source_ref(disc->base_source); } } return disc; }