如何使用WinAPI识别光驱中的光盘类型?

2024-04-22

我正在编写一个适用于音频 CD 和混合 CD 的应用程序。我想要一种方法来确定应用程序使用的驱动器中当前是否存在音频或混合类型(至少有一个音轨)光盘。

到目前为止,我能够通过以下方式识别该驱动器是CD-ROMGetDriveType。然而,事实证明,识别驱动器内实际存在的介质并不那么容易。这是我到目前为止所得到的:

int drive_has_audio_disc(const char *root_path)
{
  char volume_name[MAX_PATH+1];
  BOOL winapi_rv;
  DWORD fs_flags;
  int rv;

  winapi_rv = GetVolumeInformation(root_path, volume_name, sizeof(volume_name),
    NULL, NULL, &fs_flags, NULL, 0);
  if(winapi_rv != 0)
  {
    rv = (strcmp(volume_name, "Audio CD") == 0 &&
      (fs_flags & FILE_READ_ONLY_VOLUME));
  }
  else
  {
    rv = (GetLastError() == ERROR_INVALID_PARAMETER) ? 0 : -1;
  }
  return rv;
}

但是,它依赖于 Windows 为所有被识别为音频的光盘指定名称“音频 CD”的事实。这感觉不对,并且在混合模式 CD 上会严重失败,因为它们在 Windows 中的名称是由数据轨道的卷名称确定的。另外,else块在这里是因为我注意到GetVolumeInformation返回一个错误GetLastError等于ERROR_INVALID_PARAMETER当驱动器中根本没有光盘时。

理想情况下,我正在寻找类似的东西CDROM_DISC_STATUSLinux 上存在 ioctl。它返回CDS_NO_INFO, CDS_AUDIO, CDS_MIXED,或一些其他值,具体取决于光盘的内容。

还有其他方法可以处理这个问题吗?那么混合模式光盘又如何呢?


您可以使用CD-ROM I/O 控制代码 http://msdn.microsoft.com/en-us/library/windows/hardware/ff551394,特别是IOCTL_CDROM_READ_TOC http://msdn.microsoft.com/en-us/library/windows/hardware/ff559364。它返回的结构如下所示:

struct TRACK_DATA {
  UCHAR Reserved;
  UCHAR Control  :4;
  UCHAR Adr  :4;
  UCHAR TrackNumber;
  UCHAR Reserved1;
  UCHAR Address[4];
} 

struct CDROM_TOC {
  UCHAR      Length[2];
  UCHAR      FirstTrack;
  UCHAR      LastTrack;
  TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS];
};

您可以找到如何检索它的示例在拉里·奥斯特曼的博客上 http://blogs.msdn.com/b/larryosterman/archive/2005/05/02/playing-audio-cds-part-7-dae-table-of-contents.aspx。 由此您应该能够确定确切的光盘类型。如果没有,请查看其他 IOCTL,我确信应该有一个可以为您提供必要的信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用WinAPI识别光驱中的光盘类型? 的相关文章

随机推荐