home *** CD-ROM | disk | FTP | other *** search
- char *version = "\0$VER: MCDPlayer " VERSION " (" __DATE__ " " __TIME__ ")";
-
- UBYTE *scsi_data = NULL;
- UBYTE *toc_buf = NULL;
-
- int NewTimer = -1;
-
- char scsi_dev[32];
- int scsi_id = 1;
-
- UBYTE buffer[LINE_BUF];
-
- int ActStat = 0; /* 0=No Disk; 1=Playing; 2=Stopped; 3=Paused; 4=Datadisk */
- int ActTitle = 0;
- int ActProg = 0; /* -1=No Prog; 0=Default Prog; 1-3=other Progs */
- int ActProgTitle = 0;
-
- char SetNextTitle = 0;
- char InputTitleStat = 0; /* 0: direkte Titelwahl, 1: Zehnerstelle, 2: Einerstelle */
- int InputTitle = 0;
-
- MSGPORT *mp_ptr;
- IOSTDREQ *io_ptr;
- SCSICMD scsi_cmd;
- UBYTE *scsi_sense;
-
- UBYTE TOC_NumTracks = 0;
- UBYTE TOC_Flags[100]; /* 0=Musik, 1=Daten */
- ULONG TOC_Addr[100];
- char *TOC_Title[100];
- char *TOC_CDTitle;
- char *TOC_CDInterpret;
- char TOC_TitleStrs[4000];
- char TOC_CDID[20];
-
- char WndPosition = 0;
- int Wnd_X = -1;
- int Wnd_Y = -1;
-
- char SongPath[128];
-
- struct timerequest *TimerIO = NULL;
- struct MsgPort *TimerMP = NULL;
- struct MsgPort *BrokerMP = NULL;
- struct DiskObject *DObj=NULL;
- struct Library *CxBase= NULL;
-
- CxObj *broker=NULL, *filter[17], *sender[17], *translate[17];
- struct NewBroker newbroker =
- { NB_VERSION,
- "MCDP",
- "MultiCDPlayer, ©1994 Boris Jakubaschk",
- "Player for audio CDs in a CDROM drive",
- NBU_UNIQUE | NBU_NOTIFY,
- NULL,
- 0, 0, 0 };
- ULONG cxsigflag;
-
-
- int TimerInit()
- {
- if (TimerMP = CreatePort(0,0))
- {
- if (TimerIO = (struct timerequest *) CreateExtIO(TimerMP, sizeof(struct timerequest)))
- {
- if (OpenDevice( TIMERNAME, UNIT_VBLANK, (struct IORequest *)TimerIO, 0L)==NULL)
- {
- return( 1 );
- }
- else
- {
- ErrorMsg("Can't open timer.device.");
- }
- }
- else
- {
- ErrorMsg( "CreateExtIO failed." );
- }
- }
- else
- {
- ErrorMsg("CreatePort failed.");
- }
- return( 0 );
- }
-
- void TimerExit()
- {
- if (TimerIO)
- {
- CloseDevice((struct IORequest *)TimerIO);
- DeleteExtIO((struct IORequest *)TimerIO);
- };
- if (TimerMP)
- {
- DeletePort(TimerMP);
- };
- }
-
- int DoScsiCmd (UBYTE * data, int datasize, UBYTE * cmd, int cmdsize, UBYTE flags)
- {
- io_ptr->io_Length = sizeof (SCSICMD);
- io_ptr->io_Data = (APTR) & scsi_cmd;
- io_ptr->io_Command = HD_SCSICMD;
-
- scsi_cmd.scsi_Data = (APTR) data;
- scsi_cmd.scsi_Length = datasize;
- scsi_cmd.scsi_SenseActual = 0;
- scsi_cmd.scsi_SenseData = scsi_sense;
- scsi_cmd.scsi_SenseLength = SENSE_LEN;
- scsi_cmd.scsi_Command = cmd;
- scsi_cmd.scsi_CmdLength = cmdsize;
- scsi_cmd.scsi_Flags = flags;
-
- (void) DoIO ((struct IORequest *) io_ptr);
-
- return (io_ptr->io_Error);
- }
-
- char SCMD_Inquiry ( void )
- {
- static SCSICMD6 command =
- {
- SCSI_CMD_INQ,
- PAD,
- PAD,
- PAD,
- 0,
- PAD
- };
- static int err;
-
- command.b4 = MAX_DATA_LEN;
-
- if ((err = DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
- (UBYTE *) & command, sizeof (command),
- (SCSIF_READ | SCSIF_AUTOSENSE))) == 0)
- {
- return ((scsi_data[0] & 0x1F)==0x05);
- }
- return( FALSE );
- }
-
- void SCMD_PlayAudio (int starttrack)
- {
- static SCSICMD12 command =
- {
- SCSI_CMD_PLAYAUDIO12,
- PAD,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- PAD,
- PAD,
- };
-
- int i = 1;
- ULONG Addr;
-
- SetNextTitle = 0;
-
- if (ActProg != -1)
- {
- if (Program[0][ActProg]!=0)
- {
- while ( (i<starttrack) && (Program[i-1][ActProg]!=0) ) i++;
- ActProgTitle = i;
- starttrack = Program[i-1][ActProg];
- }
- else ActProg = -1;
- }
-
- DrawPrgmSymb( (ActProg!=-1)?1:0 );
-
- while( (TOC_Flags[starttrack-1]==1)&&(starttrack<TOC_NumTracks) ) starttrack++;
-
- Addr = TOC_Addr[starttrack-1]+1;
-
- command.b2 = (Addr&0xFF000000)>>24;
- command.b3 = (Addr&0x00FF0000)>>16;
- command.b4 = (Addr&0x0000FF00)>>8;
- command.b5 = (Addr&0x000000FF);
-
- if (ActProg == -1)
- {
- Addr = TOC_Addr[TOC_NumTracks]-TOC_Addr[starttrack-1]-1;
- }
- else Addr = TOC_Addr[starttrack]-TOC_Addr[starttrack-1]-1;
-
- command.b6 = (Addr&0xFF000000)>>24;
- command.b7 = (Addr&0x00FF0000)>>16;
- command.b8 = (Addr&0x0000FF00)>>8;
- command.b9 = (Addr&0x000000FF);
-
- DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
- (UBYTE *) & command, sizeof (command),
- (SCSIF_READ | SCSIF_AUTOSENSE));
- };
-
- void SCMD_PauseResume( void )
- {
- static SCSICMD10 command =
- {
- SCSI_CMD_PAUSERESUME,
- PAD,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- PAD,
- };
-
- command.b8 = (ActStat==1)?0x00:0x01;
-
- DoScsiCmd (0, 0,
- (UBYTE *) & command, sizeof (command),
- (SCSIF_READ | SCSIF_AUTOSENSE));
- DrawPrgmSymb( (ActStat==1)?3:1 );
- }
-
- void SCMD_Eject( void )
- {
- static SCSICMD6 command =
- {
- SCSI_CMD_SSU,
- 0,
- PAD,
- PAD,
- 0,
- PAD,
- };
-
- int err;
-
- command.b4 = 2;
-
- if ((err = DoScsiCmd (0, 0,
- (UBYTE *) & command, sizeof (command),
- (SCSIF_READ | SCSIF_AUTOSENSE))) != 0)
- {
- return;
- }
- }
-
- void SCMD_Stop( void )
- {
- static SCSICMD12 command =
- {
- SCSI_CMD_RZU,
- 0 ,
- 0 ,
- 0 ,
- 0 ,
- 0 ,
- 0 ,
- 0 ,
- 0 ,
- 0 ,
- 0 ,
- 0 ,
- };
-
- /* command.b4 = 2; */
-
- DoScsiCmd (0, 0,
- (UBYTE *) & command, sizeof (command),
- (SCSIF_READ | SCSIF_AUTOSENSE));
-
- DrawPrgmSymb( 0 );
- ActProg = -1;
- SetDispStat();
- }
-
- void SCMD_SetVolume (int vol0, int vol1, int vol2, int vol3)
- {
- static int err, i, j;
- static SCSICMD6 modecommand;
- static struct volmodedata
- {
- UBYTE head[4];
- UBYTE page; /* page code 0x0E */
- UBYTE plength; /* page length */
- UBYTE b2; /* bit 2: Immed, bit 1: SOTC */
- UBYTE b3; /* reserved */
- UBYTE b4; /* reserved */
- UBYTE b5; /* bit 7: APRVal, bit 3-0: format of LBAs / Sec. */
- UWORD bps; /* logical blocks per second audio playback */
- UBYTE out0; /* lower 4 bits: output port 0 channel selection */
- UBYTE vol0; /* output port 0 volume */
- UBYTE out1; /* lower 4 bits: output port 1 channel selection */
- UBYTE vol1; /* output port 1 volume */
- UBYTE out2; /* lower 4 bits: output port 2 channel selection */
- UBYTE vol2; /* output port 2 volume */
- UBYTE out3; /* lower 4 bits: output port 3 channel selection */
- UBYTE vol3; /* output port 3 volume */
- } modedata;
-
- for (i = 0; i < 4; i++)
- modedata.head[i] = 0;
-
- modecommand.opcode = SCSI_CMD_MSE;
- modecommand.b1 = 0;
- modecommand.b2 = 0x0E;
- modecommand.b3 = 0;
- modecommand.b4 = MAX_DATA_LEN;
- modecommand.control = 0;
-
- if ((err = DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
- (UBYTE *) &modecommand, sizeof (modecommand),
- (SCSIF_READ | SCSIF_AUTOSENSE))) != 0)
- return;
-
- for (j = (scsi_data[0]+1), i = scsi_data[3] + 4; i < j; i += scsi_data[i+1] + 2)
- {
- memcpy (&modedata.page, &scsi_data[i], 16);
- }
-
- if (vol0 > -1 || vol1 > -1 || vol2 > -1 || vol3 > -1)
- {
- modedata.page = 0x0e;
- modedata.plength = 0x0e;
-
- if (vol0 >= 0)
- modedata.vol0 = vol0;
- if (vol1 >= 0)
- modedata.vol1 = vol1;
- if (vol2 >= 0)
- modedata.vol2 = vol2;
- if (vol3 >= 0)
- modedata.vol3 = vol3;
-
- modecommand.opcode = SCSI_CMD_MSL;
- modecommand.b1 = 0x10;
- modecommand.b2 = 0;
- modecommand.b3 = 0;
- modecommand.b4 = sizeof (modedata);
- modecommand.control = 0;
-
- if ((err = DoScsiCmd ((UBYTE *) &modedata, sizeof(modedata),
- (UBYTE *) &modecommand, sizeof (modecommand),
- (SCSIF_WRITE | SCSIF_AUTOSENSE))) != 0)
- return;
- }
- }
-
- char *GetNextStr( char *a )
- {
- char *b;
-
- b = a;
- while( *b!='\n' ) b++;
- *b = '\0';
- return( b+1 );
- }
-
- void ShowCDTitle( void )
- {
- int slen;
-
- SetAPen( MainWnd->RPort, 1 );
- RectFill( MainWnd->RPort, 25, 38+offy, 258, 64+offy );
- SetAPen( MainWnd->RPort, 2 );
- SetBPen( MainWnd->RPort, 1 );
- Move( MainWnd->RPort, 25, 50+offy );
- slen = strlen(TOC_CDInterpret);
- Text( MainWnd->RPort, TOC_CDInterpret, (slen>29)? 29:slen );
- Move( MainWnd->RPort, 25, 61+offy );
- slen = strlen(TOC_CDTitle);
- Text( MainWnd->RPort, TOC_CDTitle, (slen>29)? 29:slen );
-
- ActTitle = 0;
- }
-
-
- void SCMD_ReadTOC ( void )
- {
- static SCSICMD10 command =
- {
- SCSI_CMD_READTOC,
- 0,
- PAD, PAD, PAD, PAD,
- 0,
- 0x03, 0x24,
- PAD
- };
-
- int err, tocsize;
- int i;
- UBYTE *tocptr;
- char Buffer[130];
- BPTR FH;
- char *a;
-
- if ((err = DoScsiCmd ((UBYTE *) toc_buf, MAX_TOC_LEN,
- (UBYTE *) & command, sizeof (command),
- (SCSIF_READ | SCSIF_AUTOSENSE))) == 0)
- {
- SetAPen( MainWnd->RPort, 1 );
- RectFill( MainWnd->RPort, 25, 38+offy, 258, 64+offy );
-
- tocsize = (toc_buf[0] << 8) | toc_buf[1]; /* first word encodes length */
-
- /* TOC_NumTracks = toc_buf[3]; */
- TOC_Addr[2] = 0;
- TOC_NumTracks = 0;
- if (tocsize >= 2) /* TOC Data Length - FTN - LTN */
- tocsize -= 2;
- for (tocptr = &toc_buf[4]; tocptr < (&toc_buf[4] + tocsize); tocptr += 8)
- {
- TOC_Addr[TOC_NumTracks] = (tocptr[4] << 24) | (tocptr[5] << 16) | (tocptr[6] << 8) | (tocptr[7]);
- /* printf ("Track number: %d ", tocptr[2]); */
- TOC_Flags[TOC_NumTracks] = (tocptr[1] & 0x04) ? 1 : 0;
- TOC_NumTracks++;
- }
- TOC_NumTracks--;
-
- if (TOC_NumTracks<=20) RectFill( MainWnd->RPort, 165-7*(20-TOC_NumTracks), 65+offy, 190, 72+offy );
-
- SetAPen( MainWnd->RPort, 2 );
- SetBPen( MainWnd->RPort, 1 );
-
- sprintf(Buffer, "%02d", TOC_Addr[TOC_NumTracks]/75/60 );
- Move( MainWnd->RPort, 212, 37+offy );
- Text( MainWnd->RPort, Buffer, 2 );
-
- sprintf(Buffer, "%02d", (TOC_Addr[TOC_NumTracks]/75)%60 );
- Move( MainWnd->RPort, 231, 37+offy );
- Text( MainWnd->RPort, Buffer, 2 );
-
- sprintf( TOC_CDID, "ID%02d%06X%06X", TOC_NumTracks, TOC_Addr[2], TOC_Addr[TOC_NumTracks] );
-
- sprintf( Buffer, SongPath );
- AddPart( Buffer, TOC_CDID, 130 );
-
- if (FH = Open( Buffer, MODE_OLDFILE ))
- {
- Read( FH, TOC_TitleStrs, 4000 );
- Close( FH );
- a = TOC_TitleStrs;
- TOC_CDInterpret = a;
- a = GetNextStr( a );
- TOC_CDTitle = a;
- for (i=0; i<TOC_NumTracks; i++)
- {
- a = GetNextStr( a );
- TOC_Title[i] = a;
- };
- a = GetNextStr( a );
- }
- else
- {
- a = TOC_TitleStrs;
- strcpy( a, "<Unknown CD>" );
- TOC_CDTitle = a;
- a += strlen( a ) + 1;
- strcpy( a, TOC_CDID );
- TOC_CDInterpret = a;
- a += strlen( a ) + 1;
- for (i=0; i<TOC_NumTracks; i++)
- {
- strcpy( a, "<Unknown Title>" );
- TOC_Title[i] = a;
- a += strlen( a ) + 1;
- };
- };
- ShowCDTitle();
- GetProgram();
- if (Program[0][0]==0) ActProg = -1;
- }
- }
-
- void SCMD_Jump( int blocks )
- {
- static SCSICMD10 command1 =
- {
- SCSI_CMD_READSUBCHANNEL,
- 0,
- 0x40,
- 0,
- PAD,
- PAD,
- 0,
- 0,0,
- PAD
- };
-
- static SCSICMD12 command2 =
- {
- SCSI_CMD_PLAYAUDIO12,
- PAD,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- PAD,
- PAD,
- };
-
- int err;
- int addr;
-
- command1.b2 = 0x40;
- command1.b3 = 1;
- command1.b6 = 0;
-
- command1.b7 = 255;
- command1.b8 = 255;
-
- if ((err = DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
- (UBYTE *) &command1, sizeof (command1),
- (SCSIF_READ | SCSIF_AUTOSENSE))) == 0)
- {
- if (NewTimer)
- addr = (scsi_data[12] << 24) | (scsi_data[11] << 16) | (scsi_data[10] << 8) | (scsi_data[9]);
- else
- addr = ((scsi_data[8] << 16) | (scsi_data[9] << 16) | (scsi_data[10] << 8) | (scsi_data[11]) );
-
- addr += blocks;
-
- if ((addr>=TOC_Addr[ActTitle-1])&&(addr<TOC_Addr[ActTitle]))
- {
- command2.b2 = (addr&0xFF000000)>>24;
- command2.b3 = (addr&0x00FF0000)>>16;
- command2.b4 = (addr&0x0000FF00)>>8;
- command2.b5 = (addr&0x000000FF);
-
- if (ActProg == -1)
- {
- addr = TOC_Addr[TOC_NumTracks]-TOC_Addr[ActTitle-1]-1;
- }
- else addr = TOC_Addr[ActTitle]-TOC_Addr[ActTitle-1]-1;
-
- command2.b6 = (addr&0xFF000000)>>24;
- command2.b7 = (addr&0x00FF0000)>>16;
- command2.b8 = (addr&0x0000FF00)>>8;
- command2.b9 = (addr&0x000000FF);
-
- DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
- (UBYTE *) & command2, sizeof (command2),
- (SCSIF_READ | SCSIF_AUTOSENSE));
- }
- }
- }
-
-
-