|
|
@ -159,6 +159,8 @@ drive, or only store a subset of the _opts structs in drives */ |
|
|
|
drive_lba); |
|
|
|
|
|
|
|
/* >>> ts A61009 : ensure page.sectors >= 0 before calling */ |
|
|
|
/* >>> ts B21123 : Would now be d->read_cd() with |
|
|
|
with sectype = 0 , mainch = 0xf8 */ |
|
|
|
d->r ead_sectors(d, drive_lba, page.sectors, o, &page); |
|
|
|
|
|
|
|
printf("Read %d\n", page.sectors); |
|
|
@ -538,6 +540,113 @@ ex:; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef Libburn_with_read_audiO |
|
|
|
|
|
|
|
/* ts B21119 : API function*/ |
|
|
|
int burn_read_audio(struct burn_drive *d, int sector_no, |
|
|
|
char data[], off_t data_size, off_t *data_count, int flag) |
|
|
|
{ |
|
|
|
int alignment = 2352, start, upto, chunksize = 1, err, cpy_size, i; |
|
|
|
int sose_mem = 0, ret; |
|
|
|
char msg[81], *wpt; |
|
|
|
struct buffer *buf = NULL, *buffer_mem = d->buffer; |
|
|
|
|
|
|
|
BURN_ALLOC_MEM(buf, struct buffer, 1); |
|
|
|
*data_count = 0; |
|
|
|
sose_mem = d->silent_on_scsi_error; |
|
|
|
|
|
|
|
if (d->released) { |
|
|
|
libdax_msgs_submit(libdax_messenger, |
|
|
|
d->global_index, 0x00020142, |
|
|
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, |
|
|
|
"Drive is not grabbed on random access read", 0, 0); |
|
|
|
{ret = 0; goto ex;} |
|
|
|
} |
|
|
|
if (d->drive_role != 1) { |
|
|
|
libdax_msgs_submit(libdax_messenger, d->global_index, |
|
|
|
0x00020146, |
|
|
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, |
|
|
|
"Drive is a virtual placeholder (stdio-drive or null-drive)", |
|
|
|
0, 0); |
|
|
|
{ret = 0; goto ex;} |
|
|
|
} |
|
|
|
if ((data_size % alignment) != 0) { |
|
|
|
sprintf(msg, |
|
|
|
"Audio read size not properly aligned (%d bytes)", |
|
|
|
alignment); |
|
|
|
libdax_msgs_submit(libdax_messenger, d->global_index, |
|
|
|
0x0002019d, |
|
|
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, |
|
|
|
msg, 0, 0); |
|
|
|
{ret = 0; goto ex;} |
|
|
|
} |
|
|
|
if (d->busy != BURN_DRIVE_IDLE) { |
|
|
|
libdax_msgs_submit(libdax_messenger, |
|
|
|
d->global_index, 0x00020145, |
|
|
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, |
|
|
|
"Drive is busy on attempt to read audio", 0, 0); |
|
|
|
{ret = 0; goto ex;} |
|
|
|
} |
|
|
|
|
|
|
|
d->busy = BURN_DRIVE_READING_SYNC; |
|
|
|
d->buffer = buf; |
|
|
|
|
|
|
|
start = sector_no; |
|
|
|
upto = start + data_size / alignment; |
|
|
|
wpt = data; |
|
|
|
for (; start < upto; start += chunksize) { |
|
|
|
chunksize = upto - start; |
|
|
|
if (chunksize > (BUFFER_SIZE / alignment)) |
|
|
|
chunksize = (BUFFER_SIZE / alignment); |
|
|
|
cpy_size = chunksize * alignment; |
|
|
|
if (flag & 2) |
|
|
|
d->silent_on_scsi_error = 1; |
|
|
|
if (flag & 16) { |
|
|
|
d->had_particular_error &= ~1; |
|
|
|
if (!d->silent_on_scsi_error) |
|
|
|
d->silent_on_scsi_error = 2; |
|
|
|
} |
|
|
|
err = d->read_cd(d, start, chunksize, 1, 0x10, NULL, d->buffer, |
|
|
|
(flag & 8) >> 3); |
|
|
|
if (flag & (2 | 16)) |
|
|
|
d->silent_on_scsi_error = sose_mem; |
|
|
|
if (err == BE_CANCELLED) { |
|
|
|
if ((flag & 16) && (d->had_particular_error & 1)) |
|
|
|
{ret = -3; goto ex;} |
|
|
|
if(!(flag & 4)) |
|
|
|
for (i = 0; i < chunksize - 1; i++) { |
|
|
|
if (flag & 2) |
|
|
|
d->silent_on_scsi_error = 1; |
|
|
|
err = d->read_cd(d, start + i, 1, 1, 0x10, |
|
|
|
NULL, d->buffer, (flag & 8) >> 3); |
|
|
|
if (flag & 2) |
|
|
|
d->silent_on_scsi_error = sose_mem; |
|
|
|
if (err == BE_CANCELLED) |
|
|
|
break; |
|
|
|
memcpy(wpt, d->buffer->data, alignment); |
|
|
|
wpt += alignment; |
|
|
|
*data_count += alignment; |
|
|
|
} |
|
|
|
|
|
|
|
ret = 0; goto ex; |
|
|
|
} |
|
|
|
memcpy(wpt, d->buffer->data, cpy_size); |
|
|
|
wpt += cpy_size; |
|
|
|
*data_count += cpy_size; |
|
|
|
} |
|
|
|
|
|
|
|
ret = 1; |
|
|
|
ex: |
|
|
|
BURN_FREE_MEM(buf); |
|
|
|
d->buffer = buffer_mem; |
|
|
|
d->busy = BURN_DRIVE_IDLE; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#endif /* Libburn_with_read_audiO */ |
|
|
|
|
|
|
|
|
|
|
|
#ifdef Libburn_develop_quality_scaN |
|
|
|
|
|
|
|
/* B21108 ts */ |
|
|
|