qemu/hw/audio/fmopl.h
<<
>>
Prefs
   1#ifndef FMOPL_H
   2#define FMOPL_H
   3
   4
   5typedef void (*OPL_TIMERHANDLER)(void *param, int channel, double interval_Sec);
   6
   7/* !!!!! here is private section , do not access there member direct !!!!! */
   8
   9/* Saving is necessary for member of the 'R' mark for suspend/resume */
  10/* ---------- OPL one of slot  ---------- */
  11typedef struct fm_opl_slot {
  12        int32_t TL;             /* total level     :TL << 8            */
  13        int32_t TLL;            /* adjusted now TL                     */
  14        uint8_t  KSR;           /* key scale rate  :(shift down bit)   */
  15        int32_t *AR;            /* attack rate     :&AR_TABLE[AR<<2]   */
  16        int32_t *DR;            /* decay rate      :&DR_TALBE[DR<<2]   */
  17        int32_t SL;             /* sustin level    :SL_TALBE[SL]       */
  18        int32_t *RR;            /* release rate    :&DR_TABLE[RR<<2]   */
  19        uint8_t ksl;            /* keyscale level  :(shift down bits)  */
  20        uint8_t ksr;            /* key scale rate  :kcode>>KSR         */
  21        uint32_t mul;           /* multiple        :ML_TABLE[ML]       */
  22        uint32_t Cnt;           /* frequency count :                   */
  23        uint32_t Incr;  /* frequency step  :                   */
  24        /* envelope generator state */
  25        uint8_t eg_typ; /* envelope type flag                  */
  26        uint8_t evm;            /* envelope phase                      */
  27        int32_t evc;            /* envelope counter                    */
  28        int32_t eve;            /* envelope counter end point          */
  29        int32_t evs;            /* envelope counter step               */
  30        int32_t evsa;   /* envelope step for AR :AR[ksr]           */
  31        int32_t evsd;   /* envelope step for DR :DR[ksr]           */
  32        int32_t evsr;   /* envelope step for RR :RR[ksr]           */
  33        /* LFO */
  34        uint8_t ams;            /* ams flag                            */
  35        uint8_t vib;            /* vibrate flag                        */
  36        /* wave selector */
  37        int32_t **wavetable;
  38}OPL_SLOT;
  39
  40/* ---------- OPL one of channel  ---------- */
  41typedef struct fm_opl_channel {
  42        OPL_SLOT SLOT[2];
  43        uint8_t CON;                    /* connection type                     */
  44        uint8_t FB;                     /* feed back       :(shift down bit)   */
  45        int32_t *connect1;      /* slot1 output pointer                */
  46        int32_t *connect2;      /* slot2 output pointer                */
  47        int32_t op1_out[2];     /* slot1 output for selfeedback        */
  48        /* phase generator state */
  49        uint32_t  block_fnum;   /* block+fnum      :                   */
  50        uint8_t kcode;          /* key code        : KeyScaleCode      */
  51        uint32_t  fc;                   /* Freq. Increment base                */
  52        uint32_t  ksl_base;     /* KeyScaleLevel Base step             */
  53        uint8_t keyon;          /* key on/off flag                     */
  54} OPL_CH;
  55
  56/* OPL state */
  57typedef struct fm_opl_f {
  58        int clock;                      /* master clock  (Hz)                */
  59        int rate;                       /* sampling rate (Hz)                */
  60        double freqbase;        /* frequency base                    */
  61        double TimerBase;       /* Timer base time (==sampling time) */
  62        uint8_t address;                /* address register                  */
  63        uint8_t status;         /* status flag                       */
  64        uint8_t statusmask;     /* status mask                       */
  65        uint32_t mode;          /* Reg.08 : CSM , notesel,etc.       */
  66        /* Timer */
  67        int T[2];                       /* timer counter                     */
  68        uint8_t st[2];          /* timer enable                      */
  69        /* FM channel slots */
  70        OPL_CH *P_CH;           /* pointer of CH                     */
  71        int     max_ch;                 /* maximum channel                   */
  72        /* Rhythm sention */
  73        uint8_t rhythm;         /* Rhythm mode , key flag */
  74        /* time tables */
  75        int32_t AR_TABLE[76];   /* attack rate tables  */
  76        int32_t DR_TABLE[76];   /* decay rate tables   */
  77        uint32_t FN_TABLE[1024];  /* fnumber -> increment counter */
  78        /* LFO */
  79        int32_t *ams_table;
  80        int32_t *vib_table;
  81        int32_t amsCnt;
  82        int32_t amsIncr;
  83        int32_t vibCnt;
  84        int32_t vibIncr;
  85        /* wave selector enable flag */
  86        uint8_t wavesel;
  87        /* external event callback handler */
  88        OPL_TIMERHANDLER  TimerHandler;         /* TIMER handler   */
  89    void *TimerParam; /* TIMER parameter */
  90} FM_OPL;
  91
  92/* ---------- Generic interface section ---------- */
  93FM_OPL *OPLCreate(int clock, int rate);
  94void OPLDestroy(FM_OPL *OPL);
  95void OPLSetTimerHandler(FM_OPL *OPL, OPL_TIMERHANDLER TimerHandler,
  96                        void *param);
  97
  98int OPLWrite(FM_OPL *OPL,int a,int v);
  99unsigned char OPLRead(FM_OPL *OPL,int a);
 100int OPLTimerOver(FM_OPL *OPL,int c);
 101
 102void YM3812UpdateOne(FM_OPL *OPL, int16_t *buffer, int length);
 103#endif
 104