我正在编写一个适用于音频 CD 和混合 CD 的应用程序。我想要一种方法来确定应用程序使用的驱动器中当前是否有音频或混合类型(至少有一个音轨)光盘。
到目前为止,我能够通过GetDriveType
. 然而,事实证明,识别实际在驱动器内的媒体并不是那么容易。这是我到目前为止所得到的:
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
有没有其他方法来处理这个?那么混合模式光盘呢?