home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magazyn Amiga Shareware Floppies
/
ma58.dms
/
ma58.adf
/
superplay-lib_DEV
/
Programmers
/
Example_SPObjects
/
SPO
/
SP_WriteSubs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-27
|
6KB
|
168 lines
/* SP_WriteSubs.c
- Functions for Writing of SPO-Files
(c) 1990-94 by Andreas R. Kleinert
Last changes : 21.07.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);
ULONG __saveds __stdargs SPLI_SaveSample(struct SPObjectHandle *SPObjectHandle,
UBYTE *destname,
UBYTE *buffer, ULONG buffersize,
ULONG samplespersec, ULONG volume,
ULONG samplebits);
/* *************************************************** */
/* * * */
/* * 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);
ULONG SPO2_GetSampleList( APTR handle, struct SPO_SampleList **samplelist);
#pragma libcall SPObjectBase2 SPO2_GetSampleBuffer 84 ba903
#pragma libcall SPObjectBase2 SPO2_GetSampleInfo 8a 1ba904
#pragma libcall SPObjectBase2 SPO2_GetSampleList 90 a902
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;
struct SPObjectBase *SPObjectBase2 = SPO_SourceBase;
struct SPO_SampleList *SampleList = N;
struct SPO_SampleEntry *entry;
ULONG count = N;
char filename [256];
UBYTE name [256];
if(!SPObjectHandle) return(SPERR_NO_HANDLE);
if(SPObjectHandle->ah_Medium != SPO_MEDIUM_DISK) return(SPERR_ACTION_NOT_SUPPORTED);
if(strlen(SPObjectHandle->ah_WriteName) > 4)
{
if(!stricmp(&SPObjectHandle->ah_WriteName[strlen(SPObjectHandle->ah_WriteName)-4], ".spo"))
{
strcpy(filename, SPObjectHandle->ah_WriteName);
filename[strlen(filename)-4] = (char) 0;
}else strcpy(filename, SPObjectHandle->ah_WriteName);
}else strcpy(filename, SPObjectHandle->ah_WriteName);
if(!SPObjectHandle->ah_SaveSampleList)
{
if(!SPO_SourceBase) return(SPERR_ILLEGAL_ACCESS);
if(!source_handle) return(SPERR_NO_HANDLE);
if(LibVer(SPO_SourceBase) < 2)
{
UBYTE *buffer;
ULONG buffersize, spsec, volume;
retval = SPO2_GetSampleBuffer(source_handle, &buffer, &buffersize);
if(!retval) retval = SPO2_GetSampleInfo(source_handle, &spsec, &volume, N);
if(!retval) retval = SPLI_SaveSample(SPObjectHandle,
filename,
buffer,
buffersize,
spsec,
volume,
8);
return(retval);
} /* ELSE : */
retval = SPO2_GetSampleList(source_handle, &SampleList);
if(retval) return(retval);
}else SampleList = SPObjectHandle->ah_SaveSampleList;
if(!SampleList) return(SPERR_ILLEGAL_ACCESS);
SPObjectHandle->ah_SPOHeader = (struct SPOHeader *) AllocVec(sizeof(struct SPOHeader), (MEMF_CLEAR|MEMF_PUBLIC));
if(!SPObjectHandle->ah_SPOHeader) return(SPERR_NO_MEMORY);
for(entry=(APTR) SampleList->sl_EntryList.lh_Head;(entry)&&(entry!=(APTR) &(SampleList->sl_EntryList.lh_Tail));)
{
if(entry->se_Type == SE_TYPE_SAMPLE)
{
SPO_FreeResources(SPObjectHandle);
strcpy(name, filename);
if(count++ > 0) sprintf(&name[strlen(name)], "_%ld", count);
retval = SPLI_SaveSample(SPObjectHandle,
name,
entry->se_SampleBuffer,
entry->se_SampleSize,
entry->se_SamplesPerSec,
entry->se_Volume,
entry->se_SampleBits);
if(retval) break;
}
entry = (APTR) entry->se_Node.ln_Succ;
}
return(retval);
}
ULONG __saveds __stdargs SPLI_SaveSample(struct SPObjectHandle *SPObjectHandle,
UBYTE *destname,
UBYTE *buffer, ULONG buffersize,
ULONG samplespersec, ULONG volume,
ULONG samplebits)
{
ULONG retval = SPERR_NO_ERROR;
char destname_spo [256];
strcpy(destname_spo, destname);
strcat(destname_spo, ".spo");
SPObjectHandle->ah_filehandle_dest = Open(destname_spo, MODE_NEWFILE);
if(!SPObjectHandle->ah_filehandle_dest) return(SPERR_NO_FILE);
SPObjectHandle->ah_filehandle_dest2 = Open(destname, MODE_NEWFILE);
if(!SPObjectHandle->ah_filehandle_dest2) return(SPERR_NO_FILE);
SPObjectHandle->ah_ramhandle = AIM_GetMemList();
if(!SPObjectHandle->ah_ramhandle) return(SPERR_NO_MEMORY);
strcpy(SPObjectHandle->ah_SPOHeader->spo_ID, SPO_ID);
SPObjectHandle->ah_SPOHeader->spo_SampleBits = (UBYTE) samplebits;
SPObjectHandle->ah_SPOHeader->spo_StereoFlag = (UBYTE) FALSE;
SPObjectHandle->ah_SPOHeader->spo_Channels = (UBYTE) 15;
SPObjectHandle->ah_SPOHeader->spo_Frequency = (ULONG) samplespersec;
SPObjectHandle->ah_SPOHeader->spo_Volume = (ULONG) volume;
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);
}