cdMain.c

// imWare
// Wednesday, February 14, 1990
// James Beninghaus
 
#include    <stdio.h>
#include    <string.h>
#include    <ToolUtils.h>
#include    <Errors.h>
#include    <cd.h>
 
#define sUNDEF          0
#define sDRIVE          1
#define sPLAY           2
#define sPAUSE          3
#define sCONTINUE       4
#define sSTOP           5
#define sEJECT          6
 
#define min(a, b)       (a<b ? a:b)
#define max(a, b)       (a>b ? a:b)
 
void Usage() {
    printf("cd [-drive 1..6] [-play [1..73 [1..73]] [stereo | mono] | -pause | -continue | -stop | -eject]\n");
    exit(paramErr);
}
 
main (int argc, char *argv[]) {
    
    auto    OSErr   osErr;
    auto    short   drive,
                    ioRefNum,
                    count,
                    track,
                    state;
    auto    Byte    userCDNumber,
                    userStart, 
                    userStop,
                    discStart,
                    discStop,
                    audioStatus,
                    playMode,
                    cntlField,
                    minutes,
                    seconds,
                    frames;
    auto    Boolean discInPlace;
    
    InitGraf((Ptr) &qd.thePort);
    
    state           = sUNDEF;
    userCDNumber    = 1;
    userStart       = 0;
    userStop        = 100;
    playMode        = STEREO;
    
    count = 0;
    while (++count < argc)
        if (0 == strcmp("-drive", argv[count]))
            state = sDRIVE;
        else if (1 == sscanf(argv[count], "%hd", &drive) && 1 <= drive && drive <= 6 && sDRIVE == state) {
            state = sUNDEF;
            userCDNumber = (Byte) drive;
        } else if (0 == strcmp("-play", argv[count]) && sUNDEF == state)
            state = sPLAY;
        else if (1 == sscanf(argv[count], "%hd", &track) && 1 <= track && track <= 73 && sPLAY == state)    
            if (0 == userStart)
                userStart = (Byte) track;
            else
                userStop = (Byte) track;
        else if (0 == strcmp("stereo", argv[count]) && sPLAY == state)
            playMode = STEREO;
        else if (0 == strcmp("mono", argv[count]) && sPLAY == state)
            playMode = MONO;
        else if (0 == strcmp("-pause", argv[count]) && sUNDEF == state)
            state = sPAUSE;
        else if (0 == strcmp("-continue", argv[count]) && sUNDEF == state)
            state = sCONTINUE;
        else if (0 == strcmp("-stop", argv[count]) && sUNDEF == state)
            state = sSTOP;
        else if (0 == strcmp("-eject", argv[count]) && sUNDEF == state)
            state = sEJECT;
        else
            Usage();
 
    osErr = OpenCD(userCDNumber, &ioRefNum);
    if (noErr == osErr)
        osErr = DiscStatus(ioRefNum, &discInPlace);
        if (noErr == osErr) {
            if (discInPlace) {
                switch (state) {
                    case sUNDEF :
                    case sDRIVE :
                    case sPLAY :
                        osErr = TrackCount(ioRefNum, &discStop);
                        if (noErr == osErr) {
                            discStart = 0; 
                            do 
                                osErr = TrackInfo(ioRefNum, ++discStart, &cntlField, &minutes, &seconds, &frames);
                            while (BitTst(&cntlField, 5) && noErr == osErr); 
                            if (noErr == osErr) {
                                osErr = AStop(ioRefNum, max(min(userStop, discStop), discStart));
                                if (noErr == osErr) 
                                    osErr = APlay(ioRefNum, min(max(userStart, discStart), discStop), playMode);
                            }
                        }
                        break;
                    case sPAUSE :
                        osErr = AStatus(ioRefNum, &audioStatus, &playMode, &cntlField, &minutes, &seconds, &frames);
                        if (noErr == osErr)
                            if (PLAYING == audioStatus)
                                osErr = APause(ioRefNum, PAUSE);
                        break;
                    case sCONTINUE :
                        osErr = AStatus(ioRefNum, &audioStatus, &playMode, &cntlField, &minutes, &seconds, &frames);
                        if (noErr == osErr)
                            if (PAUSED == audioStatus) 
                                osErr = APause(ioRefNum, CONTINUE);
                        break;
                    case sSTOP :
                        osErr = AStop(ioRefNum, 0);
                        break;
                    case sEJECT :
                        osErr = EjectCD(ioRefNum);
                        break;
                }
            }
        }
    exit(osErr);
}