/* CDVol controls output volume of CD player */ #include #include #include #include #include #define MULTIPLEX_INT 0x2f #define INIT_MP_INT 0x1500 #define CDREQ_MP_INT 0x1510 #define STAT_HAS_AN_ERROR 0x8000 #define STAT_BUSY 0x0200 #define STAT_DONE 0x0100 int CDRomLoaded,CDRomDrive; #define WRITE_IOCTL_COMMAND 12 #define AUDIO_CHANNEL_CTRL 3 typedef struct { unsigned char ParamLength; unsigned char SubUnit; unsigned char CommandCode; unsigned int Status; unsigned long Reserved1; unsigned long Reserved2; unsigned char Meddescr; unsigned long Transfaddr; unsigned int Numbytes; unsigned int Startsec; unsigned long volID; } IOCTLStruc; typedef struct { unsigned char CntrlCode; unsigned char InputChan0; unsigned char VolChan0; unsigned char InputChan1; unsigned char VolChan1; unsigned char InputChan2; unsigned char VolChan2; unsigned char InputChan3; unsigned char VolChan3; } AudCtrlStruc; AudCtrlStruc AudCtrlBlock; IOCTLStruc IOCTLBlock; int CDRomLoaded,CDRomDrive; main(int argc, char *argv[]) { if (!CheckCD2F()){ printf("MSCDEX NOT LOADED\n"); exit(1); } if(argc > 2) SetVol( (unsigned char)atoi(argv[1]),(unsigned char)atoi(argv[2]) ); else { printf("CDVOL Sets audio output volume of CD-ROM\n"); printf("usage: cdvol \n"); } } CheckCD2F() { union REGS regs; regs.x.ax = INIT_MP_INT; int86(MULTIPLEX_INT,®s,®s); CDRomLoaded = regs.x.bx; CDRomDrive = regs.x.cx; } SetVol(unsigned char Leftvol, unsigned char Rightvol) { union REGS regs; struct SREGS sregs; AudCtrlBlock.CntrlCode = AUDIO_CHANNEL_CTRL; AudCtrlBlock.InputChan0 = 0; AudCtrlBlock.VolChan0 = Leftvol; AudCtrlBlock.InputChan1 = 1; AudCtrlBlock.VolChan1 = Rightvol; AudCtrlBlock.InputChan2 = 2; AudCtrlBlock.VolChan2 = 0; AudCtrlBlock.InputChan3 = 3; AudCtrlBlock.VolChan3 = 0; IOCTLBlock.ParamLength = 13; IOCTLBlock.SubUnit = 0; IOCTLBlock.CommandCode = WRITE_IOCTL_COMMAND; IOCTLBlock.Status = 0; IOCTLBlock.Meddescr = 0; IOCTLBlock.Transfaddr = (unsigned long)&AudCtrlBlock; IOCTLBlock.Numbytes = 9; IOCTLBlock.Startsec = 0; IOCTLBlock.volID = 0; regs.x.ax = CDREQ_MP_INT; regs.x.bx = FP_OFF(&IOCTLBlock); regs.x.cx = CDRomDrive; sregs.es = FP_SEG(&IOCTLBlock); int86x(MULTIPLEX_INT,®s,®s,&sregs); return(IOCTLBlock.Status); } .