【发布时间】:2014-05-25 13:21:03
【问题描述】:
我正在编写一个可以处理音频 CD 和混合 CD 的应用程序。我想要一种方法来确定应用程序使用的驱动器中当前是否有音频或混合类型(至少有一个音轨)光盘。
到目前为止,我能够通过GetDriveType 确定驱动器是 CD-ROM。然而,事实证明,识别驱动器内实际存在的媒体并不容易。这是我到目前为止所得到的:
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。
理想情况下,我正在寻找类似于 Linux 上的 CDROM_DISC_STATUS ioctl 的东西。它返回CDS_NO_INFO、CDS_AUDIO、CDS_MIXED 或其他一些值,具体取决于光盘的内容。
还有其他方法可以解决这个问题吗?那么混合模式光盘呢?
【问题讨论】:
-
AFAIK,获取您要查找的信息的唯一方法是通过 IMAPI 接口,特别是通过包含
CurrentPhysicalMediaType属性的IDiscFormat2Data接口。