libburn-0.7.2.pl01 : Workarounds for Pioneer DVR-216D rev 1.09

This commit is contained in:
Thomas Schmitt 2009-11-13 09:49:10 +00:00
parent b641b5c570
commit 2a388cb443
6 changed files with 112 additions and 10 deletions

14
README
View File

@ -11,7 +11,7 @@ Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
and Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
http://files.libburnia-project.org/releases/libburn-0.7.2.pl00.tar.gz
http://files.libburnia-project.org/releases/libburn-0.7.2.pl01.tar.gz
------------------------------------------------------------------------------
@ -19,9 +19,9 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
From tarball
Obtain libburn-0.7.2.pl00.tar.gz, take it to a directory of your choice and do:
Obtain libburn-0.7.2.pl01.tar.gz, take it to a directory of your choice and do:
tar xzf libburn-0.7.2.pl00.tar.gz
tar xzf libburn-0.7.2.pl01.tar.gz
cd libburn-0.7.2
./configure --prefix=/usr
make
@ -443,6 +443,14 @@ Project history as far as known to me:
It can retrieve media product info and can process track input which was
prepared for CD-ROM XA Mode 2 Form 1. cdrskin now performs option -minfo.
- 28 Oct 2009 libisoburn-0.4.4 fixes a bug with cdrecord emulation and
introduces new information options about media type and ISO image id strings.
On Linux it helps with mounting two sessions of the same media
simultaneously.
- 12 Nov 2009 libburn-0.7.2.pl01 works around problems with Pioneer DVR-216D.
DVD-R runs made the drive stuck. Ejecting the tray did not work properly.
------------------------------------------------------------------------------

View File

@ -4,7 +4,7 @@
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org but also published via:
http://scdbackup.sourceforge.net/cdrskin_eng.html
http://scdbackup.sourceforge.net/cdrskin-0.7.2.pl00.tar.gz
http://scdbackup.sourceforge.net/cdrskin-0.7.2.pl01.tar.gz
Copyright (C) 2006-2009 Thomas Schmitt, provided under GPL version 2.
------------------------------------------------------------------------------
@ -24,9 +24,9 @@ By using this software you agree to the disclaimer at the end of this text
Compilation, First Glimpse, Installation
Obtain cdrskin-0.7.2.pl00.tar.gz, take it to a directory of your choice and do:
Obtain cdrskin-0.7.2.pl01.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-0.7.2.pl00.tar.gz
tar xzf cdrskin-0.7.2.pl01.tar.gz
cd cdrskin-0.7.2
Within that directory execute:

View File

@ -193,7 +193,7 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool
<P>
<DL>
<DT>Download as source code (see README):</DT>
<DD><A HREF="cdrskin-0.7.2.pl00.tar.gz">cdrskin-0.7.2.pl00.tar.gz</A>
<DD><A HREF="cdrskin-0.7.2.pl01.tar.gz">cdrskin-0.7.2.pl01.tar.gz</A>
(780 KB).
</DD>
<DD>
@ -262,6 +262,12 @@ Bug fixes towards cdrskin-0.7.0.pl00:
-->
</UL>
Bug fixes towards cdrskin-0.7.2.pl00:
<UL>
<LI>Workaround for Pioneer DVR-216D which got stuck on DVD-R burns.</LI>
<LI>Workaround for Pioneer DVR-216D which did not always eject the tray.</LI>
</UL>
<HR>
<P>
@ -278,8 +284,10 @@ Bug fixes towards cdrskin-0.7.0.pl00:
<DD>Bug fixes towards cdrskin-0.7.2.pl00:
<UL>
<LI>none yet</LI>
<LI>Workaround for Pioneer DVR-216D which got stuck on DVD-R burns.</LI>
<LI>Workaround for Pioneer DVR-216D which did not always eject the tray.</LI>
<!--
<LI>none yet</LI>
-->
</UL>
</DD>
@ -309,7 +317,7 @@ admins with full system souvereignty.</DT>
</DD>
<DD>
<A HREF="cdrskin-0.7.3.tar.gz">cdrskin-0.7.3.tar.gz</A>
(780 KB).
(800 KB).
</DD>
<!-- This is not offered any more since spring 2008

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2009.10.12.080001"
#define Cdrskin_timestamP "2009.11.12.230001"

View File

