
 /* SP_InfoSubs.c
    - Functions for SPO-Support -
    (c) 1994-96 by Andreas R. Kleinert
    Last changes : 08.08.1996
 */

#include "spobject.h"


 /* PUBLIC functions (high level) */

ULONG __saveds __asm SPO_FileInfoRequest( register __a1 struct SPObjectHandle *SPObjectHandle_a1, register __a2 struct Window *window, register __a3 ULONG future);
ULONG __saveds __asm SPO_CheckFileType(register __a1 BPTR handle, register __a2 UBYTE *filename, register __a3 APTR future);


/* *************************************************** */
/* *                                                 * */
/* * SPO_FileInfoRequest : Display File Information  * */
/* *                                                 * */
/* *************************************************** */

ULONG __saveds __asm SPO_FileInfoRequest( register __a1 struct SPObjectHandle *SPObjectHandle_a1, register __a2 struct Window *window, register __a3 ULONG future)
{
 struct SPObjectHandle *SPObjectHandle = SPObjectHandle_a1;

 ULONG retval = SPERR_NO_ERROR;
 char buffer [1024], hbuf[80];
 ULONG idcmp = N, noinfo = TRUE;
 struct EasyStruct *estr;
 struct Window     *disp_win = window;

 if(!SPObjectHandle) return(SPERR_NO_HANDLE);

 buffer[0] = (char) 0;

 if(SPObjectHandle->ah_SPOHeader)
  {
   noinfo = FALSE;

   strcat(buffer,   "\n File Information"
                  "\n\n File Type : SPO Sample");

   strcat(buffer, "\n");

   sprintf(hbuf, "\n Length      : %ld Bytes", (ULONG) SPObjectHandle->ah_SPOHeader->spo_SampleLength);
   strcat(buffer, hbuf);

   sprintf(hbuf, "\n Frequency   : %ld Hz",    (ULONG) SPObjectHandle->ah_SPOHeader->spo_Frequency);
   strcat(buffer, hbuf);

   strcat(buffer, "\n");

  }else retval = SPERR_NO_HANDLE;

 if(!retval)
  {
   if(noinfo)
    {
     strcat(buffer,   "\n File Information"
                    "\n\n No information available\n");
    }

   estr = AllocVec(sizeof(struct EasyStruct), MEMF_CLEAR);
   if(estr)
    {
     estr->es_StructSize   = sizeof(struct EasyStruct);
     estr->es_Flags        = N;
     estr->es_Title        = "SuperPlay InfoRequester";
     estr->es_TextFormat   = buffer;
     estr->es_GadgetFormat = "Confirm";

     if(!disp_win) disp_win = SPObjectHandle->ah_ReqIOWindow;

     EasyRequestArgs(disp_win, estr, &idcmp, N);
     FreeVec(estr);
    }
  }

 return(retval);
}

/* *************************************************** */
/* *                                                 * */
/* * SPLI_CheckFileType : ...                        * */
/* *                                                 * */
/* *************************************************** */

ULONG __saveds __asm SPO_CheckFileType(register __a1 BPTR handle_a1, register __a2 UBYTE *filename, register __a3 struct SPOCheckFile *spo_check)
{
 BPTR handle = handle_a1;
 BPTR handle2;
 ULONG retval = FALSE;
 UBYTE SPO_id[256];
 char spo_name [256];
 ULONG medium = SPO_MEDIUM_DISK;

 if(spo_check) medium = spo_check->spc_Medium;

 if(medium == SPO_MEDIUM_DISK && handle)
  {
   Seek(handle, N, OFFSET_BEGINNING);
   Read(handle, &SPO_id[0], 256);
   Seek(handle, N, OFFSET_BEGINNING);

   if(!strncmp(SPO_id, SPO_ID, strlen(SPO_ID))) retval = TRUE;

   if(!retval && filename)
    {
     strcpy(spo_name, filename);
     strcat(spo_name, ".spo");

     handle2 = Open(spo_name, MODE_OLDFILE);
     if(handle2)
      {
       Read(handle2, &SPO_id[0], 256);

       if(!strncmp(SPO_id, SPO_ID, strlen(SPO_ID))) retval = TRUE;

       Close(handle2);
      }
    }
  }

 return(retval);
}

extern void Fmt(void); /* Assembler-Routine for RawDoFmt */

void __saveds __stdargs SPLI_SPrintf(APTR buffer, char *formatstring, ...)
{
 RawDoFmt((APTR) formatstring, (APTR) (((ULONG *)&formatstring)+1), (APTR) &Fmt, (APTR) buffer);
}
