From 6e5c50bde46d57a9f6439d6bd103c36c8df1de4c Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 1 Mar 2014 10:16:03 +0000 Subject: [PATCH] Improved emulation of mode page 2A --- cdrskin/cdrskin_timestamp.h | 2 +- libburn/drive.c | 8 ++++++++ libburn/libburn.h | 15 +++++++-------- libburn/transport.h | 2 ++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index afd9c99..f44290e 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2014.02.19.111017" +#define Cdrskin_timestamP "2014.03.01.101537" diff --git a/libburn/drive.c b/libburn/drive.c index a37444b..c13ffe1 100644 --- a/libburn/drive.c +++ b/libburn/drive.c @@ -1222,6 +1222,7 @@ static int drive_getcaps(struct burn_drive *d, struct burn_drive_info *out) { struct burn_scsi_inquiry_data *id; int i, profile; + struct burn_feature_descr *feat; /* ts A61007 : now prevented in enumerate_common() */ #if 0 @@ -1275,6 +1276,13 @@ static int drive_getcaps(struct burn_drive *d, struct burn_drive_info *out) else if (profile == 0x12) out->write_dvdram = out->read_dvdram = 1; } + + /* Test Write bit of CD TAO, CD Mastering, DVD-R/-RW Write */ + for (i = 0x002D; i <= 0x002F; i++) + if (burn_drive_has_feature(d, i, &feat, 0)) + if (feat->data_lenght > 0) + out->write_simulate |= + !!(feat->data[0] & 4); } out->drive = d; diff --git a/libburn/libburn.h b/libburn/libburn.h index 91956a1..cf635f1 100644 --- a/libburn/libburn.h +++ b/libburn/libburn.h @@ -594,10 +594,10 @@ struct burn_drive_info to inquire a device file address. ^^^^^ ALWAYS ^^^^^^^*/ char location[17]; - /* DEPRECATION: - Start of information from mode page 2Ah which is declared - obsolete by MMC-5. Do not rely on this, if you can get a - meaningful reply from burn_drive_get_all_profiles() + /* NOTE: The capability to write particular media types is also + announced by their profile number being in the list returned + by burn_drive_get_all_profile(). This is the only way to + inquire types DVD-RW, DVD+R, DVD+R DL, DVD+RW, BD-R, BD-RE. */ /** Can the drive read DVD-RAM discs */ unsigned int read_dvdram:1; @@ -622,13 +622,12 @@ struct burn_drive_info /** Can the drive simulate a write */ unsigned int write_simulate:1; - /** Can the drive report C2 errors */ + /** DEPRECATED: Can the drive report C2 errors */ unsigned int c2_errors:1; - /** The size of the drive's buffer (in kilobytes) */ + /** DEPRECATED: The size of the drive's buffer (in kilobytes) */ int buffer_size; - /* End of DEPRECATION */ /** * The supported block types in tao mode. @@ -1646,7 +1645,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast); /** Format media for use with libburn. This currently applies to DVD-RW in state "Sequential Recording" (profile 0014h) which get formatted to state "Restricted Overwrite" (profile 0013h). DVD+RW can be "de-iced" - by setting bit2 of flag. DVD-RAM and BD-RE may get formatted initially + by setting bit4 of flag. DVD-RAM and BD-RE may get formatted initially or re-formatted to adjust their Defect Managment. This function usually returns while the drive is still in the process of formatting. The formatting is done, when burn_drive_get_status() diff --git a/libburn/transport.h b/libburn/transport.h index 712b1a6..a07fd7b 100644 --- a/libburn/transport.h +++ b/libburn/transport.h @@ -151,6 +151,8 @@ struct burn_feature_descr { */ unsigned char data_lenght; + + /* Additional bytes after the first 4 bytes of the descriptor */ unsigned char *data; struct burn_feature_descr *next;