Lines Matching refs:ay

74 static int check_magic(ayemu_ay_t *ay)  in check_magic()  argument
76 if (ay->magic == MAGIC1) in check_magic()
78 fprintf(stderr, "libayemu: passed pointer %p to uninitialized ayemu_ay_t structure\n", ay); in check_magic()
125 void ayemu_init(ayemu_ay_t *ay) in ayemu_init() argument
127 ay->default_chip_flag = 1; in ayemu_init()
128 ay->ChipFreq = AYEMU_DEFAULT_CHIP_FREQ; in ayemu_init()
129 ay->default_stereo_flag = 1; in ayemu_init()
130 ay->default_sound_format_flag = 1; in ayemu_init()
131 ay->dirty = 1; in ayemu_init()
132 ay->magic = MAGIC1; in ayemu_init()
134 ayemu_reset(ay); in ayemu_init()
142 void ayemu_reset(ayemu_ay_t *ay) in ayemu_reset() argument
144 if (!check_magic(ay)) return; in ayemu_reset()
146 ay->cnt_a = ay->cnt_b = ay->cnt_c = ay->cnt_n = ay->cnt_e = 0; in ayemu_reset()
147 ay->bit_a = ay->bit_b = ay->bit_c = ay->bit_n = 0; in ayemu_reset()
148 ay->env_pos = ay->EnvNum = 0; in ayemu_reset()
149 ay->Cur_Seed = 0xffff; in ayemu_reset()
153 static void set_table_ay (ayemu_ay_t *ay, int tbl[16]) in set_table_ay() argument
157 ay->table[n] = tbl[n/2]; in set_table_ay()
158 ay->type = AYEMU_AY; in set_table_ay()
161 static void set_table_ym (ayemu_ay_t *ay, int tbl[32]) in set_table_ym() argument
165 ay->table[n] = tbl[n]; in set_table_ym()
166 ay->type = AYEMU_YM; in set_table_ym()
171 int ayemu_set_chip_type(ayemu_ay_t *ay, ayemu_chip_t type, int *custom_table) in ayemu_set_chip_type() argument
173 if (!check_magic(ay)) in ayemu_set_chip_type()
184 set_table_ay(ay, Lion17_AY_table); in ayemu_set_chip_type()
188 set_table_ym(ay, Lion17_YM_table); in ayemu_set_chip_type()
191 set_table_ay(ay, KAY_AY_table); in ayemu_set_chip_type()
194 set_table_ym(ay, KAY_YM_table); in ayemu_set_chip_type()
197 set_table_ay(ay, custom_table); in ayemu_set_chip_type()
200 set_table_ym(ay, custom_table); in ayemu_set_chip_type()
207 ay->default_chip_flag = 0; in ayemu_set_chip_type()
208 ay->dirty = 1; in ayemu_set_chip_type()
214 void ayemu_set_chip_freq(ayemu_ay_t *ay, int chipfreq) in ayemu_set_chip_freq() argument
216 if (!check_magic(ay)) return; in ayemu_set_chip_freq()
218 ay->ChipFreq = chipfreq; in ayemu_set_chip_freq()
219 ay->dirty = 1; in ayemu_set_chip_freq()
229 int ayemu_set_sound_format (ayemu_ay_t *ay, int freq, int chans, int bits) in ayemu_set_sound_format() argument
231 if (!check_magic(ay)) in ayemu_set_sound_format()
247 ay->sndfmt.freq = freq; in ayemu_set_sound_format()
248 ay->sndfmt.channels = chans; in ayemu_set_sound_format()
249 ay->sndfmt.bpc = bits; in ayemu_set_sound_format()
252 ay->default_sound_format_flag = 0; in ayemu_set_sound_format()
253 ay->dirty = 1; in ayemu_set_sound_format()
265 int ayemu_set_stereo(ayemu_ay_t *ay, ayemu_stereo_t stereo_type, int *custom_eq) in ayemu_set_stereo() argument
270 if (!check_magic(ay)) in ayemu_set_stereo()
278 chip = (ay->type == AYEMU_AY)? 0 : 1; in ayemu_set_stereo()
289 ay->eq[i] = default_layout[chip][stereo_type][i]; in ayemu_set_stereo()
293 ay->eq[i] = custom_eq[i]; in ayemu_set_stereo()
300 ay->default_stereo_flag = 0; in ayemu_set_stereo()
301 ay->dirty = 1; in ayemu_set_stereo()
315 void ayemu_set_regs(ayemu_ay_t *ay, unsigned char *regs) in ayemu_set_regs() argument
317 if (!check_magic(ay)) return; in ayemu_set_regs()
326 ay->regs.tone_a = regs[0] + ((regs[1]&0x0f) << 8); in ayemu_set_regs()
327 ay->regs.tone_b = regs[2] + ((regs[3]&0x0f) << 8); in ayemu_set_regs()
328 ay->regs.tone_c = regs[4] + ((regs[5]&0x0f) << 8); in ayemu_set_regs()
330 ay->regs.noise = regs[6] & 0x1f; in ayemu_set_regs()
332 ay->regs.R7_tone_a = ! (regs[7] & 0x01); in ayemu_set_regs()
333 ay->regs.R7_tone_b = ! (regs[7] & 0x02); in ayemu_set_regs()
334 ay->regs.R7_tone_c = ! (regs[7] & 0x04); in ayemu_set_regs()
336 ay->regs.R7_noise_a = ! (regs[7] & 0x08); in ayemu_set_regs()
337 ay->regs.R7_noise_b = ! (regs[7] & 0x10); in ayemu_set_regs()
338 ay->regs.R7_noise_c = ! (regs[7] & 0x20); in ayemu_set_regs()
340 ay->regs.vol_a = regs[8] & 0x0f; in ayemu_set_regs()
341 ay->regs.vol_b = regs[9] & 0x0f; in ayemu_set_regs()
342 ay->regs.vol_c = regs[10] & 0x0f; in ayemu_set_regs()
343 ay->regs.env_a = regs[8] & 0x10; in ayemu_set_regs()
344 ay->regs.env_b = regs[9] & 0x10; in ayemu_set_regs()
345 ay->regs.env_c = regs[10] & 0x10; in ayemu_set_regs()
346 ay->regs.env_freq = regs[11] + (regs[12] << 8); in ayemu_set_regs()
349 ay->regs.env_style = regs[13] & 0x0f; in ayemu_set_regs()
350 ay->env_pos = ay->cnt_e = 0; in ayemu_set_regs()
355 static void prepare_generation(ayemu_ay_t *ay) in prepare_generation() argument
359 if (!ay->dirty) return; in prepare_generation()
363 if (ay->default_chip_flag) ayemu_set_chip_type(ay, AYEMU_AY, NULL); in prepare_generation()
365 if (ay->default_stereo_flag) ayemu_set_stereo(ay, AYEMU_ABC, NULL); in prepare_generation()
367 if (ay->default_sound_format_flag) ayemu_set_sound_format(ay, 44100, 2, 16); in prepare_generation()
369 ay->ChipTacts_per_outcount = ay->ChipFreq / ay->sndfmt.freq / 8; in prepare_generation()
375 vol = ay->table[n]; in prepare_generation()
377 ay->vols[m][n] = (int) (((double) vol * ay->eq[m]) / 100); in prepare_generation()
385 max_l = ay->vols[0][31] + ay->vols[2][31] + ay->vols[3][31]; in prepare_generation()
386 max_r = ay->vols[1][31] + ay->vols[3][31] + ay->vols[5][31]; in prepare_generation()
388 ay->Amp_Global = ay->ChipTacts_per_outcount *vol / AYEMU_MAX_AMP; in prepare_generation()
390 ay->dirty = 0; in prepare_generation()
399 void *ayemu_gen_sound(ayemu_ay_t *ay, void *buff, size_t sound_bufsize) in ayemu_gen_sound() argument
407 if (!check_magic(ay)) in ayemu_gen_sound()
410 prepare_generation(ay); in ayemu_gen_sound()
412 snd_numcount = sound_bufsize / (ay->sndfmt.channels * (ay->sndfmt.bpc >> 3)); in ayemu_gen_sound()
416 for (m = 0 ; m < ay->ChipTacts_per_outcount ; m++) { in ayemu_gen_sound()
417 if (++ay->cnt_a >= ay->regs.tone_a) { in ayemu_gen_sound()
418 ay->cnt_a = 0; in ayemu_gen_sound()
419 ay->bit_a = ! ay->bit_a; in ayemu_gen_sound()
421 if (++ay->cnt_b >= ay->regs.tone_b) { in ayemu_gen_sound()
422 ay->cnt_b = 0; in ayemu_gen_sound()
423 ay->bit_b = ! ay->bit_b; in ayemu_gen_sound()
425 if (++ay->cnt_c >= ay->regs.tone_c) { in ayemu_gen_sound()
426 ay->cnt_c = 0; in ayemu_gen_sound()
427 ay->bit_c = ! ay->bit_c; in ayemu_gen_sound()
431 if (++ay->cnt_n >= (ay->regs.noise * 2)) { in ayemu_gen_sound()
432 ay->cnt_n = 0; in ayemu_gen_sound()
433 ay->Cur_Seed = (ay->Cur_Seed * 2 + 1) ^ \ in ayemu_gen_sound()
434 (((ay->Cur_Seed >> 16) ^ (ay->Cur_Seed >> 13)) & 1); in ayemu_gen_sound()
435 ay->bit_n = ((ay->Cur_Seed >> 16) & 1); in ayemu_gen_sound()
438 if (++ay->cnt_e >= ay->regs.env_freq) { in ayemu_gen_sound()
439 ay->cnt_e = 0; in ayemu_gen_sound()
440 if (++ay->env_pos > 127) in ayemu_gen_sound()
441 ay->env_pos = 64; in ayemu_gen_sound()
444 #define ENVVOL Envelope [ay->regs.env_style][ay->env_pos] in ayemu_gen_sound()
446 if ((ay->bit_a | !ay->regs.R7_tone_a) & (ay->bit_n | !ay->regs.R7_noise_a)) { in ayemu_gen_sound()
447 tmpvol = (ay->regs.env_a)? ENVVOL : ay->regs.vol_a * 2 + 1; in ayemu_gen_sound()
448 mix_l += ay->vols[0][tmpvol]; in ayemu_gen_sound()
449 mix_r += ay->vols[1][tmpvol]; in ayemu_gen_sound()
452 if ((ay->bit_b | !ay->regs.R7_tone_b) & (ay->bit_n | !ay->regs.R7_noise_b)) { in ayemu_gen_sound()
453 tmpvol =(ay->regs.env_b)? ENVVOL : ay->regs.vol_b * 2 + 1; in ayemu_gen_sound()
454 mix_l += ay->vols[2][tmpvol]; in ayemu_gen_sound()
455 mix_r += ay->vols[3][tmpvol]; in ayemu_gen_sound()
458 if ((ay->bit_c | !ay->regs.R7_tone_c) & (ay->bit_n | !ay->regs.R7_noise_c)) { in ayemu_gen_sound()
459 tmpvol = (ay->regs.env_c)? ENVVOL : ay->regs.vol_c * 2 + 1; in ayemu_gen_sound()
460 mix_l += ay->vols[4][tmpvol]; in ayemu_gen_sound()
461 mix_r += ay->vols[5][tmpvol]; in ayemu_gen_sound()
465 mix_l /= ay->Amp_Global; in ayemu_gen_sound()
466 mix_r /= ay->Amp_Global; in ayemu_gen_sound()
468 if (ay->sndfmt.bpc == 8) { in ayemu_gen_sound()
472 if (ay->sndfmt.channels != 1) in ayemu_gen_sound()
477 if (ay->sndfmt.channels != 1) { in ayemu_gen_sound()
490 void ayemu_free (ayemu_ay_t *ay) in ayemu_free() argument