/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct __BindgenBitfieldUnit { storage: Storage, } impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { Self { storage } } } impl __BindgenBitfieldUnit where Storage: AsRef<[u8]> + AsMut<[u8]>, { #[inline] fn extract_bit(byte: u8, index: usize) -> bool { let bit_index = if cfg!(target_endian = "big") { 7 - (index % 8) } else { index % 8 }; let mask = 1 << bit_index; byte & mask == mask } #[inline] pub fn get_bit(&self, index: usize) -> bool { debug_assert!(index / 8 < self.storage.as_ref().len()); let byte_index = index / 8; let byte = self.storage.as_ref()[byte_index]; Self::extract_bit(byte, index) } #[inline] pub unsafe fn raw_get_bit(this: *const Self, index: usize) -> bool { debug_assert!(index / 8 < core::mem::size_of::()); let byte_index = index / 8; let byte = unsafe { *(core::ptr::addr_of!((*this).storage) as *const u8).offset(byte_index as isize) }; Self::extract_bit(byte, index) } #[inline] fn change_bit(byte: u8, index: usize, val: bool) -> u8 { let bit_index = if cfg!(target_endian = "big") { 7 - (index % 8) } else { index % 8 }; let mask = 1 << bit_index; if val { byte | mask } else { byte & !mask } } #[inline] pub fn set_bit(&mut self, index: usize, val: bool) { debug_assert!(index / 8 < self.storage.as_ref().len()); let byte_index = index / 8; let byte = &mut self.storage.as_mut()[byte_index]; *byte = Self::change_bit(*byte, index, val); } #[inline] pub unsafe fn raw_set_bit(this: *mut Self, index: usize, val: bool) { debug_assert!(index / 8 < core::mem::size_of::()); let byte_index = index / 8; let byte = unsafe { (core::ptr::addr_of_mut!((*this).storage) as *mut u8).offset(byte_index as isize) }; unsafe { *byte = Self::change_bit(*byte, index, val) }; } #[inline] pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 { debug_assert!(bit_width <= 64); debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len()); let mut val = 0; for i in 0..(bit_width as usize) { if self.get_bit(i + bit_offset) { let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; val |= 1 << index; } } val } #[inline] pub unsafe fn raw_get(this: *const Self, bit_offset: usize, bit_width: u8) -> u64 { debug_assert!(bit_width <= 64); debug_assert!(bit_offset / 8 < core::mem::size_of::()); debug_assert!((bit_offset + (bit_width as usize)) / 8 <= core::mem::size_of::()); let mut val = 0; for i in 0..(bit_width as usize) { if unsafe { Self::raw_get_bit(this, i + bit_offset) } { let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; val |= 1 << index; } } val } #[inline] pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) { debug_assert!(bit_width <= 64); debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len()); for i in 0..(bit_width as usize) { let mask = 1 << i; let val_bit_is_set = val & mask == mask; let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; self.set_bit(index + bit_offset, val_bit_is_set); } } #[inline] pub unsafe fn raw_set(this: *mut Self, bit_offset: usize, bit_width: u8, val: u64) { debug_assert!(bit_width <= 64); debug_assert!(bit_offset / 8 < core::mem::size_of::()); debug_assert!((bit_offset + (bit_width as usize)) / 8 <= core::mem::size_of::()); for i in 0..(bit_width as usize) { let mask = 1 << i; let val_bit_is_set = val & mask == mask; let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; unsafe { Self::raw_set_bit(this, index + bit_offset, val_bit_is_set) }; } } } pub const BURN_CDROM: u32 = 0; pub const BURN_CDI: u32 = 16; pub const BURN_CDXA: u32 = 32; pub const BURN_POS_END: u32 = 100; pub const BURN_MODE_BITS: u32 = 127; pub const BURN_MODE0: u32 = 1; pub const BURN_MODE_RAW: u32 = 2; pub const BURN_MODE1: u32 = 4; pub const BURN_MODE2: u32 = 8; pub const BURN_FORM1: u32 = 16; pub const BURN_FORM2: u32 = 32; pub const BURN_AUDIO: u32 = 64; pub const BURN_4CH: u32 = 128; pub const BURN_COPY: u32 = 256; pub const BURN_PREEMPHASIS: u32 = 512; pub const BURN_SUBCODE_P16: u32 = 1024; pub const BURN_SUBCODE_P96: u32 = 2048; pub const BURN_SUBCODE_R96: u32 = 4096; pub const BURN_SCMS: u32 = 8192; pub const BURN_DRIVE_WHITELIST_LEN: u32 = 255; pub const BURN_DRIVE_ADR_LEN: u32 = 1024; pub const BURN_FORMAT_IS_UNFORMATTED: u32 = 1; pub const BURN_FORMAT_IS_FORMATTED: u32 = 2; pub const BURN_FORMAT_IS_UNKNOWN: u32 = 3; pub const BURN_REASONS_LEN: u32 = 4096; pub const BURN_CDTEXT_NUM_GENRES: u32 = 28; pub const BURN_HEADER_VERSION_MAJOR: u32 = 1; pub const BURN_HEADER_VERSION_MINOR: u32 = 5; pub const BURN_HEADER_VERSION_MICRO: u32 = 6; pub const BURN_MSGS_MESSAGE_LEN: u32 = 4096; pub const LIBDAX_AUDIOXTR_STRLEN: u32 = 4096; pub type __off_t = ::std::os::raw::c_long; pub type __time_t = ::std::os::raw::c_long; pub type __suseconds_t = ::std::os::raw::c_long; pub type off_t = __off_t; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct timeval { pub tv_sec: __time_t, pub tv_usec: __suseconds_t, } #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { ["Size of timeval"][::std::mem::size_of::() - 16usize]; ["Alignment of timeval"][::std::mem::align_of::() - 8usize]; ["Offset of field: timeval::tv_sec"][::std::mem::offset_of!(timeval, tv_sec) - 0usize]; ["Offset of field: timeval::tv_usec"][::std::mem::offset_of!(timeval, tv_usec) - 8usize]; }; /// References a physical drive in the system #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_drive { _unused: [u8; 0], } /// References a whole disc #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_disc { _unused: [u8; 0], } /// References a single session on a disc #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_session { _unused: [u8; 0], } /// References a single track on a disc #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_track { _unused: [u8; 0], } /// References a set of write parameters #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_write_opts { _unused: [u8; 0], } /// Packet writing. /// currently unsupported, (for DVD Incremental Streaming use TAO) pub const burn_write_types_BURN_WRITE_PACKET: burn_write_types = 0; /// With CD: Track At Once recording /// 2s gaps between tracks, no fonky lead-ins /// /// With sequential DVD-R[W]: Incremental Streaming /// With DVD+R and BD-R: Track of open size /// With DVD-RAM, DVD+RW, BD-RE: Random Writeable (used sequentially) /// With overwritable DVD-RW: Rigid Restricted Overwrite pub const burn_write_types_BURN_WRITE_TAO: burn_write_types = 1; /// With CD: Session At Once /// Block type MUST be BURN_BLOCK_SAO /// ts A70122: Currently not capable of mixing data and audio tracks. /// /// With sequential DVD-R[W]: Disc-at-once, DAO /// Single session, single track, fixed size mandatory, (-dvd-compat) /// With other DVD or BD media: same as BURN_WRITE_TAO but may demand /// that track size is known in advance. pub const burn_write_types_BURN_WRITE_SAO: burn_write_types = 2; /// With CD: Raw disc at once recording. /// all subcodes must be provided by lib or user /// only raw block types are supported /// With DVD and BD media: not supported. /// /// ts A90901: This had been disabled because its implementation /// relied on code from cdrdao which is not understood /// currently. /// A burn run will abort with \"FATAL\" error message /// if this mode is attempted. /// @since 0.7.2 /// ts A91016: Re-implemented according to ECMA-130 Annex A and B. /// Now understood, explained and not stemming from cdrdao. /// @since 0.7.4 pub const burn_write_types_BURN_WRITE_RAW: burn_write_types = 3; /// In replies this indicates that not any writing will work. /// As parameter for inquiries it indicates that no particular write /// mode shall is specified. /// Do not use for setting a write mode for burning. It will not work. pub const burn_write_types_BURN_WRITE_NONE: burn_write_types = 4; /// Possible disc writing style/modes pub type burn_write_types = ::std::os::raw::c_uint; /// sync, headers, edc/ecc provided by lib/user pub const burn_block_types_BURN_BLOCK_RAW0: burn_block_types = 1; /// sync, headers, edc/ecc and p/q subs provided by lib/user pub const burn_block_types_BURN_BLOCK_RAW16: burn_block_types = 2; /// sync, headers, edc/ecc and packed p-w subs provided by lib/user pub const burn_block_types_BURN_BLOCK_RAW96P: burn_block_types = 4; /// sync, headers, edc/ecc and raw p-w subs provided by lib/user pub const burn_block_types_BURN_BLOCK_RAW96R: burn_block_types = 8; /// only 2048 bytes of user data provided by lib/user pub const burn_block_types_BURN_BLOCK_MODE1: burn_block_types = 256; /// 2336 bytes of user data provided by lib/user pub const burn_block_types_BURN_BLOCK_MODE2R: burn_block_types = 512; /// 2048 bytes of user data provided by lib/user /// subheader provided in write parameters /// are we ever going to support this shit? I vote no. /// (supposed to be supported on all drives...) pub const burn_block_types_BURN_BLOCK_MODE2_PATHETIC: burn_block_types = 1024; /// 2048 bytes of data + 8 byte subheader provided by lib/user /// hey, this is also dumb pub const burn_block_types_BURN_BLOCK_MODE2_LAME: burn_block_types = 2048; /// 2324 bytes of data provided by lib/user /// subheader provided in write parameters /// no sir, I don't like it. pub const burn_block_types_BURN_BLOCK_MODE2_OBSCURE: burn_block_types = 4096; /// 2332 bytes of data supplied by lib/user /// 8 bytes sub header provided in write parameters /// this is the second least suck mode2, and is mandatory for /// all drives to support. pub const burn_block_types_BURN_BLOCK_MODE2_OK: burn_block_types = 8192; /// SAO block sizes are based on cue sheet, so use this. pub const burn_block_types_BURN_BLOCK_SAO: burn_block_types = 16384; /// Data format to send to the drive pub type burn_block_types = ::std::os::raw::c_uint; /// The current status is not yet known pub const burn_disc_status_BURN_DISC_UNREADY: burn_disc_status = 0; /// The drive holds a blank disc. It is ready for writing from scratch. /// Unused multi-session media: /// CD-R, CD-RW, DVD-R, DVD-RW, DVD+R, BD-R /// Blanked multi-session media (i.e. treated by burn_disc_erase()) /// CD-RW, DVD-RW /// Overwritable media with or without valid data /// DVD-RAM, DVD+RW, formatted DVD-RW, BD-RE pub const burn_disc_status_BURN_DISC_BLANK: burn_disc_status = 1; /// There is no disc at all in the drive pub const burn_disc_status_BURN_DISC_EMPTY: burn_disc_status = 2; /// There is an incomplete disc in the drive. It is ready for appending /// another session. /// Written but not yet closed multi-session media /// CD-R, CD-RW, DVD-R, DVD-RW, DVD+R, BD-R pub const burn_disc_status_BURN_DISC_APPENDABLE: burn_disc_status = 3; /// There is a disc with data on it in the drive. It is usable only for /// reading. /// Written and closed multi-session media /// CD-R, CD-RW, DVD-R, DVD-RW, DVD+R, BD-R /// Read-Only media /// CD-ROM, DVD-ROM, BD-ROM /// Note that many DVD-ROM drives report any written media /// as Read-Only media and not by their real media types. pub const burn_disc_status_BURN_DISC_FULL: burn_disc_status = 4; /// The drive was not grabbed when the status was inquired pub const burn_disc_status_BURN_DISC_UNGRABBED: burn_disc_status = 5; /// The media seems to be unsuitable for reading and for writing pub const burn_disc_status_BURN_DISC_UNSUITABLE: burn_disc_status = 6; /// Possible status of the drive in regard to the disc in it. pub type burn_disc_status = ::std::os::raw::c_uint; /// The source is ok pub const burn_source_status_BURN_SOURCE_OK: burn_source_status = 0; /// The source is at end of file pub const burn_source_status_BURN_SOURCE_EOF: burn_source_status = 1; /// The source is unusable pub const burn_source_status_BURN_SOURCE_FAILED: burn_source_status = 2; /// Possible data source return values pub type burn_source_status = ::std::os::raw::c_uint; /// The drive is not in an operation pub const burn_drive_status_BURN_DRIVE_IDLE: burn_drive_status = 0; /// The library is spawning the processes to handle a pending /// operation (A read/write/etc is about to start but hasn't quite /// yet) pub const burn_drive_status_BURN_DRIVE_SPAWNING: burn_drive_status = 1; /// The drive is reading data from a disc pub const burn_drive_status_BURN_DRIVE_READING: burn_drive_status = 2; /// The drive is writing data to a disc pub const burn_drive_status_BURN_DRIVE_WRITING: burn_drive_status = 3; /// The drive is writing Lead-In pub const burn_drive_status_BURN_DRIVE_WRITING_LEADIN: burn_drive_status = 4; /// The drive is writing Lead-Out pub const burn_drive_status_BURN_DRIVE_WRITING_LEADOUT: burn_drive_status = 5; /// The drive is erasing a disc pub const burn_drive_status_BURN_DRIVE_ERASING: burn_drive_status = 6; /// The drive is being grabbed pub const burn_drive_status_BURN_DRIVE_GRABBING: burn_drive_status = 7; /// The drive gets written zeroes before the track payload data pub const burn_drive_status_BURN_DRIVE_WRITING_PREGAP: burn_drive_status = 8; /// The drive is told to close a track (TAO only) pub const burn_drive_status_BURN_DRIVE_CLOSING_TRACK: burn_drive_status = 9; /// The drive is told to close a session (TAO only) pub const burn_drive_status_BURN_DRIVE_CLOSING_SESSION: burn_drive_status = 10; /// The drive is formatting media pub const burn_drive_status_BURN_DRIVE_FORMATTING: burn_drive_status = 11; /// The drive is busy in synchronous read (if you see this then it /// has been interrupted) pub const burn_drive_status_BURN_DRIVE_READING_SYNC: burn_drive_status = 12; /// The drive is busy in synchronous write (if you see this then it /// has been interrupted) pub const burn_drive_status_BURN_DRIVE_WRITING_SYNC: burn_drive_status = 13; /// Possible busy states for a drive pub type burn_drive_status = ::std::os::raw::c_uint; /// Information about a track on a disc - this is from the q sub channel of the /// lead-in area of a disc. The documentation here is very terse. /// See a document such as mmc3 for proper information. /// /// CAUTION : This structure is prone to future extension ! /// /// Do not restrict your application to unsigned char with any counter like /// \"session\", \"point\", \"pmin\", ... /// Do not rely on the current size of a burn_toc_entry. #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_toc_entry { /// Session the track is in pub session: ::std::os::raw::c_uchar, /// Type of data. for this struct to be valid, it must be 1 pub adr: ::std::os::raw::c_uchar, /// Type of data in the track pub control: ::std::os::raw::c_uchar, /// Zero. Always. Really. pub tno: ::std::os::raw::c_uchar, /// Track number or special information pub point: ::std::os::raw::c_uchar, pub min: ::std::os::raw::c_uchar, pub sec: ::std::os::raw::c_uchar, pub frame: ::std::os::raw::c_uchar, pub zero: ::std::os::raw::c_uchar, /// Track start time minutes for normal tracks pub pmin: ::std::os::raw::c_uchar, /// Track start time seconds for normal tracks pub psec: ::std::os::raw::c_uchar, /// Track start time frames for normal tracks pub pframe: ::std::os::raw::c_uchar, pub extensions_valid: ::std::os::raw::c_uchar, pub session_msb: ::std::os::raw::c_uchar, pub point_msb: ::std::os::raw::c_uchar, pub start_lba: ::std::os::raw::c_int, pub track_blocks: ::std::os::raw::c_int, pub last_recorded_address: ::std::os::raw::c_int, pub track_status_bits: ::std::os::raw::c_int, } #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { ["Size of burn_toc_entry"][::std::mem::size_of::() - 32usize]; ["Alignment of burn_toc_entry"][::std::mem::align_of::() - 4usize]; ["Offset of field: burn_toc_entry::session"] [::std::mem::offset_of!(burn_toc_entry, session) - 0usize]; ["Offset of field: burn_toc_entry::adr"][::std::mem::offset_of!(burn_toc_entry, adr) - 1usize]; ["Offset of field: burn_toc_entry::control"] [::std::mem::offset_of!(burn_toc_entry, control) - 2usize]; ["Offset of field: burn_toc_entry::tno"][::std::mem::offset_of!(burn_toc_entry, tno) - 3usize]; ["Offset of field: burn_toc_entry::point"] [::std::mem::offset_of!(burn_toc_entry, point) - 4usize]; ["Offset of field: burn_toc_entry::min"][::std::mem::offset_of!(burn_toc_entry, min) - 5usize]; ["Offset of field: burn_toc_entry::sec"][::std::mem::offset_of!(burn_toc_entry, sec) - 6usize]; ["Offset of field: burn_toc_entry::frame"] [::std::mem::offset_of!(burn_toc_entry, frame) - 7usize]; ["Offset of field: burn_toc_entry::zero"] [::std::mem::offset_of!(burn_toc_entry, zero) - 8usize]; ["Offset of field: burn_toc_entry::pmin"] [::std::mem::offset_of!(burn_toc_entry, pmin) - 9usize]; ["Offset of field: burn_toc_entry::psec"] [::std::mem::offset_of!(burn_toc_entry, psec) - 10usize]; ["Offset of field: burn_toc_entry::pframe"] [::std::mem::offset_of!(burn_toc_entry, pframe) - 11usize]; ["Offset of field: burn_toc_entry::extensions_valid"] [::std::mem::offset_of!(burn_toc_entry, extensions_valid) - 12usize]; ["Offset of field: burn_toc_entry::session_msb"] [::std::mem::offset_of!(burn_toc_entry, session_msb) - 13usize]; ["Offset of field: burn_toc_entry::point_msb"] [::std::mem::offset_of!(burn_toc_entry, point_msb) - 14usize]; ["Offset of field: burn_toc_entry::start_lba"] [::std::mem::offset_of!(burn_toc_entry, start_lba) - 16usize]; ["Offset of field: burn_toc_entry::track_blocks"] [::std::mem::offset_of!(burn_toc_entry, track_blocks) - 20usize]; ["Offset of field: burn_toc_entry::last_recorded_address"] [::std::mem::offset_of!(burn_toc_entry, last_recorded_address) - 24usize]; ["Offset of field: burn_toc_entry::track_status_bits"] [::std::mem::offset_of!(burn_toc_entry, track_status_bits) - 28usize]; }; /// Data source interface for tracks. /// This allows you to use arbitrary program code as provider of track input /// data. /// /// Objects compliant to this interface are either provided by the application /// or by API calls of libburn: burn_fd_source_new() , burn_file_source_new(), /// and burn_fifo_source_new(). /// /// The API calls may use any file object as data source. Consider to feed /// an eventual custom data stream asynchronously into a pipe(2) and to let /// libburn handle the rest. /// In this case the following rule applies: /// Call burn_source_free() exactly once for every source obtained from /// libburn API. You MUST NOT otherwise use or manipulate its components. /// /// In general, burn_source objects can be freed as soon as they are attached /// to track objects. The track objects will keep them alive and dispose them /// when they are no longer needed. With a fifo burn_source it makes sense to /// keep the own reference for inquiring its state while burning is in /// progress. /// /// --- /// /// The following description of burn_source applies only to application /// implemented burn_source objects. You need not to know it for API provided /// ones. /// /// If you really implement an own passive data producer by this interface, /// then beware: it can do anything and it can spoil everything. /// /// In this case the functions (*read), (*get_size), (*set_size), (*free_data) /// MUST be implemented by the application and attached to the object at /// creation time. /// Function (*read_sub) is allowed to be NULL or it MUST be implemented and /// attached. /// /// burn_source.refcount MUST be handled properly: If not exactly as many /// references are freed as have been obtained, then either memory leaks or /// corrupted memory are the consequence. /// All objects which are referred to by *data must be kept existent until /// (*free_data) is called via burn_source_free() by the last referer. #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_source { /// Reference count for the data source. MUST be 1 when a new source /// is created and thus the first reference is handed out. Increment /// it to take more references for yourself. Use burn_source_free() /// to destroy your references to it. pub refcount: ::std::os::raw::c_int, /// Read data from the source. Semantics like with read(2), but MUST /// either deliver the full buffer as defined by size or MUST deliver /// EOF (return 0) or failure (return -1) at this call or at the /// next following call. I.e. the only incomplete buffer may be the /// last one from that source. /// libburn will read a single sector by each call to (*read). /// The size of a sector depends on BURN_MODE_*. The known range is /// 2048 to 2352. /// /// If this call is reading from a pipe then it will learn /// about the end of data only when that pipe gets closed on the /// feeder side. So if the track size is not fixed or if the pipe /// delivers less than the predicted amount or if the size is not /// block aligned, then burning will halt until the input process /// closes the pipe. /// /// IMPORTANT: /// If this function pointer is NULL, then the struct burn_source is of /// version >= 1 and the job of .(*read)() is done by .(*read_xt)(). /// See below, member .version. pub read: ::std::option::Option< unsafe extern "C" fn( arg1: *mut burn_source, buffer: *mut ::std::os::raw::c_uchar, size: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int, >, /// Read subchannel data from the source (NULL if lib generated) /// WARNING: This is an obscure feature with CD raw write modes. /// Unless you checked the libburn code for correctness in that aspect /// you should not rely on raw writing with own subchannels. /// ADVICE: Set this pointer to NULL. pub read_sub: ::std::option::Option< unsafe extern "C" fn( arg1: *mut burn_source, buffer: *mut ::std::os::raw::c_uchar, size: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int, >, /// Get the size of the source's data. Return 0 means unpredictable /// size. If application provided (*get_size) might return 0, then /// the application MUST provide a fully functional (*set_size). pub get_size: ::std::option::Option off_t>, /// Program the reply of (*get_size) to a fixed value. It is advised /// to implement this by a attribute off_t fixed_size; in *data . /// The read() function does not have to take into respect this fake /// setting. It is rather a note of libburn to itself. Eventually /// necessary truncation or padding is done in libburn. Truncation /// is usually considered a misburn. Padding is considered ok. /// /// libburn is supposed to work even if (*get_size) ignores the /// setting by (*set_size). But your application will not be able to /// enforce fixed track sizes by burn_track_set_size() and possibly /// even padding might be left out. pub set_size: ::std::option::Option< unsafe extern "C" fn(source: *mut burn_source, size: off_t) -> ::std::os::raw::c_int, >, /// Clean up the source specific data. This function will be called /// once by burn_source_free() when the last referer disposes the /// source. pub free_data: ::std::option::Option, /// Next source, for when a source runs dry and padding is disabled /// WARNING: This is an obscure feature. Set to NULL at creation and /// from then on leave untouched and uninterpreted. pub next: *mut burn_source, /// Source specific data. Here the various source classes express their /// specific properties and the instance objects store their individual /// management data. /// E.g. data could point to a struct like this: /// struct app_burn_source /// { /// struct my_app *app_handle; /// ... other individual source parameters ... /// off_t fixed_size; /// }; /// /// Function (*free_data) has to be prepared to clean up and free /// the struct. pub data: *mut ::std::os::raw::c_void, /// Valid only if above member .(*read)() is NULL. This indicates a /// version of struct burn_source younger than 0. /// From then on, member .version tells which further members exist /// in the memory layout of struct burn_source. libburn will only touch /// those announced extensions. /// /// Versions: /// 0 has .(*read)() != NULL, not even .version is present. /// 1 has .version, .(*read_xt)(), .(*cancel)() pub version: ::std::os::raw::c_int, /// This substitutes for (*read)() in versions above 0. pub read_xt: ::std::option::Option< unsafe extern "C" fn( arg1: *mut burn_source, buffer: *mut ::std::os::raw::c_uchar, size: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int, >, /// Informs the burn_source that the consumer of data prematurely /// ended reading. This call may or may not be issued by libburn /// before (*free_data)() is called. pub cancel: ::std::option::Option< unsafe extern "C" fn(source: *mut burn_source) -> ::std::os::raw::c_int, >, } #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { ["Size of burn_source"][::std::mem::size_of::() - 88usize]; ["Alignment of burn_source"][::std::mem::align_of::() - 8usize]; ["Offset of field: burn_source::refcount"] [::std::mem::offset_of!(burn_source, refcount) - 0usize]; ["Offset of field: burn_source::read"][::std::mem::offset_of!(burn_source, read) - 8usize]; ["Offset of field: burn_source::read_sub"] [::std::mem::offset_of!(burn_source, read_sub) - 16usize]; ["Offset of field: burn_source::get_size"] [::std::mem::offset_of!(burn_source, get_size) - 24usize]; ["Offset of field: burn_source::set_size"] [::std::mem::offset_of!(burn_source, set_size) - 32usize]; ["Offset of field: burn_source::free_data"] [::std::mem::offset_of!(burn_source, free_data) - 40usize]; ["Offset of field: burn_source::next"][::std::mem::offset_of!(burn_source, next) - 48usize]; ["Offset of field: burn_source::data"][::std::mem::offset_of!(burn_source, data) - 56usize]; ["Offset of field: burn_source::version"] [::std::mem::offset_of!(burn_source, version) - 64usize]; ["Offset of field: burn_source::read_xt"] [::std::mem::offset_of!(burn_source, read_xt) - 72usize]; ["Offset of field: burn_source::cancel"][::std::mem::offset_of!(burn_source, cancel) - 80usize]; }; /// Information on a drive in the system #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_drive_info { /// Name of the vendor of the drive pub vendor: [::std::os::raw::c_char; 9usize], /// Name of the drive pub product: [::std::os::raw::c_char; 17usize], /// Revision of the drive pub revision: [::std::os::raw::c_char; 5usize], /// Invalid: Was: \"Location of the drive in the filesystem.\" */ /// /** This string has no meaning any more. Once it stored the drive /// device file address. Now always use function burn_drive_d_get_adr() /// to inquire a device file address. ^^^^^ ALWAYS ^^^^^^^ pub location: [::std::os::raw::c_char; 17usize], pub _bitfield_align_1: [u8; 0], pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, /// DEPRECATED: The size of the drive's buffer (in kilobytes) pub buffer_size: ::std::os::raw::c_int, /// The supported block types in tao mode. /// They should be tested with the desired block type. /// See also burn_block_types. pub tao_block_types: ::std::os::raw::c_int, /// The supported block types in sao mode. /// They should be tested with the desired block type. /// See also burn_block_types. pub sao_block_types: ::std::os::raw::c_int, /// The supported block types in raw mode. /// They should be tested with the desired block type. /// See also burn_block_types. pub raw_block_types: ::std::os::raw::c_int, /// The supported block types in packet mode. /// They should be tested with the desired block type. /// See also burn_block_types. pub packet_block_types: ::std::os::raw::c_int, /// The value by which this drive can be indexed when using functions /// in the library. This is the value to pass to all libbburn functions /// that operate on a drive. pub drive: *mut burn_drive, } #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { ["Size of burn_drive_info"][::std::mem::size_of::() - 80usize]; ["Alignment of burn_drive_info"][::std::mem::align_of::() - 8usize]; ["Offset of field: burn_drive_info::vendor"] [::std::mem::offset_of!(burn_drive_info, vendor) - 0usize]; ["Offset of field: burn_drive_info::product"] [::std::mem::offset_of!(burn_drive_info, product) - 9usize]; ["Offset of field: burn_drive_info::revision"] [::std::mem::offset_of!(burn_drive_info, revision) - 26usize]; ["Offset of field: burn_drive_info::location"] [::std::mem::offset_of!(burn_drive_info, location) - 31usize]; ["Offset of field: burn_drive_info::buffer_size"] [::std::mem::offset_of!(burn_drive_info, buffer_size) - 52usize]; ["Offset of field: burn_drive_info::tao_block_types"] [::std::mem::offset_of!(burn_drive_info, tao_block_types) - 56usize]; ["Offset of field: burn_drive_info::sao_block_types"] [::std::mem::offset_of!(burn_drive_info, sao_block_types) - 60usize]; ["Offset of field: burn_drive_info::raw_block_types"] [::std::mem::offset_of!(burn_drive_info, raw_block_types) - 64usize]; ["Offset of field: burn_drive_info::packet_block_types"] [::std::mem::offset_of!(burn_drive_info, packet_block_types) - 68usize]; ["Offset of field: burn_drive_info::drive"] [::std::mem::offset_of!(burn_drive_info, drive) - 72usize]; }; impl burn_drive_info { #[inline] pub fn read_dvdram(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } } #[inline] pub fn set_read_dvdram(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(0usize, 1u8, val as u64) } } #[inline] pub unsafe fn read_dvdram_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 0usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_read_dvdram_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 0usize, 1u8, val as u64, ) } } #[inline] pub fn read_dvdr(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) } } #[inline] pub fn set_read_dvdr(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(1usize, 1u8, val as u64) } } #[inline] pub unsafe fn read_dvdr_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 1usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_read_dvdr_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 1usize, 1u8, val as u64, ) } } #[inline] pub fn read_dvdrom(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) } } #[inline] pub fn set_read_dvdrom(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(2usize, 1u8, val as u64) } } #[inline] pub unsafe fn read_dvdrom_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 2usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_read_dvdrom_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 2usize, 1u8, val as u64, ) } } #[inline] pub fn read_cdr(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } } #[inline] pub fn set_read_cdr(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(3usize, 1u8, val as u64) } } #[inline] pub unsafe fn read_cdr_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 3usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_read_cdr_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 3usize, 1u8, val as u64, ) } } #[inline] pub fn read_cdrw(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } } #[inline] pub fn set_read_cdrw(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(4usize, 1u8, val as u64) } } #[inline] pub unsafe fn read_cdrw_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 4usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_read_cdrw_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 4usize, 1u8, val as u64, ) } } #[inline] pub fn write_dvdram(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } } #[inline] pub fn set_write_dvdram(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(5usize, 1u8, val as u64) } } #[inline] pub unsafe fn write_dvdram_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 5usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_write_dvdram_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 5usize, 1u8, val as u64, ) } } #[inline] pub fn write_dvdr(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } } #[inline] pub fn set_write_dvdr(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(6usize, 1u8, val as u64) } } #[inline] pub unsafe fn write_dvdr_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 6usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_write_dvdr_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 6usize, 1u8, val as u64, ) } } #[inline] pub fn write_cdr(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u32) } } #[inline] pub fn set_write_cdr(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(7usize, 1u8, val as u64) } } #[inline] pub unsafe fn write_cdr_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 7usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_write_cdr_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 7usize, 1u8, val as u64, ) } } #[inline] pub fn write_cdrw(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u32) } } #[inline] pub fn set_write_cdrw(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(8usize, 1u8, val as u64) } } #[inline] pub unsafe fn write_cdrw_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 8usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_write_cdrw_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 8usize, 1u8, val as u64, ) } } #[inline] pub fn write_simulate(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u32) } } #[inline] pub fn set_write_simulate(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(9usize, 1u8, val as u64) } } #[inline] pub unsafe fn write_simulate_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 9usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_write_simulate_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 9usize, 1u8, val as u64, ) } } #[inline] pub fn c2_errors(&self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u32) } } #[inline] pub fn set_c2_errors(&mut self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); self._bitfield_1.set(10usize, 1u8, val as u64) } } #[inline] pub unsafe fn c2_errors_raw(this: *const Self) -> ::std::os::raw::c_uint { unsafe { ::std::mem::transmute(<__BindgenBitfieldUnit<[u8; 2usize]>>::raw_get( ::std::ptr::addr_of!((*this)._bitfield_1), 10usize, 1u8, ) as u32) } } #[inline] pub unsafe fn set_c2_errors_raw(this: *mut Self, val: ::std::os::raw::c_uint) { unsafe { let val: u32 = ::std::mem::transmute(val); <__BindgenBitfieldUnit<[u8; 2usize]>>::raw_set( ::std::ptr::addr_of_mut!((*this)._bitfield_1), 10usize, 1u8, val as u64, ) } } #[inline] pub fn new_bitfield_1( read_dvdram: ::std::os::raw::c_uint, read_dvdr: ::std::os::raw::c_uint, read_dvdrom: ::std::os::raw::c_uint, read_cdr: ::std::os::raw::c_uint, read_cdrw: ::std::os::raw::c_uint, write_dvdram: ::std::os::raw::c_uint, write_dvdr: ::std::os::raw::c_uint, write_cdr: ::std::os::raw::c_uint, write_cdrw: ::std::os::raw::c_uint, write_simulate: ::std::os::raw::c_uint, c2_errors: ::std::os::raw::c_uint, ) -> __BindgenBitfieldUnit<[u8; 2usize]> { let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); __bindgen_bitfield_unit.set(0usize, 1u8, { let read_dvdram: u32 = unsafe { ::std::mem::transmute(read_dvdram) }; read_dvdram as u64 }); __bindgen_bitfield_unit.set(1usize, 1u8, { let read_dvdr: u32 = unsafe { ::std::mem::transmute(read_dvdr) }; read_dvdr as u64 }); __bindgen_bitfield_unit.set(2usize, 1u8, { let read_dvdrom: u32 = unsafe { ::std::mem::transmute(read_dvdrom) }; read_dvdrom as u64 }); __bindgen_bitfield_unit.set(3usize, 1u8, { let read_cdr: u32 = unsafe { ::std::mem::transmute(read_cdr) }; read_cdr as u64 }); __bindgen_bitfield_unit.set(4usize, 1u8, { let read_cdrw: u32 = unsafe { ::std::mem::transmute(read_cdrw) }; read_cdrw as u64 }); __bindgen_bitfield_unit.set(5usize, 1u8, { let write_dvdram: u32 = unsafe { ::std::mem::transmute(write_dvdram) }; write_dvdram as u64 }); __bindgen_bitfield_unit.set(6usize, 1u8, { let write_dvdr: u32 = unsafe { ::std::mem::transmute(write_dvdr) }; write_dvdr as u64 }); __bindgen_bitfield_unit.set(7usize, 1u8, { let write_cdr: u32 = unsafe { ::std::mem::transmute(write_cdr) }; write_cdr as u64 }); __bindgen_bitfield_unit.set(8usize, 1u8, { let write_cdrw: u32 = unsafe { ::std::mem::transmute(write_cdrw) }; write_cdrw as u64 }); __bindgen_bitfield_unit.set(9usize, 1u8, { let write_simulate: u32 = unsafe { ::std::mem::transmute(write_simulate) }; write_simulate as u64 }); __bindgen_bitfield_unit.set(10usize, 1u8, { let c2_errors: u32 = unsafe { ::std::mem::transmute(c2_errors) }; c2_errors as u64 }); __bindgen_bitfield_unit } } /// Operation progress report. All values are 0 based indices. #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_progress { /// The total number of sessions pub sessions: ::std::os::raw::c_int, /// Current session. pub session: ::std::os::raw::c_int, /// The total number of tracks pub tracks: ::std::os::raw::c_int, /// Current track. pub track: ::std::os::raw::c_int, /// The total number of indices pub indices: ::std::os::raw::c_int, /// Current index. pub index: ::std::os::raw::c_int, /// The starting logical block address pub start_sector: ::std::os::raw::c_int, /// On write: The number of sectors. /// On blank: 0x10000 as upper limit for relative progress steps pub sectors: ::std::os::raw::c_int, /// On write: The current sector being processed. /// On blank: Relative progress steps 0 to 0x10000 pub sector: ::std::os::raw::c_int, /// The capacity of the drive buffer pub buffer_capacity: ::std::os::raw::c_uint, /// The free space in the drive buffer (might be slightly outdated) pub buffer_available: ::std::os::raw::c_uint, /// The number of bytes sent to the drive buffer pub buffered_bytes: off_t, /// The minimum number of bytes stored in buffer during write. /// (Caution: Before surely one buffer size of bytes was processed, /// this value is 0xffffffff.) pub buffer_min_fill: ::std::os::raw::c_uint, } #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { ["Size of burn_progress"][::std::mem::size_of::() - 64usize]; ["Alignment of burn_progress"][::std::mem::align_of::() - 8usize]; ["Offset of field: burn_progress::sessions"] [::std::mem::offset_of!(burn_progress, sessions) - 0usize]; ["Offset of field: burn_progress::session"] [::std::mem::offset_of!(burn_progress, session) - 4usize]; ["Offset of field: burn_progress::tracks"] [::std::mem::offset_of!(burn_progress, tracks) - 8usize]; ["Offset of field: burn_progress::track"] [::std::mem::offset_of!(burn_progress, track) - 12usize]; ["Offset of field: burn_progress::indices"] [::std::mem::offset_of!(burn_progress, indices) - 16usize]; ["Offset of field: burn_progress::index"] [::std::mem::offset_of!(burn_progress, index) - 20usize]; ["Offset of field: burn_progress::start_sector"] [::std::mem::offset_of!(burn_progress, start_sector) - 24usize]; ["Offset of field: burn_progress::sectors"] [::std::mem::offset_of!(burn_progress, sectors) - 28usize]; ["Offset of field: burn_progress::sector"] [::std::mem::offset_of!(burn_progress, sector) - 32usize]; ["Offset of field: burn_progress::buffer_capacity"] [::std::mem::offset_of!(burn_progress, buffer_capacity) - 36usize]; ["Offset of field: burn_progress::buffer_available"] [::std::mem::offset_of!(burn_progress, buffer_available) - 40usize]; ["Offset of field: burn_progress::buffered_bytes"] [::std::mem::offset_of!(burn_progress, buffered_bytes) - 48usize]; ["Offset of field: burn_progress::buffer_min_fill"] [::std::mem::offset_of!(burn_progress, buffer_min_fill) - 56usize]; }; /// Description of a speed capability as reported by the drive in conjunction /// with eventually loaded media. There can be more than one such object per /// drive. So they are chained via .next and .prev , where NULL marks the end /// of the chain. This list is set up by burn_drive_scan() and gets updated /// by burn_drive_grab(). /// A copy may be obtained by burn_drive_get_speedlist() and disposed by /// burn_drive_free_speedlist(). /// For technical background info see SCSI specs MMC and SPC: /// mode page 2Ah (from SPC 5Ah MODE SENSE) , mmc3r10g.pdf , 6.3.11 Table 364 /// ACh GET PERFORMANCE, Type 03h , mmc5r03c.pdf , 6.8.5.3 Table 312 #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_speed_descriptor { /// Where this info comes from : /// 0 = misc /// 1 = mode page 2Ah /// 2 = ACh GET PERFORMANCE Type 03h /// 3 = ACh GET PERFORMANCE Type 00h Data Type 10h (read speed) pub source: ::std::os::raw::c_int, /// The media type that was current at the time of report /// -2 = state unknown, -1 = no media was loaded , else see /// burn_disc_get_profile() pub profile_loaded: ::std::os::raw::c_int, pub profile_name: [::std::os::raw::c_char; 80usize], /// The attributed capacity of appropriate media in logical block units /// i.e. 2352 raw bytes or 2048 data bytes. -1 = capacity unknown. pub end_lba: ::std::os::raw::c_int, /// Speed is given in 1000 bytes/s , 0 = invalid. The numbers /// are supposed to be usable with burn_drive_set_speed() pub write_speed: ::std::os::raw::c_int, pub read_speed: ::std::os::raw::c_int, /// Expert info from ACh GET PERFORMANCE and/or mode page 2Ah. /// Expect values other than 0 or 1 to get a meaning in future. pub wrc: ::std::os::raw::c_int, pub exact: ::std::os::raw::c_int, pub mrw: ::std::os::raw::c_int, /// List chaining. Use .next until NULL to iterate over the list pub prev: *mut burn_speed_descriptor, pub next: *mut burn_speed_descriptor, } #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { ["Size of burn_speed_descriptor"][::std::mem::size_of::() - 128usize]; ["Alignment of burn_speed_descriptor"] [::std::mem::align_of::() - 8usize]; ["Offset of field: burn_speed_descriptor::source"] [::std::mem::offset_of!(burn_speed_descriptor, source) - 0usize]; ["Offset of field: burn_speed_descriptor::profile_loaded"] [::std::mem::offset_of!(burn_speed_descriptor, profile_loaded) - 4usize]; ["Offset of field: burn_speed_descriptor::profile_name"] [::std::mem::offset_of!(burn_speed_descriptor, profile_name) - 8usize]; ["Offset of field: burn_speed_descriptor::end_lba"] [::std::mem::offset_of!(burn_speed_descriptor, end_lba) - 88usize]; ["Offset of field: burn_speed_descriptor::write_speed"] [::std::mem::offset_of!(burn_speed_descriptor, write_speed) - 92usize]; ["Offset of field: burn_speed_descriptor::read_speed"] [::std::mem::offset_of!(burn_speed_descriptor, read_speed) - 96usize]; ["Offset of field: burn_speed_descriptor::wrc"] [::std::mem::offset_of!(burn_speed_descriptor, wrc) - 100usize]; ["Offset of field: burn_speed_descriptor::exact"] [::std::mem::offset_of!(burn_speed_descriptor, exact) - 104usize]; ["Offset of field: burn_speed_descriptor::mrw"] [::std::mem::offset_of!(burn_speed_descriptor, mrw) - 108usize]; ["Offset of field: burn_speed_descriptor::prev"] [::std::mem::offset_of!(burn_speed_descriptor, prev) - 112usize]; ["Offset of field: burn_speed_descriptor::next"] [::std::mem::offset_of!(burn_speed_descriptor, next) - 120usize]; }; unsafe extern "C" { /// Initialize the library. /// This must be called before using any other functions in the library. It /// may be called more than once with no effect. /// It is possible to 'restart' the library by shutting it down and /// re-initializing it. Once this was necessary if you follow the older and /// more general way of accessing a drive via burn_drive_scan() and /// burn_drive_grab(). See burn_drive_scan_and_grab() with its strong /// urges and its explanations. /// @return Nonzero if the library was able to initialize; zero if /// initialization failed. pub fn burn_initialize() -> ::std::os::raw::c_int; } unsafe extern "C" { /// Shutdown the library. /// This should be called before exiting your application. Make sure that all /// drives you have grabbed are released before calling this. pub fn burn_finish(); } unsafe extern "C" { /// Abort any running drive operation and eventually call burn_finish(). /// /// You MUST shut down the busy drives if an aborting event occurs during a /// burn run. For that you may call this function either from your own signal /// handling code or indirectly by activating the built-in signal handling: /// burn_set_signal_handling(\"my_app_name : \", NULL, 0); /// Else you may eventually call burn_drive_cancel() on the active drives and /// wait for them to assume state BURN_DRIVE_IDLE. /// @param patience Maximum number of seconds to wait for drives to /// finish. /// @since 0.7.8 : /// If this is -1, then only the cancel operations will /// be performed and no burn_finish() will happen. /// @param pacifier_func If not NULL: a function to produce appeasing messages. /// See burn_abort_pacifier() for an example. /// @param handle Opaque handle to be used with pacifier_func /// @return 1 ok, all went well /// 0 had to leave a drive in unclean state /// <0 severe error, do no use libburn again /// @since 0.2.6 pub fn burn_abort( patience: ::std::os::raw::c_int, pacifier_func: ::std::option::Option< unsafe extern "C" fn( handle: *mut ::std::os::raw::c_void, patience: ::std::os::raw::c_int, elapsed: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int, >, handle: *mut ::std::os::raw::c_void, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// A pacifier function suitable for burn_abort. /// @param handle If not NULL, a pointer to a text suitable for printf(\"%s\") /// @param patience Maximum number of seconds to wait /// @param elapsed Elapsed number of seconds pub fn burn_abort_pacifier( handle: *mut ::std::os::raw::c_void, patience: ::std::os::raw::c_int, elapsed: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// ts A61006 : This is for development only. Not suitable for applications. /// Set the verbosity level of the library. The default value is 0, which means /// that nothing is output on stderr. The more you increase this, the more /// debug output should be displayed on stderr for you. /// @param level The verbosity level desired. 0 for nothing, higher positive /// values for more information output. pub fn burn_set_verbosity(level: ::std::os::raw::c_int); } unsafe extern "C" { /// Enable or disable logging of SCSI commands. /// This call can be made at any time - even before burn_initialize(). /// It is in effect for all active drives and currently not very thread /// safe for multiple drives. /// @param flag Bitfield for control purposes. The default is 0. /// bit0= log to file /tmp/libburn_sg_command_log /// bit1= log to stderr /// bit2= flush output after each line /// @since 0.7.4 pub fn burn_set_scsi_logging(flag: ::std::os::raw::c_int); } unsafe extern "C" { /// Set parameters for behavior on opening device files. To be called early /// after burn_initialize() and before any bus scan. But not mandatory at all. /// Parameter value 1 enables a feature, 0 disables. /// Default is (1,0,0). Have a good reason before you change it. /// @param exclusive /// 0 = no attempt to make drive access exclusive. /// 1 = Try to open only devices which are not marked as busy /// and try to mark them busy if opened successfully. (O_EXCL /// on GNU/Linux , flock(LOCK_EX) on FreeBSD.) /// 2 = in case of a SCSI device, also try to open exclusively /// the matching /dev/sr, /dev/scd and /dev/st . /// One may select a device SCSI file family by adding /// 0 = default family /// 4 = /dev/sr%d /// 8 = /dev/scd%d /// 16 = /dev/sg%d /// Do not use other values ! /// Add 32 to demand on GNU/Linux an exclusive lock by /// fcntl(,F_SETLK,) after open() has succeeded. /// @param blocking Try to wait for drives which do not open immediately but /// also do not return an error as well. (O_NONBLOCK) /// This might stall indefinitely with /dev/hdX hard disks. /// @param abort_on_busy Unconditionally abort process when a non blocking /// exclusive opening attempt indicates a busy drive. /// Use this only after thorough tests with your app. /// @since 0.2.2 pub fn burn_preset_device_open( exclusive: ::std::os::raw::c_int, blocking: ::std::os::raw::c_int, abort_on_busy: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Allows the use of media types which are implemented in libburn but not yet /// tested. The list of those untested profiles is subject to change. /// - Currently no media types are under test reservation - /// If you really test such media, then please report the outcome on /// libburn-hackers@pykix.org /// If ever then this call should be done soon after burn_initialize() before /// any drive scanning. /// @param yes 1=allow all implemented profiles, 0=only tested media (default) /// @since 0.3.4 pub fn burn_allow_untested_profiles(yes: ::std::os::raw::c_int); } unsafe extern "C" { /// Acquire a drive with known device file address. /// /// This is the sysadmin friendly way to open one drive and to leave all /// others untouched. It bundles the following API calls to form a /// non-obtrusive way to use libburn: /// burn_drive_add_whitelist() , burn_drive_scan() , burn_drive_grab() /// You are *strongly urged* to use this call whenever you know the drive /// address in advance. /// /// If not, then you have to use directly above calls. In that case, you are /// strongly urged* to drop any unintended drive which will be exclusively /// occupied and not closed by burn_drive_scan(). /// This can be done by shutting down the library including a call to /// burn_finish(). You may later start a new libburn session and should then /// use the function described here with an address obtained after /// burn_drive_scan() via burn_drive_d_get_adr(drive_infos[driveno].drive,adr). /// Another way is to drop the unwanted drives by burn_drive_info_forget(). /// /// Operating on multiple drives: /// /// Different than with burn_drive_scan() it is allowed to call /// burn_drive_scan_and_grab() without giving up any other scanned drives. So /// this call can be used to get a collection of more than one acquired drives. /// The attempt to acquire the same drive twice will fail, though. /// /// Pseudo-drives: /// /// burn_drive_scan_and_grab() is able to acquire virtual drives which will /// accept options much like a MMC burner drive. Many of those options will not /// cause any effect, though. The address of a pseudo-drive begins with /// prefix \"stdio:\" followed by a path. /// Examples: \"stdio:/tmp/pseudo_drive\" , \"stdio:/dev/null\" , \"stdio:-\" /// /// If the path is empty, the result is a null-drive = drive role 0. /// It pretends to have loaded no media and supports no reading or writing. /// /// If the path leads to an existing regular file, or to a not yet existing /// file, or to an existing block device, then the result is a random access /// stdio-drive capable of reading and writing = drive role 2. /// /// If the path leads to an existing file of any type other than directory, /// then the result is a sequential write-only stdio-drive = drive role 3. /// /// The special address form \"stdio:/dev/fd/{number}\" is interpreted literally /// as reference to open file descriptor {number}. This address form coincides /// with real files on some systems, but it is in fact hardcoded in libburn. /// Special address \"stdio:-\" means stdout = \"stdio:/dev/fd/1\". /// The role of such a drive is determined by the file type obtained via /// fstat({number}). /// /// Roles 2 and 3 perform all their eventual data transfer activities on a file /// via standard i/o functions open(2), lseek(2), read(2), write(2), close(2). /// The media profile is reported as 0xffff. Write space information from those /// media is not necessarily realistic. /// /// The capabilities of role 2 resemble DVD-RAM but it can simulate writing. /// If the path does not exist in the filesystem yet, it is attempted to create /// it as a regular file as soon as write operations are started. /// /// The capabilities of role 3 resemble a blank DVD-R. Nevertheless each /// burn_disc_write() run may only write a single track. /// /// One may distinguish pseudo-drives from MMC drives by call /// burn_drive_get_drive_role(). /// /// @param drive_infos On success returns a one element array with the drive /// (cdrom/burner). Thus use with driveno 0 only. On failure /// the array has no valid elements at all. /// The returned array should be freed via burn_drive_info_free() /// when it is no longer needed. /// This is a result from call burn_drive_scan(). See there. /// Use with driveno 0 only. /// @param adr The device file address of the desired drive. Either once /// obtained by burn_drive_d_get_adr() or composed skillfully by /// application or its user. E.g. \"/dev/sr0\". /// Consider to preprocess it by burn_drive_convert_fs_adr(). /// @param load Nonzero to make the drive attempt to load a disc (close its /// tray door, etc). /// @return 1 = success , 0 = drive not found , -1 = other error /// @since 0.2.2 pub fn burn_drive_scan_and_grab( drive_infos: *mut *mut burn_drive_info, adr: *mut ::std::os::raw::c_char, load: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Add a device to the list of permissible drives. As soon as some entry is in /// the whitelist all non-listed drives are banned from scanning. /// @return 1 success, <=0 failure /// @since 0.2.2 pub fn burn_drive_add_whitelist( device_address: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Remove all drives from whitelist. This enables all possible drives. pub fn burn_drive_clear_whitelist(); } unsafe extern "C" { /// Scan for drives. This function MUST be called until it returns nonzero. /// In case of re-scanning: /// All pointers to struct burn_drive and all struct burn_drive_info arrays /// are invalidated by using this function. Do NOT store drive pointers across /// calls to this function ! /// To avoid invalid pointers one MUST free all burn_drive_info arrays /// by burn_drive_info_free() before calling burn_drive_scan() a second time. /// If there are drives left, then burn_drive_scan() will refuse to work. /// /// After this call all drives depicted by the returned array are subject /// to eventual (O_EXCL) locking. See burn_preset_device_open(). This state /// ends either with burn_drive_info_forget() or with burn_drive_release(). /// It is unfriendly to other processes on the system to hold drives locked /// which one does not definitely plan to use soon. /// @param drive_infos Returns an array of drive info items (cdroms/burners). /// The returned array must be freed by burn_drive_info_free() /// before burn_finish(), and also before calling this function /// burn_drive_scan() again. /// @param n_drives Returns the number of drive items in drive_infos. /// @return 0 while scanning is not complete /// >0 when it is finished successfully, /// <0 when finished but failed. pub fn burn_drive_scan( drive_infos: *mut *mut burn_drive_info, n_drives: *mut ::std::os::raw::c_uint, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Release memory about a single drive and any exclusive lock on it. /// Become unable to inquire or grab it. Expect FATAL consequences if you try. /// @param drive_info pointer to a single element out of the array /// obtained from burn_drive_scan() : &(drive_infos[driveno]) /// @param force controls degree of permissible drive usage at the moment this /// function is called, and the amount of automatically provided /// drive shutdown : /// 0= drive must be ungrabbed and BURN_DRIVE_IDLE /// 1= try to release drive even if in state BURN_DRIVE_GRABBING /// Use these two only. Further values are to be defined. /// @return 1 on success, 2 if drive was already forgotten, /// 0 if not permissible, <0 on other failures, /// @since 0.2.2 pub fn burn_drive_info_forget( drive_info: *mut burn_drive_info, force: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// When no longer needed, free a whole burn_drive_info array which was /// returned by burn_drive_scan(). /// For freeing single drive array elements use burn_drive_info_forget(). pub fn burn_drive_info_free(drive_infos: *mut burn_drive_info); } unsafe extern "C" { /// Inquire the device file address of the given drive. /// @param drive The drive to inquire. /// @param adr An application provided array of at least BURN_DRIVE_ADR_LEN /// characters size. The device file address gets copied to it. /// @return >0 success , <=0 error (due to libburn internal problem) /// @since 0.4.0 pub fn burn_drive_d_get_adr( drive: *mut burn_drive, adr: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Inquire the device file address of a drive via a given drive_info object. /// (Note: This is a legacy call.) /// @param drive_info The drive to inquire.Usually some &(drive_infos[driveno]) /// @param adr An application provided array of at least BURN_DRIVE_ADR_LEN /// characters size. The device file address gets copied to it. /// @return >0 success , <=0 error (due to libburn internal problem) /// @since 0.2.6 pub fn burn_drive_get_adr( drive_info: *mut burn_drive_info, adr: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Evaluate whether the given address would be a drive device file address /// which could be listed by a run of burn_drive_scan(). No check is made /// whether a device file with this address exists or whether it leads /// to a usable MMC drive. /// @return 1 means yes, 0 means no /// @since 0.2.6 pub fn burn_drive_is_enumerable_adr(adr: *mut ::std::os::raw::c_char) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Try to convert a given existing filesystem address into a drive device file /// address. This succeeds with symbolic links or if a hint about the drive's /// system address can be read from the filesystem object and a matching drive /// is found. /// @param path The address of an existing file system object /// @param adr An application provided array of at least BURN_DRIVE_ADR_LEN /// characters size. The device file address gets copied to it. /// @return 1 = success , 0 = failure , -1 = severe error /// @since 0.2.6 pub fn burn_drive_convert_fs_adr( path: *mut ::std::os::raw::c_char, adr: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Try to convert a given SCSI address of bus,host,channel,target,lun into /// a drive device file address. If a SCSI address component parameter is < 0 /// then it is not decisive and the first enumerated address which matches /// the >= 0 parameters is taken as result. /// Note: bus and (host,channel) are supposed to be redundant. /// @param bus_no \"Bus Number\" (something like a virtual controller) /// @param host_no \"Host Number\" (something like half a virtual controller) /// @param channel_no \"Channel Number\" (other half of \"Host Number\") /// @param target_no \"Target Number\" or \"SCSI Id\" (a device) /// @param lun_no \"Logical Unit Number\" (a sub device) /// @param adr An application provided array of at least BURN_DRIVE_ADR_LEN /// characters size. The device file address gets copied to it. /// @return 1 = success , 0 = failure , -1 = severe error /// @since 0.2.6 pub fn burn_drive_convert_scsi_adr( bus_no: ::std::os::raw::c_int, host_no: ::std::os::raw::c_int, channel_no: ::std::os::raw::c_int, target_no: ::std::os::raw::c_int, lun_no: ::std::os::raw::c_int, adr: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Try to convert a given drive device file address into the address of a /// symbolic link that points to this drive address. /// Modern GNU/Linux systems may shuffle drive addresses from boot to boot. /// The udev daemon is supposed to create links which always point to the /// same drive, regardless of its system address. /// This call tries to find such links. /// @param dev_adr Should contain a drive address as returned by /// burn_drive_scan(). /// @param link_adr An application provided array of at least /// BURN_DRIVE_ADR_LEN characters size. The found link /// address gets copied to it. /// @param dir_adr The address of the directory where to look for links. /// Normally: \"/dev\" /// @param templ An array of pointers to name templates, which /// links have to match. A symbolic link in dir_adr matches /// a name template if it begins by that text. E.g. /// link address \"/dev/dvdrw1\" matches template \"dvdrw\". /// If templ is NULL, then the default array gets used: /// {\"dvdrw\", \"cdrw\", \"dvd\", \"cdrom\", \"cd\"} /// If several links would match, then a link will win, /// which matches the template with the lowest array index. /// Among these candidates, the one with the lowest strcmp() /// rank will be chosen as link_adr. /// @param num_templ Number of array elements in templ. /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return <0 severe error, 0 failed to search, 2 nothing found /// 1 success, link_adr is valid /// @since 1.1.4 pub fn burn_lookup_device_link( dev_adr: *mut ::std::os::raw::c_char, link_adr: *mut ::std::os::raw::c_char, dir_adr: *mut ::std::os::raw::c_char, templ: *mut *mut ::std::os::raw::c_char, num_templ: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Try to obtain bus,host,channel,target,lun from path. If there is an SCSI /// address at all, then this call should succeed with a drive device file /// address obtained via burn_drive_d_get_adr(). It is also supposed to /// succeed with any device file of a (possibly emulated) SCSI device. /// @return 1 = success , 0 = failure , -1 = severe error /// @since 0.2.6 pub fn burn_drive_obtain_scsi_adr( path: *mut ::std::os::raw::c_char, bus_no: *mut ::std::os::raw::c_int, host_no: *mut ::std::os::raw::c_int, channel_no: *mut ::std::os::raw::c_int, target_no: *mut ::std::os::raw::c_int, lun_no: *mut ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Grab a drive. This must be done before the drive can be used (for reading, /// writing, etc). /// @param drive The drive to grab. This is found in a returned /// burn_drive_info struct. /// @param load Nonzero to make the drive attempt to load a disc (close its /// tray door, etc). /// @return 1 if it was possible to grab the drive, else 0 pub fn burn_drive_grab( drive: *mut burn_drive, load: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { pub fn burn_drive_probe_cd_write_modes( drive_info: *mut burn_drive_info, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Calm down or alert a drive. Some drives stay alert after reading for /// quite some time. This saves time with the startup for the next read /// operation but also causes noise and consumes extra energy. It makes /// sense to calm down the drive if no read operation is expected for the /// next few seconds. The drive will get alert automatically if operations /// are required. /// @param d The drive to influence. /// @param flag Bitfield for control purposes /// bit0= become alert (else start snoozing) /// This is not mandatory for further drive operations /// @return 1= success , 0= drive role not suitable for calming /// @since 0.7.0 pub fn burn_drive_snooze( d: *mut burn_drive, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Re-assess drive and media status. This should be done after a drive /// underwent a status change and shall be further used without intermediate /// burn_drive_release(), burn_drive_grab(). E.g. after blanking or burning. /// @param d The already grabbed drive to re-assess. /// @param flag Unused yet. Submit 0. /// @return 1 success , <= 0 could not determine drive and media state /// @since 1.1.8 pub fn burn_drive_re_assess( d: *mut burn_drive, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Release a drive. This should not be done until the drive is no longer /// busy (see burn_drive_get_status). /// @param drive The drive to release. /// @param eject Nonzero to make the drive eject the disc in it. pub fn burn_drive_release(drive: *mut burn_drive, eject: ::std::os::raw::c_int); } unsafe extern "C" { /// Like burn_drive_release() but keeping the drive tray closed and its /// eject button disabled. This physically locked drive state will last until /// the drive is grabbed again and released via burn_drive_release(). /// Programs like eject, cdrecord, growisofs will break that ban too. /// @param d The drive to release and leave locked. /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return 1 means success, <=0 means failure /// @since 0.4.0 pub fn burn_drive_leave_locked( d: *mut burn_drive, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Returns what kind of disc a drive is holding. This function may need to be /// called more than once to get a proper status from it. See burn_disc_status /// for details. /// @param drive The drive to query for a disc. /// @return The status of the drive, or what kind of disc is in it. /// Note: BURN_DISC_UNGRABBED indicates wrong API usage pub fn burn_disc_get_status(drive: *mut burn_drive) -> burn_disc_status; } unsafe extern "C" { /// WARNING: This revives an old bug-like behavior that might be dangerous. /// Sets the drive status to BURN_DISC_BLANK if it is BURN_DISC_UNREADY /// or BURN_DISC_UNSUITABLE. Thus marking media as writable which actually /// failed to declare themselves either blank or (partially) filled. /// @return 1 drive status has been set , 0 = unsuitable drive status /// @since 0.2.6 pub fn burn_disc_pretend_blank(drive: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// WARNING: This overrides the safety measures against unsuitable media. /// Sets the drive status to BURN_DISC_FULL if it is BURN_DISC_UNREADY /// or BURN_DISC_UNSUITABLE. Thus marking media as blankable which actually /// failed to declare themselves either blank or (partially) filled. /// @since 0.2.6 pub fn burn_disc_pretend_full(drive: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// WARNING: This overrides the safety measures against unsuitable media. /// Sets the drive status to BURN_DISC_FULL unconditionally. /// @since 1.3.4 pub fn burn_disc_pretend_full_uncond(drive: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Returns the Drive Serial Number as of MMC feature 108h. /// @param d The drive to inquire. /// @param sno Returns the bytes of the serial number. A trailing 0-byte /// is appended for convenience. MMC specifies ASCII 0x20 to /// 0x7h as possible byte values. But given drive firmware /// habits there is no warranty that *sno contains no other /// byte values. /// Submit *sno as NULL or pointing to free()-able memory. /// Apply free() to *sno when no longer needed. /// @param sno_len Returns the number of valid bytes in returned *sno, /// not counting the appended trailing 0. /// @return 1= success (but maybe *sno_len is 0), <= 0 severe failure /// @since 1.4.2 pub fn burn_drive_get_serial_no( d: *mut burn_drive, sno: *mut *mut ::std::os::raw::c_char, sno_len: *mut ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Returns the Media Serial Number as of MMC feature 109h and command ABh /// READ MEDIA SERIAL NUMBER. /// /// Note: This call will return an empty result unless the macro /// Libburn_enable_scsi_cmd_ABh /// is defined at compile time. /// This is because the command READ MEDIA SERIAL NUMBER demands /// superuser authority on Linux, because no medium with serial number /// could be tested yet, and because this command made one of the test /// drives unusable until power cycle when it was executed despite /// feature 109h was not announced as \"current\". /// /// @param d The drive to inquire. /// @param sno Returns the bytes of the serial number. A trailing 0-byte /// is appended for convenience. There is no warranty that /// sno contains only non-zero printable bytes. /// Submit *sno as NULL or pointing to free()-able memory. /// Apply free() to *sno when no longer needed. /// @param sno_len Returns the number of valid bytes in returned *sno, /// not counting the appended trailing 0. /// @return 1= success (but maybe *sno_len is 0), <= 0 severe failure /// @since 1.4.2 pub fn burn_drive_get_media_sno( d: *mut burn_drive, sno: *mut *mut ::std::os::raw::c_char, sno_len: *mut ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Reads ATIP information from inserted media. To be obtained via /// burn_drive_get_write_speed(), burn_drive_get_min_write_speed(), /// burn_drive_get_start_end_lba(). The drive must be grabbed for this call. /// @param drive The drive to query. /// @return 1=success, 0=no valid ATIP info read, -1 severe error /// @since 0.2.6 pub fn burn_disc_read_atip(drive: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Tells whether a BD-R medium with Pseudo Overwrite (POW) formatting is in /// the drive. Such a formatting may have been applied by dvd+rw-tools. It /// prevents sequential multi-session. /// libburn will refuse to write to such a medium. /// @param drive The drive to query. /// @return 1 if BD-R Pseudo Overwrite , 0 if not BD-R or not POW /// @since 1.4.8 pub fn burn_drive_get_bd_r_pow(drive: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Returns start and end lba of the media which is currently inserted /// in the given drive. The drive has to be grabbed to have hope for reply. /// Shortcoming (not a feature): unless burn_disc_read_atip() was called /// only blank media will return valid info. /// @param drive The drive to query. /// @param start_lba Returns the start lba value /// @param end_lba Returns the end lba value /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return 1 if lba values are valid , 0 if invalid /// @since 0.2.6 pub fn burn_drive_get_start_end_lba( drive: *mut burn_drive, start_lba: *mut ::std::os::raw::c_int, end_lba: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Guess the manufacturer name of CD media from the ATIP addresses of lead-in /// and lead-out. (Currently only lead-in is interpreted. Lead-out may in /// future be used to identify the media type in more detail.) /// The parameters of this call should be obtained by burn_disc_read_atip(d), /// burn_drive_get_start_end_lba(d, &start_lba, &end_lba, 0), /// burn_lba_to_msf(start_lba, &m_li, &s_li, &f_li) and /// burn_lba_to_msf(end_lba, &m_lo, &s_lo, &f_lo). /// @param m_li \"minute\" part of ATIP lead-in or start_lba /// @param s_li \"second\" of lead-in or start_lba /// @param f_li \"frame\" of lead-in /// @param m_lo \"minute\" part of ATIP lead-out /// @param s_lo \"second\" of lead-out /// @param f_lo \"frame\" of lead-out /// @param flag Bitfield for control purposes, /// bit0= append a text \"(aka ...)\" to reply if other brands or /// vendor names are known. /// @return Printable text or NULL on memory shortage. /// Dispose by free() when no longer needed. /// @since 0.7.2 pub fn burn_guess_cd_manufacturer( m_li: ::std::os::raw::c_int, s_li: ::std::os::raw::c_int, f_li: ::std::os::raw::c_int, m_lo: ::std::os::raw::c_int, s_lo: ::std::os::raw::c_int, f_lo: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> *mut ::std::os::raw::c_char; } unsafe extern "C" { /// Retrieve some media information which is mainly specific to CD. For other /// media only the bits in reply parameter valid are supposed to be meaningful. /// @param d The drive to query. /// @param disc_type A string saying either \"CD-DA or CD-ROM\", or \"CD-I\", /// or \"\"CD-ROM XA\", or \"undefined\". /// @param disc_id A 32 bit number read from the media. (Meaning unclear yet) /// @param bar_code 8 hex digits from a barcode on media read by the drive /// (if the drive has a bar code reader built in). /// @param app_code The Host Application Code which must be set in the Write /// Parameters Page if the media is not unrestricted (URU==0). /// @param valid Replies bits which indicate the validity of other reply /// parameters or the state of certain CD info bits: /// bit0= disc_type is valid /// bit1= disc_id is valid /// bit2= bar_code is valid /// bit3= disc_app_code is valid /// bit4= Disc is unrestricted (URU bit, 51h READ DISC INFO) /// This seems to be broken with my drives. The bit is /// 0 and the validity bit for disc_app_code is 0 too. /// bit5= Disc is nominally erasable (Erasable bit) /// This will be set with overwritable media which /// libburn normally considers to be unerasable blank. /// @return 1 success, <= 0 an error occurred /// @since 0.7.2 pub fn burn_disc_get_cd_info( d: *mut burn_drive, disc_type: *mut ::std::os::raw::c_char, disc_id: *mut ::std::os::raw::c_uint, bar_code: *mut ::std::os::raw::c_char, app_code: *mut ::std::os::raw::c_int, valid: *mut ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read the array of CD-TEXT packs from the Lead-in of an audio CD. /// Each pack consists of 18 bytes, of which 4 are header. 12 bytes are pieces /// of 0-terminated texts or binary data. 2 bytes hold a CRC. /// For a description of the format of the array, see file doc/cdtext.txt. /// @param d The drive to query. /// @param text_packs Will point to an allocated memory buffer with CD-TEXT. /// It will only contain text packs, and not be prepended /// by the TOC header of four bytes, which gets stored with /// file cdtext.dat by cdrecord -vv -toc. (The first two of /// these bytes are supposed to hold the number of CD-TEXT /// bytes + 2. The other two bytes are supposed to be 0.) /// Dispose this buffer by free(), when no longer needed. /// @param num_packs Will tell the number of text packs, i.e. the number of /// bytes in text_packs divided by 18. /// @param flag Bitfield for control purposes, /// Unused yet. Submit 0. /// @return 1 success, 0= no CD-TEXT found, < 0 an error occurred /// @since 1.2.0 pub fn burn_disc_get_leadin_text( d: *mut burn_drive, text_packs: *mut *mut ::std::os::raw::c_uchar, num_packs: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read the current usage of the eventual BD Spare Area. This area gets /// reserved on BD media during formatting. During writing it is used to /// host replacements of blocks which failed the checkread immediately after /// writing. /// This call applies only to recordable BD media. I.e. profiles 0x41 to 0x43. /// @param d The drive to query. /// @param alloc_blocks Returns the number of blocks reserved as Spare Area /// @param free_blocks Returns the number of yet unused blocks in that area /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return 1 = reply prarameters are valid, /// <=0 = reply is invalid (e.g. because no BD profile) /// @since 0.8.8 pub fn burn_disc_get_bd_spare_info( d: *mut burn_drive, alloc_blocks: *mut ::std::os::raw::c_int, free_blocks: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Retrieve some media information which is mainly specific to media of /// the DVD-R family: DVD-R , DVD-RW , DVD-R DL , HD DVD-R /// Currently the information cannot be retrieved from other media types. /// @param d The drive to query. /// @param disk_category returns DVD Book to which the media complies /// @param book_name returns a pointer to the book name of disk_category. /// This memory is static. Do not alter or free it ! /// @param part_version returns the Media Version in the DVD Book /// @param num_layers returns the number of media layers /// @param num_blocks returns the number of blocks between pysical start /// and physical end of the media /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return 1 = reply prarameters are valid, /// <=0 = reply is invalid (e.g. because no DVD-R) /// @since 1.1.4 pub fn burn_disc_get_phys_format_info( d: *mut burn_drive, disk_category: *mut ::std::os::raw::c_int, book_name: *mut *mut ::std::os::raw::c_char, part_version: *mut ::std::os::raw::c_int, num_layers: *mut ::std::os::raw::c_int, num_blocks: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read start lba and Next Writeable Address of a track from media. /// Usually a track lba is obtained from the result of burn_track_get_entry(). /// This call retrieves an updated lba, eventual nwa, and can address the /// invisible track to come. /// The drive must be grabbed for this call. One may not issue this call /// during ongoing burn_disc_write() or burn_disc_erase(). /// @param d The drive to query. /// @param o If not NULL: write parameters to be set on drive before query /// @param trackno 0=next track to come, >0 number of existing track /// The first existing track on a CD may have a number higher /// than 1. Use burn_session_get_start_tno() to inquire this /// start number. /// @param lba return value: start lba /// @param nwa return value: Next Writeable Address /// @return 1=nwa is valid , 0=nwa is not valid , -1=error /// @since 0.2.6 pub fn burn_disc_track_lba_nwa( d: *mut burn_drive, o: *mut burn_write_opts, trackno: ::std::os::raw::c_int, lba: *mut ::std::os::raw::c_int, nwa: *mut ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Tells whether a previous attempt to determine the Next Writeable Address /// of the upcoming track reveiled that the READ TRACK INFORMATION Damage Bit /// is set for this track and that no valid writable address is available. /// See MMC-5 6.27.3.7 Damage Bit, 6.27.3.11 NWA_V (NWA valid) /// @param d The drive to query. /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return 0= Looks ok: Damage Bit is not set, NWA_V is set /// 1= Damaged and theoretically writable (NWA_V is set) /// 2= Not writable: NWA_V is not set /// 3= Damaged and not writable (NWA_V is not set), /// @since 1.1.0 pub fn burn_disc_next_track_is_damaged( d: *mut burn_drive, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Try to close the last track and session of media which have bit0 set in /// the return value of call burn_disc_next_track_is_damaged(). /// Whether it helps depends much on the reason why the media is reported /// as damaged by the drive. /// This call works only for profiles 0x09 CD-R, 0x0a CD-RW, 0x11 DVD-R, /// 0x14 DVD-RW sequential, 0x1b DVD+R, 0x2b DVD+R DL, 0x41 BD-R sequential. /// Note: After writing it is advised to give up the drive and to grab it again /// in order to learn about its view on the new media state. /// @param o Write options created by burn_write_opts_new() and /// manipulated by burn_write_opts_set_multi(). /// burn_write_opts_set_write_type() should be set to /// BURN_WRITE_TAO, burn_write_opts_set_simulate() should be /// set to 0. /// @param flag Bitfield for control purposes /// bit0= force close, even if no damage was seen /// @return <=0 media not marked as damaged, or media type not suitable, /// or closing attempted but failed /// 1= attempt finished without error indication /// @since 1.1.0 pub fn burn_disc_close_damaged( o: *mut burn_write_opts, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read start lba of the first track in the last complete session. /// This is the first parameter of mkisofs option -C. The second parameter /// is nwa as obtained by burn_disc_track_lba_nwa() with trackno 0. /// @param d The drive to query. /// @param start_lba returns the start address of that track /// @return <= 0 : failure, 1 = ok /// @since 0.3.2 pub fn burn_disc_get_msc1( d: *mut burn_drive, start_lba: *mut ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Return the best possible estimation of the currently available capacity of /// the media. This might depend on particular write option settings. For /// inquiring the space with such a set of options, the drive has to be /// grabbed and BURN_DRIVE_IDLE. If not, then one will only get a canned value /// from the most recent automatic inquiry (e.g. during last drive grabbing). /// An eventual start address from burn_write_opts_set_start_byte() will be /// taken into respect with the capacity estimation. Negative results get /// defaulted to 0. /// If the drive is actually a file in a large filesystem or a large block /// device, then the capacity is curbed to a maximum of 0x7ffffff0 blocks /// = 4 TB - 32 KB. /// @param d The drive to query. /// @param o If not NULL: write parameters to be set on drive before query /// @return number of most probably available free bytes /// @since 0.3.4 pub fn burn_disc_available_space(d: *mut burn_drive, o: *mut burn_write_opts) -> off_t; } unsafe extern "C" { /// Tells the MMC Profile identifier of the loaded media. The drive must be /// grabbed in order to get a non-zero result. /// libburn currently writes only to profiles /// 0x09 \"CD-R\" /// 0x0a \"CD-RW\" /// 0x11 \"DVD-R sequential recording\" /// 0x12 \"DVD-RAM\" /// 0x13 \"DVD-RW restricted overwrite\" /// 0x14 \"DVD-RW sequential recording\", /// 0x15 \"DVD-R/DL sequential recording\", /// 0x1a \"DVD+RW\" /// 0x1b \"DVD+R\", /// 0x2b \"DVD+R/DL\", /// 0x41 \"BD-R sequential recording\", /// 0x43 \"BD-RE\", /// 0xffff \"stdio file\" /// Note: 0xffff is not a MMC profile but a libburn invention. /// Read-only are the profiles /// 0x08 \"CD-ROM\", /// 0x10 \"DVD-ROM\", /// 0x40 \"BD-ROM\", /// Read-only for now is this BD-R profile (testers wanted) /// 0x42 \"BD-R random recording\" /// Empty drives are supposed to report /// 0x00 \"\" /// @param d The drive where the media is inserted. /// @param pno Profile Number. See also mmc5r03c.pdf, table 89 /// @param name Profile Name (see above list, unknown profiles have empty name) /// @return 1 profile is valid, 0 no profile info available /// @since 0.3.0 pub fn burn_disc_get_profile( d: *mut burn_drive, pno: *mut ::std::os::raw::c_int, name: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain product id and standards defined media codes. /// The product id is a printable string which is supposed to be the same /// for identical media but should vary with non-identical media. Some media /// cannot provide such an id at all. /// The pair (profile_number, product_id) should be the best id to identify /// media with identical product specifications. /// The reply parameters media_code1 and media_code2 can be used with /// burn_guess_manufacturer() /// The reply parameters have to be disposed by free() when no longer needed. /// @param d The drive where the media is inserted. /// @param product_id Reply: Printable text depicting manufacturer and /// eventually media id. /// @param media_code1 Reply: The eventual manufacturer identification as read /// from DVD/BD media or a text \"XXmYYsZZf\" from CD media /// ATIP lead-in. /// @param media_code2 The eventual media id as read from DVD+/BD media or a /// text \"XXmYYsZZf\" from CD ATIP lead-out. /// @param book_type Book type text for DVD and BD. /// Caution: is NULL with CD, even if return value says ok. /// @param flag Bitfield for control purposes /// bit0= do not escape \" _/\" (not suitable for /// burn_guess_manufacturer()) /// @return 1= ok, product_id and media codes are valid, /// 0= no product id_available, reply parameters are NULL /// <0= error /// @since 0.7.2 pub fn burn_disc_get_media_id( d: *mut burn_drive, product_id: *mut *mut ::std::os::raw::c_char, media_code1: *mut *mut ::std::os::raw::c_char, media_code2: *mut *mut ::std::os::raw::c_char, book_type: *mut *mut ::std::os::raw::c_char, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Guess the name of a manufacturer by profile number, manufacturer code /// and media code. The profile number can be obtained by /// burn_disc_get_profile(), the other two parameters can be obtained as /// media_code1 and media_code2 by burn_disc_get_media_id(). /// @param profile_no Profile number (submit -1 if not known) /// @param manuf_code Manufacturer code from media (e.g. \"RICOHJPN\") /// @param media_code Media ID code from media (e.g. \"W11\") /// @param flag Bitfield for control purposes, submit 0 /// @return Printable text or NULL on memory shortage. /// If the text begins with \"Unknown \" then no item of the /// manufacturer list matched the codes. /// Dispose by free() when no longer needed. /// @since 0.7.2 pub fn burn_guess_manufacturer( profile_no: ::std::os::raw::c_int, manuf_code: *mut ::std::os::raw::c_char, media_code: *mut ::std::os::raw::c_char, flag: ::std::os::raw::c_int, ) -> *mut ::std::os::raw::c_char; } unsafe extern "C" { /// Tells whether a disc can be erased or not /// @param d The drive to inquire. /// @return Non-zero means erasable pub fn burn_disc_erasable(d: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Returns the progress and status of a drive. /// @param drive The drive to query busy state for. /// @param p Returns the progress of the operation, NULL if you don't care /// @return the current status of the drive. See also burn_drive_status. pub fn burn_drive_get_status( drive: *mut burn_drive, p: *mut burn_progress, ) -> burn_drive_status; } unsafe extern "C" { /// Creates a write_opts struct for burning to the specified drive. /// The returned object must later be freed with burn_write_opts_free(). /// @param drive The drive to write with /// @return The write_opts, NULL on error pub fn burn_write_opts_new(drive: *mut burn_drive) -> *mut burn_write_opts; } unsafe extern "C" { /// Inquires the drive associated with a burn_write_opts object. /// @param opts object to inquire /// @return pointer to drive /// @since 0.4.0 pub fn burn_write_opts_get_drive(opts: *mut burn_write_opts) -> *mut burn_drive; } unsafe extern "C" { /// Frees a write_opts struct created with burn_write_opts_new /// @param opts write_opts to free pub fn burn_write_opts_free(opts: *mut burn_write_opts); } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_read_opts { _unused: [u8; 0], } unsafe extern "C" { /// Creates a read_opts struct for reading from the specified drive /// must be freed with burn_read_opts_free /// @param drive The drive to read from /// @return The read_opts pub fn burn_read_opts_new(drive: *mut burn_drive) -> *mut burn_read_opts; } unsafe extern "C" { /// Frees a read_opts struct created with burn_read_opts_new /// @param opts write_opts to free pub fn burn_read_opts_free(opts: *mut burn_read_opts); } unsafe extern "C" { /// Erase a disc in the drive. The drive must be grabbed successfully BEFORE /// calling this functions. Always ensure that the drive reports a status of /// BURN_DISC_FULL before calling this function. An erase operation is not /// cancellable, as control of the operation is passed wholly to the drive and /// there is no way to interrupt it safely. /// @param drive The drive with which to erase a disc. /// Only drive roles 1 (MMC) and 5 (stdio random write-only) /// support erasing. /// @param fast Nonzero to do a fast erase, where only the disc's headers are /// erased; zero to erase the entire disc. /// With DVD-RW, fast blanking yields media capable only of DAO. pub fn burn_disc_erase(drive: *mut burn_drive, fast: ::std::os::raw::c_int); } unsafe extern "C" { /// 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 bit4 of flag. DVD-RAM and BD-RE may get formatted initially /// or re-formatted to adjust their Defect Management. /// This function usually returns while the drive is still in the process /// of formatting. The formatting is done, when burn_drive_get_status() /// returns BURN_DRIVE_IDLE. This may be immediately after return or may /// need several thousand seconds to occur. /// @param drive The drive with the disc to format. /// @param size The size in bytes to be used with the format command. It should /// be divisible by 32*1024. The effect of this parameter may /// depend on the media profile and on parameter flag. /// @param flag Bitfield for control purposes: /// bit0= after formatting, write the given number of zero-bytes /// to the media and eventually perform preliminary closing. /// bit1+2: size mode /// 0 = use parameter size as far as it makes sense /// 1 = insist in size 0 even if there is a better default known /// (on DVD-RAM or BD-R identical to size mode 0, /// i.e. they never get formatted with payload size 0) /// 2 = without bit7: format to maximum available size /// with bit7 : take size from indexed format descriptor /// 3 = without bit7: format to default size /// with bit7 : take size from indexed format descriptor /// bit3= -reserved- /// bit4= enforce re-format of (partly) formatted media /// bit5= try to disable eventual defect management /// bit6= try to avoid lengthy media certification /// bit7, bit8 to bit15 = /// bit7 enables MMC expert application mode (else libburn /// tries to choose a suitable format type): /// If it is set then bit8 to bit15 contain the index of /// the format to use. See burn_disc_get_formats(), /// burn_disc_get_format_descr(). /// Acceptable types are: 0x00, 0x01, 0x10, 0x11, 0x13, /// 0x15, 0x26, 0x30, 0x31, 0x32. /// If bit7 is set, then bit4 is set automatically. /// bit16= enable POW on blank BD-R /// @since 0.3.0 pub fn burn_disc_format(drive: *mut burn_drive, size: off_t, flag: ::std::os::raw::c_int); } unsafe extern "C" { /// Inquire the formatting status, the associated sizes and the number of /// available formats. The info is media specific and stems from MMC command /// 23h READ FORMAT CAPACITY. See mmc5r03c.pdf 6.24 for background details. /// Media type can be determined via burn_disc_get_profile(). /// @param drive The drive with the disc to format. /// @param status The current formatting status of the inserted media. /// See BURN_FORMAT_IS_* macros. Note: \"unknown\" is the /// legal status for quick formatted, yet unwritten DVD-RW. /// @param size The size in bytes associated with status. /// unformatted: the maximum achievable size of the media /// formatted: the currently formatted capacity /// unknown: maximum capacity of drive or of media /// @param bl_sas Additional info \"Block Length/Spare Area Size\". /// Expected to be constantly 2048 for non-BD media. /// @param num_formats The number of available formats. To be used with /// burn_disc_get_format_descr() to obtain such a format /// and eventually with burn_disc_format() to select one. /// @return 1 reply is valid , <=0 failure /// @since 0.3.0 pub fn burn_disc_get_formats( drive: *mut burn_drive, status: *mut ::std::os::raw::c_int, size: *mut off_t, bl_sas: *mut ::std::os::raw::c_uint, num_formats: *mut ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Inquire parameters of an available media format. /// @param drive The drive with the disc to format. /// @param index The index of the format item. Beginning with 0 up to reply /// parameter from burn_disc_get_formats() : num_formats - 1 /// @param type The format type. See mmc5r03c.pdf, 6.5, 04h FORMAT UNIT. /// 0x00=full, 0x10=CD-RW/DVD-RW full, 0x11=CD-RW/DVD-RW grow, /// 0x15=DVD-RW quick, 0x13=DVD-RW quick grow, /// 0x26=DVD+RW background, 0x30=BD-RE with spare areas, /// 0x31=BD-RE without spare areas /// @param size The maximum size in bytes achievable with this format. /// @param tdp Type Dependent Parameter. See mmc5r03c.pdf. /// @return 1 reply is valid , <=0 failure /// @since 0.3.0 pub fn burn_disc_get_format_descr( drive: *mut burn_drive, index: ::std::os::raw::c_int, type_: *mut ::std::os::raw::c_int, size: *mut off_t, tdp: *mut ::std::os::raw::c_uint, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read a disc from the drive and write it to an fd pair. The drive must be /// grabbed successfully BEFORE calling this function. Always ensure that the /// drive reports a status of BURN_DISC_FULL before calling this function. /// @param drive The drive from which to read a disc. /// @param o The options for the read operation. pub fn burn_disc_read(drive: *mut burn_drive, o: *const burn_read_opts); } unsafe extern "C" { /// Examines a completed setup for burn_disc_write() whether it is permissible /// with drive and media. This function is called by burn_disc_write() but /// an application might be interested in this check in advance. /// @param o The options for the writing operation. /// @param disc The description of the disc to be created /// @param reasons Eventually returns a list of rejection reason statements /// @param silent 1= do not issue error messages , 0= report problems /// @return 1 ok, -1= no recordable media detected, 0= other failure /// @since 0.3.4 pub fn burn_precheck_write( o: *mut burn_write_opts, disc: *mut burn_disc, reasons: *mut ::std::os::raw::c_char, silent: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Write a disc in the drive. The drive must be grabbed successfully before /// calling this function. Always ensure that the drive reports a status of /// BURN_DISC_BLANK ot BURN_DISC_APPENDABLE before calling this function. /// Note: write_type BURN_WRITE_SAO is currently not capable of writing a mix /// of data and audio tracks. You must use BURN_WRITE_TAO for such sessions. /// To be set by burn_write_opts_set_write_type(). /// Note: This function is not suitable for overwriting data in the middle of /// a valid data area because it is allowed to append trailing data. /// For exact random access overwriting use burn_random_access_write(). /// Note: After writing it is advised to give up the drive and to grab it again /// in order to learn about its view on the new media state. /// Note: Before mounting the written media it might be necessary to eject /// and reload in order to allow the operating system to notice the new /// media state. /// @param o The options for the writing operation. /// @param disc The struct burn_disc * that described the disc to be created pub fn burn_disc_write(o: *mut burn_write_opts, disc: *mut burn_disc); } unsafe extern "C" { /// Control stream recording during the write run and eventually set the start /// LBA for stream recording. /// Stream recording is set from struct burn_write_opts when the write run /// gets started. See burn_write_opts_set_stream_recording(). /// The call described here can be used later to override this setting and /// to program automatic switching at a given LBA. It also affects subsequent /// calls to burn_random_access_write(). /// @param drive The drive which performs the write operation. /// @param recmode -1= disable stream recording /// 0= leave setting as is /// 1= enable stream recording /// @param start The LBA where actual stream recording shall start. /// (0 means unconditional stream recording) /// @param flag Bitfield for control purposes (unused yet, submit 0). /// @return 1=success , <=0 failure /// @since 0.6.4 pub fn burn_drive_set_stream_recording( drive: *mut burn_drive, recmode: ::std::os::raw::c_int, start: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Enable or disable use of the Immed bit with long running SCSI commands. /// If the Immed bit is used, then those SCSI commands end early and leave /// the drive in not-ready state. libburn then tries periodically whether /// the drive became ready again. Only then it assumes the command to be /// completely done. /// The default setting may depend on the operating system on which libburn /// was compiled. /// @param drive The drive which will be affected. /// @param enable 1= use Immed bit. /// 0= use no Immed bit. Affected commands can last very long. /// @return 1=success , <=0 failure /// @since 1.4.6 pub fn burn_drive_set_immed( drive: *mut burn_drive, enable: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Inquire the current setting of usage of the Immed bit. Either the still set /// system dependent default or the value set by call burn_drive_set_immed(). /// @return The current value. /// @since 1.4.6 pub fn burn_drive_get_immed(drive: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Cancel an operation on a drive. /// This will only work when the drive's busy state is BURN_DRIVE_READING or /// BURN_DRIVE_WRITING. /// @param drive The drive on which to cancel the current operation. pub fn burn_drive_cancel(drive: *mut burn_drive); } unsafe extern "C" { /// Inquire whether the most recent asynchronous media job was successful. /// This applies to burn_disc_erase(), burn_disc_format(), burn_disc_write(). /// Reasons for non-success may be: rejection of burn parameters, abort due to /// fatal errors during write, blank or format, a call to burn_drive_cancel() /// by the application thread. /// @param d The drive to inquire. /// @return 1=burn seems to have went well, 0=burn failed /// @since 0.2.6 pub fn burn_drive_wrote_well(d: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Inquire whether a write error occurred which is suspected to have happened /// due to a false report about DVD-RW capability to be written in write type /// BURN_WRITE_TAO. /// @param d The drive to inquire. /// @return 1= it seems that BURN_WRITE_TAO on DVD-RW caused error, /// 0= it does not seem so /// @since 1.3.4 pub fn burn_drive_was_feat21_failure(d: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Convert a minute-second-frame (MSF) value to sector count /// @param m Minute component /// @param s Second component /// @param f Frame component /// @return The sector count pub fn burn_msf_to_sectors( m: ::std::os::raw::c_int, s: ::std::os::raw::c_int, f: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Convert a sector count to minute-second-frame (MSF) /// @param sectors The sector count /// @param m Returns the minute component /// @param s Returns the second component /// @param f Returns the frame component pub fn burn_sectors_to_msf( sectors: ::std::os::raw::c_int, m: *mut ::std::os::raw::c_int, s: *mut ::std::os::raw::c_int, f: *mut ::std::os::raw::c_int, ); } unsafe extern "C" { /// Convert a minute-second-frame (MSF) value to an lba /// @param m Minute component /// @param s Second component /// @param f Frame component /// @return The lba pub fn burn_msf_to_lba( m: ::std::os::raw::c_int, s: ::std::os::raw::c_int, f: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Convert an lba to minute-second-frame (MSF) /// @param lba The lba /// @param m Returns the minute component /// @param s Returns the second component /// @param f Returns the frame component pub fn burn_lba_to_msf( lba: ::std::os::raw::c_int, m: *mut ::std::os::raw::c_int, s: *mut ::std::os::raw::c_int, f: *mut ::std::os::raw::c_int, ); } unsafe extern "C" { /// Create a new disc /// @return Pointer to a burn_disc object or NULL on failure. pub fn burn_disc_create() -> *mut burn_disc; } unsafe extern "C" { /// Delete disc and decrease the reference count on all its sessions /// @param d The disc to be freed pub fn burn_disc_free(d: *mut burn_disc); } unsafe extern "C" { /// Create a new session /// @return Pointer to a burn_session object or NULL on failure. pub fn burn_session_create() -> *mut burn_session; } unsafe extern "C" { /// Free a session (and decrease reference count on all tracks inside) /// @param s Session to be freed pub fn burn_session_free(s: *mut burn_session); } unsafe extern "C" { /// Add a session to a disc at a specific position, increasing the /// sessions's reference count. /// @param d Disc to add the session to /// @param s Session to add to the disc /// @param pos position to add at (BURN_POS_END is \"at the end\") /// @return 0 for failure, 1 for success pub fn burn_disc_add_session( d: *mut burn_disc, s: *mut burn_session, pos: ::std::os::raw::c_uint, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Remove a session from a disc /// @param d Disc to remove session from /// @param s Session pointer to find and remove pub fn burn_disc_remove_session( d: *mut burn_disc, s: *mut burn_session, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read a CDRWIN cue sheet file and equip the session object by tracks and /// CD-TEXT according to the content of the file. /// For a description of CDRWIN file format see /// http://digitalx.org/cue-sheet/syntax/ /// Fully supported commands are: /// CATALOG , CDTEXTFILE , FLAGS , INDEX , ISRC , PERFORMER , /// POSTGAP , PREGAP , REM , SONGWRITER , TITLE /// Further supported commands introduced by cdrecord (usage like PERFORMER): /// ARRANGER , COMPOSER , MESSAGE /// Partly supported commands are: /// FILE which supports only types BINARY , MOTOROLA , WAVE /// TRACK which supports only datatypes AUDIO , MODE1/2048 /// Unsupported types of FILE or TRACK lead to failure of the call. /// libburn does not yet support mixing of AUDIO and MODE1/2048. So this call /// will fail if such a mix is found. /// CD-TEXT information is allowed only if all tracks are of datatype AUDIO. /// Empty lines and lines which start by '#' are ignored. /// @param session Session where to attach tracks. It must not yet have /// tracks or else this call will fail. /// @param path Filesystem address of the CDRWIN cue sheet file. /// Normally with suffix .cue /// @param fifo_size Number of bytes in fifo. This will be rounded up by /// the block size of the track mode. <= 0 means no fifo. /// @param fifo Returns a reference to the burn_source object that /// was installed as fifo between FILE and the track /// burn sources. One may use this to inquire the fifo /// state. Dispose it by burn_source_free() when no longer /// needed. It is permissible to pass this parameter to /// libburn as NULL, in order to immediately drop ownership /// on the fifo. /// @param text_packs Returns pre-formatted CD-TEXT packs resulting from /// cue sheet command CDTEXTFILE. To be used with call /// burn_write_opts_set_leadin_text(). /// It is permissible to pass this parameter to libburn /// as NULL, in order to disable CDTEXTFILE. /// @param num_packs Returns the number of 18 byte records in text_packs. /// @param flag Bitfield for control purposes. /// bit0= Do not attach CD-TEXT information to session and /// tracks. Do not load text_packs. /// bit1= Do not use media catalog string of session or ISRC /// strings of tracks for writing to Q sub-channel. /// @return > 0 indicates success, <= 0 indicates failure /// @since 1.2.0 pub fn burn_session_by_cue_file( session: *mut burn_session, path: *mut ::std::os::raw::c_char, fifo_size: ::std::os::raw::c_int, fifo: *mut *mut burn_source, text_packs: *mut *mut ::std::os::raw::c_uchar, num_packs: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Create a track pub fn burn_track_create() -> *mut burn_track; } unsafe extern "C" { /// Free a track /// @param t Track to free pub fn burn_track_free(t: *mut burn_track); } unsafe extern "C" { /// Add a track to a session at specified position /// @param s Session to add to /// @param t Track to insert in session /// @param pos position to add at (BURN_POS_END is \"at the end\") /// @return 0 for failure, 1 for success pub fn burn_session_add_track( s: *mut burn_session, t: *mut burn_track, pos: ::std::os::raw::c_uint, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Remove a track from a session /// @param s Session to remove track from /// @param t Track pointer to find and remove /// @return 0 for failure, 1 for success pub fn burn_session_remove_track( s: *mut burn_session, t: *mut burn_track, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Set the number which shall be written as CD track number with the first /// track of the session. The following tracks will then get written with /// consecutive CD track numbers. The resulting number of the last track /// must not exceed 99. The lowest possible start number is 1, which is also /// the default. This setting applies only to CD SAO writing. /// @param session The session to be manipulated /// @param tno A number between 1 and 99 /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return > 0 indicates success, <= 0 indicates failure /// @since 1.2.0 pub fn burn_session_set_start_tno( session: *mut burn_session, tno: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Inquire the CD track start number, as set by default or by /// burn_session_set_start_tno(). /// @param session The session to be inquired /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return > 0 is the currently set CD track start number /// <= 0 indicates failure /// @since 1.2.0 pub fn burn_session_get_start_tno( session: *mut burn_session, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Set the Character Codes, the Copyright bytes, and the Language Codes /// for CD-TEXT blocks 0 to 7. They will be used in the block summaries /// of text packs which get generated from text or binary data submitted /// by burn_session_set_cdtext() and burn_track_set_cdtext(). /// Character Code value can be /// 0x00 = ISO-8859-1 /// 0x01 = 7 bit ASCII /// 0x80 = MS-JIS (japanesei Kanji, double byte characters) /// Copyright byte value can be /// 0x00 = not copyrighted /// 0x03 = copyrighted /// Language Code value will typically be 0x09 = English or 0x69 = Japanese. /// See below macros BURN_CDTEXT_LANGUAGES_0X00 and BURN_CDTEXT_LANGUAGES_0X45, /// but be aware that many of these codes have never been seen on CD, and that /// many of them do not have a character representation among the above /// Character Codes. /// Default is 0x09 = English for block 0 and 0x00 = Unknown for block 1 to 7. /// Copyright and Character Code are 0x00 for all blocks by default. /// See also file doc/cdtext.txt, \"Format of a CD-TEXT packs array\", /// \"Pack type 0x8f\". /// /// Parameter value -1 leaves the current setting of the session parameter /// unchanged. /// @param s Session where to change settings /// @param char_codes Character Codes for block 0 to 7 /// @param copyrights Copyright bytes for block 0 to 7 /// @param languages Language Codes for block 0 to 7 /// @param flag Bitfiled for control purposes. Unused yet. Submit 0. /// @return <=0 failure, > 0 success /// @since 1.2.0 pub fn burn_session_set_cdtext_par( s: *mut burn_session, char_codes: *mut ::std::os::raw::c_int, copyrights: *mut ::std::os::raw::c_int, languages: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain the current settings as of burn_session_set_cdtext_par() /// @param s Session which to inquire /// @param char_codes Will return Character Codes for block 0 to 7 /// @param copyrights Will return Copyright bytes for block 0 to 7 /// @param block_languages Will return Language Codes for block 0 to 7 /// @param flag Bitfiled for control purposes. Unused yet. Submit 0. /// @return <=0 failure, reply invalid, > 0 success, reply valid /// @since 1.2.0 pub fn burn_session_get_cdtext_par( s: *mut burn_session, char_codes: *mut ::std::os::raw::c_int, copyrights: *mut ::std::os::raw::c_int, block_languages: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Attach text or binary data as CD-TEXT attributes to a session. /// They can be used to generate CD-TEXT packs by burn_cdtext_from_session() /// or to write CD-TEXT packs into the lead-in of a CD SAO session. /// The latter happens only if no array of CD-TEXT packs is attached to /// the write options by burn_write_opts_set_leadin_text(). /// For details of the CD-TEXT format and of the payload content, see file /// doc/cdtext.txt . /// @param s Session where to attach CD-TEXT attribute /// @param block Number of the language block in which the attribute /// shall appear. Possible values: 0 to 7. /// @param pack_type Pack type number. 0x80 to 0x8e. Used if pack_type_name /// is NULL or empty text. Else submit 0 and a name. /// Pack type 0x8f is generated automatically and may not /// be set by applications. /// @param pack_type_name The pack type by name. Defined names are: /// 0x80 = \"TITLE\" 0x81 = \"PERFORMER\" /// 0x82 = \"SONGWRITER\" 0x83 = \"COMPOSER\" /// 0x84 = \"ARRANGER\" 0x85 = \"MESSAGE\" /// 0x86 = \"DISCID\" 0x87 = \"GENRE\" /// 0x88 = \"TOC\" 0x89 = \"TOC2\" /// 0x8d = \"CLOSED\" 0x8e = \"UPC_ISRC\" /// Names are recognized uppercase and lowercase. /// @param payload Text or binary bytes. The data will be copied to /// session-internal memory. /// Pack types 0x80 to 0x85 contain 0-terminated cleartext /// encoded according to the block's Character Code. /// If double byte characters are used, then two 0-bytes /// terminate the cleartext. /// Pack type 0x86 is 0-terminated ASCII cleartext. /// Pack type 0x87 consists of two byte big-endian /// Genre code (see below BURN_CDTEXT_GENRE_LIST), and /// 0-terminated ASCII cleartext of genre description. /// Pack type 0x88 mirrors the session table-of-content. /// Pack type 0x89 is not understood yet. /// Pack types 0x8a to 0x8c are reserved. /// Pack type 0x8d contains ISO-8859-1 cleartext which is /// not to be shown by commercial audio CD players. /// Pack type 0x8e is ASCII cleartext with UPC/EAN code. /// @param length Number of bytes in payload. Including terminating /// 0-bytes. /// @param flag Bitfield for control purposes. /// bit0= payload contains double byte characters /// (with character code 0x80 MS-JIS japanese Kanji) /// @return > 0 indicates success , <= 0 is failure /// @since 1.2.0 pub fn burn_session_set_cdtext( s: *mut burn_session, block: ::std::os::raw::c_int, pack_type: ::std::os::raw::c_int, pack_type_name: *mut ::std::os::raw::c_char, payload: *mut ::std::os::raw::c_uchar, length: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain a CD-TEXT attribute that was set by burn_session_set_cdtext() /// @param s Session to inquire /// @param block Number of the language block to inquire. /// @param pack_type Pack type number to inquire. Used if pack_type_name /// is NULL or empty text. Else submit 0 and a name. /// Pack type 0x8f is generated automatically and may not /// be inquire in advance. Use burn_cdtext_from_session() /// to generate all packs including type 0x8f packs. /// @param pack_type_name The pack type by name. /// See above burn_session_set_cdtext(). /// @param payload Will return a pointer to text or binary bytes. /// Not a copy of data. Do not free() this address. /// If no text attribute is attached for pack type and /// block, then payload is returned as NULL. The return /// value will not indicate error in this case. /// @param length Will return the number of bytes pointed to by payload. /// Including terminating 0-bytes. /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return 1 single byte char, 2 double byte char, <=0 error /// @since 1.2.0 pub fn burn_session_get_cdtext( s: *mut burn_session, block: ::std::os::raw::c_int, pack_type: ::std::os::raw::c_int, pack_type_name: *mut ::std::os::raw::c_char, payload: *mut *mut ::std::os::raw::c_uchar, length: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read a Sony CD-TEXT Input Sheet Version 0.7T file and attach its text /// attributes to the given session and its tracks for the given CD-TEXT /// block number. This overrides previous settings made by /// burn_session_set_cdtext(), burn_track_set_cdtext(), burn_track_set_isrc(), /// burn_session_set_start_tno(). It can later be overridden by said function /// calls. /// The media catalog number from purpose specifier \"UPC / EAN\" gets into /// effect only if burn_write_opts_set_has_mediacatalog() is set to 0. /// The format of a v07t sheet file is documented in doc/cdtext.txt. /// @param session Session where to attach CD-TEXT attributes /// @param path Local filesystem address of the sheet file which /// shall be read and interpreted. /// @param block Number of the language block in which the attributes /// shall appear. Possible values: 0 to 7. /// @param flag Bitfield for control purposes. /// bit0= Permission to read multiple blocks from the /// given sheet file. Each block is supposed to begin /// by a line \"Input Sheet Version = 0.7T\". Therefore /// this permission is only valid if the input file /// begins by such a line. /// @since 1.3.2 /// bit1= Do not use media catalog string of session or ISRC /// strings of tracks for writing to Q sub-channel. /// @since 1.2.0 /// @return > 0 indicates success and the number of interpreted /// blocks (1 if not flag bit0 is set). /// <= 0 indicates failure /// @since 1.2.0 pub fn burn_session_input_sheet_v07t( session: *mut burn_session, path: *mut ::std::os::raw::c_char, block: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Produce an array of CD-TEXT packs that could be submitted to /// burn_write_opts_set_leadin_text(), or stored as *.cdt file, /// or submitted to burn_make_input_sheet_v07t(). /// For a description of the format of the array, see file doc/cdtext.txt. /// The input data stem from burn_session_set_cdtext_par(), /// burn_session_set_cdtext(), and burn_track_set_cdtext(). /// @param s Session from which to produce CD-TEXT packs. /// @param text_packs Will return the buffer with the CD-TEXT packs. /// Dispose by free() when no longer needed. /// @param num_packs Will return the number of 18 byte text packs. /// @param flag Bitfield for control purposes. /// bit0= do not return generated CD-TEXT packs, /// but check whether production would work and /// indicate the number of packs by the call return /// value. This happens also if /// (text_packs == NULL || num_packs == NULL). /// @return Without flag bit0: > 0 is success, <= 0 failure /// With flag bit0: > 0 is number of packs, /// 0 means no packs will be generated, /// < 0 means failure /// @since 1.2.0 pub fn burn_cdtext_from_session( s: *mut burn_session, text_packs: *mut *mut ::std::os::raw::c_uchar, num_packs: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Convert an array of CD-TEXT packs into the text format of /// Sony CD-TEXT Input Sheet Version 0.7T . /// /// @param text_packs Array of bytes which form CD-TEXT packs of 18 bytes /// each. For a description of the format of the array, /// see file doc/cdtext.txt. /// No header of 4 bytes must be prepended which would /// tell the number of pack bytes + 2. /// This parameter may be NULL if the currently attached /// array of packs shall be removed. /// @param num_packs The number of 18 byte packs in text_packs. /// @param start_tno The start number of track counting, if known from /// CD table-of-content or other sources. /// Submit 0 to enable the attempt to read it and the /// track_count from pack type 0x8f. /// @param track_count The number of tracks, if known from CD table-of-content /// or orther sources. /// @param result Will return the buffer with Sheet text. /// Dispose by free() when no longer needed. /// It will be filled by the text for the v07t sheet file /// plus a trailing 0-byte. (Be aware that double-byte /// characters might contain 0-bytes, too.) /// Each CD-TEXT language block starts by the line /// \"Input Sheet Version = 0.7T\" /// and a \"Remarks\" line that tells the block number. /// @param char_code Returns the character code of the pack array: /// 0x00 = ISO-8859-1 /// 0x01 = 7 bit ASCII /// 0x80 = MS-JIS (japanese Kanji, double byte characters) /// The presence of a code value that is not in this list /// will cause this function to fail. /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return > 0 tells the number of valid text bytes in result. /// This does not include the trailing 0-byte. /// <= 0 indicates failure. /// @since 1.3.2 pub fn burn_make_input_sheet_v07t( text_packs: *mut ::std::os::raw::c_uchar, num_packs: ::std::os::raw::c_int, start_tno: ::std::os::raw::c_int, track_count: ::std::os::raw::c_int, result: *mut *mut ::std::os::raw::c_char, char_code: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Remove all CD-TEXT attributes of the given block from the session. /// They were attached by burn_session_set_cdtext(). /// @param s Session where to remove the CD-TEXT attribute /// @param block Number of the language block in which the attribute /// shall appear. Possible values: 0 to 7. /// -1 causes text packs of all blocks to be removed. /// @return > 0 is success, <= 0 failure /// @since 1.2.0 pub fn burn_session_dispose_cdtext( s: *mut burn_session, block: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read an array of CD-TEXT packs from a file. This array should be suitable /// for burn_write_opts_set_leadin_text(). /// The function tolerates and removes 4-byte headers as produced by /// cdrecord -vv -toc, if this header tells the correct number of bytes which /// matches the file size. If no 4-byte header is present, then the function /// tolerates and removes a trailing 0-byte as of Sony specs. /// @param path Filesystem address of the CD-TEXT pack file. /// Normally with suffix .cdt or .dat /// @param text_packs Will return the buffer with the CD-TEXT packs. /// Dispose by free() when no longer needed. /// @param num_packs Will return the number of 18 byte text packs. /// @param flag Bitfield for control purposes. Unused yet.Submit 0. /// @return 0 is success, <= 0 failure /// @since 1.2.0 pub fn burn_cdtext_from_packfile( path: *mut ::std::os::raw::c_char, text_packs: *mut *mut ::std::os::raw::c_uchar, num_packs: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Define the data in a track /// @param t the track to define /// @param offset The lib will write this many 0s before start of data /// @param tail The number of extra 0s to write after data /// @param pad 1 means the lib should pad the last sector with 0s if the /// track isn't exactly sector sized. (otherwise the lib will /// begin reading from the next track) /// @param mode data format (bitfield) pub fn burn_track_define_data( t: *mut burn_track, offset: ::std::os::raw::c_int, tail: ::std::os::raw::c_int, pad: ::std::os::raw::c_int, mode: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Attach text or binary data as CD-TEXT attributes to a track. /// The payload will be used to generate CD-TEXT packs by /// burn_cdtext_from_session() or to write CD-TEXT packs into the lead-in /// of a CD SAO session. This happens if the CD-TEXT attribute of the session /// gets generated, which has the same block number and pack type. In this /// case, each track should have such a CD-TEXT attribute, too. /// See burn_session_set_cdtext(). /// Be cautious not to exceed the maximum number of 253 payload packs per /// language block. Use burn_cdtext_from_session() to learn whether a valid /// array of CD-TEXT packs can be generated from your attributes. /// @param t Track where to attach CD-TEXT attribute. /// @param block Number of the language block in which the attribute /// shall appear. Possible values: 0 to 7. /// @param pack_type Pack type number. 0x80 to 0x85 or 0x8e. Used if /// pack_type_name is NULL or empty text. Else submit 0 /// and a name. /// @param pack_type_name The pack type by name. Applicable names are: /// 0x80 = \"TITLE\" 0x81 = \"PERFORMER\" /// 0x82 = \"SONGWRITER\" 0x83 = \"COMPOSER\" /// 0x84 = \"ARRANGER\" 0x85 = \"MESSAGE\" /// 0x8e = \"UPC_ISRC\" /// @param payload 0-terminated cleartext. If double byte characters /// are used, then two 0-bytes terminate the cleartext. /// @param length Number of bytes in payload. Including terminating /// 0-bytes. /// @param flag Bitfield for control purposes. /// bit0= payload contains double byte characters /// (with character code 0x80 MS-JIS japanese Kanji) /// @return > 0 indicates success , <= 0 is failure /// @since 1.2.0 pub fn burn_track_set_cdtext( t: *mut burn_track, block: ::std::os::raw::c_int, pack_type: ::std::os::raw::c_int, pack_type_name: *mut ::std::os::raw::c_char, payload: *mut ::std::os::raw::c_uchar, length: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain a CD-TEXT attribute that was set by burn_track_set_cdtext(). /// @param t Track to inquire /// @param block Number of the language block to inquire. /// @param pack_type Pack type number to inquire. Used if pack_type_name /// is NULL or empty text. Else submit 0 and a name. /// @param pack_type_name The pack type by name. /// See above burn_track_set_cdtext(). /// @param payload Will return a pointer to text bytes. /// Not a copy of data. Do not free() this address. /// If no text attribute is attached for pack type and /// block, then payload is returned as NULL. The return /// value will not indicate error in this case. /// @param length Will return the number of bytes pointed to by payload. /// Including terminating 0-bytes. /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return 1=single byte char , 2= double byte char , <=0 error /// @since 1.2.0 pub fn burn_track_get_cdtext( t: *mut burn_track, block: ::std::os::raw::c_int, pack_type: ::std::os::raw::c_int, pack_type_name: *mut ::std::os::raw::c_char, payload: *mut *mut ::std::os::raw::c_uchar, length: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Remove all CD-TEXT attributes of the given block from the track. /// They were attached by burn_track_set_cdtext(). /// @param t Track where to remove the CD-TEXT attribute. /// @param block Number of the language block in which the attribute /// shall appear. Possible values: 0 to 7. /// -1 causes text packs of all blocks to be removed. /// @return > 0 is success, <= 0 failure /// @since 1.2.0 pub fn burn_track_dispose_cdtext( t: *mut burn_track, block: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Activates CD XA compatibility modes. /// libburn currently writes data only in CD mode 1. Some programs insist in /// sending data with additional management bytes. These bytes have to be /// stripped in order to make the input suitable for BURN_MODE1. /// @param t The track to manipulate /// @param value 0= no conversion /// 1= strip 8 byte sector headers of CD-ROM XA mode 2 form 1 /// see MMC-5 4.2.3.8.5.3 Block Format for Mode 2 form 1 Data /// all other values are reserved /// @return 1=success , 0=unacceptable value /// @since 0.7.2 pub fn burn_track_set_cdxa_conv( t: *mut burn_track, value: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Set the ISRC details for a track. When writing to CD media, ISRC will get /// written into the Q sub-channel. /// @param t The track to change /// @param country the 2 char country code. Each character must be /// only numbers or letters. /// @param owner 3 char owner code. Each character must be only numbers /// or letters. /// @param year 2 digit year. A number in 0-99 (Yep, not Y2K friendly). /// @param serial 5 digit serial number. A number in 0-99999. pub fn burn_track_set_isrc( t: *mut burn_track, country: *mut ::std::os::raw::c_char, owner: *mut ::std::os::raw::c_char, year: ::std::os::raw::c_uchar, serial: ::std::os::raw::c_uint, ); } unsafe extern "C" { /// Set the composed ISRC string for a track. This is an alternative to /// burn_track_set_isrc(). /// @param t The track to be manipulated /// @param isrc 12 characters which are composed from ISRC details. /// Format is CCOOOYYSSSSS, terminated by a 0-byte: /// Country, Owner, Year(decimal digits), Serial(decimal digits). /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return > 0 indicates success, <= 0 means failure /// @since 1.2.0 pub fn burn_track_set_isrc_string( t: *mut burn_track, isrc: *mut ::std::os::raw::c_char, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Disable ISRC parameters for a track /// @param t The track to change pub fn burn_track_clear_isrc(t: *mut burn_track); } unsafe extern "C" { /// Define an index start address within a track. The index numbers inside a /// track have to form sequence starting at 0 or 1 with no gaps up to the /// highest number used. They affect only writing of CD SAO sessions. /// The first index start address of a track must be 0. /// Blocks between index 0 and index 1 are considered to be located before the /// track start as of the table-of-content. /// @param t The track to be manipulated /// @param index_number A number between 0 and 99 /// @param relative_lba The start address relative to the start of the /// burn_source of the track. It will get mapped to the /// appropriate absolute block address. /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return > 0 indicates success, <= 0 means failure /// @since 1.2.0 pub fn burn_track_set_index( t: *mut burn_track, index_number: ::std::os::raw::c_int, relative_lba: ::std::os::raw::c_uint, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Remove all index start addresses and reset to the default indexing of /// CD SAO sessions. This means index 0 of track 1 reaches from LBA -150 /// to LBA -1. Index 1 of track 1 reaches from LBA 0 to track end. Index 1 /// of track 2 follows immediately. The same happens for all further tracks /// after the end of their predecessor. /// @param t The track to be manipulated /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return > 0 indicates success, <= 0 means failure /// @since 1.2.0 pub fn burn_track_clear_indice( t: *mut burn_track, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Define whether a pre-gap shall be written before the track and how many /// sectors this pre-gap shall have. A pre-gap is written in the range of track /// index 0 and contains zeros (audio silence). No bytes from the track source /// will be read for writing the pre-gap. /// This setting affects only CD SAO write runs. /// The first track automatically gets a pre-gap of at least 150 sectors. Its /// size may be enlarged by this call. Further pre-gaps are demanded by MMC /// for tracks which follow tracks of a different mode. (But Mode mixing in /// CD SAO sessions is currently not supported by libburn.) /// @param t The track to change /// @param size Number of sectors in the pre-gap. /// -1 disables pre-gap, except for the first track. /// libburn allows 0, but MMC does not propose this. /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return > 0 indicates success, <= 0 means failure /// @since 1.2.0 pub fn burn_track_set_pregap_size( t: *mut burn_track, size: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Define whether a post-gap shall be written at the end of the track and /// how many sectors this gap shall have. A post-gap occupies the range of /// an additional index of the track. It contains zeros. No bytes from the /// track source will be read for writing the post-gap. /// This setting affects only CD SAO write runs. /// MMC prescribes to add a post-gap to a data track which is followed by /// a non-data track. (But libburn does not yet support mixed mode CD SAO /// sessions.) /// @param t The track to change /// @param size Number of sectors in the post-gap. /// -1 disables post-gap. /// libburn allows 0, but MMC does not propose this. /// @param flag Bitfield for control purposes. Unused yet. Submit 0. /// @return > 0 indicates success, <= 0 means failure /// @since 1.2.0 pub fn burn_track_set_postgap_size( t: *mut burn_track, size: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Define whether a track shall swap bytes of its input stream. /// @param t The track to change /// @param swap_source_bytes 0=do not swap, 1=swap byte pairs /// @return 1=success , 0=unacceptable value /// @since 0.2.6 pub fn burn_track_set_byte_swap( t: *mut burn_track, swap_source_bytes: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Hide the first track in the \"pre gap\" of the disc /// @param s session to change /// @param onoff 1 to enable hiding, 0 to disable pub fn burn_session_hide_first_track(s: *mut burn_session, onoff: ::std::os::raw::c_int); } unsafe extern "C" { /// Get the drive's disc struct - free when done /// @param d drive to query /// @return the disc struct or NULL on failure pub fn burn_drive_get_disc(d: *mut burn_drive) -> *mut burn_disc; } unsafe extern "C" { /// Set the track's data source /// @param t The track to set the data source for /// @param s The data source to use for the contents of the track /// @return An error code stating if the source is ready for use for /// writing the track, or if an error occurred pub fn burn_track_set_source(t: *mut burn_track, s: *mut burn_source) -> burn_source_status; } unsafe extern "C" { /// Set a default track size to be used only if the track turns out to be of /// unpredictable length and if the effective write type demands a fixed size. /// This can be useful to enable write types CD SAO or DVD DAO together with /// a track source like stdin. If the track source delivers fewer bytes than /// announced then the track will be padded up with zeros. /// @param t The track to change /// @param size The size to set /// @return 0=failure 1=success /// @since 0.3.4 pub fn burn_track_set_default_size(t: *mut burn_track, size: off_t) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Free a burn_source (decrease its refcount and maybe free it) /// @param s Source to free pub fn burn_source_free(s: *mut burn_source); } unsafe extern "C" { /// Creates a data source for an image file (and maybe subcode file) /// @param path The file address for the main channel payload. /// @param subpath Eventual address for subchannel data. Only used in exotic /// raw write modes. Submit NULL for normal tasks. /// @return Pointer to a burn_source object, NULL indicates failure pub fn burn_file_source_new( path: *const ::std::os::raw::c_char, subpath: *const ::std::os::raw::c_char, ) -> *mut burn_source; } unsafe extern "C" { /// Opens a file with eventual acceleration preparations which may depend /// on the operating system and on compile time options of libburn. /// You may use this call instead of open(2) for opening file descriptors /// which shall be handed to burn_fd_source_new(). /// This should only be done for tracks with BURN_BLOCK_MODE1 (2048 bytes /// per block). /// /// If you use this call then you MUST allocate the buffers which you use /// with read(2) by call burn_os_alloc_buffer(). Read sizes MUST be a multiple /// of a safe buffer amount. Else you risk that track data get altered during /// transmission. /// burn_disk_write() will allocate a suitable read/write buffer for its own /// operations. A fifo created by burn_fifo_source_new() will allocate /// suitable memory for its buffer if called with flag bit0 and a multiple /// of a safe buffer amount. /// @param path The file address to open /// @param open_flags The flags as of man 2 open. Normally just O_RDONLY. /// @param flag Bitfield for control purposes (unused yet, submit 0). /// @return A file descriptor as of open(2). Finally to be disposed /// by close(2). /// -1 indicates failure. /// @since 0.7.4 pub fn burn_os_open_track_src( path: *mut ::std::os::raw::c_char, open_flags: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Allocate a memory area that is suitable for reading with a file descriptor /// opened by burn_os_open_track_src(). /// @param amount Number of bytes to allocate. This should be a multiple /// of the operating system's i/o block size. 32 KB is /// guaranteed by libburn to be safe. /// @param flag Bitfield for control purposes (unused yet, submit 0). /// @return The address of the allocated memory, or NULL on failure. /// A non-NULL return value has finally to be disposed via /// burn_os_free_buffer(). /// @since 0.7.4 pub fn burn_os_alloc_buffer( amount: usize, flag: ::std::os::raw::c_int, ) -> *mut ::std::os::raw::c_void; } unsafe extern "C" { /// Dispose a memory area which was obtained by burn_os_alloc_buffer(), /// @param buffer Memory address to be freed. /// @param amount The number of bytes which was allocated at that /// address. /// @param flag Bitfield for control purposes (unused yet, submit 0). /// @return 1 success , <=0 failure /// @since 0.7.4 pub fn burn_os_free_buffer( buffer: *mut ::std::os::raw::c_void, amount: usize, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Creates a data source for an image file (a track) from an open /// readable filedescriptor, an eventually open readable subcodes file /// descriptor and eventually a fixed size in bytes. /// @param datafd The source of data. /// @param subfd The eventual source of subchannel data. Only used in exotic /// raw write modes. Submit -1 for normal tasks. /// @param size The eventual fixed size of eventually both fds. /// If this value is 0, the size will be determined from datafd. /// @return Pointer to a burn_source object, NULL indicates failure pub fn burn_fd_source_new( datafd: ::std::os::raw::c_int, subfd: ::std::os::raw::c_int, size: off_t, ) -> *mut burn_source; } unsafe extern "C" { /// Creates an offset source which shall provide a byte interval of a stream /// to its consumer. It is supposed to be chain-linked with other offset /// sources which serve neighboring consumers. The chronological sequence /// of consumers and the sequence of offset sources must match. The intervals /// of the sources must not overlap. /// /// A chain of these burn_source objects may be used to feed multiple tracks /// from one single stream of input bytes. /// Each of the offset sources will skip the bytes up to its start address and /// provide the prescribed number of bytes to the track. Skipping takes into /// respect the bytes which have been processed by eventual predecessors in the /// chain. /// Important: It is not allowed to free an offset source before its successor /// has ended its work. Best is to keep them all until all tracks /// are done. /// /// @param inp The burn_source object from which to read stream data. /// E.g. created by burn_file_source_new(). /// @param prev The eventual offset source object which shall read data from /// inp before the new offset source will begin its own work. /// This must either be a result of burn_offst_source_new() or /// it must be NULL. /// @param start The byte address where to start reading bytes for the /// consumer. inp bytes may get skipped to reach this address. /// @param size The number of bytes to be delivered to the consumer. /// If size is <= 0 then it may be set later by a call of method /// set_size(). If it is >= 0, then it can only be changed if /// flag bit0 was set with burn_offst_source_new(). /// @param flag Bitfield for control purposes /// bit0 = Prevent set_size() from overriding interval sizes > 0. /// If such a size is already set, then the new one will /// only affect the reply of get_size(). /// See also above struct burn_source. /// @since 1.2.0 /// @return Pointer to a burn_source object, later to be freed by /// burn_source_free(). NULL indicates failure. /// @since 0.8.8 pub fn burn_offst_source_new( inp: *mut burn_source, prev: *mut burn_source, start: off_t, size: off_t, flag: ::std::os::raw::c_int, ) -> *mut burn_source; } unsafe extern "C" { /// Creates a fifo which acts as proxy for an already existing data source. /// The fifo provides a ring buffer which shall smoothen the data stream /// between burn_source and writer thread. Each fifo serves only for one /// data source. It may be attached to one track as its only data source /// by burn_track_set_source(), or it may be used as input for other burn /// sources. /// A fifo starts its life in \"standby\" mode with no buffer space allocated. /// As soon as its consumer requires bytes, the fifo establishes a worker /// thread and allocates its buffer. After input has ended and all buffer /// content is consumed, the buffer space gets freed and the worker thread /// ends. This happens asynchronously. So expect two buffers and worker threads /// to exist for a short time between tracks. Be modest in your size demands if /// multiple tracks are to be expected. /// @param inp The burn_source for which the fifo shall act as proxy. /// It can be disposed by burn_source_free() immediately /// after this call. /// @param chunksize The size in bytes of a chunk. /// Use 2048 for sources suitable for BURN_BLOCK_MODE1, /// 2352 for sources which deliver for BURN_BLOCK_AUDIO, /// 2056 for sources which shall get treated by /// burn_track_set_cdxa_conv(track, 1). /// Some variations of burn_source might work only with /// a particular chunksize. E.g. libisofs demands 2048. /// @param chunks The number of chunks to be allocated in ring buffer. /// This value must be >= 2. /// @param flag Bitfield for control purposes: /// bit0= The read method of inp is capable of delivering /// arbitrary amounts of data per call. Not only one /// sector. /// Suitable for inp from burn_file_source_new() /// and burn_fd_source_new() if not the fd has /// exotic limitations on read size. /// You MUST use this on inp which uses an fd opened /// with burn_os_open_track_src(). /// Better do not use with other inp types. /// @since 0.7.4 /// @return A pointer to the newly created burn_source. /// Later both burn_sources, inp and the returned fifo, have /// to be disposed by calling burn_source_free() for each. /// inp can be freed immediately, the returned fifo may be /// kept as handle for burn_fifo_inquire_status(). /// @since 0.4.0 pub fn burn_fifo_source_new( inp: *mut burn_source, chunksize: ::std::os::raw::c_int, chunks: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> *mut burn_source; } unsafe extern "C" { /// Inquires state and fill parameters of a fifo burn_source which was created /// by burn_fifo_source_new() . Do not use with other burn_source variants. /// @param fifo The fifo object to inquire /// @param size The total size of the fifo /// @param free_bytes The current free capacity of the fifo /// @param status_text Returns a pointer to a constant text, see below /// @return <0 reply invalid, >=0 fifo status code: /// bit0+1=input status, bit2=consumption status, i.e: /// 0=\"standby\" : data processing not started yet /// 1=\"active\" : input and consumption are active /// 2=\"ending\" : input has ended without error /// 3=\"failing\" : input had error and ended, /// 4=\"unused\" : ( consumption has ended before processing start ) /// 5=\"abandoned\" : consumption has ended prematurely /// 6=\"ended\" : consumption has ended without input error /// 7=\"aborted\" : consumption has ended after input error /// @since 0.4.0 pub fn burn_fifo_inquire_status( fifo: *mut burn_source, size: *mut ::std::os::raw::c_int, free_bytes: *mut ::std::os::raw::c_int, status_text: *mut *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Inquire various counters which reflect the fifo operation. /// @param fifo The fifo object to inquire /// @param total_min_fill The minimum number of bytes in the fifo. Beginning /// from the moment when fifo consumption is enabled. /// @param interval_min_fill The minimum byte number beginning from the moment /// when fifo consumption is enabled or from the /// most recent moment when burn_fifo_next_interval() /// was called. /// @param put_counter The number of data transactions into the fifo. /// @param get_counter The number of data transactions out of the fifo. /// @param empty_counter The number of times the fifo was empty. /// @param full_counter The number of times the fifo was full. /// @since 0.7.4 pub fn burn_fifo_get_statistics( fifo: *mut burn_source, total_min_fill: *mut ::std::os::raw::c_int, interval_min_fill: *mut ::std::os::raw::c_int, put_counter: *mut ::std::os::raw::c_int, get_counter: *mut ::std::os::raw::c_int, empty_counter: *mut ::std::os::raw::c_int, full_counter: *mut ::std::os::raw::c_int, ); } unsafe extern "C" { /// Inquire the fifo minimum fill counter for intervals and reset that counter. /// @param fifo The fifo object to inquire /// @param interval_min_fill The minimum number of bytes in the fifo. Beginning /// from the moment when fifo consumption is enabled /// or from the most recent moment when /// burn_fifo_next_interval() was called. /// @since 0.7.4 pub fn burn_fifo_next_interval( fifo: *mut burn_source, interval_min_fill: *mut ::std::os::raw::c_int, ); } unsafe extern "C" { /// Obtain a preview of the first input data of a fifo which was created /// by burn_fifo_source_new(). The data will later be delivered normally to /// the consumer track of the fifo. /// bufsize may not be larger than the fifo size (chunk_size * chunks) - 32k. /// This call will succeed only if data consumption by the track has not /// started yet, i.e. best before the call to burn_disc_write(). /// It will start the worker thread of the fifo with the expectable side /// effects on the external data source. Then it waits either until enough /// data have arrived or until it becomes clear that this will not happen. /// The call may be repeated with increased bufsize. It will always yield /// the bytes beginning from the first one in the fifo. /// @param fifo The fifo object to start and to inquire /// @param buf Pointer to memory of at least bufsize bytes where to /// deliver the peeked data. /// @param bufsize Number of bytes to peek from the start of the fifo data /// @param flag Bitfield for control purposes (unused yet, submit 0). /// @return <0 on severe error, 0 if not enough data, 1 if bufsize bytes read /// @since 0.5.0 pub fn burn_fifo_peek_data( fifo: *mut burn_source, buf: *mut ::std::os::raw::c_char, bufsize: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Start the fifo worker thread and wait either until the requested number /// of bytes have arrived or until it becomes clear that this will not happen. /// Filling will go on asynchronously after burn_fifo_fill() returned. /// This call and burn_fifo_peek_data() do not disturb each other. /// @param fifo The fifo object to start /// @param fill Number of bytes desired. Expect to get return 1 if /// at least fifo size - 32k were read. /// @param flag Bitfield for control purposes. /// bit0= fill fifo to maximum size /// @return <0 on severe error, 0 if not enough data, /// 1 if desired amount or fifo full /// @since 0.7.4 pub fn burn_fifo_fill( fifo: *mut burn_source, fill: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Sets a fixed track size after the data source object has already been /// created. /// @param t The track to operate on /// @param size the number of bytes to use as track size /// @return <=0 indicates failure , >0 success /// @since 0.3.6 pub fn burn_track_set_size(t: *mut burn_track, size: off_t) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Tells how many sectors a track will have on disc, or already has on /// disc. This includes offset, payload, tail, and post-gap, but not pre-gap. /// The result is NOT RELIABLE with tracks of undefined length pub fn burn_track_get_sectors(arg1: *mut burn_track) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Tells how many source bytes have been read and how many data bytes have /// been written by the track during burn. /// @param t The track to inquire /// @param read_bytes Number of bytes read from the track source /// @param written_bytes Number of bytes written to track /// @since 0.2.6 pub fn burn_track_get_counters( t: *mut burn_track, read_bytes: *mut off_t, written_bytes: *mut off_t, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Sets drive read and write speed. /// Note: \"k\" is 1000, not 1024. /// 1xCD = 176.4 k/s, 1xDVD = 1385 k/s, 1xBD = 4496 k/s. /// Fractional speeds should be rounded up. Like 4xCD = 706. /// @param d The drive to set speed for /// @param read Read speed in k/s (0 is max, -1 is min). /// @param write Write speed in k/s (0 is max, -1 is min). pub fn burn_drive_set_speed( d: *mut burn_drive, read: ::std::os::raw::c_int, write: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Sets drive read and write speed using the \"Exact\" bit of SCSI command /// SET STREAMING. This command will be used even if a CD medium is present. /// MMC specifies that with the Exact bit the desired speed settings shall /// either be obeyed by the drive exactly, or that the drive shall indicate /// failure and not accept the settings. /// But many drives reply no error and nevertheless adjust their read speed /// only coarsly or ignore the setting after a few MB of fast read attempts. /// /// The call parameters have the same meaning as with burn_drive_set_speed(). /// @param d The drive to set speed for. It must be a role 1 drive. /// @param read Read speed in k/s (0 is max, -1 is min). /// @param write Write speed in k/s (0 is max, -1 is min). /// @return 1=success , 0=failure /// @since 1.5.4 pub fn burn_drive_set_speed_exact( d: *mut burn_drive, read: ::std::os::raw::c_int, write: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Waits until the time has elapsed since the given previous time to transmit /// the given byte count with the given speed in KB/second (KB = 1000 bytes). /// This call may be used between random access read operations like /// burn_read_data() in order to force a slower speed than the drive is /// willing to use if it gets read requests as fast as it delivers data. /// /// The parameter us_corr carries microseconds of time deviations from one /// call to the next one. Such deviations may happen because of small /// inexactnesses of the sleeper function and because of temporary delays /// in the data supply so that sleeping for a negative time span would have /// been necessary. The next call will reduce or enlarge its own sleeping /// period by this value. /// /// @param kb_per_second the desired speed in 1000 bytes per second. /// Supplied by the caller. /// @max_corr the maximum backlog in microseconds which shall /// be compensated by the next call. Supplied by the /// caller. Not more than 1 billion = 1000 seconds. /// @param prev_time time keeper updated by burn_nominal_slowdown(). /// The caller provides the memory and elsewise should /// carry it unchanged from call to call. /// @param us_corr updated by burn_nominal_slowdown(). See above. /// The caller provides the memory and elsewise should /// carry it unchanged from call to call. /// @param b_since_prev byte count since the previous call. This number /// has to be counted and supplied by the caller. /// @param flag Bitfield for control purposes: /// bit0= initialize *prev_time and *us_corr, /// ignore other parameters, do not wait /// @return 2=no wait because no usable kb_per_second , 1=success , 0=failure /// @since 1.5.4 pub fn burn_nominal_slowdown( kb_per_second: ::std::os::raw::c_int, max_corr: ::std::os::raw::c_int, prev_time: *mut timeval, us_corr: *mut ::std::os::raw::c_int, b_since_prev: off_t, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Controls the behavior with writing when the drive buffer is suspected to /// be full. To check and wait for enough free buffer space before writing /// will move the task of waiting from the operating system's device driver /// to libburn. While writing is going on and waiting is enabled, any write /// operation will be checked whether it will fill the drive buffer up to /// more than max_percent. If so, then waiting will happen until the buffer /// fill is predicted with at most min_percent. /// Thus: if min_percent < max_percent then transfer rate will oscillate. /// This may allow the driver to operate on other devices, e.g. a disk from /// which to read the input for writing. On the other hand, this checking might /// reduce maximum throughput to the drive or even get misled by faulty buffer /// fill replies from the drive. /// If a setting parameter is < 0, then this setting will stay unchanged /// by the call. /// Known burner or media specific pitfalls: /// To have max_percent larger than the burner's best reported buffer fill has /// the same effect as min_percent==max_percent. Some burners do not report /// their full buffer with all media types. Some are not suitable because /// they report their buffer fill with delay. Some do not go to full speed /// unless their buffer is full. /// /// @param d The drive to control /// @param enable 0= disable , 1= enable waiting , (-1 = do not change setting) /// @param min_usec Shortest possible sleeping period (given in micro seconds) /// @param max_usec Longest possible sleeping period (given in micro seconds) /// @param timeout_sec If a single write has to wait longer than this number /// of seconds, then waiting gets disabled and mindless /// writing starts. A value of 0 disables this timeout. /// @param min_percent Minimum of desired buffer oscillation: 25 to 100 /// @param max_percent Maximum of desired buffer oscillation: 25 to 100 /// @return 1=success , 0=failure /// @since 0.3.8 pub fn burn_drive_set_buffer_waiting( d: *mut burn_drive, enable: ::std::os::raw::c_int, min_usec: ::std::os::raw::c_int, max_usec: ::std::os::raw::c_int, timeout_sec: ::std::os::raw::c_int, min_percent: ::std::os::raw::c_int, max_percent: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Control the write simulation mode before or after burn_write_opts get /// into effect. /// Beginning with version 1.4.8 a burn run by burn_disc_write() brings the /// burn_drive object in the simulation state as set to the burn_write_opts /// by burn_write_opts_set_simulate(). This state is respected by call /// burn_random_access_write() until a new call of burn_disc_write() happens /// or until burn_drive_reset_simulate() is called. /// This call may only be made when burn_drive_get_status() returns /// BURN_DRIVE_IDLE. /// /// @param d The drive to control /// @param simulate 1 enables simulation, 0 enables real writing /// @return 1=success , 0=failure /// @since 1.4.8 pub fn burn_drive_reset_simulate( d: *mut burn_drive, simulate: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { pub fn burn_structure_print_disc(d: *mut burn_disc); } unsafe extern "C" { pub fn burn_structure_print_session(s: *mut burn_session); } unsafe extern "C" { pub fn burn_structure_print_track(t: *mut burn_track); } unsafe extern "C" { /// Sets the write type for the write_opts struct. /// Note: write_type BURN_WRITE_SAO is currently not capable of writing a mix /// of data and audio tracks. You must use BURN_WRITE_TAO for such sessions. /// @param opts The write opts to change /// @param write_type The write type to use /// @param block_type The block type to use /// @return Returns 1 on success and 0 on failure. pub fn burn_write_opts_set_write_type( opts: *mut burn_write_opts, write_type: burn_write_types, block_type: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// As an alternative to burn_write_opts_set_write_type() this function tries /// to find a suitable write type and block type for a given write job /// described by opts and disc. To be used after all other setups have been /// made, i.e. immediately before burn_disc_write(). /// @param opts The nearly complete write opts to change /// @param disc The already composed session and track model /// @param reasons This text string collects reasons for decision or failure /// @param flag Bitfield for control purposes: /// bit0= do not choose type but check the one that is already set /// bit1= do not issue error messages via burn_msgs queue /// (is automatically set with bit0) /// @return Chosen write type. BURN_WRITE_NONE on failure. /// @since 0.3.2 pub fn burn_write_opts_auto_write_type( opts: *mut burn_write_opts, disc: *mut burn_disc, reasons: *mut ::std::os::raw::c_char, flag: ::std::os::raw::c_int, ) -> burn_write_types; } unsafe extern "C" { /// Supplies toc entries for writing - not normally required for cd mastering /// @param opts The write opts to change /// @param count The number of entries /// @param toc_entries pub fn burn_write_opts_set_toc_entries( opts: *mut burn_write_opts, count: ::std::os::raw::c_int, toc_entries: *mut burn_toc_entry, ); } unsafe extern "C" { /// Sets the session format for a disc /// @param opts The write opts to change /// @param format The session format to set pub fn burn_write_opts_set_format(opts: *mut burn_write_opts, format: ::std::os::raw::c_int); } unsafe extern "C" { /// Sets the simulate value for the write_opts struct . /// This corresponds to the Test Write bit in MMC mode page 05h. Several media /// types do not support this. See struct burn_multi_caps.might_simulate for /// actual availability of this feature. /// If the media is suitable, the drive will perform burn_disc_write() as a /// simulation instead of effective write operations. This means that the /// media content and burn_disc_get_status() stay unchanged. /// Note: With stdio-drives, the target file gets eventually created, opened, /// lseeked, and closed, but not written. So there are effects on it. /// Note: Up to version 1.4.6 the call burn_random_access_write() after /// burn_disc_write() did not simulate because it does not get any /// burn_write_opts and the drive did not memorize the simulation state. /// This has changed now. burn_random_access_write() will not write after /// a simulated burn run. /// Use burn_drive_reset_simulate(drive, 0) if you really want to end /// simulation before you call burn_disc_write() with new write options. /// @param opts The write opts to change /// @param sim Non-zero enables simulation, 0 enables real writing /// @return Returns 1 on success and 0 on failure. pub fn burn_write_opts_set_simulate( opts: *mut burn_write_opts, sim: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Controls buffer underrun prevention. This is only needed with CD media /// and possibly with old DVD-R drives. All other media types are not /// vulnerable to burn failure due to buffer underrun. /// @param opts The write opts to change /// @param underrun_proof if non-zero, buffer underrun protection is enabled /// @return Returns 1 if the drive announces to be capable of underrun /// prevention, /// Returns 0 if not. pub fn burn_write_opts_set_underrun_proof( opts: *mut burn_write_opts, underrun_proof: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Sets whether to use opc or not with the write_opts struct /// @param opts The write opts to change /// @param opc If non-zero, optical power calibration will be performed at /// start of burn pub fn burn_write_opts_set_perform_opc(opts: *mut burn_write_opts, opc: ::std::os::raw::c_int); } unsafe extern "C" { /// The Q sub-channel of a CD may contain a Media Catalog Number of 13 decimal /// digits. This call sets the string of digits, but does not yet activate it /// for writing. /// @param opts The write opts to change /// @param mediacatalog The 13 decimal digits as ASCII bytes. I.e. '0' = 0x30. pub fn burn_write_opts_set_mediacatalog( opts: *mut burn_write_opts, mediacatalog: *mut ::std::os::raw::c_uchar, ); } unsafe extern "C" { /// This call activates the Media Catalog Number for writing. The digits of /// that number have to be set by call burn_write_opts_set_mediacatalog(). /// @param opts The write opts to change /// @param has_mediacatalog 1= activate writing of catalog to Q sub-channel /// 0= deactivate it pub fn burn_write_opts_set_has_mediacatalog( opts: *mut burn_write_opts, has_mediacatalog: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Sets the multi flag which eventually marks the emerging session as not /// being the last one and thus creating a BURN_DISC_APPENDABLE media. /// Note: DVD-R[W] in write mode BURN_WRITE_SAO are not capable of this. /// DVD-R DL are not capable of this at all. /// libburn will refuse to write if burn_write_opts_set_multi() is /// enabled under such conditions. /// @param opts The option object to be manipulated /// @param multi 1=media will be appendable, 0=media will be closed (default) /// @since 0.2.6 pub fn burn_write_opts_set_multi(opts: *mut burn_write_opts, multi: ::std::os::raw::c_int); } unsafe extern "C" { /// Set the severity to be used with write error messages which are potentially /// caused by not using write type BURN_WRITE_SAO on fast blanked DVD-RW. /// /// Normally the call burn_write_opts_auto_write_type() can prevent such /// errors by looking for MMC feature 21h \"Incremental Streaming Writable\" /// which anounnces the capability for BURN_WRITE_TAO and multi session. /// Regrettable many drives announce feature 21h even if they only can do /// BURN_WRITE_SAO. This mistake becomes obvious by an early write error. /// /// If you plan to call burn_drive_was_feat21_failure() and to repeat the /// burn attempt with BURN_WRITE_SAO, then set the severity of the error /// message low enough, so that the application does not see reason to abort. /// /// @param opts The option object to be manipulated /// @param severity Severity as with burn_msgs_set_severities(). /// \"ALL\" or empty text means the default severity that /// is attributed to other kinds of write errors. pub fn burn_write_opts_set_fail21h_sev( opts: *mut burn_write_opts, severity: *mut ::std::os::raw::c_char, ); } unsafe extern "C" { /// Submit an array of CD-TEXT packs which shall be written to the Lead-in /// of a SAO write run on CD. /// @param opts The option object to be manipulated /// @param text_packs Array of bytes which form CD-TEXT packs of 18 bytes /// each. For a description of the format of the array, /// see file doc/cdtext.txt. /// No header of 4 bytes must be prepended which would /// tell the number of pack bytes + 2. /// This parameter may be NULL if the currently attached /// array of packs shall be removed. /// @param num_packs The number of 18 byte packs in text_packs. /// This parameter may be 0 if the currently attached /// array of packs shall be removed. /// @param flag Bitfield for control purposes. /// bit0= do not verify checksums /// bit1= repair mismatching checksums /// bit2= repair checksums if they are 00 00 with each pack /// @return 1 on success, <= 0 on failure /// @since 1.2.0 pub fn burn_write_opts_set_leadin_text( opts: *mut burn_write_opts, text_packs: *mut ::std::os::raw::c_uchar, num_packs: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Sets a start address for writing to media and write modes which are able /// to choose this address at all (for now: DVD+RW, DVD-RAM, formatted DVD-RW). /// now). The address is given in bytes. If it is not -1 then a write run /// will fail if choice of start address is not supported or if the block /// alignment of the address is not suitable for media and write mode. /// Alignment to 32 kB blocks is supposed to be safe with DVD media. /// Call burn_disc_get_multi_caps() can obtain the necessary media info. See /// resulting struct burn_multi_caps elements .start_adr , .start_alignment , /// .start_range_low , .start_range_high . /// @param opts The write opts to change /// @param value The address in bytes (-1 = start at default address) /// @since 0.3.0 pub fn burn_write_opts_set_start_byte(opts: *mut burn_write_opts, value: off_t); } unsafe extern "C" { /// Caution: still immature and likely to change. Problems arose with /// sequential DVD-RW on one drive. /// /// Controls whether the whole available space of the media shall be filled up /// by the last track of the last session. /// @param opts The write opts to change /// @param fill_up_media If 1 : fill up by last track, if 0 = do not fill up /// @since 0.3.4 pub fn burn_write_opts_set_fillup( opts: *mut burn_write_opts, fill_up_media: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Lets libburn ignore the failure of some conformance checks: /// - the check whether CD write+block type is supported by the drive /// - the check whether the media profile supports simulated burning /// - @since 1.5.6 /// The check whether a write operation exceeds the size of the medium /// as announced by the drive. This is known as \"overburn\" and may work /// for a few thousand additional blocks on CD media with write type SAO. /// @param opts The write opts to change /// @param use_force 1=ignore above checks, 0=refuse work on failed check /// @since 0.3.4 pub fn burn_write_opts_set_force(opts: *mut burn_write_opts, use_force: ::std::os::raw::c_int); } unsafe extern "C" { /// Eventually makes use of the more modern write command AAh WRITE12 and /// sets the Streaming bit. With DVD-RAM and BD 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 affects the write operations of burn_disc_write() /// and subsequent calls of burn_random_access_write(). /// @param opts The write opts to change /// @param value 0=use 2Ah WRITE10, 1=use AAh WRITE12 with Streaming bit /// @since 0.6.4: /// >=16 use WRITE12 but not before the LBA given by value /// @since 0.4.6 pub fn burn_write_opts_set_stream_recording( opts: *mut burn_write_opts, value: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Overrides the write chunk size for DVD and BD media which is normally /// determined according to media type and setting of stream recording. /// A chunk size of 64 KB may improve throughput with bus systems which show /// latency problems. /// @param opts The write opts to change /// @param obs Number of bytes which shall be sent by a single write command. /// 0 means automatic size, 32768 and 65336 are the only other /// accepted sizes for now. /// @since 0.7.4 pub fn burn_write_opts_set_dvd_obs(opts: *mut burn_write_opts, obs: ::std::os::raw::c_int); } unsafe extern "C" { /// Overrides the automatic decision whether to pad up the last write chunk to /// its full size. This applies to DVD, BD and stdio: pseudo-drives. /// Note: This override may get enabled fixely already at compile time by /// defining macro Libburn_dvd_always_obs_paD . /// @param opts The write opts to change /// @param pad 1 means to pad up in any case, 0 means automatic decision. /// @since 1.2.4 pub fn burn_write_opts_set_obs_pad(opts: *mut burn_write_opts, pad: ::std::os::raw::c_int); } unsafe extern "C" { /// Exempts BD-R media from the elsewise unavoidable automatic padding of the /// last write chunk to its full size. /// Even if this exempt is granted it gets into effect only if stream recording /// is disabled and burn_write_opts_set_obs_pad() is set to 0. /// @param opts The write opts to change /// @param value 1= possibly exempt BD-R from end chunk padding. /// 0= always act on BD-R as if /// burn_write_opts_set_obs_pad(opts, 1) is in effect. /// @since 1.5.6 pub fn burn_write_opts_set_bdr_obs_exempt( opts: *mut burn_write_opts, value: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Sets the rhythm by which stdio pseudo drives force their output data to /// be consumed by the receiving storage device. This forcing keeps the memory /// from being clogged with lots of pending data for slow devices. /// @param opts The write opts to change /// @param rhythm Number of 2KB output blocks after which fsync(2) is /// performed. /// -1 means no fsync() /// 0 means default /// 1 means fsync() only at end, @since 1.3.8 (noop before 1.3.8) /// elsewise the value must be >= 32. /// Default is currently 8192 = 16 MB. /// @since 0.7.4 pub fn burn_write_opts_set_stdio_fsync( opts: *mut burn_write_opts, rhythm: ::std::os::raw::c_int, ); } unsafe extern "C" { /// 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 /// disc is read, including headers. pub fn burn_read_opts_set_raw(opts: *mut burn_read_opts, raw_mode: ::std::os::raw::c_int); } unsafe extern "C" { /// Sets whether to report c2 errors or not /// @param opts The read opts to change /// @param c2errors If non-zero, report c2 errors. pub fn burn_read_opts_set_c2errors(opts: *mut burn_read_opts, c2errors: ::std::os::raw::c_int); } unsafe extern "C" { /// Sets whether to read subcodes from audio tracks or not /// @param opts The read opts to change /// @param subcodes_audio If non-zero, read subcodes from audio tracks on the disc. pub fn burn_read_opts_read_subcodes_audio( opts: *mut burn_read_opts, subcodes_audio: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Sets whether to read subcodes from data tracks or not /// @param opts The read opts to change /// @param subcodes_data If non-zero, read subcodes from data tracks on the disc. pub fn burn_read_opts_read_subcodes_data( opts: *mut burn_read_opts, subcodes_data: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Sets whether to recover errors if possible /// @param opts The read opts to change /// @param hardware_error_recovery If non-zero, attempt to recover errors if possible. pub fn burn_read_opts_set_hardware_error_recovery( opts: *mut burn_read_opts, hardware_error_recovery: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Sets whether to report recovered errors or not /// @param opts The read opts to change /// @param report_recovered_errors If non-zero, recovered errors will be reported. pub fn burn_read_opts_report_recovered_errors( opts: *mut burn_read_opts, report_recovered_errors: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Sets whether blocks with unrecoverable errors should be read or not /// @param opts The read opts to change /// @param transfer_damaged_blocks If non-zero, blocks with unrecoverable errors will still be read. pub fn burn_read_opts_transfer_damaged_blocks( opts: *mut burn_read_opts, transfer_damaged_blocks: ::std::os::raw::c_int, ); } unsafe extern "C" { /// Sets the number of retries to attempt when trying to correct an error /// @param opts The read opts to change /// @param hardware_error_retries The number of retries to attempt when correcting an error. pub fn burn_read_opts_set_hardware_error_retries( opts: *mut burn_read_opts, hardware_error_retries: ::std::os::raw::c_uchar, ); } unsafe extern "C" { /// Gets the list of profile codes supported by the drive. /// Profiles depict the feature sets which constitute media types. For /// known profile codes and names see burn_disc_get_profile(). /// @param d is the drive to query /// @param num_profiles returns the number of supported profiles /// @param profiles returns the profile codes /// @param is_current returns the status of the corresponding profile code: /// 1= current, i.e. the matching media is loaded /// 0= not current, i.e. the matching media is not loaded /// @return always 1 for now /// @since 0.7.0 pub fn burn_drive_get_all_profiles( d: *mut burn_drive, num_profiles: *mut ::std::os::raw::c_int, profiles: *mut ::std::os::raw::c_int, is_current: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtains the profile name associated with a profile code. /// @param profile_code the profile code to be translated /// @param name returns the profile name (e.g. \"DVD+RW\") /// @return 1= known profile code , 0= unknown profile code /// @since 0.7.0 pub fn burn_obtain_profile_name( profile_code: ::std::os::raw::c_int, name: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtains the list of SCSI Feature Codes from feature descriptors which /// were obtained from the drive when it was most recently acquired or /// re-assessed. /// @param d Drive to query /// @param count Returns the number of allocated elements in feature_codes /// @param feature_codes Returns the allocated array of feature codes. /// If returned *feature_codes is not NULL, dispose it /// by free() when it is no longer needed. /// @since 1.5.2 pub fn burn_drive_get_feature_codes( d: *mut burn_drive, count: *mut ::std::os::raw::c_int, feature_codes: *mut *mut ::std::os::raw::c_uint, ); } unsafe extern "C" { /// Obtains the fields and data of a particular feature which were obtained /// from the drive when it was last acquired or re-assessed. See MMC specs /// for full detail. /// @param d Drive to query /// @param feature_code A number as learned by burn_drive_get_feature_codes() /// @param flags Returns byte 2 of the feature descriptor: /// bit0= Current /// bit1= Persistent /// bit2-5= Version /// @param additional_length Returns byte 3 of descriptor. /// This is the size of feature_data. /// @param feature_data Returns further bytes of descriptor. /// If returned *feature_data is not NULL, dispose it /// by free() when it is no longer needed. /// @param feature_text Returns text representation of the feature descriptor: /// Code +/- : Name : Version,P/N : Hex bytes : Parsed info /// Current features are marked by \"+\", others by \"-\". /// Persistent features are marked by \"P\", others by \"N\". /// feature_text may be submitted as NULL. In this case /// no text is generated and returned. /// If returned *feature_text is not NULL, dispose it /// by free() when it is no longer needed. /// @return 0 feature descriptor is not present /// -1 out of memory /// >0 success /// @since 1.5.2 pub fn burn_drive_get_feature( d: *mut burn_drive, feature_code: ::std::os::raw::c_uint, flags: *mut ::std::os::raw::c_uchar, additional_length: *mut ::std::os::raw::c_uchar, feature_data: *mut *mut ::std::os::raw::c_uchar, feature_text: *mut *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Gets the maximum write speed for a drive and eventually loaded media. /// The return value might change by the media type of already loaded media, /// again by call burn_drive_grab() and again by call burn_disc_read_atip(). /// @param d Drive to query /// @return Maximum write speed in K/s pub fn burn_drive_get_write_speed(d: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Gets the minimum write speed for a drive and eventually loaded media. /// The return value might change by the media type of already loaded media, /// again by call burn_drive_grab() and again by call burn_disc_read_atip(). /// @param d Drive to query /// @return Minimum write speed in K/s /// @since 0.2.6 pub fn burn_drive_get_min_write_speed(d: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Gets the maximum read speed for a drive /// @param d Drive to query /// @return Maximum read speed in K/s pub fn burn_drive_get_read_speed(d: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain a copy of the current speed descriptor list. The drive's list gets /// updated on various occasions such as burn_drive_grab() but the copy /// obtained here stays untouched. It has to be disposed via /// burn_drive_free_speedlist() when it is not longer needed. Speeds /// may appear several times in the list. The list content depends much on /// drive and media type. It seems that .source == 1 applies mostly to CD media /// whereas .source == 2 applies to any media. /// @param d Drive to query /// @param speed_list The copy. If empty, *speed_list gets returned as NULL. /// @return 1=success , 0=list empty , <0 severe error /// @since 0.3.0 pub fn burn_drive_get_speedlist( d: *mut burn_drive, speed_list: *mut *mut burn_speed_descriptor, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Look up the fastest speed descriptor which is not faster than the given /// speed_goal. If it is 0, then the fastest one is chosen among the /// descriptors with the highest end_lba. If it is -1 then the slowest speed /// descriptor is chosen regardless of end_lba. Parameter flag decides whether /// the speed goal means write speed or read speed. /// @param d Drive to query /// @param speed_goal Upper limit for speed, /// 0=search for maximum speed , -1 search for minimum speed /// @param best_descr Result of the search, NULL if no match /// @param flag Bitfield for control purposes /// bit0= look for best read speed rather than write speed /// bit1= look for any source type (else look for source==2 first /// and for any other source type only with CD media) /// @return >0 indicates a valid best_descr, 0 = no valid best_descr /// @since 0.3.8 pub fn burn_drive_get_best_speed( d: *mut burn_drive, speed_goal: ::std::os::raw::c_int, best_descr: *mut *mut burn_speed_descriptor, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Dispose a speed descriptor list copy which was obtained by /// burn_drive_get_speedlist(). /// @param speed_list The list copy. *speed_list gets set to NULL. /// @return 1=list disposed , 0= *speedlist was already NULL /// @since 0.3.0 pub fn burn_drive_free_speedlist( speed_list: *mut *mut burn_speed_descriptor, ) -> ::std::os::raw::c_int; } /// The reply structure for burn_disc_get_multi_caps() #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct burn_multi_caps { pub multi_session: ::std::os::raw::c_int, pub multi_track: ::std::os::raw::c_int, pub start_adr: ::std::os::raw::c_int, /// The alignment for start addresses. /// ( start_address % start_alignment ) must be 0. pub start_alignment: off_t, /// The lowest permissible start address. pub start_range_low: off_t, /// The highest addressable start address. pub start_range_high: off_t, /// Potential availability of write modes /// 4= needs no size prediction, not to be chosen automatically /// 3= needs size prediction, not to be chosen automatically /// 2= available, no size prediction necessary /// 1= available, needs exact size prediction /// 0= not available /// With CD media (profiles 0x09 and 0x0a) check also the elements /// _block_types of the according write mode. pub might_do_tao: ::std::os::raw::c_int, pub might_do_sao: ::std::os::raw::c_int, pub might_do_raw: ::std::os::raw::c_int, /// Generally advised write mode. /// Not necessarily the one chosen by burn_write_opts_auto_write_type() /// because the burn_disc structure might impose particular demands. pub advised_write_mode: burn_write_types, /// Write mode as given by parameter wt of burn_disc_get_multi_caps(). pub selected_write_mode: burn_write_types, /// Profile number which was current when the reply was generated pub current_profile: ::std::os::raw::c_int, /// Whether the current profile indicates CD media. 1=yes, 0=no pub current_is_cd_profile: ::std::os::raw::c_int, /// Whether the current profile is able to perform simulated write pub might_simulate: ::std::os::raw::c_int, } #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { ["Size of burn_multi_caps"][::std::mem::size_of::() - 72usize]; ["Alignment of burn_multi_caps"][::std::mem::align_of::() - 8usize]; ["Offset of field: burn_multi_caps::multi_session"] [::std::mem::offset_of!(burn_multi_caps, multi_session) - 0usize]; ["Offset of field: burn_multi_caps::multi_track"] [::std::mem::offset_of!(burn_multi_caps, multi_track) - 4usize]; ["Offset of field: burn_multi_caps::start_adr"] [::std::mem::offset_of!(burn_multi_caps, start_adr) - 8usize]; ["Offset of field: burn_multi_caps::start_alignment"] [::std::mem::offset_of!(burn_multi_caps, start_alignment) - 16usize]; ["Offset of field: burn_multi_caps::start_range_low"] [::std::mem::offset_of!(burn_multi_caps, start_range_low) - 24usize]; ["Offset of field: burn_multi_caps::start_range_high"] [::std::mem::offset_of!(burn_multi_caps, start_range_high) - 32usize]; ["Offset of field: burn_multi_caps::might_do_tao"] [::std::mem::offset_of!(burn_multi_caps, might_do_tao) - 40usize]; ["Offset of field: burn_multi_caps::might_do_sao"] [::std::mem::offset_of!(burn_multi_caps, might_do_sao) - 44usize]; ["Offset of field: burn_multi_caps::might_do_raw"] [::std::mem::offset_of!(burn_multi_caps, might_do_raw) - 48usize]; ["Offset of field: burn_multi_caps::advised_write_mode"] [::std::mem::offset_of!(burn_multi_caps, advised_write_mode) - 52usize]; ["Offset of field: burn_multi_caps::selected_write_mode"] [::std::mem::offset_of!(burn_multi_caps, selected_write_mode) - 56usize]; ["Offset of field: burn_multi_caps::current_profile"] [::std::mem::offset_of!(burn_multi_caps, current_profile) - 60usize]; ["Offset of field: burn_multi_caps::current_is_cd_profile"] [::std::mem::offset_of!(burn_multi_caps, current_is_cd_profile) - 64usize]; ["Offset of field: burn_multi_caps::might_simulate"] [::std::mem::offset_of!(burn_multi_caps, might_simulate) - 68usize]; }; unsafe extern "C" { /// Allocates a struct burn_multi_caps (see above) and fills it with values /// which are appropriate for the drive and the loaded media. The drive /// must be grabbed for this call. The returned structure has to be disposed /// via burn_disc_free_multi_caps() when no longer needed. /// @param d The drive to inquire /// @param wt With BURN_WRITE_NONE the best capabilities of all write modes /// get returned. If set to a write mode like BURN_WRITE_SAO the /// capabilities with that particular mode are returned and the /// return value is 0 if the desired mode is not possible. /// @param caps returns the info structure /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return < 0 : error , 0 : writing seems impossible , 1 : writing possible /// @since 0.3.2 pub fn burn_disc_get_multi_caps( d: *mut burn_drive, wt: burn_write_types, caps: *mut *mut burn_multi_caps, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Removes from memory a multi session info structure which was returned by /// burn_disc_get_multi_caps(). The pointer *caps gets set to NULL. /// @param caps the info structure to dispose (note: pointer to pointer) /// @return 0 : *caps was already NULL, 1 : memory object was disposed /// @since 0.3.2 pub fn burn_disc_free_multi_caps(caps: *mut *mut burn_multi_caps) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Gets a copy of the toc_entry structure associated with a track /// @param t Track to get the entry from /// @param entry Struct for the library to fill out pub fn burn_track_get_entry(t: *mut burn_track, entry: *mut burn_toc_entry); } unsafe extern "C" { /// Gets a copy of the toc_entry structure associated with a session's lead out /// @param s Session to get the entry from /// @param entry Struct for the library to fill out pub fn burn_session_get_leadout_entry(s: *mut burn_session, entry: *mut burn_toc_entry); } unsafe extern "C" { /// Gets an array of all complete sessions for the disc /// THIS IS NO LONGER VALID AFTER YOU ADD OR REMOVE A SESSION /// The result array contains *num + burn_disc_get_incomplete_sessions() /// elements. All above *num are incomplete sessions. /// Typically there is at most one incomplete session with one empty track. /// DVD+R and BD-R seem support more than one track with even readable data. /// @param d Disc to get session array for /// @param num Returns the number of sessions in the array /// @return array of sessions pub fn burn_disc_get_sessions( d: *mut burn_disc, num: *mut ::std::os::raw::c_int, ) -> *mut *mut burn_session; } unsafe extern "C" { /// Obtains the number of incomplete sessions which are recorded in the /// result array of burn_disc_get_sessions() after the complete sessions. /// See above. /// @param d Disc object to inquire /// @return Number of incomplete sessions pub fn burn_disc_get_incomplete_sessions(d: *mut burn_disc) -> ::std::os::raw::c_int; } unsafe extern "C" { pub fn burn_disc_get_sectors(d: *mut burn_disc) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Gets an array of all the tracks for a session /// THIS IS NO LONGER VALID AFTER YOU ADD OR REMOVE A TRACK /// @param s session to get track array for /// @param num Returns the number of tracks in the array /// @return array of tracks pub fn burn_session_get_tracks( s: *mut burn_session, num: *mut ::std::os::raw::c_int, ) -> *mut *mut burn_track; } unsafe extern "C" { pub fn burn_session_get_sectors(s: *mut burn_session) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Gets the mode of a track /// @param track the track to query /// @return the track's mode pub fn burn_track_get_mode(track: *mut burn_track) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Returns whether the first track of a session is hidden in the pregap /// @param session the session to query /// @return non-zero means the first track is hidden pub fn burn_session_get_hidefirst(session: *mut burn_session) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Returns the library's version in its parts. /// This is the runtime counterpart of the three build time macros /// burn_header_version_* below. /// @param major The major version number /// @param minor The minor version number /// @param micro The micro version number pub fn burn_version( major: *mut ::std::os::raw::c_int, minor: *mut ::std::os::raw::c_int, micro: *mut ::std::os::raw::c_int, ); } unsafe extern "C" { /// Obtain the id string of the SCSI transport interface. /// This interface may be a system specific adapter module of libburn or /// an adapter to a supporting library like libcdio. /// @param flag Bitfield for control puposes, submit 0 for now /// @return A pointer to the id string. Do not alter the string content. /// @since 0.7.6 pub fn burn_scsi_transport_id(flag: ::std::os::raw::c_int) -> *mut ::std::os::raw::c_char; } unsafe extern "C" { /// Control queueing and stderr printing of messages from libburn. /// Severity may be one of \"NEVER\", \"ABORT\", \"FATAL\", \"FAILURE\", \"SORRY\", /// \"WARNING\", \"HINT\", \"NOTE\", \"UPDATE\", \"DEBUG\", \"ALL\". /// @param queue_severity Gives the minimum limit for messages to be queued. /// Default: \"NEVER\". If you queue messages then you /// must consume them by burn_msgs_obtain(). /// @param print_severity Does the same for messages to be printed directly /// to stderr. Default: \"FATAL\". /// @param print_id A text prefix to be printed before the message. /// @return >0 for success, <=0 for error /// @since 0.2.6 pub fn burn_msgs_set_severities( queue_severity: *mut ::std::os::raw::c_char, print_severity: *mut ::std::os::raw::c_char, print_id: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain the oldest pending libburn message from the queue which has at /// least the given minimum_severity. This message and any older message of /// lower severity will get discarded from the queue and is then lost forever. /// @param minimum_severity may be one of \"NEVER\", \"ABORT\", \"FATAL\", /// \"FAILURE\", \"SORRY\", \"WARNING\", \"HINT\", \"NOTE\", \"UPDATE\", /// \"DEBUG\", \"ALL\". /// To call with minimum_severity \"NEVER\" will discard the /// whole queue. /// @param error_code Will become a unique error code as listed in /// libburn/libdax_msgs.h /// @param msg_text Must provide at least BURN_MSGS_MESSAGE_LEN bytes. /// @param os_errno Will become the eventual errno related to the message /// @param severity Will become the severity related to the message and /// should provide at least 80 bytes. /// @return 1 if a matching item was found, 0 if not, <0 for severe errors /// @since 0.2.6 pub fn burn_msgs_obtain( minimum_severity: *mut ::std::os::raw::c_char, error_code: *mut ::std::os::raw::c_int, msg_text: *mut ::std::os::raw::c_char, os_errno: *mut ::std::os::raw::c_int, severity: *mut ::std::os::raw::c_char, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Submit a message to the libburn queueing system. It will be queued or /// printed as if it was generated by libburn itself. /// @param error_code The unique error code of your message. /// Submit 0 if you do not have reserved error codes within /// the libburnia project. /// @param msg_text Not more than BURN_MSGS_MESSAGE_LEN characters of /// message text. /// @param os_errno Eventual errno related to the message. Submit 0 if /// the message is not related to a operating system error. /// @param severity One of \"ABORT\", \"FATAL\", \"FAILURE\", \"SORRY\", \"WARNING\", /// \"HINT\", \"NOTE\", \"UPDATE\", \"DEBUG\". Defaults to \"FATAL\". /// @param d An eventual drive to which the message shall be related. /// Submit NULL if the message is not specific to a /// particular drive object. /// @return 1 if message was delivered, <=0 if failure /// @since 0.4.0 pub fn burn_msgs_submit( error_code: ::std::os::raw::c_int, msg_text: *mut ::std::os::raw::c_char, os_errno: ::std::os::raw::c_int, severity: *mut ::std::os::raw::c_char, d: *mut burn_drive, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Convert a severity name into a severity number, which gives the severity /// rank of the name. /// @param severity_name A name as with burn_msgs_submit(), e.g. \"SORRY\". /// @param severity_number The rank number: the higher, the more severe. /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return >0 success, <=0 failure /// @since 0.4.0 pub fn burn_text_to_sev( severity_name: *mut ::std::os::raw::c_char, severity_number: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Convert a severity number into a severity name /// @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) /// @return >0 success, <=0 failure /// @since 0.4.4 pub fn burn_sev_to_text( severity_number: ::std::os::raw::c_int, severity_name: *mut *mut ::std::os::raw::c_char, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Return a blank separated list of severity names. Sorted from low /// to high severity. /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return A constant string with the severity names /// @since 1.2.6 pub fn burn_list_sev_texts(flag: ::std::os::raw::c_int) -> *mut ::std::os::raw::c_char; } unsafe extern "C" { /// Replace the messenger object handle of libburn by a compatible handle /// obtained from a related library. /// See also: libisofs, API function iso_get_messenger(). /// @param messenger The foreign but compatible message handle. /// @return 1 : success, <=0 : failure /// @since 0.4.0 pub fn burn_set_messenger(messenger: *mut ::std::os::raw::c_void) -> ::std::os::raw::c_int; } /// The prototype of a handler function suitable for burn_set_signal_handling() /// Such a function has to return -2 if it does not want the process to /// exit with value 1. pub type burn_abort_handler_t = ::std::option::Option< unsafe extern "C" fn( handle: *mut ::std::os::raw::c_void, signum: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int, >; unsafe extern "C" { /// Control built-in signal handling. Either by setting an own handler or /// by activating the built-in signal handler. /// /// A function parameter handle of NULL activates the built-in abort handler. /// Depending on mode it may cancel all drive operations, wait for all drives /// to become idle, exit(1). It may also prepare function /// burn_drive_get_status() for waiting and performing exit(1). /// Parameter handle may be NULL or a text that shall be used as prefix for /// pacifier messages of burn_abort_pacifier(). Other than with an application /// provided handler, the prefix char array does not have to be kept existing /// until the eventual signal event. /// Before version 0.7.8 only action 0 was available. I.e. the built-in handler /// waited for the drives to become idle and then performed exit(1) directly. /// But during burn_disc_write() onto real CD or DVD, FreeBSD 8.0 pauses the /// other threads until the signal handler returns. /// The new actions try to avoid this deadlock. It is advised to use action 3 /// at least during burn_disc_write(), burn_disc_erase(), burn_disc_format(): /// burn_set_signal_handling(text, NULL, 0x30); /// and to call burn_is_aborting(0) when the drive is BURN_DRIVE_IDLE. /// If burn_is_aborting(0) returns 1, then call burn_abort() and exit(1). /// /// @param handle Opaque handle eventually pointing to an application /// provided memory object /// @param handler A function to be called on signals, if the handling bits /// in parameter mode are set 0. /// It will get parameter handle as argument. flag will be 0. /// It should finally call burn_abort(). See there. /// If the handler function returns 2 or -2, then the wrapping /// signal handler of libburn will return and let the program /// continue its operations. Any other return value causes /// exit(1). /// @param mode : bit0 - bit3: Handling of received signals: /// 0 Install libburn wrapping signal handler, which will call /// handler(handle, signum, 0) on nearly all signals /// 1 Enable system default reaction on all signals /// 2 Try to ignore nearly all signals /// 10 like mode 2 but handle SIGABRT like with mode 0 /// bit4 - bit7: With handler == NULL : /// Action of built-in handler. \"control thread\" is the one /// which called burn_set_signal_handling(). /// All actions activate receive mode 2 to ignore further /// signals. /// 0 Same as 1 (for pre-0.7.8 backward compatibility) /// @since 0.7.8 /// 1 Catch the control thread in abort handler, call /// burn_abort() with a patience value > 0 and /// finally exit(1). Does not always work with FreeBSD. /// 2 Call burn_abort() with patience -1 and return from /// handler. When the control thread calls /// burn_drive_get_status(), then call burn_abort() /// with patience 1 instead, and finally exit(1). /// Does not always work with FreeBSD. /// 3 Call burn_abort() with patience -1, return from handler. /// It is duty of the application to detect a pending abort /// condition by calling burn_is_aborting() and to wait for /// all drives to become idle. E.g. by calling burn_abort() /// with patience >0. /// 4 Like 3, but without calling burn_abort() with -1. Only /// the indicator of burn_is_aborting() gets set. /// bit8: @since 1.3.2 /// try to ignore SIGPIPE (regardless of bit0 - bit3) /// /// @since 0.2.6 pub fn burn_set_signal_handling( handle: *mut ::std::os::raw::c_void, handler: burn_abort_handler_t, mode: ::std::os::raw::c_int, ); } unsafe extern "C" { pub fn burn_is_aborting(flag: ::std::os::raw::c_int) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Write data in random access mode. /// The drive must be grabbed successfully before calling this function which /// circumvents usual libburn session processing and rather writes data without /// preparations or finalizing. This will work only with overwritable media /// which are also suitable for burn_write_opts_set_start_byte(). The same /// address alignment restrictions as with this function apply. I.e. for DVD /// it is best to align to 32 KiB blocks (= 16 LBA units). The amount of data /// to be written is subject to the same media dependent alignment rules. /// Again, 32 KiB is most safe. /// Call burn_disc_get_multi_caps() can obtain the necessary media info. See /// resulting struct burn_multi_caps elements .start_adr , .start_alignment , /// .start_range_low , .start_range_high . /// Other than burn_disc_write() this is a synchronous call which returns /// only after the write transaction has ended (successfully or not). So it is /// wise not to transfer giant amounts of data in a single call. /// Important: Data have to fit into the already formatted area of the media. /// /// If the burn_drive object is in simulation mode, then no actual write /// operation or synchronization of the drive buffer will happen. /// See burn_drive_reset_simulate(). /// /// @param d The drive to which to write /// @param byte_address The start address of the write in byte /// (1 LBA unit = 2048 bytes) (do respect media alignment) /// @param data The bytes to be written /// @param data_count The number of those bytes (do respect media alignment) /// data_count == 0 is permitted (e.g. to flush the /// drive buffer without further data transfer). /// @param flag Bitfield for control purposes: /// bit0 = flush the drive buffer after eventual writing /// @return 1=successful , <=0 : number of transferred bytes * -1 /// @since 0.4.0 pub fn burn_random_access_write( d: *mut burn_drive, byte_address: off_t, data: *mut ::std::os::raw::c_char, data_count: off_t, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Inquire the maximum amount of readable data. /// On DVD and BD it is supposed that all LBAs in the range from 0 to /// capacity - 1 can be read via burn_read_data() although some of them may /// never have been recorded. With multi-session CD there have to be /// expected unreadable TAO Run-out blocks. /// If tracks are recognizable then it is better to only read LBAs which /// are part of some track and on CD to be cautious about the last two blocks /// of each track which might be TAO Run-out blocks. /// If the drive is actually a large file or block device, then the capacity /// is curbed to a maximum of 0x7ffffff0 blocks = 4 TB - 32 KB. /// @param d The drive from which to read /// @param capacity Will return the result if valid /// @param flag Bitfield for control purposes: Unused yet, submit 0. /// @return 1=successful , <=0 an error occurred /// @since 0.6.0 pub fn burn_get_read_capacity( d: *mut burn_drive, capacity: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read data in random access mode. /// The drive must be grabbed successfully before calling this function. /// With all currently supported drives and media the byte_address has to /// be aligned to 2048 bytes. Only data tracks with 2048 bytes per sector /// can be read this way. I.e. not CD-audio, not CD-video-stream ... /// This is a synchronous call which returns only after the full read job /// has ended (successfully or not). So it is wise not to read giant amounts /// of data in a single call. /// @param d The drive from which to read /// @param byte_address The start address of the read in byte (aligned to 2048) /// @param data A memory buffer capable of taking data_size bytes /// @param data_size The amount of data to be read. This does not have to /// be aligned to any block size. /// @param data_count The amount of data actually read (interesting on error) /// The counted bytes are supposed to be valid. /// @param flag Bitfield for control purposes: /// bit0= - reserved - /// bit1= do not submit error message if read error /// bit2= on error do not try to read a second time /// with single block steps. /// @since 0.5.2 /// bit3= return -2 on permission denied error rather than /// issuing a warning message. /// @since 1.0.6 /// bit4= return -3 on SCSI error /// 5 64 00 ILLEGAL MODE FOR THIS TRACK /// and prevent this error from being reported as /// event message. Do not retry reading in this case. /// (Useful to try the last two blocks of a CD /// track which might be non-data because of TAO.) /// @since 1.2.6 /// bit5= issue messages with severity DEBUG if they would /// be suppressed by bit1. /// @since 1.4.0 /// @return 1=successful , <=0 an error occurred /// with bit3: -2= permission denied error /// @since 0.4.0 pub fn burn_read_data( d: *mut burn_drive, byte_address: off_t, data: *mut ::std::os::raw::c_char, data_size: off_t, data_count: *mut off_t, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Read CD audio sectors in random access mode. /// The drive must be grabbed successfully before calling this function. /// Only CD audio tracks with 2352 bytes per sector can be read this way. /// I.e. not data tracks, not CD-video-stream, ... /// /// Note that audio data do not have exact block addressing. If you read a /// sequence of successive blocks then you will get a seamless stream /// of data. But the actual start and end position of this audio stream /// will differ by a few dozens of milliseconds, depending on individual /// CD and individual drive. /// Expect leading and trailing zeros, as well as slight truncation. /// /// @param d The drive from which to read. /// It must be a real MMC drive (i.e. not a stdio file) /// and it must have a CD loaded (i.e. not DVD or BD). /// @param sector_no The sector number (Logical Block Address) /// It may be slightly below 0, depending on drive and /// medium. -150 is a lower limit. /// @param data A memory buffer capable of taking data_size bytes /// @param data_size The amount of data to be read. This must be aligned /// to full multiples of 2352. /// @param data_count The amount of data actually read (interesting on error) /// @param flag Bitfield for control purposes: /// bit0= - reserved - /// bit1= do not submit error message if read error /// bit2= on error do not try to read a second time /// with single block steps. /// bit3= Enable DAP : \"flaw obscuring mechanisms like /// audio data mute and interpolate\" /// bit4= return -3 on SCSI error /// 5 64 00 ILLEGAL MODE FOR THIS TRACK /// and prevent this error from being reported as /// event message. Do not retry reading in this case. /// (Useful to try the last two blocks of a CD /// track which might be non-audio because of TAO.) /// bit5= issue messages with severity DEBUG if they would /// be suppressed by bit1. /// @since 1.4.0 /// @return 1=successful , <=0 an error occurred /// with bit3: -2= permission denied error /// @since 1.2.6 pub fn burn_read_audio( d: *mut burn_drive, sector_no: ::std::os::raw::c_int, data: *mut ::std::os::raw::c_char, data_size: off_t, data_count: *mut off_t, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Extract an interval of audio sectors from CD and store it as a WAVE /// audio file on hard disk. /// /// @param drive The drive from which to read. /// @param start_sector The logical block address of the first audio sector /// which shall be read. /// @param sector_count The number of audio sectors to be read. /// Each sector consists of 2352 bytes. /// @param target_path The address of the file where to store the extracted /// audio data. Will be opened O_WRONLY | O_CREAT. /// The file name should have suffix \".wav\". /// @param flag Bitfield for control purposes: /// bit0= Report about progress by UPDATE messages /// bit3= Enable DAP : \"flaw obscuring mechanisms like /// audio data mute and interpolate\" /// @since 1.3.2 pub fn burn_drive_extract_audio( drive: *mut burn_drive, start_sector: ::std::os::raw::c_int, sector_count: ::std::os::raw::c_int, target_path: *mut ::std::os::raw::c_char, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Extract all audio sectors of a track from CD and store them as a WAVE /// audio file on hard disk. /// /// @param drive The drive from which to read. /// @param track The track which shall be extracted. /// @param target_path The address of the file where to store the extracted /// audio data. Will be opened O_WRONLY | O_CREAT. /// The file name should have suffix \".wav\". /// @param flag Bitfield for control purposes: /// bit0= Report about progress by UPDATE messages /// bit3= Enable DAP : \"flaw obscuring mechanisms like /// audio data mute and interpolate\" /// @since 1.3.2 pub fn burn_drive_extract_audio_track( drive: *mut burn_drive, track: *mut burn_track, target_path: *mut ::std::os::raw::c_char, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Inquire whether the drive object is a real MMC drive or a pseudo-drive /// created by a stdio: address. /// @param d The drive to inquire /// @return 0= null-drive /// 1= real MMC drive /// 2= stdio-drive, random access, read-write /// 3= stdio-drive, sequential, write-only /// 4= stdio-drive, random access, read-only /// (only if enabled by burn_allow_drive_role_4()) /// 5= stdio-drive, random access, write-only /// (only if enabled by burn_allow_drive_role_4()) /// @since 0.4.0 pub fn burn_drive_get_drive_role(d: *mut burn_drive) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Allow drive role 4 \"random access read-only\" /// and drive role 5 \"random access write-only\". /// By default a random access file assumes drive role 2 \"read-write\" /// regardless whether it is actually readable or writeable. /// If enabled, random-access file objects which recognizably permit no /// writing will be classified as role 4 and those which permit no reading /// will get role 5. /// Candidates are drive addresses of the form stdio:/dev/fd/# , where # is /// the integer number of an open file descriptor. If this descriptor was /// opened read-only or write-only, then it gets role 4 or role 5, /// respectively. /// Other paths may get tested by an attempt to open them for read-write /// (role 2) or read-only (role 4) or write-only (role 5). See bit1. /// @param allowed Bitfield for control purposes: /// bit0= Enable roles 4 and 5 for drives which get /// acquired after this call /// bit1= with bit0: /// Test whether the file can be opened for /// read-write, read-only, or write-only. /// Classify as roles 2, 4, 5. /// bit2= with bit0 and bit1: /// Classify files which cannot be opened at all /// as role 0 : useless dummy. /// Else classify as role 2. /// bit3= Classify non-empty role 5 drives as /// BURN_DISC_APPENDABLE with Next Writeable Address /// after the end of the file. It is nevertheless /// possible to change this address by call /// burn_write_opts_set_start_byte(). /// @since 1.0.6 pub fn burn_allow_drive_role_4(allowed: ::std::os::raw::c_int); } unsafe extern "C" { /// Find out whether a given address string would lead to the given drive /// object. This should be done in advance for track source addresses /// with parameter drive_role set to 2. /// Although a real MMC drive should hardly exist as two drive objects at /// the same time, this can easily happen with stdio-drives. So if more than /// one drive is used by the application, then this gesture is advised: /// burn_drive_d_get_adr(d2, adr2); /// if (burn_drive_equals_adr(d1, adr2, burn_drive_get_drive_role(d2))) /// ... Both drive objects point to the same storage facility ... /// /// @param d1 Existing drive object /// @param adr2 Address string to be tested. Prefix \"stdio:\" overrides /// parameter drive_role2 by either 0 or 2 as appropriate. /// The string must be shorter than BURN_DRIVE_ADR_LEN. /// @param drive_role2 Role as burn_drive_get_drive_role() would attribute /// to adr2 if it was a drive. Use value 2 for checking track /// sources or pseudo-drive addresses without \"stdio:\". /// Use 1 for checking drive addresses including those with /// prefix \"stdio:\". /// @return 1= adr2 leads to d1 , 0= adr2 seems not to lead to d1, /// -1 = adr2 is bad /// @since 0.4.0 pub fn burn_drive_equals_adr( d1: *mut burn_drive, adr2: *mut ::std::os::raw::c_char, drive_role2: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } /// Extractor object encapsulating intermediate states of extraction. /// The clients of libdax_audioxtr shall only allocate pointers to this /// struct and get a storage object via libdax_audioxtr_new(). /// Appropriate initial value for the pointer is NULL. #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct libdax_audioxtr { _unused: [u8; 0], } unsafe extern "C" { /// Open an audio file, check whether suitable, create extractor object. /// @param xtr Opaque handle to extractor. Gets attached extractor object. /// @param path Address of the audio file to extract. \"-\" is stdin (but might /// be not suitable for all futurely supported formats). /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return >0 success /// 0 unsuitable format /// -1 severe error /// -2 path not found /// @since 0.2.4 pub fn libdax_audioxtr_new( xtr: *mut *mut libdax_audioxtr, path: *mut ::std::os::raw::c_char, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain identification parameters of opened audio source. /// @param xtr Opaque handle to extractor /// @param fmt Gets pointed to the audio file format id text: \".wav\" , \".au\" /// @param fmt_info Gets pointed to a format info text telling parameters /// @param num_channels e.g. 1=mono, 2=stereo, etc /// @param sample_rate e.g. 11025, 44100 /// @param bits_per_sample e.g. 8= 8 bits per sample, 16= 16 bits ... /// @param msb_first Byte order of samples: 0= Intel = Little Endian /// 1= Motorola = Big Endian /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return >0 success, <=0 failure /// @since 0.2.4 pub fn libdax_audioxtr_get_id( xtr: *mut libdax_audioxtr, fmt: *mut *mut ::std::os::raw::c_char, fmt_info: *mut *mut ::std::os::raw::c_char, num_channels: *mut ::std::os::raw::c_int, sample_rate: *mut ::std::os::raw::c_int, bits_per_sample: *mut ::std::os::raw::c_int, msb_first: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain a prediction about the extracted size based on internal information /// of the formatted file. /// @param o Opaque handle to extractor /// @param size Gets filled with the predicted size /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return 1 prediction was possible , 0 no prediction could be made /// @since 0.2.4 pub fn libdax_audioxtr_get_size( o: *mut libdax_audioxtr, size: *mut off_t, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Obtain next buffer full of extracted data in desired format (only raw audio /// for now). /// @param xtr Opaque handle to extractor /// @param buffer Gets filled with extracted data /// @param buffer_size Maximum number of bytes to be filled into buffer /// @param flag Bitfield for control purposes /// bit0= do not stop at predicted end of data /// @return >0 number of valid buffer bytes, /// 0 End of file /// -1 operating system reports error /// -2 usage error by application /// @since 0.2.4 pub fn libdax_audioxtr_read( xtr: *mut libdax_audioxtr, buffer: *mut ::std::os::raw::c_char, buffer_size: ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Try to obtain a file descriptor which will deliver extracted data /// to normal calls of read(2). This may fail because the format is /// unsuitable for that, but WAVE (.wav) is ok. If this call succeeds the xtr /// object will have forgotten its file descriptor and libdax_audioxtr_read() /// will return a usage error. One may use *fd after libdax_audioxtr_destroy() /// and will have to close it via close(2) when done with it. /// @param o Opaque handle to extractor /// @param fd Returns the file descriptor number /// @param flag Bitfield for control purposes /// bit0= do not dup(2) and close(2) but hand out original fd /// @return 1 success, 0 cannot hand out fd , -1 severe error /// @since 0.2.4 pub fn libdax_audioxtr_detach_fd( o: *mut libdax_audioxtr, fd: *mut ::std::os::raw::c_int, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; } unsafe extern "C" { /// Clean up after extraction and destroy extractor object. /// @param xtr Opaque handle to extractor, *xtr is allowed to be NULL, /// xtr is set to NULL by this function /// @param flag Bitfield for control purposes (unused yet, submit 0) /// @return 1 = destroyed object, 0 = was already destroyed /// @since 0.2.4 pub fn libdax_audioxtr_destroy( xtr: *mut *mut libdax_audioxtr, flag: ::std::os::raw::c_int, ) -> ::std::os::raw::c_int; }