mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-03 23:47:08 +00:00
230 lines
5.7 KiB
C
230 lines
5.7 KiB
C
///////////////////////////////////////////////////////////////////////////////////
|
|
//-------------------------------------------------------------------------------//
|
|
//-------------------------------------------------------------------------------//
|
|
//-----------H----H--X----X-----CCCCC----22222----0000-----0000------11----------//
|
|
//----------H----H----X-X-----C--------------2---0----0---0----0--1--1-----------//
|
|
//---------HHHHHH-----X------C----------22222---0----0---0----0-----1------------//
|
|
//--------H----H----X--X----C----------2-------0----0---0----0-----1-------------//
|
|
//-------H----H---X-----X---CCCCC-----222222----0000-----0000----1111------------//
|
|
//-------------------------------------------------------------------------------//
|
|
//----------------------------------------------------- http://hxc2001.free.fr --//
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
// File : hxcmod.h
|
|
// Contains: a tiny mod player
|
|
//
|
|
// Written by: Jean François DEL NERO
|
|
//
|
|
// Change History (most recent first):
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __HXCMOD_H
|
|
#define __HXCMOD_H
|
|
|
|
#if defined __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#ifndef MODPLAY_DEF
|
|
#define MODPLAY_DEF
|
|
|
|
// Basic type
|
|
typedef unsigned char muchar;
|
|
typedef unsigned short muint;
|
|
typedef short mint;
|
|
typedef unsigned long mulong;
|
|
|
|
#define NUMMAXCHANNELS 32
|
|
#define MAXNOTES 12*12
|
|
#define SAMPLE_RATE 44100
|
|
//
|
|
// MOD file structures
|
|
//
|
|
|
|
#pragma pack(1)
|
|
|
|
typedef struct {
|
|
muchar name[22];
|
|
muint length;
|
|
muchar finetune;
|
|
muchar volume;
|
|
muint reppnt;
|
|
muint replen;
|
|
} sample;
|
|
|
|
typedef struct {
|
|
muchar sampperiod;
|
|
muchar period;
|
|
muchar sampeffect;
|
|
muchar effect;
|
|
} note;
|
|
|
|
typedef struct {
|
|
muchar title[20];
|
|
sample samples[31];
|
|
muchar length;
|
|
muchar protracker;
|
|
muchar patterntable[128];
|
|
muchar signature[4];
|
|
muchar speed;
|
|
} module;
|
|
|
|
#pragma pack()
|
|
|
|
//
|
|
// HxCMod Internal structures
|
|
//
|
|
typedef struct {
|
|
char * sampdata;
|
|
muint sampnum;
|
|
muint length;
|
|
muint reppnt;
|
|
muint replen;
|
|
mulong samppos;
|
|
muint period;
|
|
muchar volume;
|
|
mulong ticks;
|
|
muchar effect;
|
|
muchar parameffect;
|
|
muint effect_code;
|
|
|
|
|
|
mint decalperiod;
|
|
mint portaspeed;
|
|
mint portaperiod;
|
|
mint vibraperiod;
|
|
mint Arpperiods[3];
|
|
muchar ArpIndex;
|
|
|
|
mint oldk;
|
|
muchar volumeslide;
|
|
|
|
muchar vibraparam;
|
|
muchar vibrapointeur;
|
|
|
|
muchar finetune;
|
|
|
|
muchar cut_param;
|
|
|
|
muint patternloopcnt;
|
|
muint patternloopstartpoint;
|
|
} hxcmod_channel;
|
|
|
|
typedef struct {
|
|
module song;
|
|
char * sampledata[31];
|
|
note * patterndata[128];
|
|
|
|
mulong playrate;
|
|
muint tablepos;
|
|
muint patternpos;
|
|
muint patterndelay;
|
|
muint jump_loop_effect;
|
|
muchar bpm;
|
|
mulong patternticks;
|
|
mulong patterntickse;
|
|
mulong patternticksaim;
|
|
mulong sampleticksconst;
|
|
|
|
mulong samplenb;
|
|
|
|
hxcmod_channel channels[NUMMAXCHANNELS];
|
|
|
|
muint number_of_channels;
|
|
|
|
muint fullperiod[MAXNOTES * 8];
|
|
|
|
muint mod_loaded;
|
|
|
|
mint last_r_sample;
|
|
mint last_l_sample;
|
|
|
|
mint stereo;
|
|
mint stereo_separation;
|
|
mint bits;
|
|
mint filter;
|
|
|
|
} modcontext;
|
|
|
|
//
|
|
// Player states structures
|
|
//
|
|
typedef struct track_state_
|
|
{
|
|
unsigned char instrument_number;
|
|
unsigned short cur_period;
|
|
unsigned char cur_volume;
|
|
unsigned short cur_effect;
|
|
unsigned short cur_parameffect;
|
|
}track_state;
|
|
|
|
typedef struct tracker_state_
|
|
{
|
|
int number_of_tracks;
|
|
int bpm;
|
|
int speed;
|
|
int cur_pattern;
|
|
int cur_pattern_pos;
|
|
int cur_pattern_table_pos;
|
|
unsigned int buf_index;
|
|
track_state tracks[32];
|
|
}tracker_state;
|
|
|
|
typedef struct tracker_state_instrument_
|
|
{
|
|
char name[22];
|
|
int active;
|
|
}tracker_state_instrument;
|
|
|
|
typedef struct tracker_buffer_state_
|
|
{
|
|
int nb_max_of_state;
|
|
int nb_of_state;
|
|
int cur_rd_index;
|
|
int sample_step;
|
|
char name[64];
|
|
tracker_state_instrument instruments[31];
|
|
tracker_state * track_state_buf;
|
|
}tracker_buffer_state;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
// HxCMOD Core API:
|
|
// -------------------------------------------
|
|
// int hxcmod_init(modcontext * modctx)
|
|
//
|
|
// - Initialize the modcontext buffer. Must be called before doing anything else.
|
|
// Return 1 if success. 0 in case of error.
|
|
// -------------------------------------------
|
|
// int hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size )
|
|
//
|
|
// - "Load" a MOD from memory (from "mod_data" with size "mod_data_size").
|
|
// Return 1 if success. 0 in case of error.
|
|
// -------------------------------------------
|
|
// void hxcmod_fillbuffer( modcontext * modctx, unsigned short * outbuffer, unsigned long nbsample, tracker_buffer_state * trkbuf )
|
|
//
|
|
// - Generate and return the next samples chunk to outbuffer.
|
|
// nbsample specify the number of stereo 16bits samples you want.
|
|
// The output format is signed 44100Hz 16-bit Stereo PCM samples.
|
|
// The output buffer size in byte must be equal to ( nbsample * 2 * 2 ).
|
|
// The optional trkbuf parameter can be used to get detailed status of the player. Put NULL/0 is unused.
|
|
// -------------------------------------------
|
|
// void hxcmod_unload( modcontext * modctx )
|
|
// - "Unload" / clear the player status.
|
|
// -------------------------------------------
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
int hxcmod_init( modcontext * modctx );
|
|
int hxcmod_setcfg( modcontext * modctx, int samplerate, int bits, int stereo, int stereo_separation, int filter);
|
|
int hxcmod_load( modcontext * modctx, void * mod_data, int mod_data_size );
|
|
void hxcmod_fillbuffer( modcontext * modctx, unsigned short * outbuffer, unsigned long nbsample, tracker_buffer_state * trkbuf );
|
|
void hxcmod_unload( modcontext * modctx );
|
|
|
|
#endif
|
|
|
|
|
|
#if defined __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // __HXCMOD_H
|