New API call burn_write_opts_set_stream_recording()

This commit is contained in:
Thomas Schmitt 2008-04-12 16:42:45 +00:00
parent 51ac900de6
commit e522db6220
8 changed files with 93 additions and 19 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2008.04.10.211529"
#define Cdrskin_timestamP "2008.04.12.164244"

View File

@ -61,6 +61,7 @@ int burn_setup_drive(struct burn_drive *d, char *fname)
d->released = 1;
d->stdio_fd = -1;
d->status = BURN_DISC_UNREADY;
d->do_stream_recording = 0;
return 1;
}

View File

@ -1758,6 +1758,20 @@ void burn_write_opts_set_fillup(struct burn_write_opts *opts,
void burn_write_opts_set_force(struct burn_write_opts *opts, int use_force);
/* ts A80412 */
/** Eventually makes use of the more modern write command AAh WRITE12 and
sets the Streaming bit. With DVD-RAM this can override the traditional
slowdown to half nominal speed. But if it speeds up writing then it also
disables error management and correction. Weigh your priorities.
This only affects the write operations of burn_disc_write().
@since 0.4.6
@param opts The write opts to change
@param value 0=use 2Ah WRITE10, 1=use AAh WRITE12 with Streaming bit
*/
void burn_write_opts_set_stream_recording(struct burn_write_opts *opts,
int value);
/** Sets whether to read in raw mode or not
@param opts The read opts to change
@param raw_mode If non-zero, reading will be done in raw mode, so that everything in the data tracks on the
@ -2189,8 +2203,9 @@ int burn_msgs_submit(int error_code, char msg_text[], int os_errno,
int burn_text_to_sev(char *severity_name, int *severity_number, int flag);
/* ts A80202 : @since 0.4.4 */
/* ts A80202 */
/** Convert a severity number into a severity name
@since 0.4.4
@param severity_number The rank number: the higher, the more severe.
@param severity_name A name as with burn_msgs_submit(), e.g. "SORRY".
@param flag Bitfield for control purposes (unused yet, submit 0)

View File

@ -707,22 +707,26 @@ int mmc_write(struct burn_drive *d, int start, struct buffer *buf)
if(d->wait_for_buffer_free)
mmc_wait_for_buffer_free(d, buf);
scsi_init_command(&c, MMC_WRITE_10, sizeof(MMC_WRITE_10));
/*
memcpy(c.opcode, MMC_WRITE_10, sizeof(MMC_WRITE_10));
c.oplen = sizeof(MMC_WRITE_10);
*/
/* ts A80412 */
if(d->do_stream_recording > 0) {
/* >>> ??? is WRITE12 available ? */
/* >>> ??? inquire feature 107h Stream Writing bit ? */
scsi_init_command(&c, MMC_WRITE_12, sizeof(MMC_WRITE_12));
mmc_int_to_four_char(c.opcode + 2, start);
mmc_int_to_four_char(c.opcode + 6, len);
c.opcode[10] = 1<<7; /* Streaming bit */
} else {
scsi_init_command(&c, MMC_WRITE_10, sizeof(MMC_WRITE_10));
mmc_int_to_four_char(c.opcode + 2, start);
c.opcode[6] = 0;
c.opcode[7] = (len >> 8) & 0xFF;
c.opcode[8] = len & 0xFF;
}
c.retry = 1;
mmc_int_to_four_char(c.opcode + 2, start);
c.opcode[6] = 0;
c.opcode[7] = (len >> 8) & 0xFF;
c.opcode[8] = len & 0xFF;
c.page = buf;
c.dir = TO_DRIVE;
/*
burn_print(12, "%d, %d, %d, %d - ", c->opcode[2], c->opcode[3], c->opcode[4], c->opcode[5]);
burn_print(12, "%d, %d, %d, %d\n", c->opcode[6], c->opcode[7], c->opcode[8], c->opcode[9]);
*/
#ifdef Libburn_log_in_and_out_streaM
/* <<< ts A61031 */
@ -2612,7 +2616,9 @@ selected_not_suitable:;
}
if (!(d->current_profile == 0x13 ||
d->current_profile == 0x14 ||
d->current_profile == 0x1a))
d->current_profile == 0x1a ||
(0 && d->current_profile == 0x12) ||
(0 && d->current_profile == 0x43))) /* >>> */
goto unsuitable_media;
format_type = d->format_descriptors[index].type;
@ -2741,6 +2747,31 @@ selected_not_suitable:;
format_type == 0x15 ? "quick" : "full");
return_immediately = 1; /* caller must do the waiting */
} else if (0 && d->current_profile == 0x12) {
/* DVD-RAM */
format_type = 0x00;
if(flag & 4) {
/* >>> search for largest 0x00 format descriptor */;
} else {
/* >>> search for smallest 0x00 descriptor >= size */;
}
/* >>> */;
} else if (0 && d->current_profile == 0x43 &&
burn_support_untested_profiles) {
/* BD-RE */
format_type = 0x00;
if(flag & 4) {
/* >>> search for format 0x31 */;
/* >>> if 0x31 : */
/* >>> format_type = 0x31; */
/* >>> else */
/* >>> search largest 0x30 format descriptor */;
} else {
/* >>> search for smallest 0x30 descriptor >= size */;
}
/* >>> */;
} else {
/* >>> other formattable types to come */

View File

@ -38,6 +38,7 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
opts->start_byte = -1;
opts->fill_up_media = 0;
opts->force_is_set = 0;
opts->do_stream_recording = 0;
opts->has_mediacatalog = 0;
opts->format = BURN_CDROM;
opts->multi = 0;
@ -380,6 +381,16 @@ void burn_write_opts_set_force(struct burn_write_opts *opts, int use_force)
}
/* ts A80412: API */
void burn_write_opts_set_stream_recording(struct burn_write_opts *opts,
int value)
{
opts->do_stream_recording = !!value;
}
/* ts A70901: API */
struct burn_drive *burn_write_opts_get_drive(struct burn_write_opts *opts)
{

View File

@ -49,6 +49,11 @@ struct burn_write_opts
*/
int force_is_set;
/* ts A80412 : whether to use WRITE12 with Streaming bit set
rather than WRITE10. Speeds up DVD-RAM. Might help with BD-RE.
This gets transferred to burn_drive.do_stream_recording */
int do_stream_recording;
/** A disc can have a media catalog number */
int has_mediacatalog;
unsigned char mediacatalog[13];

View File

@ -187,6 +187,11 @@ struct burn_drive
synchronize chache has happened yet */
int needs_sync_cache;
/* ts A80412 : whether to use WRITE12 with Streaming bit set
rather than WRITE10. Speeds up DVD-RAM. Might help
with BD-RE */
int do_stream_recording;
/* ts A61218 from 51h READ DISC INFORMATION */
int bg_format_status; /* 0=needs format start, 1=needs format restart*/

View File

@ -1978,6 +1978,9 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
/* ts A61224 */
burn_disc_init_write_status(o, disc); /* must be done very early */
/* ts A80412 */
d->do_stream_recording = o->do_stream_recording;
d->buffer = &buf;
memset(d->buffer, 0, sizeof(struct buffer));
d->rlba = -150;
@ -1988,14 +1991,14 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
ret = burn_stdio_write_sync(o, disc);
if (ret <= 0)
goto fail_wo_sync;
return;
goto ex;
}
/* ts A61218 */
if (! d->current_is_cd_profile) {
ret = burn_dvd_write_sync(o, disc);
if (ret <= 0)
goto fail_wo_sync;
return;
goto ex;
}
/* ts A70218 */
@ -2148,7 +2151,7 @@ return crap. so we send the command, then ignore the result.
/* ts A61012 : This return was traditionally missing. I suspect this
to have caused Cdrskin_eject() failures */
return;
goto ex;
fail:
d->sync_cache(d);
@ -2160,6 +2163,9 @@ fail_wo_sync:;
"Burn run failed", 0, 0);
d->cancel = 1;
d->busy = BURN_DRIVE_IDLE;
ex:;
d->do_stream_recording = 0;
return;
}
/* ts A70811 : API function */