⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mikmod_internals.h

📁 这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔者对其中的LIBMAD库做了针对ARM MPU的优化. 并增加了词幕功能.
💻 H
📖 第 1 页 / 共 2 页
字号:
/*	MikMod sound library
	(c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS for
	complete list.

	This library is free software; you can redistribute it and/or modify
	it under the terms of the GNU Library General Public License as
	published by the Free Software Foundation; either version 2 of
	the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU Library General Public License for more details.

	You should have received a copy of the GNU Library General Public
	License along with this library; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
	02111-1307, USA.
*/

/*==============================================================================

  $Id: mikmod_internals.h,v 1.4 2004/02/18 13:29:17 raph Exp $

  MikMod sound library internal definitions

==============================================================================*/

#ifndef _MIKMOD_INTERNALS_H
#define _MIKMOD_INTERNALS_H

#ifdef __cplusplus
extern "C" {
#endif

#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include <stdarg.h>
#if defined(__OS2__)||defined(__EMX__)||defined(WIN32)
#define strcasecmp(s,t) stricmp(s,t)
#endif

#include <mikmod_build.h>

#ifdef WIN32
#pragma warning(disable:4761)
#endif

/*========== More type definitions */

/* SLONGLONG: 64bit, signed */
#if defined (__arch64__) || defined(__alpha)
typedef long		SLONGLONG;
#define NATIVE_64BIT_INT
#elif defined(__WATCOMC__)
typedef __int64		SLONGLONG;
#elif defined(WIN32) && !defined(__MWERKS__)
typedef LONGLONG	SLONGLONG;
#elif macintosh && !TYPE_LONGLONG
#include <Types.h>
typedef SInt64	    SLONGLONG;
#else
typedef long long	SLONGLONG;
#endif

/*========== Error handling */

#define _mm_errno MikMod_errno
#define _mm_critical MikMod_critical
extern MikMod_handler_t _mm_errorhandler;

/*========== Memory allocation */

extern void* _mm_malloc(size_t);
extern void* _mm_calloc(size_t,size_t);
#define _mm_free(p) do { if (p) free(p); p = NULL; } while(0)

/*========== MT stuff */

#ifdef HAVE_PTHREAD
#include <pthread.h>
#define DECLARE_MUTEX(name) \
	extern pthread_mutex_t _mm_mutex_##name
#define MUTEX_LOCK(name)	\
 	pthread_mutex_lock(&_mm_mutex_##name)
#define MUTEX_UNLOCK(name)	\
	pthread_mutex_unlock(&_mm_mutex_##name)
#elif defined(__OS2__)||defined(__EMX__)
#define DECLARE_MUTEX(name)	\
	extern HMTX _mm_mutex_##name
#define MUTEX_LOCK(name)	\
	if(_mm_mutex_##name)	\
		DosRequestMutexSem(_mm_mutex_##name,SEM_INDEFINITE_WAIT)
#define MUTEX_UNLOCK(name)	\
	if(_mm_mutex_##name)	\
		DosReleaseMutexSem(_mm_mutex_##name)
#elif defined(WIN32)
#include <windows.h>
#define DECLARE_MUTEX(name)	\
	extern HANDLE _mm_mutex_##name
#define MUTEX_LOCK(name)	\
	if(_mm_mutex_##name)	\
		WaitForSingleObject(_mm_mutex_##name,INFINITE)
#define MUTEX_UNLOCK(name)	\
	if(_mm_mutex_##name)	\
		ReleaseMutex(_mm_mutex_##name)
#else
#define DECLARE_MUTEX(name)	\
	extern void *_mm_mutex_##name
#define MUTEX_LOCK(name)
#define MUTEX_UNLOCK(name)
#endif

DECLARE_MUTEX(lists);
DECLARE_MUTEX(vars);

/*========== Portable file I/O */

extern MREADER* _mm_new_file_reader(FILE* fp);
extern void _mm_delete_file_reader(MREADER*);

extern MWRITER* _mm_new_file_writer(FILE *fp);
extern void _mm_delete_file_writer(MWRITER*);

extern BOOL _mm_FileExists(CHAR *fname);

#define _mm_write_SBYTE(x,y) y->Put(y,(int)x)
#define _mm_write_UBYTE(x,y) y->Put(y,(int)x)

#define _mm_read_SBYTE(x) (SBYTE)x->Get(x)
#define _mm_read_UBYTE(x) (UBYTE)x->Get(x)

#define _mm_write_SBYTES(x,y,z) z->Write(z,(void *)x,y)
#define _mm_write_UBYTES(x,y,z) z->Write(z,(void *)x,y)
#define _mm_read_SBYTES(x,y,z)  z->Read(z,(void *)x,y)
#define _mm_read_UBYTES(x,y,z)  z->Read(z,(void *)x,y)

#define _mm_fseek(x,y,z) x->Seek(x,y,z)
#define _mm_ftell(x) x->Tell(x)
#define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)

#define _mm_eof(x) x->Eof(x)

extern void _mm_iobase_setcur(MREADER*);
extern void _mm_iobase_revert(void);
extern FILE *_mm_fopen(CHAR*,CHAR*);
extern int	_mm_fclose(FILE *);
extern void _mm_write_string(CHAR*,MWRITER*);
extern int  _mm_read_string (CHAR*,int,MREADER*);

extern SWORD _mm_read_M_SWORD(MREADER*);
extern SWORD _mm_read_I_SWORD(MREADER*);
extern UWORD _mm_read_M_UWORD(MREADER*);
extern UWORD _mm_read_I_UWORD(MREADER*);

extern SLONG _mm_read_M_SLONG(MREADER*);
extern SLONG _mm_read_I_SLONG(MREADER*);
extern ULONG _mm_read_M_ULONG(MREADER*);
extern ULONG _mm_read_I_ULONG(MREADER*);

extern int _mm_read_M_SWORDS(SWORD*,int,MREADER*);
extern int _mm_read_I_SWORDS(SWORD*,int,MREADER*);
extern int _mm_read_M_UWORDS(UWORD*,int,MREADER*);
extern int _mm_read_I_UWORDS(UWORD*,int,MREADER*);

extern int _mm_read_M_SLONGS(SLONG*,int,MREADER*);
extern int _mm_read_I_SLONGS(SLONG*,int,MREADER*);
extern int _mm_read_M_ULONGS(ULONG*,int,MREADER*);
extern int _mm_read_I_ULONGS(ULONG*,int,MREADER*);

extern void _mm_write_M_SWORD(SWORD,MWRITER*);
extern void _mm_write_I_SWORD(SWORD,MWRITER*);
extern void _mm_write_M_UWORD(UWORD,MWRITER*);
extern void _mm_write_I_UWORD(UWORD,MWRITER*);

extern void _mm_write_M_SLONG(SLONG,MWRITER*);
extern void _mm_write_I_SLONG(SLONG,MWRITER*);
extern void _mm_write_M_ULONG(ULONG,MWRITER*);
extern void _mm_write_I_ULONG(ULONG,MWRITER*);

extern void _mm_write_M_SWORDS(SWORD*,int,MWRITER*);
extern void _mm_write_I_SWORDS(SWORD*,int,MWRITER*);
extern void _mm_write_M_UWORDS(UWORD*,int,MWRITER*);
extern void _mm_write_I_UWORDS(UWORD*,int,MWRITER*);

extern void _mm_write_M_SLONGS(SLONG*,int,MWRITER*);
extern void _mm_write_I_SLONGS(SLONG*,int,MWRITER*);
extern void _mm_write_M_ULONGS(ULONG*,int,MWRITER*);
extern void _mm_write_I_ULONGS(ULONG*,int,MWRITER*);

/*========== Samples */

/* This is a handle of sorts attached to any sample registered with
   SL_RegisterSample.  Generally, this only need be used or changed by the
   loaders and drivers of mikmod. */
typedef struct SAMPLOAD {
	struct SAMPLOAD *next;

	ULONG    length;       /* length of sample (in samples!) */
	ULONG    loopstart;    /* repeat position (relative to start, in samples) */
	ULONG    loopend;      /* repeat end */
	UWORD    infmt,outfmt;
	int      scalefactor;
	SAMPLE*  sample;
	MREADER* reader;
} SAMPLOAD;

/*========== Sample and waves loading interface */

extern void      SL_HalveSample(SAMPLOAD*,int);
extern void      SL_Sample8to16(SAMPLOAD*);
extern void      SL_Sample16to8(SAMPLOAD*);
extern void      SL_SampleSigned(SAMPLOAD*);
extern void      SL_SampleUnsigned(SAMPLOAD*);
extern BOOL      SL_LoadSamples(void);
extern SAMPLOAD* SL_RegisterSample(SAMPLE*,int,MREADER*);
extern BOOL      SL_Load(void*,SAMPLOAD*,ULONG);
extern BOOL      SL_Init(SAMPLOAD*);
extern void      SL_Exit(SAMPLOAD*);

/*========== Internal module representation (UniMod) interface */

/* number of notes in an octave */
#define OCTAVE 12

extern void   UniSetRow(UBYTE*);
extern UBYTE  UniGetByte(void);
extern UWORD  UniGetWord(void);
extern UBYTE* UniFindRow(UBYTE*,UWORD);
extern void   UniSkipOpcode(void);
extern void   UniReset(void);
extern void   UniWriteByte(UBYTE);
extern void   UniWriteWord(UWORD);
extern void   UniNewline(void);
extern UBYTE* UniDup(void);
extern BOOL   UniInit(void);
extern void   UniCleanup(void);
extern void   UniEffect(UWORD,UWORD);
#define UniInstrument(x) UniEffect(UNI_INSTRUMENT,x)
#define UniNote(x)       UniEffect(UNI_NOTE,x)
extern void   UniPTEffect(UBYTE,UBYTE);
extern void   UniVolEffect(UWORD,UBYTE);

/*========== Module Commands */

enum {
	/* Simple note */
	UNI_NOTE = 1,
	/* Instrument change */
	UNI_INSTRUMENT,
	/* Protracker effects */
	UNI_PTEFFECT0,     /* arpeggio */
	UNI_PTEFFECT1,     /* porta up */
	UNI_PTEFFECT2,     /* porta down */
	UNI_PTEFFECT3,     /* porta to note */
	UNI_PTEFFECT4,     /* vibrato */
	UNI_PTEFFECT5,     /* dual effect 3+A */
	UNI_PTEFFECT6,     /* dual effect 4+A */
	UNI_PTEFFECT7,     /* tremolo */
	UNI_PTEFFECT8,     /* pan */
	UNI_PTEFFECT9,     /* sample offset */
	UNI_PTEFFECTA,     /* volume slide */
	UNI_PTEFFECTB,     /* pattern jump */
	UNI_PTEFFECTC,     /* set volume */
	UNI_PTEFFECTD,     /* pattern break */
	UNI_PTEFFECTE,     /* extended effects */
	UNI_PTEFFECTF,     /* set speed */
	/* Scream Tracker effects */
	UNI_S3MEFFECTA,    /* set speed */
	UNI_S3MEFFECTD,    /* volume slide */
	UNI_S3MEFFECTE,    /* porta down */
	UNI_S3MEFFECTF,    /* porta up */
	UNI_S3MEFFECTI,    /* tremor */
	UNI_S3MEFFECTQ,    /* retrig */
	UNI_S3MEFFECTR,    /* tremolo */
	UNI_S3MEFFECTT,    /* set tempo */
	UNI_S3MEFFECTU,    /* fine vibrato */
	UNI_KEYOFF,        /* note off */
	/* Fast Tracker effects */
	UNI_KEYFADE,       /* note fade */
	UNI_VOLEFFECTS,    /* volume column effects */
	UNI_XMEFFECT4,     /* vibrato */
	UNI_XMEFFECT6,     /* dual effect 4+A */
	UNI_XMEFFECTA,     /* volume slide */
	UNI_XMEFFECTE1,    /* fine porta up */
	UNI_XMEFFECTE2,    /* fine porta down */
	UNI_XMEFFECTEA,    /* fine volume slide up */
	UNI_XMEFFECTEB,    /* fine volume slide down */
	UNI_XMEFFECTG,     /* set global volume */
	UNI_XMEFFECTH,     /* global volume slide */
	UNI_XMEFFECTL,     /* set envelope position */
	UNI_XMEFFECTP,     /* pan slide */
	UNI_XMEFFECTX1,    /* extra fine porta up */
	UNI_XMEFFECTX2,    /* extra fine porta down */
	/* Impulse Tracker effects */
	UNI_ITEFFECTG,     /* porta to note */
	UNI_ITEFFECTH,     /* vibrato */
	UNI_ITEFFECTI,     /* tremor (xy not incremented) */
	UNI_ITEFFECTM,     /* set channel volume */
	UNI_ITEFFECTN,     /* slide / fineslide channel volume */
	UNI_ITEFFECTP,     /* slide / fineslide channel panning */
	UNI_ITEFFECTT,     /* slide tempo */
	UNI_ITEFFECTU,     /* fine vibrato */
	UNI_ITEFFECTW,     /* slide / fineslide global volume */
	UNI_ITEFFECTY,     /* panbrello */
	UNI_ITEFFECTZ,     /* resonant filters */
	UNI_ITEFFECTS0,
	/* UltraTracker effects */
	UNI_ULTEFFECT9,    /* Sample fine offset */
	/* OctaMED effects */
	UNI_MEDSPEED,
	UNI_MEDEFFECTF1,   /* play note twice */
	UNI_MEDEFFECTF2,   /* delay note */
	UNI_MEDEFFECTF3,   /* play note three times */
	/* Oktalyzer effects */
	UNI_OKTARP,		   /* arpeggio */

	UNI_LAST
};

extern UWORD unioperands[UNI_LAST];

/* IT / S3M Extended SS effects: */
enum {
	SS_GLISSANDO = 1,
	SS_FINETUNE,
	SS_VIBWAVE,
	SS_TREMWAVE,
	SS_PANWAVE,
	SS_FRAMEDELAY,
	SS_S7EFFECTS,
	SS_PANNING,
	SS_SURROUND,
	SS_HIOFFSET,
	SS_PATLOOP,
	SS_NOTECUT,
	SS_NOTEDELAY,
	SS_PATDELAY
};

/* IT Volume column effects */
enum {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -