/*
**      $VER: SP_SampleListSubs.c 3.3 (4.1.97)
**
**      SPObject sample list management API
**
**      (C) Copyright 1994-97 Andreas R. Kleinert
**      All Rights Reserved.
*/

#include "spobject.h"


 /* SampleList-Support-Functions */

struct SPO_SampleList * __saveds __stdargs SPLI_GetSampleList(void);
void                    __saveds __stdargs SPLI_FreeSampleList(struct SPO_SampleList *SampleList);
ULONG                   __saveds __stdargs SPLI_AddSample(struct SPO_SampleList *slist, APTR buffer, ULONG size, ULONG bits, ULONG sps, ULONG volume);


struct SPO_SampleList * __saveds __stdargs SPLI_GetSampleList(void)
{
 struct SPO_SampleList *SampleList = N;
 struct List           *samelist   = N;

 samelist = (struct List *) AllocVec(sizeof(struct SPO_SampleList), MEMF_CLEAR|MEMF_PUBLIC);
 if(samelist)
  {
   SampleList = (APTR) samelist;

   SampleList->sl_NumEntries = 0;

   samelist->lh_Head     = (struct Node *) &(samelist->lh_Tail);
   samelist->lh_Tail     = N;
   samelist->lh_TailPred = (struct Node *) &(samelist->lh_Head);
   samelist->lh_Type     = NT_UNKNOWN;
  }else return(NULL);

 return(SampleList);
}

void __saveds __stdargs SPLI_FreeSampleList(struct SPO_SampleList *SampleList)
{
 struct SPO_SampleEntry *entry;

 if(SampleList)
  {
   for(entry=(APTR) SampleList->sl_EntryList.lh_Head;(entry)&&(entry!=(APTR) &(SampleList->sl_EntryList.lh_Tail));)
    {
     Remove((APTR) entry);
     FreeVec(entry);
     entry = (APTR) SampleList->sl_EntryList.lh_Head;
    }

   FreeVec(SampleList);
  }
}

ULONG __saveds __stdargs SPLI_AddSample(struct SPO_SampleList *slist, APTR buffer, ULONG size, ULONG bits, ULONG sps, ULONG volume)
{
 struct SPO_SampleEntry *entry;

 entry = (APTR) AllocVec(sizeof(struct SPO_SampleEntry), MEMF_CLEAR|MEMF_PUBLIC);
 if(!entry) return(FALSE);

 slist->sl_NumEntries++;


 entry->se_Version       = 2;

 entry->se_Type          = SE_TYPE_SAMPLE;

 entry->se_SampleBuffer  = buffer;
 entry->se_SampleSize    = size;

 entry->se_SampleBits    = bits;
 entry->se_SamplesPerSec = sps;
 entry->se_Volume        = volume;


 AddTail((APTR)slist, (APTR)entry);

 return(TRUE);
}
