Retrieving Compact Disc Track-Specific Information
For CD audio devices, you can get the starting location and length of a track
by specifying the MCI_TRACK flag and setting the
dwTrack member of
MCI_STATUS_PARMS to the desired track number. To get the starting location of a track, set the
dwItem member to MCI_STATUS_POSITION. To get the length of a track, set
dwItem to MCI_STATUS_LENGTH. For example, the following example retrieves the total
number of tracks on the compact disc and the starting location of each track.
Then, it uses the
MessageBox function to report the starting locations of the tracks.
// 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 getCDTrackStartTimes(VOID)
{
UINT wDeviceID;
int i, iNumTracks;
DWORD dwReturn;
DWORD dwPosition;
DWORD *pMem;
char szTempString[64];
char szTimeString[512] = "\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 = "cdaudio";
if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE, (DWORD)(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)(LPVOID) &mciSetParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
// Get the number of tracks;
// limit to number that can be displayed (20).
mciStatusParms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,
MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
iNumTracks = 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 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)(LPVOID) &mciStatusParms)) {
mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
return (dwReturn);
}
pMem[i-1] = mciStatusParms.dwReturn;
wsprintf(szTempString,
"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]));
lstrcat(szTimeString, szTempString);
}
// Use MessageBox to display starting times.
MessageBox(hMainWnd, szTimeString,
"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);
}
- Software for developers
-
Delphi Components
.Net Components
Software for Android Developers
- More information resources
-
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
- Databases for Amazon shops developers
-
Amazon Categories Database
Browse Nodes Database