Delphi Graphics and Game Programming Exposed! with DirectX For versions 5.0-7.0:Sound and Music
Search Tips
Advanced Search
Title
Author
Publisher
ISBN
Please Select
-----------
Artificial Intel
Business & Mgmt
Components
Content Mgmt
Certification
Databases
Enterprise Mgmt
Fun/Games
Groupware
Hardware
IBM Redbooks
Intranet Dev
Middleware
Multimedia
Networks
OS
Productivity Apps
Programming Langs
Security
Soft Engineering
UI
Web Services
Webmaster
Y2K
-----------
New Arrivals
Delphi Graphics and Game Programming Exposed with DirectX 7.0 by John Ayres Wordware Publishing, Inc. ISBN: 1556226373 Pub Date: 12/01/99 Search this book:
Previous
Table of Contents
Next
Listing 9-11: Playing CD Audio tracks
procedure TfrmCDExample.FormCreate(Sender: TObject);
var
OpenParms: TMCI_Open_Parms;
StatusParms: TMCI_Status_Parms;
SetParms: TMCI_Set_Parms;
InfoParms: TMCI_Info_Parms;
UniqueID: array[0..255] of char;
NumTracks,
iCount: Integer;
begin
{open the cd audio playback device}
OpenParms.lpstrDeviceType := cdaudio;
MCISendCommand(0, MCI_OPEN, MCI_OPEN_TYPE or MCI_WAIT, Longint(@OpenParms));
{save a handle to the cd audio device}
MCIDeviceID := OpenParms.wDeviceID;
{determine if a CD is present in the drive}
StatusParms.dwItem := MCI_STATUS_MEDIA_PRESENT ;
MCISendCommand(MCIDeviceID, MCI_STATUS, MCI_WAIT or MCI_STATUS_ITEM,
LongInt(@StatusParms));
if not LongBool(StatusParms.dwReturn) then
begin
ShowMessage(No CD is inserted in the CD-ROM drive. Please insert a CD +
and try again.);
Application.Terminate;
end;
{retrieve and display the unique CD identification number. this is for
information only, and is not required for playing a track from the CD}
InfoParms.dwRetSize := 255;
InfoParms.lpstrReturn := UniqueID;
MCISendCommand(MCIDeviceID, MCI_INFO, MCI_INFO_MEDIA_IDENTITY or MCI_WAIT,
Longint(@InfoParms));
lblUniqueID.Caption := UniqueID;
{set the time format for the CD audio device}
SetParms.dwTimeFormat := MCI_FORMAT_TMSF;
MCISendCommand(MCIDeviceID, MCI_SET, MCI_WAIT or MCI_SET_TIME_FORMAT,
Longint(@SetParms));
{retrieve the number of tracks on the CD}
StatusParms.dwItem := MCI_STATUS_NUMBER_OF_TRACKS ;
MCISendCommand(MCIDeviceID, MCI_STATUS, MCI_WAIT or MCI_STATUS_ITEM,
LongInt(@StatusParms));
NumTracks := StatusParms.dwReturn;
{for each track, indicate its length}
for iCount := 1 to NumTracks do
begin
StatusParms.dwTrack := iCount;
StatusParms.dwItem := MCI_STATUS_LENGTH;
MCISendCommand(MCIDeviceID, MCI_STATUS, MCI_WAIT or MCI_STATUS_ITEM or
MCI_TRACK, LongInt(@StatusParms));
{when polling for length on a specific track, the value returned in the TMSF
format is not exactly what you would expect. the Track macro returns
minutes, the Minute macro returns seconds, the Second macro returns frames,
and the Frame macro returns nothing. notice also that we are saving the
exact length of each track in the Objects property}
lbxCDTracks.Items.AddObject(Track +IntToStr(iCount)+ - +
Format(%d:%.2d,
[MCI_TMSF_TRACK(StatusParms.dwReturn),
MCI_TMSF_MINUTE(StatusParms.dwReturn)]),
TObject(MCI_MAKE_TMSF(
iCount,MCI_TMSF_TRACK(StatusParms.dwReturn),
MCI_TMSF_MINUTE(StatusParms.dwReturn),
MCI_TMSF_SECOND(StatusParms.dwReturn))));
end;
end;
procedure TfrmCDExample.lbxCDTracksDblClick(Sender: TObject);
var
PlayParms: TMCI_Play_Parms;
begin
{the user has indicated that another track should be played. therefore, stop
any CD audio currently being output}
MCISendCommand(MCIDeviceID, MCI_STOP, MCI_WAIT, 0);
{the index of the selected item matches the index of the requested CD audio
track. however, CD audio track indexes are one-based, and list box indexes
are zero-based, so we must add a one to the selected item index. this
indicates the starting track from which to begin playback}
PlayParms.dwFrom := MCI_MAKE_TMSF(lbxCDTracks.ItemIndex+1, 0, 0, 0);
{remember that we stored the actual length of each track in the Objects
property along with the track name? since there is no track following the
last track on the CD, we cannot tell the device to play the current track
to the next track. to play the last track on the CD, we must indicate the
exact length of that track. therefore, if we are playing the last track,
we extract the tracks exact length from the Objects property. otherwise
we can simply tell it to play to the next track}
if lbxCDTracks.ItemIndex = lbxCDTracks.Items.Count-1 then
PlayParms.dwTo := Longint(lbxCDTracks.Items.Objects[lbxCDTracks.ItemIndex])
else
PlayParms.dwTo := MCI_MAKE_TMSF(lbxCDTracks.ItemIndex+2, 0, 0, 0);
{instruct the CD audio device to play the indicated selection}
MCISendCommand(MCIDeviceID, MCI_PLAY, MCI_FROM or MCI_TO,
Longint(@PlayParms));
end;
procedure TfrmCDExample.TimerTimer(Sender: TObject);
var
StatusParms: TMCI_Status_Parms;
begin
{poll the CD to determine the position of the current playback}
StatusParms.dwItem := MCI_STATUS_POSITION;
MCISendCommand(MCIDeviceID, MCI_STATUS, MCI_WAIT or MCI_STATUS_ITEM,
LongInt(@StatusParms));
{the returned position value is in TMSF format. thus, we must extract the
appropriate minutes and seconds values}
lblPosition.Caption := Format(%d:%.2d,
[MCI_TMSF_MINUTE(StatusParms.dwReturn),
MCI_TMSF_SECOND(StatusParms.dwReturn)]);
end;
procedure TfrmCDExample.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{the application is terminating, so stop any CD audio playback, and
close the CD audio device}
MCISendCommand(MCIDeviceID, MCI_STOP, MCI_WAIT, 0);
MCISendCommand(MCIDeviceID, MCI_CLOSE, 0, 0);
end;
Previous
Table of Contents
Next
Products | Contact Us | About Us | Privacy | Ad Info | Home
Use of this site is subject to certain Terms & Conditions, Copyright © 1996-2000 EarthWeb Inc. All rights reserved. Reproduction whole or in part in any form or medium without express written permission of EarthWeb is prohibited. Read EarthWeb's privacy statement.
Wyszukiwarka