static void print_game_sound(FILE *out, const game_driver *game, const machine_config *config) { int speakers = speaker_output_count(config); /* if we have no sound, zero out the speaker count */ if (sound_first(config) == NULL) speakers = 0; fprintf(out, "\t\t<sound channels=\"%d\"/>\n", speakers); }
void sound_init(running_machine *machine) { attotime update_frequency = SOUND_UPDATE_FREQUENCY; const char *filename; /* handle -nosound */ nosound_mode = !options_get_bool(mame_options(), OPTION_SOUND); if (nosound_mode) machine->sample_rate = 11025; /* count the speakers */ VPRINTF(("total speakers = %d\n", speaker_output_count(machine->config))); /* allocate memory for mix buffers */ leftmix = auto_malloc(machine->sample_rate * sizeof(*leftmix)); rightmix = auto_malloc(machine->sample_rate * sizeof(*rightmix)); finalmix = auto_malloc(machine->sample_rate * sizeof(*finalmix)); /* allocate a global timer for sound timing */ sound_update_timer = timer_alloc(sound_update, NULL); timer_adjust_periodic(sound_update_timer, update_frequency, 0, update_frequency); /* initialize the streams engine */ VPRINTF(("streams_init\n")); streams_init(machine, update_frequency.attoseconds); /* now start up the sound chips and tag their streams */ VPRINTF(("start_sound_chips\n")); start_sound_chips(); /* finally, do all the routing */ VPRINTF(("route_sound\n")); route_sound(); /* open the output WAV file if specified */ filename = options_get_string(mame_options(), OPTION_WAVWRITE); if (filename[0] != 0) wavfile = wav_open(filename, machine->sample_rate, 2); /* enable sound by default */ global_sound_enabled = TRUE; sound_muted = FALSE; sound_set_attenuation(options_get_int(mame_options(), OPTION_VOLUME)); /* register callbacks */ config_register("mixer", sound_load, sound_save); add_pause_callback(machine, sound_pause); add_reset_callback(machine, sound_reset); add_exit_callback(machine, sound_exit); }
void sound_init(running_machine *machine) { sound_private *global; const char *filename; machine->sound_data = global = auto_alloc_clear(machine, sound_private); /* handle -nosound */ global->nosound_mode = !options_get_bool(machine->options(), OPTION_SOUND); if (global->nosound_mode) machine->sample_rate = 11025; /* count the speakers */ VPRINTF(("total speakers = %d\n", speaker_output_count(machine->config))); /* allocate memory for mix buffers */ global->leftmix = auto_alloc_array(machine, INT32, machine->sample_rate); global->rightmix = auto_alloc_array(machine, INT32, machine->sample_rate); global->finalmix = auto_alloc_array(machine, INT16, machine->sample_rate); /* allocate a global timer for sound timing */ global->update_timer = timer_alloc(machine, sound_update, NULL); timer_adjust_periodic(global->update_timer, STREAMS_UPDATE_ATTOTIME, 0, STREAMS_UPDATE_ATTOTIME); /* finally, do all the routing */ VPRINTF(("route_sound\n")); route_sound(machine); /* open the output WAV file if specified */ filename = options_get_string(machine->options(), OPTION_WAVWRITE); if (filename[0] != 0) global->wavfile = wav_open(filename, machine->sample_rate, 2); /* enable sound by default */ global->enabled = TRUE; global->muted = FALSE; sound_set_attenuation(machine, options_get_int(machine->options(), OPTION_VOLUME)); /* register callbacks */ config_register(machine, "mixer", sound_load, sound_save); machine->add_notifier(MACHINE_NOTIFY_PAUSE, sound_pause); machine->add_notifier(MACHINE_NOTIFY_RESUME, sound_resume); machine->add_notifier(MACHINE_NOTIFY_RESET, sound_reset); machine->add_notifier(MACHINE_NOTIFY_EXIT, sound_exit); }
static void route_sound(void) { int sndnum, routenum, outputnum; const device_config *curspeak; /* iterate over all the sound chips */ for (sndnum = 0; sndnum < totalsnd; sndnum++) { sound_info *info = &sound[sndnum]; /* iterate over all routes */ for (routenum = 0; routenum < info->sound->routes; routenum++) { const sound_route *mroute = &info->sound->route[routenum]; speaker_info *speaker; sound_info *sound; /* find the target */ speaker = find_speaker_by_tag(mroute->target); sound = find_sound_by_tag(mroute->target); /* if neither found, it's fatal */ if (speaker == NULL && sound == NULL) fatalerror("Sound route \"%s\" not found!\n", mroute->target); /* if we got a speaker, bump its input count */ if (speaker != NULL) { if (mroute->output >= 0 && mroute->output < info->outputs) speaker->inputs++; else if (mroute->output == ALL_OUTPUTS) speaker->inputs += info->outputs; } } } /* now allocate the mixers and input data */ streams_set_tag(Machine, NULL); for (curspeak = speaker_output_first(Machine->config); curspeak != NULL; curspeak = speaker_output_next(curspeak)) { speaker_info *info = curspeak->token; if (info->inputs != 0) { info->mixer_stream = stream_create(info->inputs, 1, Machine->sample_rate, info, mixer_update); info->input = auto_malloc(info->inputs * sizeof(*info->input)); info->inputs = 0; } else logerror("Warning: speaker \"%s\" has no inputs\n", info->tag); } /* iterate again over all the sound chips */ for (sndnum = 0; sndnum < totalsnd; sndnum++) { sound_info *info = &sound[sndnum]; /* iterate over all routes */ for (routenum = 0; routenum < info->sound->routes; routenum++) { const sound_route *mroute = &info->sound->route[routenum]; speaker_info *speaker; sound_info *sound; /* find the target */ speaker = find_speaker_by_tag(mroute->target); sound = find_sound_by_tag(mroute->target); /* if it's a speaker, set the input */ if (speaker != NULL) { for (outputnum = 0; outputnum < info->outputs; outputnum++) if (mroute->output == outputnum || mroute->output == ALL_OUTPUTS) { char namebuf[256]; int index; sound_type sndtype = sndnum_to_sndti(sndnum, &index); /* built the display name */ namebuf[0] = '\0'; /* speaker name, if more than one speaker */ if (speaker_output_count(Machine->config) > 1) sprintf(namebuf, "%sSpeaker '%s': ", namebuf, speaker->tag); /* device name */ sprintf(namebuf, "%s%s ", namebuf, sndnum_name(sndnum)); /* device index, if more than one of this type */ if (sndtype_count(sndtype) > 1) sprintf(namebuf, "%s#%d ", namebuf, index); /* channel number, if more than channel for this device */ if (info->outputs > 1) sprintf(namebuf, "%sCh.%d", namebuf, outputnum); /* remove final space */ if (namebuf[strlen(namebuf) - 1] == ' ') namebuf[strlen(namebuf) - 1] = '\0'; /* fill in the input data on this speaker */ speaker->input[speaker->inputs].gain = mroute->gain; speaker->input[speaker->inputs].default_gain = mroute->gain; speaker->input[speaker->inputs].name = auto_strdup(namebuf); /* connect the output to the input */ stream_set_input(speaker->mixer_stream, speaker->inputs++, info->output[outputnum].stream, info->output[outputnum].output, mroute->gain); } } /* if it's a sound chip, set the input */ else { if (mroute->input < 0) { for (outputnum = 0; outputnum < info->outputs; outputnum++) if (mroute->output == outputnum || mroute->output == ALL_OUTPUTS) stream_set_input(sound->output[0].stream, 0, info->output[outputnum].stream, info->output[outputnum].output, mroute->gain); } else { assert(mroute->output != ALL_OUTPUTS); for (outputnum = 0; outputnum < info->outputs; outputnum++) if (mroute->output == outputnum) stream_set_input(sound->output[0].stream, mroute->input, info->output[outputnum].stream, info->output[outputnum].output, mroute->gain); } } } } }
int numberOfSpeakers(const machine_config *config) { int speakers = speaker_output_count(config); return speakers; }