Reading of optical media is for now restricted to reading of data sectors,
which is done by call burn_read_data() of libburn,
reading of audio CD sectors by call burn_read_audio(),
and reading of CD-TEXT from audio CD by burn_disc_get_leadin_text().
This is fully sufficient for DVD media. On CD, a sector not only may host
2048 bytes of payload but stores more information which can be accessed
by special SCSI commands. An example are Audio sectors of CD-DA discs which
store payload in all their 2352 bytes. Other sector formats are known withi
payload between that maximum and 2048.
Data reading has several use cases in libburnia:
is able to read CD TAO tracks up to the last data sectors which are normally
inaccessible through the Linux block devices. This is due to the fact
that a TAO track announces a size which includes two non-data sectors
at the end of the track. Some drives correct this, some do not. Whether a track
was recorded by TAO is hardly to tell. In a SAO track, all announced sectors
are data sectors. telltoc solves this dilemma by reading the end sectors
of a track one-by-one.
Application program cdrskin emulates ISO multi-session on DVD+RW
by reading the first 64 kB of the ISO 9660 image from media, patching some
address fields and writing them back.
(Learned from Andy Polyakov's growisofs.)
Further, cdrskin is able to copy audio tracks and CD-TEXT from CD to
Library libisoburn creates an interface object for library
libisofs which can read data blocks from libburn drives.
This is used for detecting an ISO 9660 image and for loading its
directory tree and management data. libisoburn itself performs the same
patching of DVD+RW and similar media as can be done by cdrskin.
Application program xorriso uses data reading capabilities for
comparing the content of disk files with the content of ISO image files
and for copying files from ISO image to disk.
On several Linux systems, the block device driver needs reloading of thei
drive tray in order to make available freshly written data via its
buffered i/o. The libburn read function does not need such a reload.