コンパクトディスクTrack-Specific情報の取得
CD オーディオ デバイスの場合は、MCI_TRACK フラグを指定し、MCI_STATUS_PARMSの dwTrack メンバーを 目的のトラック 番号に設定することで、トラックの開始位置と長さを取得できます。 トラックの開始位置を取得するには、 dwItem メンバーを MCI_STATUS_POSITION に設定します。 トラックの長さを取得するには、 dwItem を MCI_STATUS_LENGTH に設定します。 たとえば、次の例では、コンパクト ディスク上のトラックの合計数と、各トラックの開始位置を取得します。次に、 MessageBox 関数を使用して、トラックの開始位置を報告します。
// Uses the MCI_STATUS command to get and display the
// starting times for the tracks on a compact disc.
// Returns 0L if successful; otherwise, it returns an
// MCI error code.
DWORD DisplayCDTrackStartTimes(HWND hMainWnd)
{
UINT wDeviceID;
int i, iNumTracks;
DWORD dwReturn;
DWORD *pMem;
TCHAR szTempString[64];
TCHAR szTimeString[512] = TEXT("\0"); // Room for 20 tracks.
MCI_OPEN_PARMS mciOpenParms;
MCI_SET_PARMS mciSetParms;
MCI_STATUS_PARMS mciStatusParms;
// Open the device by specifying the device name.
mciOpenParms.lpstrDeviceType = TEXT("cdaudio");
if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE, (DWORD_PTR)(LPVOID) &mciOpenParms))
{
// Failed to open device.
// Don't close device; just return error.
return (dwReturn);
}
// The device opened successfully; get the device ID.
wDeviceID = mciOpenParms.wDeviceID;
// Set the time format to minute/second/frame (MSF) format.
mciSetParms.dwTimeFormat = MCI_FORMAT_MSF;
if (dwReturn = mciSendCommand(wDeviceID, MCI_SET,
MCI_SET_TIME_FORMAT,
(DWORD_PTR)(LPVOID) &mciSetParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
// Get the number of tracks;
// limit it to the number that can be displayed (20).
mciStatusParms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,
MCI_STATUS_ITEM, (DWORD_PTR)(LPVOID) &mciStatusParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
iNumTracks = (int)mciStatusParms.dwReturn;
iNumTracks = min(iNumTracks, 20);
// Allocate memory to hold starting positions.
pMem = (DWORD *)LocalAlloc(LPTR,
iNumTracks * sizeof(DWORD));
if (pMem == NULL)
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (-1);
}
// For each track, get and save the starting location and
// build a string containing the starting locations.
for(i=1; i<=iNumTracks; i++)
{
mciStatusParms.dwItem = MCI_STATUS_POSITION;
mciStatusParms.dwTrack = i;
if (dwReturn = mciSendCommand(wDeviceID,
MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK,
(DWORD_PTR)(LPVOID) &mciStatusParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
pMem[i-1] = (DWORD)mciStatusParms.dwReturn;
_stprintf_s(szTempString,
TEXT("Track %2d - %02d:%02d:%02d\n"), i,
MCI_MSF_MINUTE(pMem[i-1]),
MCI_MSF_SECOND(pMem[i-1]),
MCI_MSF_FRAME(pMem[i-1]));
_tcscat_s(szTimeString, szTempString);
}
// Use MessageBox to display starting times.
MessageBox(
hMainWnd,
szTimeString,
TEXT("Track Starting Position"),
MB_ICONINFORMATION);
// Free memory and close the device.
LocalFree((HANDLE) pMem);
if (dwReturn = mciSendCommand(wDeviceID,
MCI_CLOSE, 0, NULL))
{
return (dwReturn);
}
return (0L);
}