
 /* SP_WriteSubs.c
    - Functions for Writing of SPO-Files
    (c) 1990-94 by Andreas R. Kleinert
    Last changes : 30.03.1994
 */

#include "spobject.h"


 /* PUBLIC functions */

ULONG __saveds __asm SPO_Write( register __a1 struct SPObjectHandle *SPObjectHandle_a1,
                                register __a2 struct SPObjectBase   *SPO_SourceBase,
                                register __a3 struct SPObjectHandle *source_handle);


/* *************************************************** */
/* *						     * */
/* * SPO_Write : ...                                 * */
/* *						     * */
/* *************************************************** */

/* Use these because of unwished interferences because of same-named
   functions inside this library */
ULONG SPO2_GetSampleBuffer(  APTR handle, UBYTE **buffer, ULONG *buffersize);
ULONG SPO2_GetSampleInfo(    APTR handle, ULONG *samplesPerSec, ULONG *volume, APTR future);


#pragma libcall SPObjectBase2 SPO2_GetSampleBuffer  84 ba903
#pragma libcall SPObjectBase2 SPO2_GetSampleInfo    8a 1ba904

ULONG __saveds __asm SPO_Write( register __a1 struct SPObjectHandle *SPObjectHandle_a1,
                                register __a2 struct SPObjectBase   *SPO_SourceBase,
                                register __a3 struct SPObjectHandle *source_handle)
{
 struct SPObjectHandle *SPObjectHandle = SPObjectHandle_a1;
 ULONG retval = SPERR_NO_ERROR;
 UBYTE *buffer;
 ULONG buffersize, spsec, volume;
 struct SPObjectBase *SPObjectBase2 = SPO_SourceBase;

 char filename [256], filename_spo [256];

 if(!SPObjectHandle) return(SPERR_NO_HANDLE);
 if(!SPO_SourceBase) return(SPERR_ILLEGAL_ACCESS);
 if(!source_handle)  return(SPERR_NO_HANDLE);
 if(SPObjectHandle->ah_Medium != SPO_MEDIUM_DISK) return(SPERR_ACTION_NOT_SUPPORTED);

             retval = SPO2_GetSampleBuffer(source_handle, &buffer, &buffersize);
 if(!retval) retval = SPO2_GetSampleInfo(source_handle, &spsec, &volume, N);

 if(retval) return(retval);

 SPObjectHandle->ah_ramhandle = AIM_GetMemList();
 if(!SPObjectHandle->ah_ramhandle) return(SPERR_NO_MEMORY);

 if(strlen(SPObjectHandle->ah_WriteName) > 4)
  {
   if(!stricmp(&SPObjectHandle->ah_WriteName[strlen(SPObjectHandle->ah_WriteName)-4], ".spo"))
    {
     strcpy(filename_spo, SPObjectHandle->ah_WriteName);
     strcpy(filename,     SPObjectHandle->ah_WriteName);
     filename[strlen(filename)-4] = (char) 0;
    }else
    {
     strcpy(filename,     SPObjectHandle->ah_WriteName);
     strcpy(filename_spo, SPObjectHandle->ah_WriteName);
     strcat(filename_spo, ".spo");
    }
  }else
  {
   strcpy(filename_spo, SPObjectHandle->ah_WriteName);
   strcat(filename_spo, ".spo");
   strcpy(filename,     SPObjectHandle->ah_WriteName);
  }

 SPObjectHandle->ah_filehandle_dest = Open(filename_spo, MODE_NEWFILE);
 if(!SPObjectHandle->ah_filehandle_dest) return(SPERR_NO_FILE);

 SPObjectHandle->ah_filehandle_dest2 = Open(filename, MODE_NEWFILE);
 if(!SPObjectHandle->ah_filehandle_dest2) return(SPERR_NO_FILE);

 SPObjectHandle->ah_SPOHeader = (struct SPOHeader *) AllocVec(sizeof(struct SPOHeader), (MEMF_CLEAR|MEMF_PUBLIC));
 if(!SPObjectHandle->ah_SPOHeader) return(SPERR_NO_MEMORY);

 strcpy(SPObjectHandle->ah_SPOHeader->spo_ID, SPO_ID);

 SPObjectHandle->ah_SPOHeader->spo_SampleBits = (UBYTE) 8;
 SPObjectHandle->ah_SPOHeader->spo_StereoFlag = (UBYTE) FALSE;

 SPObjectHandle->ah_SPOHeader->spo_Channels   = (UBYTE) 15;
 SPObjectHandle->ah_SPOHeader->spo_Frequency  = (ULONG) spsec;
 SPObjectHandle->ah_SPOHeader->spo_Volume     = (ULONG) 64;

 SPObjectHandle->ah_SPOHeader->spo_SampleLength = buffersize;

 Write(SPObjectHandle->ah_filehandle_dest,  SPObjectHandle->ah_SPOHeader, SPOHEADER_SIZE);
 Write(SPObjectHandle->ah_filehandle_dest2,                       buffer,     buffersize);

 return(retval);
}
