オーディオ CD と混合 CD で動作するアプリケーションを作成しています。アプリケーションが使用するドライブに現在オーディオまたは混合タイプ (少なくとも 1 つのオーディオ トラックを含む) のディスクがあるかどうかを判断する方法が必要です。
ここまでで、ドライブが CD-ROM であることが で確認できました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」という名前を割り当てるという事実に依存しています。Windows での CD の名前はデータ トラックのボリューム名によって決定されるため、これは適切ではなく、混合モードの CD では惨めに失敗するでしょう。また、ブロックがここにあるのは、ドライブにディスクがまったくない場合に等しいエラーを返すelse
ことに気付いたからです。GetVolumeInformation
GetLastError
ERROR_INVALID_PARAMETER
CDROM_DISC_STATUS
理想的には、 Linux に存在する ioctlのようなものを探しています。CDS_NO_INFO
ディスクの内容に応じて、 、CDS_AUDIO
、CDS_MIXED
、またはその他の値を返します。
これを処理する他の方法はありますか?ミックスモードのディスクはどうですか?