with Gmface.Gm_Common;                    use Gmface.Gm_Common;
with Gmface.Gm_MIDI.Instruments;          use Gmface.Gm_MIDI.Instruments;
with Gmface.Gm_Virtual;                   use Gmface.Gm_Virtual;

with Gmface.Gm_Processing.Gm_Common;      use Gmface.Gm_Processing.Gm_Common;

with Ada.Calendar;                      use Ada.Calendar;
with Interfaces.C;                      use Interfaces.C;
package Gmface.Gm_Processing.Gm_Plugins is
   
   type Gm_Plugin_Processing;
   task type Event_Process_Type(Driver : access Gm_Plugin_Processing) is
      
      entry Receive (Device  : in Device_Num;
		     Date    : in Time;
		     Message : in Interfaces.C.Long;
		     Hour    : in Duration;
		     Tempo   : in Tempo_Type);
      entry Halt;
      
   end Event_Process_Type;
   
   type Gm_Plugin_Processing is abstract tagged limited
      record
	 Box           : access Messages_Box;
	 Instruments   : access Bandmaster_Record;
	 Event_Process : Event_Process_Type(Gm_Plugin_Processing'Access);
      end record;
   
   procedure Initialize(Plugin_Process : in Gm_Plugin_Processing; Options : in Work_Options_access) is abstract;
   procedure Start(Plugin_Process : in Gm_Plugin_Processing; Start_Time : in Time; Tempo : in Tempo_Type; Signature : in Time_Signature_Type) is abstract;
   procedure Stop(Plugin_Process : in Gm_Plugin_Processing) is abstract;
   procedure Halt(Plugin_Process : in Gm_Plugin_Processing) is abstract;
end Gmface.Gm_Processing.Gm_Plugins;