擷取光碟 Track-Specific 信息
[與此頁面相關聯的功能 MCI是舊版功能。 MediaPlayer已取代它。 MediaPlayer 已針對 Windows 10 和 Windows 11 優化。 Microsoft強烈建議新程式代碼盡可能使用 MediaPlayer,而不是 MCI。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
針對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);
}