bool RipTrack(track_t i_track, std::string filename) {
			InitWavWriter(filename);
			p = cdio_paranoia_init(d);
			if (!p) return false;

			/* Restrict speed */
			if (cdda_speed_set(d, MAX_SPEED) != DRIVER_OP_SUCCESS) {
				printf("Unable to set speed\n");
			}

			i_first_lsn = cdio_cddap_track_firstsector(d, i_track);

			if ( -1 == i_first_lsn ) {
				printf("Trouble getting starting LSN\n");
			} else {
				i_last_lsn = cdio_cddap_track_lastsector(d, i_track);

				printf("Reading track %d from LSN %ld to LSN %ld\n", i_track, 
				(long int) i_first_lsn, (long int) i_last_lsn);

				/* Set reading mode for full paranoia, but allow skipping sectors. */
				paranoia_modeset(p, PARANOIA_MODE_FULL^PARANOIA_MODE_NEVERSKIP);

				if (RipAttempt() == 1) {
					printf("Ripping failed\n");
					return false;
				}
			}

			CloseWavWriter();
			cdio_paranoia_free(p);
			return true;
		}
static int
CDDAReader_track_lsn_device(cdio_CDDAReader *self, int track_num)
{
    const lsn_t lsn = cdio_cddap_track_firstsector(self->_.drive.drive,
                                                   (track_t)track_num);
    return lsn;
}
示例#3
0
int CdParanoia::firstSectorOfTrack(int track)
{
    #ifdef CDIOPARANOIA_FOUND
    return paranoia ? cdio_cddap_track_firstsector(drive, track) : -1;
    #else
    return paranoia ? cdda_track_firstsector(drive, track) : -1;
    #endif
}
示例#4
0
static PyObject*
CDDA_track_offsets(cdio_CDDAObject* self, PyObject *args)
{
    int tracknum;
    lsn_t first_sector;
    lsn_t last_sector;

    if (!PyArg_ParseTuple(args, "i", &tracknum))
        return NULL;

    first_sector = cdio_cddap_track_firstsector(self->cdrom_drive,
                                                (track_t)tracknum);
    last_sector = cdio_cddap_track_lastsector(self->cdrom_drive,
                                              (track_t)tracknum);

    return Py_BuildValue("(i,i)", (int)first_sector, (int)last_sector);
}
示例#5
0
static gboolean
xmms_cdda_init (xmms_xform_t *xform)
{
	CdIo_t *cdio = NULL;
	cdrom_drive_t *drive = NULL;
	const gchar *url;
	gchar **url_data = NULL;
	gchar *url_end;
	xmms_cdda_data_t *data;
	guint playtime;
	lsn_t first_lsn;
	track_t track;
	gchar *disc_id = NULL;
	gchar *cddb_id = NULL;
	xmms_config_property_t *val;
	const gchar *device;
	const gchar *metakey;
	gboolean ret = TRUE;

	g_return_val_if_fail (xform, FALSE);
	url = xmms_xform_indata_get_str (xform, XMMS_STREAM_TYPE_URL);

	if (g_ascii_strcasecmp (url, "cdda://") == 0) {
		xmms_xform_outdata_type_add (xform,
		                             XMMS_STREAM_TYPE_MIMETYPE,
		                             "application/x-xmms2-playlist-entries",
		                             XMMS_STREAM_TYPE_END);
		return TRUE;
	}

	val = xmms_xform_config_lookup (xform, "device");
	device = xmms_config_property_get_string (val);

	if (!get_disc_ids (device, &disc_id, &cddb_id, 0)) {
		return FALSE;
	}

	url += 7;
	url_data = g_strsplit (url, "/", 2);

	if (g_ascii_strcasecmp (url_data[0], disc_id)) {
		xmms_log_error ("Wrong disc inserted.");
		ret = FALSE;
		goto end;
	}

	if (url_data[1] == NULL) {
		xmms_log_error ("Missing track number.");
		ret = FALSE;
		goto end;
	}

	track = strtol (url_data[1], &url_end, 10);
	if (url_data[1] == url_end) {
		xmms_log_error ("Invalid track, need a number.");
		ret = FALSE;
		goto end;
	}

	cdio = open_cd (xform);
	if (!cdio) {
		ret = FALSE;
		goto end;
	}

	drive = cdio_cddap_identify_cdio (cdio, 1, NULL);
	if (!drive) {
		xmms_log_error ("Failed to identify drive.");
		ret = FALSE;
		goto end;
	}

	if (cdio_cddap_open (drive)) {
		xmms_log_error ("Unable to open disc.");
		ret = FALSE;
		goto end;
	}

	first_lsn = cdio_cddap_track_firstsector (drive, track);
	if (first_lsn == -1) {
		xmms_log_error ("No such track.");
		ret = FALSE;
		goto end;
	}

	data = g_new (xmms_cdda_data_t, 1);
	data->cdio = cdio;
	data->drive = drive;
	data->track = track;
	data->first_lsn = first_lsn;
	data->last_lsn = cdio_cddap_track_lastsector (drive, data->track);
	data->current_lsn = first_lsn;
	data->buf_used = CDIO_CD_FRAMESIZE_RAW;

	playtime = (data->last_lsn - data->first_lsn) *
	           1000.0 / CDIO_CD_FRAMES_PER_SEC;

	metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_DURATION;
	xmms_xform_metadata_set_int (xform, metakey, playtime);

	metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_BITRATE;
	xmms_xform_metadata_set_int (xform, metakey, 141120);

	xmms_xform_metadata_set_str (xform, "disc_id", url_data[0]);
	xmms_xform_metadata_set_str (xform, "cddb_id", cddb_id);

	metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_TRACKNR;
	xmms_xform_metadata_set_int (xform, metakey, track);

	xmms_xform_private_data_set (xform, data);

	xmms_xform_outdata_type_add (xform,
	                             XMMS_STREAM_TYPE_MIMETYPE,
	                             "audio/pcm",
	                             XMMS_STREAM_TYPE_FMT_FORMAT,
	                             XMMS_SAMPLE_FORMAT_S16,
	                             XMMS_STREAM_TYPE_FMT_CHANNELS,
	                             2,
	                             XMMS_STREAM_TYPE_FMT_SAMPLERATE,
	                             44100,
	                             XMMS_STREAM_TYPE_END);

end:
	/* These are to be destroyed in every cases... */
	g_free (cddb_id);
	g_free (disc_id);
	g_strfreev (url_data);

	/* destroy cdio/drive in case of failure */
	if (!ret) {
		if (drive) {
			cdio_cddap_close_no_free_cdio (drive);
		}
		if (cdio) {
			cdio_destroy (cdio);
		}
	}

	return ret;
}
		lba_t GetLba(track_t i_track) {
			return cdio_lsn_to_lba(cdio_cddap_track_firstsector(d, i_track));
		}
static int
CDDAReader_first_sector_device(cdio_CDDAReader *self)
{
    return cdio_cddap_track_firstsector(self->_.drive.drive,
                                        self->first_track_num(self));
}