home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / cdrom / compactplayer / source / compactplayer.c < prev    next >
C/C++ Source or Header  |  1995-12-28  |  7KB  |  312 lines

  1. #include "sysheaders.h"
  2. #include "cdpanel.h"
  3. #include "CompactPlayer.h"
  4.  
  5. long __oslibversion = 37;
  6. long __classactversion = 40;
  7.  
  8. UBYTE Version[] = "$VER: CompactPlayer 1.8 " __AMIGADATE__;
  9.  
  10. BOOL Dummy(void) { return FALSE; }
  11.  
  12. void (*CD_Eject)(UBYTE );
  13. void (*CD_Stop)(void);
  14. void (*CD_Play)(ULONG );
  15. void (*CD_PauseResume)(UBYTE );
  16. void (*CD_Seek)(LONG );
  17. ULONG (*CD_Snoop)(ULONG * , ULONG * , ULONG * , ULONG );
  18. ULONG (*CD_ReadTOC)(void);
  19. BOOL (*CD_IsCD)(void);
  20. void (*CD_Close)(void) = (void (*)(void))Dummy;
  21.  
  22. /*****************************************************************
  23.  * Error message
  24.  */
  25.  
  26. void 
  27. ErrorMsg( const STRPTR error, ... )
  28. {
  29.     ULONG *args = ((ULONG *)&error) + 1;
  30.     
  31.     /* Display an error easyrequest */
  32.     
  33.     struct EasyStruct req =
  34.     {
  35.         sizeof(struct EasyStruct),
  36.         0,
  37.         NULL, NULL, NULL
  38.     };
  39.     
  40.     req.es_Title = GS(ERROR_TITLE);
  41.     req.es_TextFormat = error;
  42.     req.es_GadgetFormat = GS(ERROR_BUTTON);
  43.     
  44.     EasyRequestArgs( NULL, &req, NULL, args );
  45. }
  46.  
  47. void 
  48. Sprintf(char *buffer, const char *ctl, ...)
  49. {
  50.     ULONG *args = (ULONG *)&ctl;
  51.     
  52.     /* Print a string */
  53.     
  54.     RawDoFmt((char *)ctl, ++args, (void (*))"\x16\xc0\x4e\x75", buffer);
  55. }
  56.  
  57. int
  58. Init_Device(void)
  59. {
  60.     CD_Close();
  61.     if (!strcmp("cd.device", Device))
  62.         return Open_CD();
  63.     else
  64.         return Open_SCSI();
  65. }
  66.  
  67. /********************************************************
  68.  * Index files
  69.  */
  70.  
  71. ULONG TOCL[MAX_TOC];                    /* track lenghts in blocks */
  72. ULONG TOCT[MAX_TOC];                    /* track lenghts in seconds */
  73. UBYTE TOCF[MAX_TOC];                    /* audio/data */
  74. STRPTR TOCS[MAX_TOC];                    /* titles */
  75. ULONG TOCP[MAX_TOC];                    /* program */
  76. STRPTR TITLE[2];                         /* artist/record */
  77. UBYTE TitleBuffer[(MAX_TOC+2)*40];        /* title string buffer */
  78. ULONG Tracks;
  79. ULONG Track;
  80. BOOL done;
  81.  
  82. /***********************************************************
  83.  * Primary event handler
  84.  */
  85.  
  86. extern struct List *BrowserNodesA( STRPTR * );
  87. extern void FreeBrowserNodes( struct List * );
  88.  
  89. struct List *TrackList;
  90. struct MsgPort *AppPort, *WinPort;
  91.  
  92. static void
  93. MainLoop(void)
  94. {
  95.     ULONG sig,    wsig = 1L << WinPort->mp_SigBit, 
  96.                 asig = 1L << AppPort->mp_SigBit, 
  97.                 tsig = 1L << TimerPort->mp_SigBit,
  98.                 rsig;
  99.                 
  100.     GetAttr( AREXX_SigMask, ARexxObj, &rsig );
  101.  
  102.     while (done == FALSE)
  103.     {
  104.         sig = Wait(wsig | asig | tsig | rsig | SIGBREAKF_CTRL_C);
  105.  
  106.         if (sig & (wsig | asig))
  107.         {
  108.             /* Messages waiting in the shared IDCMP or AppMessage port */
  109.             MainWindowIDCMP();
  110.             ListWindowIDCMP();
  111.             ConfWindowIDCMP();
  112.         } 
  113.  
  114.         if (sig & tsig)            /* timer triggered */
  115.         {
  116.             ULONG status, ostatus;
  117.             ULONG track = 0;
  118.             ULONG tracktime = 0;
  119.             ULONG time = 0;
  120.  
  121.             WaitIO(TimerIO);
  122.  
  123.             TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  124.             TimerIO->tr_time.tv_secs = 1;
  125.             TimerIO->tr_time.tv_micro = 0;
  126.             SendIO((struct IORequest *) TimerIO);
  127.  
  128.             GetAttr(CDPANEL_Status, GList[G_Panel], &ostatus);
  129.             status = CD_Snoop(&track, &tracktime, &time, ostatus);
  130.  
  131.             if ((ostatus == CDP_EMPTY || ostatus == CDP_EJECTED) && status != ostatus)
  132.             {
  133.                 /* A CD was just inserted? */
  134.             
  135.                 SetGadgetAttrs(GList[G_List], Win, NULL, LISTBROWSER_Labels, ~0, TAG_END);
  136.  
  137.                 FreeBrowserNodes(TrackList);
  138.                 
  139.                 Tracks = CD_ReadTOC();
  140.                 TrackList = BrowserNodesA(TOCS);
  141.  
  142.                 SetGadgetAttrs(GList[G_Panel], Win, NULL,
  143.                                CDPANEL_Status, status,
  144.                                CDPANEL_Artist, TITLE[0],
  145.                                CDPANEL_Title, TITLE[1],
  146.                                CDPANEL_Tracks, Tracks,
  147.                                CDPANEL_TrackTitles, TOCS,
  148.                                CDPANEL_TrackTimes, TOCT,
  149.                                CDPANEL_TotalTime, TOCT[Tracks],
  150.                                TAG_END);
  151.                                
  152.                 if (SetGadgetAttrs(GList[G_List], Win, NULL, LISTBROWSER_Labels, TrackList, GA_ReadOnly, FALSE, TAG_END))
  153.                     RefreshGList(GList[G_List], Win, NULL, 1);
  154.  
  155.                 UpdateTitleEditor();
  156.             }
  157.  
  158.             if (track)
  159.             {
  160.                 ULONG i;
  161.                 
  162.                 /* We're apparently playing */
  163.  
  164.                 GetAttr(LISTBROWSER_Selected, GList[G_List], &i);
  165.                 if (track - 1 != i)
  166.                     SetGadgetAttrs(GList[G_List], Win, NULL, LISTBROWSER_Selected, track - 1, LISTBROWSER_MakeVisible, track - 1, TAG_END);
  167.                     
  168.                 if (ostatus == CDP_SEEKING)
  169.                     status = CDP_SEEKING;
  170.  
  171.                 SetGadgetAttrs(GList[G_Panel], Win, NULL,
  172.                                CDPANEL_Status, status,
  173.                                CDPANEL_Time, time,
  174.                                CDPANEL_Track, track,
  175.                                CDPANEL_TrackTime, tracktime,
  176.                                TAG_END);
  177.                                
  178.                 if (!Track) Track = track;
  179.             }
  180.  
  181.             if (status == CDP_EMPTY || status == CDP_EJECTED)
  182.             {
  183.                 SetGadgetAttrs(GList[G_Panel], Win, NULL,
  184.                                CDPANEL_Status, status,
  185.                                TAG_END);
  186.                                
  187.                 /* No CD. If it was just removed, expunge the names */
  188.  
  189.                 if (TrackList)
  190.                 {
  191.                     if (SetGadgetAttrs(GList[G_List], Win, NULL, LISTBROWSER_Labels, &dummyList, GA_ReadOnly, TRUE, TAG_END))
  192.                         RefreshGList(GList[G_List], Win, NULL, 1);
  193.                     FreeBrowserNodes(TrackList);
  194.                     TrackList = NULL;
  195.                 }
  196.             }
  197.  
  198.             if (status == CDP_STOPPED)
  199.             {
  200.                 /* CD isn't playing */
  201.             
  202.                 SetGadgetAttrs(GList[G_Panel], Win, NULL,
  203.                                CDPANEL_Status, status,
  204.                                TAG_END);
  205.                                
  206.                 if (ostatus == CDP_PLAYING || ostatus == CDP_SEEKING)
  207.                 {
  208.                     if (SetGadgetAttrs(GList[G_List], Win, NULL, LISTBROWSER_Selected, ~0, TAG_END))
  209.                         RefreshGList(GList[G_List], Win, NULL, 1);
  210.                 }
  211.             }
  212.         }
  213.         
  214.         if (sig & rsig)
  215.         {
  216.             DoMethod( ARexxObj, AM_HANDLEEVENT );
  217.         }
  218.         
  219.         if (sig & SIGBREAKF_CTRL_C)
  220.         {
  221.             done = TRUE;
  222.         }
  223.     }
  224. }
  225.  
  226. /*************************************************************
  227.  * Initialisation 
  228.  */
  229.  
  230. #define TEMPLATE "DEVICE/K,UNIT/K/N,PUBSCREEN/K,INDEXPATH/K,XPOS/K/N,YPOS/K/N,TINYFONT/K,PANELFONT/K"
  231. enum { ARG_Device, ARG_Unit, Arg_PubScreen, ARG_IndexPath, ARG_XPos, ARG_YPos, ARG_TinyFont, ARG_PanelFont, ARG_ThrowAway, ARG_MAX };
  232. LONG ArgArray[ARG_MAX+1];
  233.  
  234. int
  235. main(void)
  236. {
  237.     struct RDArgs *RDArgs;
  238.     
  239.     if (RDArgs = ReadToolArgs( TEMPLATE, ArgArray ))
  240.     {
  241.         Screen = (STRPTR)ArgArray[Arg_PubScreen];
  242.         if (ArgArray[ARG_Device])
  243.         {
  244.             if (AvoidDevice((STRPTR)ArgArray[ARG_Device]))
  245.             {
  246.                 ErrorMsg(GS(DEVICE_INCOMPATIBLE), ArgArray[ARG_Device]);
  247.             }
  248.             else
  249.                 Device = (STRPTR)ArgArray[ARG_Device];
  250.         }
  251.         if (ArgArray[ARG_Unit])
  252.             Unit = *(ULONG *)ArgArray[ARG_Unit];
  253.         if (ArgArray[ARG_IndexPath])
  254.             IndexPath = (STRPTR)ArgArray[ARG_IndexPath];
  255.         if (ArgArray[ARG_TinyFont])
  256.         {
  257.             /* Fill up the TextAttr for the main windows list/button font */
  258.         
  259.             STRPTR s = (STRPTR)ArgArray[ARG_TinyFont];
  260.             CompactAttr.ta_Name = s;
  261.             while (*s && *s != '/')
  262.                 s++;
  263.             if (*s == '/')
  264.             {
  265.                 *s++ = 0;
  266.                 CompactAttr.ta_YSize = atoi(s);
  267.             }
  268.         }
  269.         if (ArgArray[ARG_PanelFont])
  270.         {
  271.             /* Fill up the TextAttr for the font used in the status panel */
  272.             
  273.             STRPTR s = (STRPTR)ArgArray[ARG_PanelFont];
  274.             PanelAttr.ta_Name = s;
  275.             while (*s && *s != '/')
  276.                 s++;
  277.             if (*s == '/')
  278.             {
  279.                 *s++ = 0;
  280.                 PanelAttr.ta_YSize = atoi(s);
  281.             }
  282.         }
  283.  
  284.         if (InitARexx() != (APTR)~0)    /* ~0 means already running */
  285.         {
  286.             if ((AppPort = CreateMsgPort()) && (WinPort = CreateMsgPort()))
  287.             {
  288.                 if (OpenMainWindow(    ArgArray[ARG_XPos] ? *(ULONG *)ArgArray[ARG_XPos] : 0,
  289.                                     ArgArray[ARG_YPos] ? *(ULONG *)ArgArray[ARG_YPos] : 4000))
  290.                 {
  291.                     Init_Device();
  292.             
  293.                     MainLoop();
  294.                 }
  295.                 CloseListWindow();
  296.                 CloseConfWindow();
  297.                 CloseMainWindow();
  298.             }
  299.             if (AppPort)
  300.                 DeleteMsgPort(AppPort);
  301.             if (WinPort)
  302.                 DeleteMsgPort(WinPort);
  303.         }
  304.  
  305.         CloseARexx();
  306.  
  307.         CD_Close();
  308.         FreeToolArgs(RDArgs);
  309.     }
  310.     return 0;
  311. }
  312.