home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / MM1 / SOUNDUTILS / tracker.4.6.lzh / TRACKER4.6 / Amiga / server / smain.c < prev    next >
C/C++ Source or Header  |  1994-11-24  |  4KB  |  185 lines

  1. /* amiga/server/main.c */
  2.  
  3. /* sound server task management */
  4.  
  5. /* $Id: smain.c,v 1.7 1994/01/08 20:26:45 Espie Rel Espie $
  6.  * $Log: smain.c,v $
  7.  * Revision 1.7  1994/01/08  20:26:45  Espie
  8.  * Added pause gadget.
  9.  *
  10.  * Revision 1.6  1994/01/08  04:05:32  Espie
  11.  * Added geta4 for local data model.
  12.  *
  13.  * Revision 1.5  1994/01/07  15:58:17  Espie
  14.  * Semantics of TIME_WAIT has changed:
  15.  * we now input delays and the server computes what's needed.
  16.  * Makes Pause feasible !
  17.  *
  18.  * Revision 1.4  1994/01/05  14:56:02  Espie
  19.  * *** empty log message ***
  20.  *
  21.  * Revision 1.3  1994/01/05  04:35:23  Espie
  22.  * Suppressed old debug messages.
  23.  *
  24.  * Revision 1.2  1994/01/04  19:13:21  Espie
  25.  * Almost nothing.
  26.  *
  27.  * Revision 1.1  1994/01/04  15:45:37  Espie
  28.  * Initial revision
  29.  *
  30.  */
  31. #include <exec/nodes.h>
  32. #include <exec/memory.h>
  33. #include <proto/exec.h>
  34. #include <devices/audio.h>
  35. #ifdef EXTERNAL
  36. #include <stdio.h>
  37. #endif
  38.  
  39. #include "defs.h"
  40. #include "amiga/amiga.h"
  41. #include "amiga/server/server.h"
  42.  
  43. ID("$Id$")
  44.  
  45. LOCAL struct MsgPort *port = 0;
  46. LOCAL struct MinList event_list;
  47.  
  48. void close_all()
  49.    {
  50.    end_audio();
  51.    close_timer();
  52.    if (port)
  53.       {
  54.       struct Message *msg;
  55.       
  56.       while (msg = GetMsg(port))
  57.          ReplyMsg(msg);
  58.       while (msg = RemHead(&event_list))
  59.          ReplyMsg(msg);
  60.       if (port->mp_Node.ln_Name)
  61.          RemPort(port);
  62.       DeleteMsgPort(port);
  63.       }
  64.    }
  65.  
  66. void subtask(struct ext_message *msg)
  67.    {
  68.    struct MsgPort *aport, *tport;
  69.    struct ext_message *msg2;
  70.    int paused = FALSE;
  71.  
  72.    geta4();
  73.    msg->data.comm.task = FindTask(0);
  74.    msg->data.comm.port = 0;
  75.    if (!port)
  76.       port = CreateMsgPort();
  77.    NewList(&event_list);
  78.    aport = start_audio();
  79.    tport = open_timer();
  80.  
  81.    if (port && aport && tport)
  82.       {
  83.       msg->data.comm.port = port;
  84.       ReplyMsg(msg);
  85.       }
  86.    else
  87.       {
  88.       close_all();
  89.       Forbid();
  90.       ReplyMsg(msg);
  91. #ifdef EXTERNAL
  92.       return;
  93. #else
  94.       Wait(0L);
  95. #endif
  96.       }
  97.  
  98.    forever
  99.       {
  100.       ULONG mask;
  101.       
  102.       mask = Wait(1<<port->mp_SigBit | 1<<tport->mp_SigBit | 1<<aport->mp_SigBit);
  103.          /* deal with messages */
  104.       if (mask & 1<<port->mp_SigBit)
  105.          {
  106.  
  107.          while (msg = (struct ext_message *)GetMsg(port))
  108.             {
  109.             switch(msg->type)
  110.                {
  111.             case TYPE_DIE:
  112. #ifdef EXTERNAL
  113.                puts("Dying");
  114. #endif
  115.                close_all();
  116.                Forbid();
  117.                msg->data.comm.task = FindTask(0);
  118.                ReplyMsg(msg);
  119. #ifdef EXTERNAL
  120.                puts("Dead");
  121.                return;
  122. #else
  123.                Wait(0);
  124. #endif
  125.             case TYPE_FLUSH_BUFFER:
  126.                reset_audio();
  127.                ReplyMsg(msg);
  128.                while(msg = RemHead(&event_list))
  129.                   {
  130.                   ReplyMsg(msg);
  131.                   }
  132.                break;
  133.             case TYPE_PAUSE:
  134.                paused = TRUE;
  135.                ReplyMsg(msg);
  136.                send_immediate(CMD_STOP, 15);
  137.                break;
  138.             case TYPE_UNPAUSE:
  139.                paused = FALSE;
  140.                send_immediate(CMD_START, 15);
  141.                handle_timer(&event_list, TRUE);
  142.                ReplyMsg(msg);
  143.                break;
  144.                /* bandwidth optimization: compress multiple WAIT messages 
  145.                 * and reply them right away
  146.                 */
  147.             case TYPE_WAIT:
  148.                if (msg2 = RemTail(&event_list))
  149.                   {
  150.                   if (msg2->type == TYPE_WAIT)
  151.                      {
  152.                      msg->data.time.low += msg2->data.time.low;
  153.                      if (msg->data.time.low < msg2->data.time.low)
  154.                         msg->data.time.high++;
  155.                      msg->data.time.high += msg2->data.time.high;
  156.                      ReplyMsg(msg2);
  157.                      }
  158.                   else
  159.                      AddTail(&event_list, msg2);
  160.                   }
  161.                /* FALL THROUGH */
  162.             default:
  163.                AddTail(&event_list, msg);
  164.                }
  165.             }
  166.          }
  167.       if (!paused)
  168.          handle_timer(&event_list, mask & 1<<tport->mp_SigBit);
  169.       handle_audio(&event_list, mask & 1<<aport->mp_SigBit);
  170.       }
  171.    }
  172.  
  173. #ifdef EXTERNAL
  174. main()
  175.    {
  176.    port = CreateMsgPort();
  177.    port->mp_Node.ln_Name = PUBLIC_PORT_NAME;
  178.    port->mp_Node.ln_Pri = 0;
  179.    AddPort(port);
  180.    WaitPort(port);
  181.    subtask(GetMsg(port));
  182.    Permit();
  183.    }
  184. #endif
  185.