// struct defines\r
///////////////////////////////////////////////////////////\r
\r
+enum ADSR_State {\r
+ ADSR_ATTACK = 0,\r
+ ADSR_DECAY = 1,\r
+ ADSR_SUSTAIN = 2,\r
+ ADSR_RELEASE = 3,\r
+};\r
+\r
// ADSR INFOS PER CHANNEL\r
typedef struct\r
{\r
- unsigned char State:2;\r
+ unsigned char State:2; // ADSR_State\r
unsigned char AttackModeExp:1;\r
unsigned char SustainModeExp:1;\r
unsigned char SustainIncrease:1;\r
unsigned char * pCurr; // current pos in sound mem\r
unsigned char * pLoop; // loop ptr in sound mem\r
\r
- unsigned int bStop:1; // is channel stopped (sample _can_ still be playing, ADSR Release phase)\r
unsigned int bReverb:1; // can we do reverb on this channel? must have ctrl register bit, to get active\r
unsigned int bRVBActive:1; // reverb active flag\r
unsigned int bNoise:1; // noise active flag\r
extern SPUCHAN s_chan[];\r
extern REVERBInfo rvb;\r
\r
-void do_samples(unsigned int cycles_to);\r
+void do_samples(unsigned int cycles_to, int do_sync);\r
void schedule_next_irq(void);\r
\r
#define regAreaGet(ch,offset) \\r
spu.regArea[((ch<<4)|(offset))>>1]\r
\r
-#define do_samples_if_needed(c) \\r
+#define do_samples_if_needed(c, sync) \\r
do { \\r
- if ((int)((c) - spu.cycles_played) >= 16 * 768) \\r
- do_samples(c); \\r
+ if (sync || (int)((c) - spu.cycles_played) >= 16 * 768) \\r
+ do_samples(c, sync); \\r
} while (0)\r
\r
#endif\r