|
|
|
@ -1485,6 +1485,20 @@ ex:;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int mmc_register_leadout(struct burn_drive *d, int *highest_leadout,
|
|
|
|
|
int toc_idx)
|
|
|
|
|
{
|
|
|
|
|
int lba;
|
|
|
|
|
|
|
|
|
|
lba = burn_msf_to_lba(d->toc_entry[toc_idx].pmin,
|
|
|
|
|
d->toc_entry[toc_idx].psec,
|
|
|
|
|
d->toc_entry[toc_idx].pframe);
|
|
|
|
|
if (lba > *highest_leadout)
|
|
|
|
|
*highest_leadout = lba;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
|
|
|
|
|
{
|
|
|
|
|
/* read full toc, all sessions, in m/s/f form, 4k buffer */
|
|
|
|
@ -1494,7 +1508,7 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
|
|
|
|
|
struct buffer *buf = NULL;
|
|
|
|
|
struct command *c = NULL;
|
|
|
|
|
int dlen;
|
|
|
|
|
int i, old_alloc_len, t_idx, ret;
|
|
|
|
|
int i, old_alloc_len, t_idx, ret, highest_leadout = -1;
|
|
|
|
|
unsigned char *tdata;
|
|
|
|
|
char *msg = NULL;
|
|
|
|
|
|
|
|
|
@ -1652,9 +1666,12 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
|
|
|
|
|
d->disc->session[tdata[0] - 1]->firsttrack = tdata[8];
|
|
|
|
|
if (tdata[3] == 0xA1)
|
|
|
|
|
d->disc->session[tdata[0] - 1]->lasttrack = tdata[8];
|
|
|
|
|
if (tdata[3] == 0xA2)
|
|
|
|
|
if (tdata[3] == 0xA2) {
|
|
|
|
|
d->disc->session[tdata[0] - 1]->leadout_entry =
|
|
|
|
|
&d->toc_entry[i];
|
|
|
|
|
/* ts B60305 */
|
|
|
|
|
mmc_register_leadout(d, &highest_leadout, i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ts A70131 : was (d->status != BURN_DISC_BLANK) */
|
|
|
|
@ -1701,6 +1718,23 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
|
|
|
|
|
/* A80808 */
|
|
|
|
|
burn_disc_cd_toc_extensions(d, 0);
|
|
|
|
|
|
|
|
|
|
/* ts B60304
|
|
|
|
|
Most drives report READ CAPACITY of TAO CD too high by 2 blocks.
|
|
|
|
|
TOC format 2 always reports 2 blocks more than are readable.
|
|
|
|
|
So here it is possible to check and mark as trusted.
|
|
|
|
|
*/
|
|
|
|
|
if (highest_leadout > 0 && d->media_read_capacity != 0x7fffffff &&
|
|
|
|
|
!d->mr_capacity_trusted) {
|
|
|
|
|
if (highest_leadout - 3 == d->media_read_capacity) {
|
|
|
|
|
d->mr_capacity_trusted = 1;
|
|
|
|
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
|
|
|
|
0x00000002, LIBDAX_MSGS_SEV_DEBUG,
|
|
|
|
|
LIBDAX_MSGS_PRIO_ZERO,
|
|
|
|
|
"Trusting READ CAPACITY by 2 extra blocks in TOC. Assuming TAO.",
|
|
|
|
|
0, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = 1;
|
|
|
|
|
ex:;
|
|
|
|
|
BURN_FREE_MEM(msg);
|
|
|
|
@ -1909,6 +1943,7 @@ static int mmc_read_disc_info_al(struct burn_drive *d, int *alloc_len)
|
|
|
|
|
|
|
|
|
|
/* ts A81210 */
|
|
|
|
|
d->media_read_capacity = 0x7fffffff;
|
|
|
|
|
d->mr_capacity_trusted = -1;
|
|
|
|
|
|
|
|
|
|
/* ts A61202 */
|
|
|
|
|
d->toc_entries = 0;
|
|
|
|
@ -4836,6 +4871,7 @@ int mmc_read_capacity(struct burn_drive *d)
|
|
|
|
|
BURN_ALLOC_MEM(buf, struct buffer, 1);
|
|
|
|
|
BURN_ALLOC_MEM(c, struct command, 1);
|
|
|
|
|
d->media_read_capacity = 0x7fffffff;
|
|
|
|
|
d->mr_capacity_trusted = -1;
|
|
|
|
|
mmc_start_if_needed(d, 1);
|
|
|
|
|
if (mmc_function_spy(d, "mmc_read_capacity") <= 0)
|
|
|
|
|
{ret = 0; goto ex;}
|
|
|
|
@ -4853,6 +4889,10 @@ int mmc_read_capacity(struct burn_drive *d)
|
|
|
|
|
d->media_read_capacity = 0x7fffffff;
|
|
|
|
|
{ret = 0; goto ex;}
|
|
|
|
|
}
|
|
|
|
|
if (d->current_profile >= 0x08 && d->current_profile <= 0x0A)
|
|
|
|
|
d->mr_capacity_trusted = 0;
|
|
|
|
|
else
|
|
|
|
|
d->mr_capacity_trusted = 1;
|
|
|
|
|
ret = 1;
|
|
|
|
|
ex:;
|
|
|
|
|
BURN_FREE_MEM(c);
|
|
|
|
@ -5367,6 +5407,7 @@ int mmc_setup_drive(struct burn_drive *d)
|
|
|
|
|
d->media_capacity_remaining = 0;
|
|
|
|
|
d->media_lba_limit = 0;
|
|
|
|
|
d->media_read_capacity = 0x7fffffff;
|
|
|
|
|
d->mr_capacity_trusted = 0;
|
|
|
|
|
d->pessimistic_buffer_free = 0;
|
|
|
|
|
d->pbf_altered = 0;
|
|
|
|
|
d->wait_for_buffer_free = Libburn_wait_for_buffer_freE;
|
|
|
|
|