static int AY8910_init(const char *chip_name,int chip, int clock,int volume,int sample_rate, mem_read_handler portAread,mem_read_handler portBread, mem_write_handler portAwrite,mem_write_handler portBwrite) { struct AY8910 *PSG = &AYPSG[chip]; int i; #ifdef SINGLE_CHANNEL_MIXER char buf[40]; int gain = MIXER_GET_GAIN(volume); int pan = MIXER_GET_PAN(volume); #else char buf[3][40]; const char *name[3]; int vol[3]; #endif /* the step clock for the tone and noise generators is the chip clock */ /* divided by 8; for the envelope generator of the AY-3-8910, it is half */ /* that much (clock/16), but the envelope of the YM2149 goes twice as */ /* fast, therefore again clock/8. */ // causes crashes with YM2610 games - overflow? // if (options.use_filter) sample_rate = clock/8; memset(PSG,0,sizeof(struct AY8910)); PSG->PortAread = portAread; PSG->PortBread = portBread; PSG->PortAwrite = portAwrite; PSG->PortBwrite = portBwrite; #ifdef SINGLE_CHANNEL_MIXER for (i = 0;i < 3;i++) PSG->mix_vol[i] = MIXER_GET_LEVEL(volume); sprintf(buf,"%s #%d",chip_name,chip); PSG->Channel = stream_init(buf,MIXERG(100,gain,pan),sample_rate,chip,AY8910Update); #else for (i = 0;i < 3;i++) { vol[i] = volume; name[i] = buf[i]; sprintf(buf[i],"%s #%d Ch %c",chip_name,chip,'A'+i); } PSG->Channel = stream_init_multi(3,name,vol,sample_rate,chip,AY8910Update); #endif if (PSG->Channel == -1) return 1; return 0; }
int mixer_allocate_channels(int channels, const int *default_mixing_levels) { int i, j; /* make sure we didn't overrun the number of available channels */ if (first_free_channel + channels > MIXER_MAX_CHANNELS) { logerror("Too many mixer channels (requested %d, available %d)\n", first_free_channel + channels, MIXER_MAX_CHANNELS); exit(1); } /* loop over channels requested */ for (i = 0; i < channels; i++) { struct mixer_channel_data *channel = &mixer_channel[first_free_channel + i]; /* extract the basic data */ channel->default_mixing_level = MIXER_GET_LEVEL(default_mixing_levels[i]); channel->pan = MIXER_GET_PAN(default_mixing_levels[i]); channel->gain = MIXER_GET_GAIN(default_mixing_levels[i]); channel->volume = 100; /* backwards compatibility with old 0-255 volume range */ if (channel->default_mixing_level > 100) channel->default_mixing_level = channel->default_mixing_level * 25 / 255; /* attempt to load in the configuration data for this channel */ channel->mixing_level = channel->default_mixing_level; if (!config_invalid) { /* if the defaults match, set the mixing level from the config */ if (channel->default_mixing_level == channel->config_default_mixing_level) channel->mixing_level = channel->config_mixing_level; /* otherwise, invalidate all channels that have been created so far */ else { config_invalid = 1; for (j = 0; j < first_free_channel + i; j++) mixer_set_mixing_level(j, mixer_channel[j].default_mixing_level); } } /* set the default name */ mixer_set_name(first_free_channel + i, 0); } /* increment the counter and return the first one */ first_free_channel += channels; return first_free_channel - channels; }