我正在编写一个适用于音频 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_STATUS
Linux 上存在 ioctl。它返回CDS_NO_INFO
, CDS_AUDIO
, CDS_MIXED
,或一些其他值,具体取决于光盘的内容。
还有其他方法可以处理这个问题吗?那么混合模式光盘又如何呢?