
 /* SV_SuperVisor.c
    - SuperVising (global exit) Functions for 8SVX-Support -
    (c) 1990-94 by Andreas R. Kleinert
    Last changes : 30.04.1994
 */

#include "spobject.h"

struct SPObjectHandle * __saveds __asm SPO_AllocHandle( register __a1 APTR future_a1);
void __saveds __asm SPO_FreeHandle( register __a1 struct SPObjectHandle *SPObjectHandle_a1);
void __saveds __asm SPO_StopReplay( register __a1 struct SPObjectHandle *SPObjectHandle_a1);
void __saveds __asm SPO_FreeResources( register __a1 struct SPObjectHandle *SPObjectHandle_a1);

/* *************************************************** */
/* *						     * */
/* * SPO_AllocHandle : Free SPObjectHandle and more  * */
/* *						     * */
/* *************************************************** */

struct SPObjectHandle * __saveds __asm SPO_AllocHandle( register __a1 APTR future_a1)
{
 APTR future = future_a1;
 struct SPObjectHandle *handle;

 handle = (APTR) AllocVec(sizeof(struct SPObjectHandle), (MEMF_CLEAR|MEMF_PUBLIC));
 if(handle)
  {
   handle->ah_Type      = SP_SUBTYPE_NONE;
   handle->ah_WriteMode = SP_SUBTYPE_NONE;
   handle->ah_Medium    = SPO_MEDIUM_DISK; /* default */
  }

 return(handle);
}

/* *************************************************** */
/* *						     * */
/* * SPO_FreeHandle : Free SPObjectHandle and more   * */
/* *						     * */
/* *************************************************** */

void __saveds __asm SPO_FreeHandle( register __a1 struct SPObjectHandle *SPObjectHandle_a1)
{
 struct SPObjectHandle *SPObjectHandle = SPObjectHandle_a1;

 if(SPObjectHandle->ah_PlayTask)
  {
   SPObjectHandle->ah_TaskStopNext = TRUE;

   for(;SPObjectHandle->ah_TaskRunning;) Delay(5);

   RemTask(SPObjectHandle->ah_PlayTask); Delay(25);

   if(SPObjectHandle->ah_PlayTask->tc_SPLower) FreeVec(SPObjectHandle->ah_PlayTask->tc_SPLower);

   FreeVec(SPObjectHandle->ah_PlayTask);
   SPObjectHandle->ah_PlayTask = N;
  }

 if(SPObjectHandle->ah_SPOHeader)
  {
   FreeVec(SPObjectHandle->ah_SPOHeader);

   if(SPObjectHandle->ah_XpkBuffer) FreeMem(SPObjectHandle->ah_XpkBuffer, SPObjectHandle->ah_XpkBufferSize);

   SPObjectHandle->ah_SPOHeader = N;
   SPObjectHandle->ah_XpkBuffer = N;
  }

 SPO_FreeResources(SPObjectHandle);

 FreeVec(SPObjectHandle);
}

/* *************************************************** */
/* *						     * */
/* * SPO_StopReplay : ...                            * */
/* *						     * */
/* *************************************************** */

void __saveds __asm SPO_StopReplay( register __a1 struct SPObjectHandle *SPObjectHandle_a1)
{
 struct SPObjectHandle *SPObjectHandle = SPObjectHandle_a1;

 return;
}

/* *************************************************** */
/* *						     * */
/* * SPO_FreeResources : Free Memory and more        * */
/* *						     * */
/* *************************************************** */

void __saveds __asm SPO_FreeResources( register __a1 struct SPObjectHandle *SPObjectHandle_a1)
{
 struct SPObjectHandle *SPObjectHandle = SPObjectHandle_a1;

 if(SPObjectHandle)
  {
   if(SPObjectHandle->ah_filehandle_source) Close(SPObjectHandle->ah_filehandle_source);
   if(SPObjectHandle->ah_filehandle_dest)   Close(SPObjectHandle->ah_filehandle_dest);
   if(SPObjectHandle->ah_filehandle_dest2)  Close(SPObjectHandle->ah_filehandle_dest2);
   if(SPObjectHandle->ah_ramhandle)         AIM_FreeMemList(SPObjectHandle->ah_ramhandle);

   SPObjectHandle->ah_filehandle_source = N;
   SPObjectHandle->ah_filehandle_dest   = N;
   SPObjectHandle->ah_filehandle_dest2  = N;
   SPObjectHandle->ah_ramhandle         = N;
  }
}
