static int read_packet(AVFormatContext *ctx, AVPacket *pkt) { CDIOContext *s = ctx->priv_data; int ret; uint16_t *buf; char *err = NULL; if (ctx->streams[0]->cur_dts > s->last_sector) return AVERROR_EOF; buf = cdio_paranoia_read(s->paranoia, NULL); if (!buf) return AVERROR_EOF; if (err = cdio_cddap_errors(s->drive)) { av_log(ctx, AV_LOG_ERROR, "%s\n", err); free(err); err = NULL; } if (err = cdio_cddap_messages(s->drive)) { av_log(ctx, AV_LOG_VERBOSE, "%s\n", err); free(err); err = NULL; } if ((ret = av_new_packet(pkt, CDIO_CD_FRAMESIZE_RAW)) < 0) return ret; memcpy(pkt->data, buf, CDIO_CD_FRAMESIZE_RAW); return 0; }
static int cdpa_read(rnc_dev_t *dev, void *buf, size_t size) { cdpa_t *cdpa = dev->data; char *s, *p; size_t n; mrp_debug("reading %zu bytes", size); if ((size % CDIO_CD_FRAMESIZE_RAW) != 0) goto invalid; p = buf; n = size; while (n > 0) { s = (char *)cdio_paranoia_read(cdpa->cdpa, read_status); if (s == NULL) goto ioerror; memcpy(p, s, CDIO_CD_FRAMESIZE_RAW); p += CDIO_CD_FRAMESIZE_RAW; n -= CDIO_CD_FRAMESIZE_RAW; } return size; invalid: errno = EINVAL; return -1; ioerror: errno = EIO; return -1; }
int RipAttempt() { for ( i_cursor = i_first_lsn; i_cursor <= i_last_lsn; ) { for ( int i = 0; i < NUM_TRIES; i++) { paranoia_seek(p, i_cursor, SEEK_SET); for ( int j = 0; j < NUM_SECTORS && j <= (i_last_lsn - i_cursor); j++ ) { /* read a sector */ int16_t *p_readbuf = cdio_paranoia_read(p, NULL); int16_t *buf_pointer; psz_err = cdio_cddap_errors(d); psz_mes = cdio_cddap_messages(d); if (psz_mes || psz_err) printf("%s%s\n", psz_mes ? psz_mes: "", psz_err ? psz_err: ""); if (psz_err) free(psz_err); if (psz_mes) free(psz_mes); if( !p_readbuf ) { printf("paranoia read error. Stopping.\n"); break; } else { /* Transport data to actual buffer */ if ( i == 0 ) { for ( buf_pointer = p_readbuf, counter = (CDIO_CD_FRAMESIZE_RAW/2)*j; buf_pointer != NULL && counter < (CDIO_CD_FRAMESIZE_RAW/2)*(j+1); buf_pointer++, counter++ ) { readbuf[counter] = *buf_pointer; } } else { for ( buf_pointer = p_readbuf, counter = (CDIO_CD_FRAMESIZE_RAW/2)*j; buf_pointer != NULL && counter < (CDIO_CD_FRAMESIZE_RAW/2)*(j+1); buf_pointer++, counter++ ) { readbuf2[counter] = *buf_pointer; } } } num_samples = counter; } } failed = false; for (int i = 0; i < num_samples ; i++) { if (readbuf[i] != readbuf2[i]) { failed = true; } } if (!failed) { i_cursor += NUM_SECTORS; written_samples = WriteToFile(); if (written_samples != num_samples) return 1; } } return 0; }
static void get_track_info(ripncode_t *r) { rip_track_t *t; int i, base; char file[1024], *msg; int16_t *samples; int fd, n, l, total; base = cdio_get_first_track_num(r->cdio); r->ntrack = cdio_get_num_tracks(r->cdio); r->tracks = mrp_allocz_array(rip_track_t, r->ntrack); if (r->tracks == NULL && r->ntrack > 0) ripncode_fatal(r, "failed to allocate track info"); cdio_paranoia_modeset(r->cdpa, PARANOIA_MODE_FULL); for (i = 0, t = r->tracks; i < r->ntrack; i++, t++) { if (i >= r->last) break; t->id = base + i; t->format = cdio_get_track_format(r->cdio, base + i); t->lsn_beg = cdio_get_track_lsn(r->cdio, base + i); t->lsn_end = cdio_get_track_last_lsn(r->cdio, base + i); t->lba = cdio_get_track_lba(r->cdio, base + i); printf("track #%d (id %d): lsn: %u - %u (lba %u), format: %s\n", i, base + i, t->lsn_beg, t->lsn_end, t->lba, track_format_name(t->format)); if (r->dryrun) continue; snprintf(file, sizeof(file), "track-%d.raw", i); if ((fd = open(file, O_WRONLY|O_CREAT, 0644)) < 0) ripncode_fatal(r, "failed to open '%s' (%d: %s)", file, errno, strerror(errno)); cdio_paranoia_seek(r->cdpa, t->lsn_beg * CDIO_CD_FRAMESIZE_RAW, SEEK_SET); total = t->lsn_end - t->lsn_beg + 1; for (l = 0; l <= total; l++) { printf("\rreading track sector %d/%d (#%d)...", l, total, t->lsn_beg + l); fflush(stdout); samples = cdio_paranoia_read(r->cdpa, read_status); if (samples == NULL) { msg = cdio_cddap_errors(r->cdda); ripncode_fatal(r, "failed to seek to LSN %d (%s)", t->lsn_beg, msg ? msg : "unknown error"); } n = write(fd, samples, CDIO_CD_FRAMESIZE_RAW); if (n < 0) ripncode_fatal(r, "failed to write sector data (%d: %s)", errno, strerror(errno)); } close(fd); } }