Example #1
0
/**
 * 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;
}
Example #2
0
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;
}
Example #3
0
/**
 * 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;
}