audio: remove UINT32
[qemu/ar7.git] / hw / audio / fmopl.h
blobb52f0392cb1006ca3190b80230de636bea04d69d
1 #ifndef FMOPL_H
2 #define FMOPL_H
4 #include <stdint.h>
6 /* --- system optimize --- */
7 /* select bit size of output : 8 or 16 */
8 #define OPL_OUTPUT_BIT 16
10 /* compiler dependence */
11 #ifndef OSD_CPU_H
12 #define OSD_CPU_H
13 typedef signed char INT8; /* signed 8bit */
14 typedef signed short INT16; /* signed 16bit */
15 typedef signed int INT32; /* signed 32bit */
16 #endif
18 #if (OPL_OUTPUT_BIT==16)
19 typedef INT16 OPLSAMPLE;
20 #endif
21 #if (OPL_OUTPUT_BIT==8)
22 typedef unsigned char OPLSAMPLE;
23 #endif
25 typedef void (*OPL_TIMERHANDLER)(int channel,double interval_Sec);
26 typedef void (*OPL_IRQHANDLER)(int param,int irq);
27 typedef void (*OPL_UPDATEHANDLER)(int param,int min_interval_us);
28 typedef void (*OPL_PORTHANDLER_W)(int param,unsigned char data);
29 typedef unsigned char (*OPL_PORTHANDLER_R)(int param);
31 /* !!!!! here is private section , do not access there member direct !!!!! */
33 #define OPL_TYPE_WAVESEL 0x01 /* waveform select */
34 #define OPL_TYPE_ADPCM 0x02 /* DELTA-T ADPCM unit */
35 #define OPL_TYPE_KEYBOARD 0x04 /* keyboard interface */
36 #define OPL_TYPE_IO 0x08 /* I/O port */
38 /* Saving is necessary for member of the 'R' mark for suspend/resume */
39 /* ---------- OPL one of slot ---------- */
40 typedef struct fm_opl_slot {
41 INT32 TL; /* total level :TL << 8 */
42 INT32 TLL; /* adjusted now TL */
43 uint8_t KSR; /* key scale rate :(shift down bit) */
44 INT32 *AR; /* attack rate :&AR_TABLE[AR<<2] */
45 INT32 *DR; /* decay rate :&DR_TALBE[DR<<2] */
46 INT32 SL; /* sustin level :SL_TALBE[SL] */
47 INT32 *RR; /* release rate :&DR_TABLE[RR<<2] */
48 uint8_t ksl; /* keyscale level :(shift down bits) */
49 uint8_t ksr; /* key scale rate :kcode>>KSR */
50 uint32_t mul; /* multiple :ML_TABLE[ML] */
51 uint32_t Cnt; /* frequency count : */
52 uint32_t Incr; /* frequency step : */
53 /* envelope generator state */
54 uint8_t eg_typ; /* envelope type flag */
55 uint8_t evm; /* envelope phase */
56 INT32 evc; /* envelope counter */
57 INT32 eve; /* envelope counter end point */
58 INT32 evs; /* envelope counter step */
59 INT32 evsa; /* envelope step for AR :AR[ksr] */
60 INT32 evsd; /* envelope step for DR :DR[ksr] */
61 INT32 evsr; /* envelope step for RR :RR[ksr] */
62 /* LFO */
63 uint8_t ams; /* ams flag */
64 uint8_t vib; /* vibrate flag */
65 /* wave selector */
66 INT32 **wavetable;
67 }OPL_SLOT;
69 /* ---------- OPL one of channel ---------- */
70 typedef struct fm_opl_channel {
71 OPL_SLOT SLOT[2];
72 uint8_t CON; /* connection type */
73 uint8_t FB; /* feed back :(shift down bit) */
74 INT32 *connect1; /* slot1 output pointer */
75 INT32 *connect2; /* slot2 output pointer */
76 INT32 op1_out[2]; /* slot1 output for selfeedback */
77 /* phase generator state */
78 uint32_t block_fnum; /* block+fnum : */
79 uint8_t kcode; /* key code : KeyScaleCode */
80 uint32_t fc; /* Freq. Increment base */
81 uint32_t ksl_base; /* KeyScaleLevel Base step */
82 uint8_t keyon; /* key on/off flag */
83 } OPL_CH;
85 /* OPL state */
86 typedef struct fm_opl_f {
87 uint8_t type; /* chip type */
88 int clock; /* master clock (Hz) */
89 int rate; /* sampling rate (Hz) */
90 double freqbase; /* frequency base */
91 double TimerBase; /* Timer base time (==sampling time) */
92 uint8_t address; /* address register */
93 uint8_t status; /* status flag */
94 uint8_t statusmask; /* status mask */
95 uint32_t mode; /* Reg.08 : CSM , notesel,etc. */
96 /* Timer */
97 int T[2]; /* timer counter */
98 uint8_t st[2]; /* timer enable */
99 /* FM channel slots */
100 OPL_CH *P_CH; /* pointer of CH */
101 int max_ch; /* maximum channel */
102 /* Rhythm sention */
103 uint8_t rhythm; /* Rhythm mode , key flag */
104 OPL_PORTHANDLER_R porthandler_r;
105 OPL_PORTHANDLER_W porthandler_w;
106 int port_param;
107 OPL_PORTHANDLER_R keyboardhandler_r;
108 OPL_PORTHANDLER_W keyboardhandler_w;
109 int keyboard_param;
110 /* time tables */
111 INT32 AR_TABLE[75]; /* atttack rate tables */
112 INT32 DR_TABLE[75]; /* decay rate tables */
113 uint32_t FN_TABLE[1024]; /* fnumber -> increment counter */
114 /* LFO */
115 INT32 *ams_table;
116 INT32 *vib_table;
117 INT32 amsCnt;
118 INT32 amsIncr;
119 INT32 vibCnt;
120 INT32 vibIncr;
121 /* wave selector enable flag */
122 uint8_t wavesel;
123 /* external event callback handler */
124 OPL_TIMERHANDLER TimerHandler; /* TIMER handler */
125 int TimerParam; /* TIMER parameter */
126 OPL_IRQHANDLER IRQHandler; /* IRQ handler */
127 int IRQParam; /* IRQ parameter */
128 OPL_UPDATEHANDLER UpdateHandler; /* stream update handler */
129 int UpdateParam; /* stream update parameter */
130 } FM_OPL;
132 /* ---------- Generic interface section ---------- */
133 #define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
135 FM_OPL *OPLCreate(int type, int clock, int rate);
136 void OPLDestroy(FM_OPL *OPL);
137 void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset);
138 void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,int param);
139 void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,int param);
141 void OPLResetChip(FM_OPL *OPL);
142 int OPLWrite(FM_OPL *OPL,int a,int v);
143 unsigned char OPLRead(FM_OPL *OPL,int a);
144 int OPLTimerOver(FM_OPL *OPL,int c);
146 void YM3812UpdateOne(FM_OPL *OPL, INT16 *buffer, int length);
147 #endif