home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / M2V11-1.LHA / modula / amiga / RealTime.def < prev    next >
Encoding:
Text File  |  1993-11-10  |  8.3 KB  |  235 lines

  1. DEFINITION FOR LIBRARY MODULE RealTime ;
  2.  
  3. FROM SYSTEM    IMPORT STRING, ADDRESS ;
  4. FROM Utility    IMPORT TAG_USER, TagItemPtr, Tag, HookPtr ;
  5. FROM Exec    IMPORT Node, MinList, Library, TaskPtr  ;
  6.  
  7. (*============================================================================*)
  8.  
  9. (* realtime.library's idea of time is based on a clock which emits a pulse    *)
  10. (* 1200 times a second (1.2kHz).All time values maintained by realtime.library*)
  11. (* are based on this number. For example, the field RealTimeBase->rtb_Time    *)
  12. (* expresses an amount of time equivalent to(RealTimeBase->rtb_Time/TICK_FREQ)*)
  13. (* seconds.                                      *)
  14.  
  15. CONST
  16.   TICK_FREQ = 1200 ;
  17.  
  18. (*============================================================================*)
  19.  
  20. (* Each Conductor represents a group of applications which wish to remain  *)
  21. (* synchronized together.                           *)
  22. (*                                       *)
  23. (* This structure must only be allocated by realtime.library and is       *)
  24. (* READ-ONLY!                                   *)
  25.  
  26. TYPE
  27.   ConductorPtr = POINTER TO Conductor ;
  28.   Conductor = RECORD
  29.     cdt_Link        : Node      ;
  30.     cdt_Reserved0    : CARDINAL  ;
  31.     cdt_Players        : MinList   ; (* this conductor's players      *)
  32.     cdt_ClockTime    : LONGINT   ; (* current time of this sequence *)
  33.     cdt_StartTime    : LONGINT   ; (* start time of this sequence   *)
  34.     cdt_ExternalTime    : LONGINT   ; (* time from external unit       *)
  35.     cdt_MaxExternalTime : LONGINT   ; (* upper limit on sync'd time    *)
  36.     cdt_Metronome    : LONGINT   ; (* MetricTime highest pri node   *)
  37.     cdt_Reserved1    : CARDINAL  ;
  38.     cdt_Flags        : BITSET    ; (* conductor flags           *)
  39.     cdt_State        : SHORTCARD ; (* playing or stopped           *)
  40.   END ;
  41.  
  42. CONST
  43. (* Flag bits for Conductor.cdt_Flags *)
  44.   CONDUCTF_EXTERNAL = {0} ; (* clock is externally driven *)
  45.   CONDUCTF_GOTTICK  = {1} ; (* received 1st external tick *)
  46.   CONDUCTF_METROSET = {2} ; (* cdt_Metronome filled in    *)
  47.   CONDUCTF_PRIVATE  = {3} ; (* conductor is private      *)
  48.  
  49.   CONDUCTB_EXTERNAL = 0 ;
  50.   CONDUCTB_GOTTICK  = 1 ;
  51.   CONDUCTB_METROSET = 2 ;
  52.   CONDUCTB_PRIVATE  = 3 ;
  53.  
  54. (* constants for Conductor.cdt_State and SetConductorState() *)
  55.   CONDSTATE_STOPPED     = 0 ; (* clock is stopped        *)
  56.   CONDSTATE_PAUSED      = 1 ; (* clock is paused        *)
  57.   CONDSTATE_LOCATE      = 2 ; (* go to 'running' when ready *)
  58.   CONDSTATE_RUNNING     = 3 ; (* run clock NOW            *)
  59.  
  60. (* These do not actually exist as Conductor states, but are used as additional*)
  61. (* arguments to SetConductorState()                          *)
  62.  
  63.   CONDSTATE_METRIC     = -1 ; (* ask high node to locate       *)
  64.   CONDSTATE_SHUTTLE    = -2 ; (* time changing but not running *)
  65.   CONDSTATE_LOCATE_SET = -3 ; (* maestro done locating           *)
  66.  
  67.  
  68. (*============================================================================*)
  69.  
  70.  
  71. (* The Player is the connection between a Conductor and an application. *)
  72. (*                                    *)
  73. (* This structure must only be allocated by realtime.library and is    *)
  74. (* READ-ONLY!                                *)
  75.  
  76. TYPE
  77.   PlayerPtr = POINTER TO Player ;
  78.   Player = RECORD
  79.     pl_Link     : Node     ;
  80.     pl_Reserved0 : SHORTINT ;
  81.     pl_Reserved1 : SHORTINT ;
  82.     pl_Hook     : HookPtr  ;     (* player's hook function     *)
  83.     pl_Source     : ConductorPtr; (* pointer to parent context     *)
  84.     pl_Task     : TaskPtr  ;     (* task to signal for alarm     *)
  85.     pl_MetricTime: LONGINT  ;     (* current time in app's metric *)
  86.     pl_AlarmTime : LONGINT  ;     (* time to wake up         *)
  87.     pl_UserData     : ADDRESS  ;     (* for application use         *)
  88.     pl_PlayerID     : CARDINAL ;     (* for application use         *)
  89.     pl_Flags     : BITSET   ;     (* general Player flags     *)
  90.   END ;
  91.  
  92. CONST
  93. (* Flag bits for Player.pl_Flags *)
  94.   PLAYERF_READY        = {0} ;  (* player is ready to go!       *)
  95.   PLAYERF_ALARMSET    = {1} ;  (* alarm is set           *)
  96.   PLAYERF_QUIET        = {2} ;  (* a dummy player, used for sync  *)
  97.   PLAYERF_CONDUCTED    = {3} ;  (* give me metered time       *)
  98.   PLAYERF_EXTSYNC    = {4} ;  (* granted external sync       *)
  99.  
  100.   PLAYERB_READY        = 0 ;
  101.   PLAYERB_ALARMSET    = 1 ;
  102.   PLAYERB_QUIET        = 2 ;
  103.   PLAYERB_CONDUCTED    = 3 ;
  104.   PLAYERB_EXTSYNC    = 4 ;
  105.  
  106.  
  107. (*============================================================================*)
  108.  
  109.  
  110. (* Tags for CreatePlayer(), SetPlayerAttrs(), and GetPlayerAttrs() *)
  111.   PLAYER_Base        = (TAG_USER+64)    ;
  112.   PLAYER_Hook        = (PLAYER_Base+1)  ;  (* set address of hook function *)
  113.   PLAYER_Name        = (PLAYER_Base+2)  ;  (* name of player                     *)
  114.   PLAYER_Priority    = (PLAYER_Base+3)  ;  (* priority of player          *)
  115.   PLAYER_Conductor    = (PLAYER_Base+4)  ;  (* set conductor for player     *)
  116.   PLAYER_Ready        = (PLAYER_Base+5)  ;  (* the "ready" flag          *)
  117.   PLAYER_AlarmTime    = (PLAYER_Base+12) ;  (* alarm time              *)
  118.                             (*  (sets PLAYERF_ALARMSET)     *)
  119.   PLAYER_Alarm        = (PLAYER_Base+13) ;  (* sets/clears PLAYERF_ALARMSET *)
  120.                             (*  flag                  *)
  121.  
  122.   PLAYER_AlarmSigTask    = (PLAYER_Base+6)  ;  (* task to signal for alarm/    *)
  123.                             (*  notify              *)
  124.   PLAYER_AlarmSigBit    = (PLAYER_Base+8)  ;  (* signal bit for alarm (or -1) *)
  125.   PLAYER_Conducted    = (PLAYER_Base+7)  ;  (* sets/clears PLAYERF_CONDUCTED*)
  126.                             (*  flag                  *)
  127.   PLAYER_Quiet        = (PLAYER_Base+9)  ;  (* don't process time thru this *)
  128.   PLAYER_UserData    = (PLAYER_Base+10) ;
  129.   PLAYER_ID        = (PLAYER_Base+11) ;
  130.   PLAYER_ExtSync    = (PLAYER_Base+14) ;  (* attempt/release to ext sync  *)
  131.   PLAYER_ErrorCode    = (PLAYER_Base+15) ;  (* error return value          *)
  132.  
  133.  
  134. (*============================================================================*)
  135.  
  136. CONST
  137. (* Method types for messages sent via a Player's hook *)
  138.   PM_TICK     = 0 ;
  139.   PM_STATE    = 1 ;
  140.   PM_POSITION = 2 ;
  141.   PM_SHUTTLE  = 3 ;
  142.  
  143. (* used for PM_TICK, PM_POSITION and PM_SHUTTLE methods *)
  144. TYPE
  145.   pmTimePtr = POINTER TO pmTime ;
  146.   pmTime = RECORD
  147.     pmt_Method : LONGINT ; (* PM_TICK, PM_POSITION, or PM_SHUTTLE *)
  148.     pmt_Time   : LONGINT ;
  149.   END ;
  150.  
  151. (* used for the PM_STATE method *)
  152.  
  153.   pmStatePtr = POINTER TO pmState ;
  154.   pmState = RECORD
  155.     pms_Method   : LONGINT ; (* PM_STATE *)
  156.     pms_OldState : LONGINT ;
  157.   END ;
  158.  
  159.  
  160. (*============================================================================*)
  161.  
  162. CONST
  163. (* Possible lock types for LockRealTime() *)
  164.   RT_CONDUCTORS    = 0 ;  (* conductor list *)
  165.  
  166.  
  167. (*============================================================================*)
  168.  
  169. CONST
  170. (* realtime.library error codes *)
  171.   RTE_NOMEMORY      = 801 ;  (* memory allocation failed      *)
  172.   RTE_NOCONDUCTOR = 802 ;  (* player needs a conductor      *)
  173.   RTE_NOTIMER      = 803 ;  (* timer (CIA) allocation failed *)
  174.   RTE_PLAYING      = 804 ;  (* can't shuttle while playing   *)
  175.  
  176. (*============================================================================*)
  177.  
  178. (* OpenLibrary("realtime.library",0) returns a pointer to this structure. *)
  179. (* All fields are READ-ONLY.                          *)
  180.  
  181. TYPE
  182.   RealTimeBasePtr = POINTER TO RealTimeBaseRec ;
  183.   RealTimeBaseRec = RECORD
  184.     rtb_LibNode   : Library ;
  185.     rtb_Reserved0 : ARRAY [0..1] OF CHAR ;
  186.  
  187.     rtb_Time      : LONGINT  ; (* current time                 *)
  188.     rtb_TimeFrac  : LONGINT  ; (* fixed-point fraction part of time  *)
  189.     rtb_Reserved1 : CARDINAL ;
  190.     rtb_TickErr      : INTEGER  ; (* nanosecond error from ideal Tick   *)
  191.   END ;                   (* length to real tick length         *)
  192.  
  193. VAR RealTimeBase : RealTimeBasePtr ;
  194.  
  195. (* Actual tick length is: 1/TICK_FREQ + rtb_TickErr/1e9 *)
  196.  
  197. CONST
  198.   RealTime_TickErr_Min = -705 ;
  199.   RealTime_TickErr_Max =  705 ;
  200.  
  201.  
  202. (*============================================================================*)
  203.  
  204. (*--- functions in V37 or higher (Release 2.04) ---*)
  205.  
  206. (* Locks *)
  207.  
  208. PROCEDURE LockRealTime( lockType : LONGINT ) : ADDRESS ;
  209. PROCEDURE UnlockRealTime( lock : ADDRESS ) ;
  210.  
  211. (* Conductor *)
  212.  
  213. PROCEDURE CreatePlayerA( tagList : TagItemPtr ) : PlayerPtr ;
  214. PROCEDURE CreatePlayer( tag1 : Tag ; .. ) : PlayerPtr ;
  215.  
  216. PROCEDURE DeletePlayer( player : PlayerPtr );
  217.  
  218. PROCEDURE SetPlayerAttrsA( player: PlayerPtr ; tagList: TagItemPtr ) : BOOLEAN ;
  219. PROCEDURE SetPlayerAttrs( player : PlayerPtr ; tag1 : Tag ; .. ) : BOOLEAN ;
  220.  
  221. PROCEDURE SetConductorState( player : PlayerPtr ;
  222.                  state  : LONGINT ;
  223.                  time   : LONGINT ) : LONGINT ;
  224.  
  225. PROCEDURE ExternalSync( player : PlayerPtr ;
  226.             minTime, maxTime : LONGINT ) : BOOLEAN ;
  227.  
  228. PROCEDURE NextConductor( previousConductor : ConductorPtr ) : ConductorPtr ;
  229. PROCEDURE FindConductor( name : STRING ) : ConductorPtr ;
  230.  
  231. PROCEDURE GetPlayerAttrsA( player: PlayerPtr ; tagList : TagItemPtr ): LONGINT ;
  232. PROCEDURE GetPlayerAttrs( player : PlayerPtr ; tag1 : Tag ; .. ) : LONGINT ;
  233.  
  234. END RealTime.
  235.