home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************
- $CRT 18 Dec 1996 : hb
-
- $AUT Holger Burkarth
- $DAT >>Dt8svx.c<< 29 Jan 1997 13:37:35 - (C) ProDAD
- *******************************************************************/
-
- //##ex mcpp:cppc -gs -o pos:pos/Libs/8svxdt.library p:pLib/LibCode.o p:/pOS_RKRM/pAudio/Dt8svx.c -l pOSStub -l pOS -l CPPList
-
- /***********************************************************
- pOS programing example - Copyright (C) 1995-97 proDAD
-
- This code was written as an easy to understand example,
- how to program pOS features. It is provided 'as-is',
- without any express or implied warranty.
-
- Permission is hereby granted to use, copy and modify
- this source code for any purpose, without fee, subject
- to the following conditions:
-
- (1) This notice may not be removed or altered from any
- source distribution.
-
- (2) Altered source versions must be plainly marked as
- such, and must not be misrepresented as being
- the original source code.
-
- (3) If only executable code is distributed, then the
- accompanying documentation have to state that
- "this software is based in part on examples of
- the pOS developer packet".
-
- (4) Permission for use of this code is granted only
- if the user accepts full responsibility for any
- undesirable consequences. proDAD accept NO LIABILITY
- for damages of any kind.
-
- ©proDAD
- ***********************************************************/
-
- /*\
- *** Example:
- ***
- \*/
-
-
- #define __COMPUTER_AMIGA 1
- #define NOMYDEBUG
-
- #include "p:pExec/Library.h"
- #include "p:pExec/Diagnos.h"
- #include "p:pExec/TstTags.h"
- #include "p:pDOS/ArgTags.h"
- #include "p:pDOS/DosSig.h"
- #include "p:pDOS/DosErrors.h"
- #include "p:pDOS/Segment.h"
- #include "p:pDOS/Files.h"
- #include "p:pAudio/Audio.h"
- #include "p:pAudio/AudioTags.h"
- #include "p:pAudio/InfoData.h"
- #include "p:pAudio/StdAMap.h"
- #include "p:pDtType/DtBase.h"
- #include "p:pDtType/DtTags.h"
- #include "p:pDtType/Sample.h"
- #include "p:pDtType/DClass.h"
-
- #include "p:proto/pLibExt.h"
- #include "p:proto/pExec2.h"
- #include "p:proto/pDOS2.h"
- #include "p:proto/pAudio2.h"
- #include "p:proto/pList.h"
-
- #ifdef _____ME_____
- #include "grund/inc_string.h"
- #include "grund/inc_limits.h"
- #else
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include <string.h>
- #include <limits.h>
- #ifdef __cplusplus
- }
- #endif
- #endif
-
-
-
- #ifdef __cplusplus
- extern "C"
- {
- void InitModules();
- void CleanupModules();
- }
- #endif
-
-
- #define MAXOCT 4
-
- struct Voice8Header
- {
- ULONG oneShotHiSamples;
- ULONG repeatHiSamples;
- ULONG samplesPerHiCycle;
- UWORD samplesPerSec;
- UBYTE ctOctave;
- UBYTE sCompression;
- ULONG volume;
- };
-
- struct EightSVXInfo
- {
- struct Voice8Header Vhdr;
- SBYTE *osamps[MAXOCT];
- ULONG osizes[MAXOCT];
- SBYTE *rsamps[MAXOCT];
- ULONG rsizes[MAXOCT];
- ULONG spcycs[MAXOCT];
- };
-
-
-
-
- struct pOSp_DtLib
- {
- pOS_Library dl_Lib;
-
- pOS_NClass *dl_DtClass;
- };
-
-
- struct pOSp_DtData
- {
- Voice8Header VH;
- UBYTE *Body;
- size_t BodySize;
- };
-
-
- #ifndef MAKE_ID
- #define MAKE_ID(a,b,c,d) ( (LONG)(a)<<24L | (LONG)(b)<<16L | (c)<<8 | (d) )
- #endif
-
-
-
- struct pOS_ExecBase* gb_ExecBase;
- struct pOS_ExecLibFunction* gb_ExecLib;
- struct pOS_DosBase *gb_DosBase;
- struct pOS_UtilityBase *gb_UtilityBase;
-
- extern ULONG *FuncTable[];
- const CHAR LibraryName[] ="8svxdt.library";
- const CHAR LibraryIDName[]="8svxdt.library 1.0 ("__DATE2__") (Copyright proDAD, Created by Holger Burkarth)";
-
- const pOS_TagItem LibraryDescribe[]=
- {
- EXTSTTAG_MainOSID, pOS_MAINOSID,
- TAG_END
- };
-
-
- BOOL pLibMain(_R_LB pOS_ExecBase*,_R_A0 pOSp_DtLib*);
- ULONG DtDispatcher(_R_LB pOS_ExecBase*,_R_A0 const pOS_Class*,_R_A1 pOSp_DtData*,_R_A2 pOS_DtTypeMethod*);
- VOID DtDispose(pOSp_DtData* obj);
-
-
- pOS_ResidentLibInit InitTable=
- {
- sizeof(pOSp_DtLib),
- FuncTable,
- NULL,
- (BOOL(*)(_R_LB pOS_ExecBase*,_R_A0 pOS_Library*))pLibMain
- };
-
-
- /*----------------------------------
- Wird in dieser Library nicht benötigt.
- -----------------------------------*/
- BOOL Open_func(_R_LB pOSp_DtLib*) { return(1); }
- VOID Close_func(_R_LB pOSp_DtLib*) {}
- ULONG Reserved_func(_R_LB pOSp_DtLib*) { return(0); }
-
-
-
- /*----------------------------------
- -----------------------------------*/
- pOS_SegmentLst* Expunge_func(_R_LB pOSp_DtLib* lib)
- {
- if(lib->dl_Lib.lib_OpenCnt==0) {
- pOS_SegmentLst* Seg=lib->dl_Lib.lib_Segm;
-
- pOS_ListRemove(&lib->dl_Lib.lib_Node);
-
- if(lib->dl_DtClass) pOS_DeleteClass(lib->dl_DtClass);
-
- _pOS_FreeLibraryMem2(&lib->dl_Lib); /* Lib-Memory freigeben */
- pOS_CloseLibrary((pOS_Library*)gb_DosBase);
- pOS_CloseLibrary((pOS_Library*)gb_UtilityBase);
- #ifdef __cplusplus
- CleanupModules();
- #endif
- return(Seg);
- }
- return(0);
- }
-
-
- ULONG *FuncTable[]=
- {
- (ULONG*)Open_func,
- (ULONG*)Close_func,
- (ULONG*)Expunge_func,
- // ------------
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- // ------------
-
- (ULONG*)ULONG_MAX
- };
-
-
-
- /*----------------------------------
- -----------------------------------*/
- BOOL pLibMain(_R_LB pOS_ExecBase* exec,_R_A0 pOSp_DtLib* lib)
- {
- #ifdef __pOS_EXECPRECODE
- extern struct pOS_ExecBase* gb_ExecBase;
- extern struct pOS_ExecLibFunction* gb_ExecLib;
-
- gb_ExecBase=(struct pOS_ExecBase*)exec;
- gb_ExecLib=*((struct pOS_ExecLibFunction**)lib->dl_Lib.lib_Segm->sel_Seg.seg_Reserved2);
- gb_DosBase =(pOS_DosBase*)pOS_OpenLibrary("pdos.library",0);
- gb_UtilityBase=(pOS_UtilityBase*)pOS_OpenLibrary("putility.library",0);
- #else
- #error hier fehlt etwas
- #endif
-
- #ifdef __cplusplus
- InitModules();
- #endif
-
- strcmp("",""); // Linker Dummy
-
- {
- lib->dl_DtClass =
- pOS_CreateClass("DtType/8svx.class",pOS_DTNAME_SAMPLE,NULL,
- (APTR)DtDispatcher,sizeof(pOSp_DtData),0);
- }
-
- if(lib->dl_DtClass==NULL) {
- pOS_CloseLibrary((pOS_Library*)gb_DosBase);
- pOS_CloseLibrary((pOS_Library*)gb_UtilityBase);
- #ifdef __cplusplus
- CleanupModules();
- #endif
- }
- return(lib->dl_DtClass!=NULL);
- }
-
- /*******************************************************************************/
- typedef ULONG(*AFunc)(pOSp_DtData*,const pOS_DClassInfo*,
- const pOS_TagItem*,pOS_FileHandle*,APTR);
-
-
- /*----------------------------------------
- ---------------------------------------*/
- VOID D1Unpack(const SBYTE *source,size_t n,SBYTE *dest)
- {
- static const SBYTE codeToDelta[16] = {-34,-21,-13,-8,-5,-3,-2,-1,0,1,2,3,5,8,13,21};
- UBYTE d;
- SBYTE x;
-
- source++; // Pad-Byte
- x=*source++;
- n=(n-2)/2;
-
- for(; n>0; --n) {
- d = *source++;
-
- x += codeToDelta[d>>4];
- *dest++ = x;
-
- x += codeToDelta[d & 0x0f];
- *dest++ = x;
- }
- }
-
-
- /*----------------------------------
- -----------------------------------*/
- ULONG DtStdFunc(pOSp_DtData *obj,const pOS_DClassInfo* dci,const pOS_TagItem* tags,
- AFunc func)
- {
- ULONG ret=0;
-
- switch(dci->dci_Flags & DCLINFOF_HandleMask) {
-
- case DCLINFOF_FileName:
- {
- pOS_FileHandle *FH;
-
- if(FH=pOS_OpenFile(NULL,dci->dci_U.dci_FileName,FILEHDMOD_Read)) {
- ret=(*func)(obj,dci,tags,FH,dci->dci_Format ? dci->dci_Data:NULL);
- pOS_CloseFile(FH);
- }
- }
- break;
-
- case DCLINFOF_FH:
- ret=(*func)(obj,dci,tags,dci->dci_U.dci_FH,dci->dci_Format ? dci->dci_Data:NULL);
- break;
- }
-
- return(ret);
- }
-
-
- /*----------------------------------
- -----------------------------------*/
- size_t GetSampleSize(const pOSp_DtData* obj)
- {
- BOOL M1=(obj->VH.repeatHiSamples==0);
- return( M1 ? obj->VH.oneShotHiSamples : obj->VH.repeatHiSamples );
- }
-
- /*----------------------------------
- -----------------------------------*/
- VOID GetInfoData(const pOSp_DtData* obj,pOS_DtTypeSample* data)
- {
- data->dtsmp_ID[0]='8';
- data->dtsmp_ID[1]='S';
- data->dtsmp_ID[2]='V';
- data->dtsmp_ID[3]='X';
- data->dtsmp_ID[4]='\0';
-
- data->dtsmp_AudioMapType=AUDIOMAPTYP_Std8Bit;
- data->dtsmp_Compression = obj->VH.sCompression;
- data->dtsmp_Volume = (obj->VH.volume & 0x3f)<<10;
- data->dtsmp_Cycles = obj->VH.samplesPerHiCycle;
- data->dtsmp_Frames = 1;
- data->dtsmp_Frequence = obj->VH.samplesPerSec;
- data->dtsmp_Length = GetSampleSize(obj);
-
- if(data->dtsmp_Volume==0) data->dtsmp_Volume=0xffff;
- if(data->dtsmp_Cycles==0) data->dtsmp_Cycles=1;
- }
-
-
-
- /*----------------------------------
- -----------------------------------*/
- ULONG DtObtainFile_func(pOSp_DtData* obj,const pOS_DClassInfo* dci,
- const pOS_TagItem *tags,pOS_FileHandle* fh,APTR data)
- {
- UBYTE Buffer[12];
- ULONG Res=DCLMTHR_None;
-
- pOS_ReadFile(fh,Buffer,12);
- if( *((ULONG*)&Buffer[0]) == MAKE_ID('F','O','R','M')
- && *((ULONG*)&Buffer[8]) == MAKE_ID('8','S','V','X'))
- {
- pOS_ReadFile(fh,Buffer,8);
- if( *((ULONG*)&Buffer[0]) == MAKE_ID('V','H','D','R') ) {
- if(sizeof(obj->VH)==pOS_ReadFile(fh,&obj->VH,sizeof(obj->VH))) {
- if(data) GetInfoData(obj,(pOS_DtTypeSample*)data);
- Res=DCLMTHR_Match;
- }
- }
- }
- return(Res);
- }
-
-
- /*----------------------------------
- -----------------------------------*/
- ULONG DtLoadFile_func(pOSp_DtData* obj,const pOS_DClassInfo* dci,
- const pOS_TagItem *tags,pOS_FileHandle* fh,APTR data)
- {
- UBYTE Buffer[8];
- ULONG Res=DCLMTHR_None;
-
- DtDispose(obj);
-
- Res=DtObtainFile_func(obj,dci,tags,fh,data);
- if(Res & DCLMTHR_Match) {
- UWORD Anz;
-
- for(Anz=16 ;Anz>0; --Anz) {
- if(8 != pOS_ReadFile(fh,Buffer,8) ) break;
-
- if( *((ULONG*)&Buffer[0]) == MAKE_ID('B','O','D','Y') ) {
- obj->BodySize=*((ULONG*)&Buffer[4]);
- if(obj->BodySize!=0) {
- obj->Body=(UBYTE*)pOS_AllocMem(obj->BodySize,MEMF_PUBLIC|MEMF_VMEM);
- if(obj->Body) {
- pOS_ReadFile(fh,obj->Body,obj->BodySize);
- Res |= DCLMTHR_Ok;
- }
- }
- break;
- }
- else pOS_SeekFile(fh,*((ULONG*)&Buffer[4]),FILEHDSEK_Current);
- }
- }
- return(Res);
- }
-
-
- /*----------------------------------
- -----------------------------------*/
- ULONG DtRead(const pOSp_DtData* obj,const pOS_DClassInfo* dci,
- const pOS_TagItem *tags,pOS_DtTypeSampleFrame* fra)
- {
- ULONG Res=0;
-
- if(obj->Body) {
- pOS_Std8AudioMap *const Map=(pOS_Std8AudioMap*)fra->dtsmpf_AudioMap;
- size_t Len=GetSampleSize(obj);
- if(Map
- && Map->bam_Audio.am_Type==AUDIOMAPTYP_Std8Bit
- && (fra->dtsmpf_Length==0 || fra->dtsmpf_Length==Len) )
- {
- if(Len>Map->bam_Length) Len=Map->bam_Length;
- if(obj->VH.sCompression==0) {
- memcpy(Map->bam_Sample,obj->Body,Len);
- Res=DCLMTHR_Ok;
- }
- else if(obj->VH.sCompression==1) {
- D1Unpack(obj->Body,Len,Map->bam_Sample);
- Res=DCLMTHR_Ok;
- }
- }
- else Res=DCLMTHR_Warn;
- }
- return(Res);
- }
-
-
-
-
- /*----------------------------------
- -----------------------------------*/
- VOID DtDispose(pOSp_DtData* obj)
- {
- if(obj->Body) {
- pOS_FreeMem(obj->Body,obj->BodySize);
- obj->Body=NULL;
- }
- }
-
-
- /*----------------------------------
- -----------------------------------*/
- ULONG DtDispatcher(_R_LB pOS_ExecBase* exec,_R_A0 const pOS_Class* cl,
- _R_A1 pOSp_DtData *obj,_R_A2 pOS_DtTypeMethod* mth)
- {
- const pOS_DClassInfo* DC;
- ULONG ret=0;
-
- switch(mth->dtth_Method) {
- // -----
- case DCLMTH_New:
- break;
-
- case DCLMTH_XObtain:
- DC=mth->dtth_U.dtth_Obtain.dtob_Info;
- if( (DC->dci_Flags & DCLINFOF_HandleMask)!=DCLINFOF_None) {
- if(DC->dci_Format==NULL || stricmp(DC->dci_Format,pOS_DTFORM_SAMPLE)==0) {
- ret=DtStdFunc(obj,DC,mth->dtth_U.dtth_Obtain.dtob_Tags,DtObtainFile_func);
- }
- }
- else if(obj->Body!=NULL && DC->dci_Data) {
- GetInfoData(obj,(pOS_DtTypeSample*)DC->dci_Data);
- ret=DCLMTHR_Ok | DCLMTHR_Match;
- }
- break;
-
- case DCLMTH_XLoad:
- DC=mth->dtth_U.dtth_Load.dtld_Info;
- if(stricmp(DC->dci_Format,pOS_DTFORM_SAMPLE)==0) {
- ret=DtStdFunc(obj,DC,mth->dtth_U.dtth_Load.dtld_Tags,DtLoadFile_func);
- }
- else ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
- break;
-
- case DCLMTH_XRead:
- DC=mth->dtth_U.dtth_Load.dtld_Info;
- ret=DtRead(obj,DC,mth->dtth_U.dtth_Read.dtrd_Tags,
- (pOS_DtTypeSampleFrame*)mth->dtth_U.dtth_Read.dtrd_Data);
- break;
-
- case DCLMTH_Dispose:
- DtDispose(obj);
- ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
- break;
-
- default: ret=pOS_DoAbsMethodA(cl,obj,(pOS_Method*)mth);
- }
-
- return(ret);
- }
-
-