home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Audio 4.94 - Over 11,000 Files
/
audio-11000.iso
/
msdos
/
sndbords
/
proaudio
/
pas_sdk1
/
pas-sdk1.arj
/
PAS
/
CDROMAPP
/
CDPLAY.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-23
|
3KB
|
143 lines
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#define OKAY 0
#include "cdmaster.h"
char *syntax=
"Syntax: cdplay [drive# [starttrack# [endtrack#]]].\n"
"\tdrive#\tnumber of CDROM drive; defaults to the first drive#\n"
"\t\tuse '.' to specify the first drive# when specifying track#'s.\n"
"\tstarttrack#\tstarting track number to play.\n"
"\tendtrack#\tending track number to play.\n"
"\t\tuse -1 to play to end of disc, -2 to play to end of track.\n";
char *nodrives= "No CDROM drives attached.\n";
char *nomscdex= "MSCDEX is not installed.\n";
main(int argc, char **argv)
{
int bgntrack= 1;
int endtrack= 1;
int numcdroms= 0;
int ourdrive= 0;
struct cdtable *cdt;
if (!ismscdex())
{
fprintf(stderr, nomscdex);
return(1);
}
if (!(numcdroms= getnumcdroms()))
{
fprintf(stderr, nodrives);
return(2);
}
switch (argc)
{
case 4:
endtrack= atoi(argv[3]);
case 3:
bgntrack= atoi(argv[2]);
case 2:
if (argv[1][0] != '.')
{
if (!(ourdrive= atoi(argv[1])))
{
fprintf(stderr, syntax);
return(3);
}
break;
}
case 1:
if (!(ourdrive= getfirstcdrom()))
{
fprintf(stderr, nodrives);
return(4);
}
break;
default:
fprintf(stderr, syntax);
return(5);
}
if (endtrack == -1)
endtrack= 99;
else
if (endtrack == -2)
endtrack= bgntrack;
else
if (endtrack < bgntrack)
endtrack= bgntrack;
/* Programming Notes:
* Call "createaudiotoc()" to get a quick structure allocated.
*
* Get the trackinfo for the desired track. Convert the
* frame/min/sec/unknown bytes in trackinfo (the starting address)
* to a long by getting the address of the frame member and calling
* "redtolong()" using a pointer, but subtract 2 seconds from this
* value (150 frames); it is not known why, but if you use the
* "starting address" as returned by the driver you actually address
* data 2 seconds into the disc (this is required here because
* "cdtrackinfo()" is a low level call (cdrom.c) and returns exactly
* what the driver provides, whereas "gettrackframes()" (cdmaster.c)
* does the adjustment for us.
*
* Then, accumulate the count of frames to play for each track in the
* range specified on the command line.
*
* Finally, "cdplay()".
*/
if (cdt= createaudiotoc(ourdrive))
{
int status= 0;
long sframe;
long tframes= 0;
int track= bgntrack;
struct trackinfo ti;
if (status= cdtrackinfo(ourdrive, bgntrack, &ti) >= 0)
{
long *redaddress= (long *) &ti.frame;
long sframe= redtolong((*redaddress)); //- (75* 2);
do
{
long f= gettrackframes(ourdrive, track);
if (f == -1)
status= -1;
else
if (!f)
if (endtrack != 99)
status= -1;
else
break;
if (status < 0)
break;
tframes+= f;
}
while (++track <= endtrack);
printf("play drive: %2d - From: %2d - Upto: %2d ", ourdrive, bgntrack, track- 1);
if (status >= 0)
status= cdplay(ourdrive, sframe, tframes);
}
printf("= %X.\n", status);
destroyaudiotoc(ourdrive);
}
else
printf("failed, no initialization.\n");
return(OKAY);
}