void sound_update(int line) { int16 *fm[2], *psg[2]; if(!snd.enabled) return; /* Finish buffers at end of frame */ if(line == smptab_len - 1) { psg[0] = psg_buffer[0] + snd.done_so_far; psg[1] = psg_buffer[1] + snd.done_so_far; fm[0] = fm_buffer[0] + snd.done_so_far; fm[1] = fm_buffer[1] + snd.done_so_far; /* Generate SN76489 sample data */ SN76489_Update(0, psg, snd.sample_count - snd.done_so_far); /* Generate YM2413 sample data */ FM_Update(fm, snd.sample_count - snd.done_so_far); /* Mix streams into output buffer */ snd.mixer_callback(snd.stream, snd.output, snd.sample_count); /* Reset */ snd.done_so_far = 0; } else { int tinybit; tinybit = smptab[line] - snd.done_so_far; /* Do a tiny bit */ psg[0] = psg_buffer[0] + snd.done_so_far; psg[1] = psg_buffer[1] + snd.done_so_far; fm[0] = fm_buffer[0] + snd.done_so_far; fm[1] = fm_buffer[1] + snd.done_so_far; /* Generate SN76489 sample data */ SN76489_Update(0, psg, tinybit); /* Generate YM2413 sample data */ FM_Update(fm, tinybit); /* Sum total */ snd.done_so_far += tinybit; } }
/* Run PSG chip for required M-cycles */ INLINE void psg_update(unsigned int cycles) { if (cycles > psg_cycles_count) { /* clocks to run */ unsigned int clocks = (cycles - psg_cycles_count + psg_cycles_ratio - 1) / psg_cycles_ratio; /* update cycle count */ psg_cycles_count += clocks * psg_cycles_ratio; /* run PSG chip & get samples */ snd.psg.pos += SN76489_Update(snd.psg.pos, clocks); } }
void sn764xx_stream_update(UINT8 ChipID, stream_sample_t **outputs, int samples) { sn764xx_state *info = &SN764xxData[ChipID]; switch(EMU_CORE) { case EC_MAME: SN76496Update(info->chip, outputs, samples); break; #ifdef ENABLE_ALL_CORES case EC_MAXIM: SN76489_Update((SN76489_Context*)info->chip, outputs, samples); break; #endif } }
void sn764xx_stream_update(void *_info, stream_sample_t **outputs, int samples) { sn764xx_state* info = (sn764xx_state*)_info; switch(info->EMU_CORE) { case EC_MAME: SN76496Update(info->chip, outputs, samples); break; #ifdef ENABLE_ALL_CORES case EC_MAXIM: SN76489_Update((SN76489_Context*)info->chip, outputs, samples); break; #endif } }
int sound_update(unsigned int cycles) { int delta, preamp, time, l, r, *ptr; /* Run PSG & FM chips until end of frame */ SN76489_Update(cycles); fm_update(cycles); /* FM output pre-amplification */ preamp = config.fm_preamp; /* FM frame initial timestamp */ time = fm_cycles_start; /* Restore last FM outputs from previous frame */ l = fm_last[0]; r = fm_last[1]; /* FM buffer start pointer */ ptr = fm_buffer; /* flush FM samples */ if (config.hq_fm) { /* high-quality Band-Limited synthesis */ do { /* left channel */ delta = ((*ptr++ * preamp) / 100) - l; l += delta; blip_add_delta(snd.blips[0][0], time, delta); /* right channel */ delta = ((*ptr++ * preamp) / 100) - r; r += delta; blip_add_delta(snd.blips[0][1], time, delta); /* increment time counter */ time += fm_cycles_ratio; } while (time < cycles); } else { /* faster Linear Interpolation */ do { /* left channel */ delta = ((*ptr++ * preamp) / 100) - l; l += delta; blip_add_delta_fast(snd.blips[0][0], time, delta); /* right channel */ delta = ((*ptr++ * preamp) / 100) - r; r += delta; blip_add_delta_fast(snd.blips[0][1], time, delta); /* increment time counter */ time += fm_cycles_ratio; } while (time < cycles); } /* reset FM buffer pointer */ fm_ptr = fm_buffer; /* save last FM output for next frame */ fm_last[0] = l; fm_last[1] = r; /* adjust FM cycle counters for next frame */ fm_cycles_count = fm_cycles_start = time - cycles; /* end of blip buffers time frame */ blip_end_frame(snd.blips[0][0], cycles); blip_end_frame(snd.blips[0][1], cycles); /* return number of available samples */ return blip_samples_avail(snd.blips[0][0]); }