我正在使用IMAPIv2在我的C#项目中刻录CD/DVD。我意识到接口是XA格式的(模式2)。我认为XA格式主要用于ISO。关于网络上的IMAPIv2的许多例子使用了以下方法来演示总的磁盘空间和空闲空间:
discFormatData.Recorder = discRecorder;
IMAPI_MEDIA_PHYSICAL_TYPE mediaType = discFormatData.CurrentPhysicalMediaType;
this.MediaType = GetMediaTypeString(mediaType);
fileSystemImage = new MsftFileSystemImage();
fileSystemImage.ChooseImageDefaultsForMediaType(mediaType);
MediaStateString = GetMediaStatus(discFormatData.CurrentMediaStatus);
if (discFormatData.MediaHeuristicallyBlank) MediaStateString = "Blank";
Int64 freeMediaBlocks = discFormatData.FreeSectorsOnMedia;
this.TotalDiscCapacity = 2048 * freeMediaBlocks;
Int64 userMediaBlocks = discFormatData.TotalSectorsOnMedia - discFormatData.FreeSectorsOnMedia;
this.TotalUsedDiscSpace = 2048 * userMediaBlocks;
不幸的是,如果我用上面描述的TotalSectorsOnMedia乘以2048 *,我将无法获得正确的总磁盘容量。当我用IMAPIv2烧录一个容量为800 MB的磁盘时,上面的代码将显示我的磁盘容量大约在650 MB左右。当我用其他软件燃烧器检查磁盘时,我看到模式被设置为XA。是否可以在燃烧前设置此模式?此外,如果有以模式1编写的会话,我将如何解决确定磁盘空闲空间的问题?是否有可能知道光盘是以哪种方式写的?
谢谢。
发布于 2013-11-13 07:22:04
为了获得总磁盘容量,您需要将扇区的数量乘以每个扇区上用户数据字段的长度(在CD/XA (eXtended体系结构)模式2上,该模式的长度为2336字节,而不是2048年)。
CD上的扇区保存2048字节的用户数据,留下304字节用于其他目的.每个数据扇区都以一个16字节的头开头:
模式字节确定扇区中剩余的2336字节是什么样子:
为了检索为同一轨道中的扇区提供的数据类型,可以从IRawCDImageTrackInfo接口中使用IRawCDImageTrackInfo方法。
可能的扇区类型由类型枚举定义:
typedef enum {
IMAPI_CD_SECTOR_AUDIO = 0x00,
IMAPI_CD_SECTOR_MODE_ZERO = 0x01,
IMAPI_CD_SECTOR_MODE1 = 0x02,
IMAPI_CD_SECTOR_MODE2FORM0 = 0x03,
IMAPI_CD_SECTOR_MODE2FORM1 = 0x04,
IMAPI_CD_SECTOR_MODE2FORM2 = 0x05,
IMAPI_CD_SECTOR_MODE1RAW = 0x06,
IMAPI_CD_SECTOR_MODE2FORM0RAW = 0x07,
IMAPI_CD_SECTOR_MODE2FORM1RAW = 0x08,
IMAPI_CD_SECTOR_MODE2FORM2RAW = 0x09
} IMAPI_CD_SECTOR_TYPE;
备注:某些扇区类型与单个映像中的其他扇区类型不兼容。以下是这种情况的典型例子:如果第一个音轨是音频,那么所有的音轨都必须是音频的。如果第一首曲目是Mode1,那么所有曲目都必须是Mode1。只有三个Mode2 (XA)扇区(模式2形式0、模式2表单1和模式2表单2)可以在单个磁盘映像中混合,即使这样,也只能与其他模式2 (XA)扇区类型混合。
https://stackoverflow.com/questions/4874374
复制