@ -76,6 +76,57 @@ void sbc_eject(struct burn_drive *d)
spc_wait_unit_attention(d, 1800, "STOP UNIT (+ EJECT)", 0);
}
/* ts A91112 : 0.7.2.pl01 */
#define Libburn_pioneer_dvr_216d_start_synC 1
#ifdef Libburn_pioneer_dvr_216d_start_synC
/* ts A91112 : Now with flag */
/* @param flag bit0= asynchronous waiting
*/
int sbc_start_unit_flag(struct burn_drive *d, int flag)
{
struct command c;
int ret;
if (mmc_function_spy(d, "start_unit") <= 0)
return 0;
scsi_init_command(&c, SBC_START_UNIT, sizeof(SBC_START_UNIT));
c.retry = 1;
c.opcode[1] |= (flag & 1); /* ts A70918 : Immed */
c.dir = NO_TRANSFER;
d->issue_command(d, &c);
if (c.error)
return 0;
if (!(flag & 1))
return 1;
/* ts A70918 : asynchronous */
ret = spc_wait_unit_attention(d, 1800, "START UNIT", 0);
return ret;
}
int sbc_start_unit(struct burn_drive *d)
{
int ret;
d->is_stopped = 0; /* no endless starting attempts */
/* Asynchronous, not to block controller by waiting */
ret = sbc_start_unit_flag(d, 1);
if (ret <= 0)
return ret;
/* Synchronous to catch Pioneer DVD-216D which is ready too early.
A pending START UNIT can prevent ejecting of the tray.
*/
ret = sbc_start_unit_flag(d, 0);
return ret;
}
#else /* Libburn_pioneer_dvr_216d_start_synC */
/* ts A61118 : is it necessary to tell the drive to get ready for use ? */
int sbc_start_unit(struct burn_drive *d)
{
@ -98,6 +149,9 @@ int sbc_start_unit(struct burn_drive *d)
return ret;
}
#endif /* ! Libburn_pioneer_dvr_216d_start_synC */
/* ts A90824 : Trying to reduce drive noise */
int sbc_stop_unit(struct burn_drive *d)
{

View File

@ -1240,6 +1240,7 @@ int burn_dvd_write_track(struct burn_write_opts *o,
struct buffer *out = d->buffer;
int sectors;
int i, open_ended = 0, ret= 0, is_flushed = 0;
int first_buf_cap = 0, further_cap = 0, buf_cap_step = 256;
/* ts A70213 : eventually expand size of track to max */
burn_track_apply_fillup(t, d->media_capacity_remaining, 0);
@ -1250,6 +1251,18 @@ int burn_dvd_write_track(struct burn_write_opts *o,
ret = burn_disc_open_track_dvd_minus_r(o, s, tnum);
if (ret <= 0)
goto ex;
/* ts A91112 : 0.7.2.pl01 */
#define Libburn_pioneer_dvr_216d_read_buf_caP 1
#ifdef Libburn_pioneer_dvr_216d_read_buf_caP
/* Pioneer DVR-216D rev 1.09 hates multiple buffer inquiries
before the drive buffer is full.
*/
first_buf_cap = 0;
further_cap = -1;
#endif
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
/* DVD+R , DVD+R/DL */
ret = burn_disc_open_track_dvd_plus_r(o, s, tnum);
@ -1284,10 +1297,29 @@ int burn_dvd_write_track(struct burn_write_opts *o,
burn_disc_init_track_status(o, s, tnum, sectors);
for (i = 0; open_ended || i < sectors; i++) {
#ifdef Libburn_pioneer_dvr_216d_read_buf_caP
/* From time to time inquire drive buffer */
/* Eventually avoid to do this more than once
before the drive buffer is full. See above DVD-R[W].
*/
if (i == first_buf_cap ||
((i % buf_cap_step) == 0 &&
(i >= further_cap || further_cap < 0))) {
d->read_buffer_capacity(d);
if (further_cap < 0)
further_cap =
d->progress.buffer_capacity / 2048 + 128;
}
#else /* Libburn_pioneer_dvr_216d_read_buf_caP */
/* From time to time inquire drive buffer */
if ((i%256)==0)
d->read_buffer_capacity(d);
#endif /* ! Libburn_pioneer_dvr_216d_read_buf_caP */
/* transact a (CD sized) sector */
if (!sector_data(o, t, 0))
{ ret = 0; goto ex; }