5

オーディオ 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ことに気付いたからです。GetVolumeInformationGetLastErrorERROR_INVALID_PARAMETER

CDROM_DISC_STATUS理想的には、 Linux に存在する ioctlのようなものを探しています。CDS_NO_INFOディスクの内容に応じて、 、CDS_AUDIOCDS_MIXED、またはその他の値を返します。

これを処理する他の方法はありますか?ミックスモードのディスクはどうですか?

4

2 に答える 2

3

CD-ROM I/O コントロール コード、特にIOCTL_CDROM_READ_TOC. 返される構造は次のようになります。

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];
};

Larry Osterman のブログで、それを取得する方法の例を見つけることができます。これから、正確なディスクの種類を判断できるはずです。そうでない場合は、他の IOCTL をチェックしてください。必要な情報を提供するものがあるはずです。

于 2014-04-11T13:36:55.210 に答える
0

以前、あるプロジェクトで似たようなことをしなければなりませんでしたが、代わりに DVD を使用しました。を使用して、マルチメディア コマンド (MMC)DeviceIoControl(IOCTL_SCSI_PASS_THROUGH)コマンドをドライブに直接送信し、現在ロードされている特定の種類のディスクに基づいて、現在アクティブなプロファイルを取得できます。 GET CONFIGURATION

CD プロファイルは次のとおりです。

0x0008CD-ROM
0x0009CD-R
0x000ACD-RW
0x0020倍密度 CD-ROM
0x0021倍密度 CD-R
0x0022倍密度 CD-RW

于 2014-04-12T00:56:13.727 に答える