Wednesday, April 27, 2005 12:45 PM
LarryOsterman
Playing audio CDs, part 6 - MCI Command playback
Today, we play the actual audio track on the CD using the MCI commands.
HRESULT CMCICommandCDPlayer::PlayTrack(int TrackNumber)
{
MCIERROR mciError;
MCI_SET_PARMS setParms = {0};
MCI_PLAY_PARMS playParms = {0};
//
// The track number from the host app is )ORIGIN 0, MCI is )ORIGIN 1, so adjust it.
//
TrackNumber += 1;
if (TrackNumber > (int)_TrackCount)
{
printf("Track out of range\n");
return E_FAIL;
}
// Set the MCI time format to track/minute/second/frame.
setParms.dwTimeFormat = MCI_FORMAT_TMSF;
mciError = mciSendCommand(_MciHandle, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD_PTR)&setParms);
if (mciError != 0)
{
printf("MCI Error %x determining CD media status\n",mciError);
return HRESULT_FROM_WIN32(mciError);
}
playParms.dwFrom = MCI_MAKE_TMSF(TrackNumber, 0, 0, 0);
if (TrackNumber < _TrackCount)
{
playParms.dwTo = MCI_MAKE_TMSF(TrackNumber+1, 0, 0, 0);
}
mciError = mciSendCommand(_MciHandle, MCI_PLAY, MCI_FROM | (TrackNumber <_TrackCount ? MCI_TO : 0) | MCI_WAIT, (DWORD_PTR)&playParms);
if (mciError != 0)
{
printf("MCI Error %x playing media\n",mciError);
return HRESULT_FROM_WIN32(mciError);
}
return S_OK;
}
Not much different from the previous versions, in fact it's a pretty straightforward transcription of the previous programs. One minor change is that I'm using the MCI_WAIT flag to ask the MCI commands
That allows me to avoid the Sleep() at the end. I could have done the same thing in the string based version by appending the " wait" command to the play command string.
I'm going to skip a couple of days on this series, it'll take a while to get the Digital Audio Extraction version of this problem ready for publication, DAE's sufficiently compilicated that it'll take several articles to fully describe what I'm doing.