UINT32 eg_timer;\r
UINT32 eg_timer_add;\r
UINT32 pack; // 4c: stereo, lastchan, disabled, lfo_enabled | pan_r, pan_l, ams[2] | AMmasks[4] | FB[4] | lfo_ampm[16]\r
- UINT32 algo; /* 50 */\r
+ UINT32 algo; /* 50: algo[3], was_update */\r
INT32 op1_out;\r
} chan_rend_context;\r
\r
} else {\r
buffer[scounter] += smp;\r
}\r
+ ct->algo = 8; // algo is only used in asm, here only bit3 is used\r
}\r
\r
/* update phase counters AFTER output calculations */\r
#endif\r
\r
\r
-static void chan_render(int *buffer, int length, FM_CH *CH, UINT32 flags) // flags: stereo, lastchan, disabled, ?, pan_r, pan_l\r
+static int chan_render(int *buffer, int length, FM_CH *CH, UINT32 flags) // flags: stereo, lastchan, disabled, ?, pan_r, pan_l\r
{\r
chan_rend_context ct;\r
\r
CH->SLOT[SLOT3].phase = ct.phase3;\r
CH->SLOT[SLOT4].phase = ct.phase4;\r
CH->mem_value = ct.mem;\r
+\r
+ return (ct.algo & 8) >> 3; // had output\r
}\r
\r
/* update phase increment and envelope generator */\r
int YM2612UpdateOne_(int *buffer, int length, int stereo, int is_buf_empty)\r
{\r
int pan;\r
+ int active_chs = 0;\r
\r
// if !is_buf_empty, it means it has valid samples to mix with, else it may contain trash\r
if (is_buf_empty) memset32(buffer, 0, length<<stereo);\r
if (stereo) stereo = 1;\r
\r
/* mix to 32bit dest */\r
- chan_render(buffer, length, &ym2612.CH[0], stereo|((pan&0x003)<<4)); // flags: stereo, lastchan, disabled, ?, pan_r, pan_l\r
- chan_render(buffer, length, &ym2612.CH[1], stereo|((pan&0x00c)<<2));\r
- chan_render(buffer, length, &ym2612.CH[2], stereo|((pan&0x030) ));\r
- chan_render(buffer, length, &ym2612.CH[3], stereo|((pan&0x0c0)>>2));\r
- chan_render(buffer, length, &ym2612.CH[4], stereo|((pan&0x300)>>4));\r
- chan_render(buffer, length, &ym2612.CH[5], stereo|((pan&0xc00)>>6)|(ym2612.dacen<<2)|2);\r
-\r
- return 1; // buffer updated\r
+ // flags: stereo, lastchan, disabled, ?, pan_r, pan_l\r
+ active_chs |= chan_render(buffer, length, &ym2612.CH[0], stereo|((pan&0x003)<<4)) << 0;\r
+ active_chs |= chan_render(buffer, length, &ym2612.CH[1], stereo|((pan&0x00c)<<2)) << 1;\r
+ active_chs |= chan_render(buffer, length, &ym2612.CH[2], stereo|((pan&0x030) )) << 2;\r
+ active_chs |= chan_render(buffer, length, &ym2612.CH[3], stereo|((pan&0x0c0)>>2)) << 3;\r
+ active_chs |= chan_render(buffer, length, &ym2612.CH[4], stereo|((pan&0x300)>>4)) << 4;\r
+ active_chs |= chan_render(buffer, length, &ym2612.CH[5], stereo|((pan&0xc00)>>6)|(ym2612.dacen<<2)|2) << 5;\r
+\r
+ return active_chs; // 1 if buffer updated\r
}\r
\r
\r