/* NetHack 3.7 sndprocs.h $NHDT-Date: $ $NHDT-Branch: $:$NHDT-Revision: $ */ /* Copyright (c) Michael Allison, 2022 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef SNDPROCS_H #define SNDPROCS_H /* * * Types of potential sound supports (all are optional): * * SNDCAP_USERSOUNDS User-specified sounds that play based on config * file entries that identify a regular expression * to match against message window text, and identify * an external sound file to load in response. * The sound interface function pointer used to invoke * it: * * void (*sound_play_usersound)(char *filename, * int32_t volume, int32_t idx); * * SNDCAP_HEROMUSIC Invoked by the core when the in-game hero is * playing a tune on an instrument. The sound * interface function pointer used to invoke it: * * void (*sound_hero_playnotes)(int32_t instrument, * char *str, int32_t volume); * * SNDCAP_ACHIEVEMENTS Invoked by the core when an in-game achievement * is reached. The soundlib routines could play * appropriate theme or mood music in response. * There would need to be a way to map the * achievements to external user-specified sounds. * The sound interface function pointer used to * invoke it: * * void (*sound_achievement)(schar, schar, * int32_t); * * SNDCAP_SOUNDEFFECTS Invoked by the core when something * sound-producing happens in the game. The soundlib * routines could play an appropriate sound effect * in response. They can be public-domain or * suitably-licensed stock sounds included with the * game source and made available during the build * process, or (not-yet-implemented) a way to * tie particular sound effects to a user-specified * sound samples in a config file. The sound * interface function pointer used to invoke it: * * void (*sound_soundeffect)(char *desc, int32_t, * int32_t volume); * * Development notes: * - gc.chosen_soundlib holds the soundlib_id that will be initialized * at the appropriate time (startup or after an option change). It * is initialized to soundlib_nosound, so that is what will be used if * the initial value isn't replaced via an assign_soundlib() call * prior to the call to the activate_chosen_soundlib() in * moveloop_preamble() at the start of the game. * - ga.active_soundlib holds the soundlib_id of the active soundlib. * It is initialized to soundlib_unassigned. It will get changed to * reflect the activated soundlib_id once activate_chosen_soundlib() * has been called. * */ enum soundlib_ids { soundlib_unassigned = 0, #ifdef SND_LIB_QTSOUND soundlib_qtsound, #endif #ifdef SND_LIB_PORTAUDIO soundlib_portaudio, #endif #ifdef SND_LIB_OPENAL soundlib_openal, #endif #ifdef SND_LIB_SDL_MIXER soundlib_sdl_mixer, #endif #ifdef SND_LIB_MINIAUDIO soundlib_miniaudio, #endif #ifdef SND_LIB_FMOD soundlib_fmod, #endif #ifdef SND_LIB_SOUND_ESCCODES soundlib_sound_esccodes, #endif #ifdef SND_LIB_VISSOUND soundlib_vissound, #endif #ifdef SND_LIB_WINDSOUND soundlib_windsound, #endif soundlib_nosound }; struct sound_procs { const char *soundname; enum soundlib_ids soundlib_id; unsigned long sndcap; /* capabilities in the port */ void (*sound_init_nhsound)(void); void (*sound_exit_nhsound)(const char *); void (*sound_achievement)(schar, schar, int32_t); void (*sound_soundeffect)(char *desc, int32_t, int32_t volume); void (*sound_hero_playnotes)(int32_t instrument, char *str, int32_t volume); void (*sound_play_usersound)(char *filename, int32_t volume, int32_t idx); }; extern struct sound_procs sndprocs; #define SOUNDID(soundname) #soundname, soundlib_##soundname /* * SOUNDCAP */ #define SNDCAP_USERSOUNDS 0x0001L #define SNDCAP_HEROMUSIC 0x0002L #define SNDCAP_ACHIEVEMENTS 0x0004L #define SNDCAP_SOUNDEFFECTS 0x0008L /* 28 free bits */ extern struct sound_procs soundprocs; /* subset for NetHack */ enum instruments { ins_choir_aahs = 53, ins_trumpet = 57, ins_trombone = 58, ins_french_horn = 61, ins_english_horn = 70, ins_piccolo = 73, ins_flute = 74, ins_pan_flute = 76, ins_blown_bottle = 77, ins_whistle = 79, ins_tinkle_bell = 113, ins_woodblock = 116, ins_taiko_drum = 117, ins_melodic_tom = 118, ins_seashore = 123, ins_fencepost }; #if 0 enum instruments_broad { ins_acoustic_grand_piano = 1, ins_bright_acoustic_piano = 2, ins_electric_grand_piano = 3, ins_honkytonk_piano = 4, ins_electric_piano_1 = 5, ins_electric_piano_2 = 6, ins_harpsichord = 7, ins_clavinet = 8, ins_celesta = 9, ins_glockenspiel = 10, ins_music_box = 11, ins_vibraphone = 12, ins_marimba = 13, ins_xylophone = 14, ins_tubular_bells = 15, ins_dulcimer = 16, ins_drawbar_organ = 17, ins_percussive_organ = 18, ins_rock_organ = 19, ins_church_organ = 20, ins_reed_organ = 21, ins_french_accordion = 22, ins_harmonica = 23, ins_tango_accordion = 24, ins_acoustic_guitar__nylon = 25, ins_acoustic_guitar_steel = 26, ins_electric_guitar_jazz = 27, ins_electric_guitar_clean = 28, ins_electric_guitar_muted = 29, ins_overdriven_guitar = 30, ins_distortion_guitar = 31, ins_guitar_harmonics = 32, ins_acoustic_bass = 33, ins_electric_bass__fingered = 34, ins_electric_bass_picked = 35, ins_fretless_bass = 36, ins_slap_bass_1 = 37, ins_slap_bass_2 = 38, ins_synth_bass_1 = 39, ins_synth_bass_2 = 40, ins_violin = 41, ins_viola = 42, ins_cello = 43, ins_contrabass = 44, ins_tremolo_strings = 45, ins_pizzicato_strings = 46, ins_orchestral_harp = 47, ins_timpani = 48, ins_string_ensemble_1 = 49, ins_string_ensemble_2 = 50, ins_synthstrings_1 = 51, ins_synthstrings_2 = 52, ins_choir_aahs = 53, ins_voice_oohs = 54, ins_synth_voice = 55, ins_orchestra_hit = 56, ins_trumpet = 57, ins_trombone = 58, ins_tuba = 59, ins_muted_trumpet = 60, ins_french_horn = 61, ins_brass_section = 62, ins_synthbrass_1 = 63, ins_synthbrass_2 = 64, ins_soprano_sax = 65, ins_alto_sax = 66, ins_tenor_sax = 67, ins_baritone_sax = 68, ins_oboe = 69, ins_english_horn = 70, ins_bassoon = 71, ins_clarinet = 72, ins_piccolo = 73, ins_flute = 74, ins_recorder = 75, ins_pan_flute = 76, ins_blown_bottle = 77, ins_shakuhachi = 78, ins_whistle = 79, ins_ocarina = 80, ins_sitar = 105, ins_banjo = 106, ins_shamisen = 107, ins_koto = 108, ins_kalimba = 109, ins_bag_pipe = 110, ins_fiddle = 111, ins_shanai = 112, ins_tinkle_bell = 113, ins_agogo = 114, ins_steel_drums = 115, ins_woodblock = 116, ins_taiko_drum = 117, ins_melodic_tom = 118, ins_synth_drum = 119, ins_reverse_cymbal = 120, ins_guitar_fret_noise = 121, ins_breath_noise = 122, ins_seashore = 123, ins_bird_tweet = 124, ins_telephone_ring = 125, ins_helicopter = 126, ins_applause = 127, ins_gunshot = 128, ins_fencepost }; #endif enum sound_effect_entries { se_faint_splashing = 1, se_crackling_of_hellfire = 2, se_heart_beat = 3, se_typing_noise = 4, se_hollow_sound = 5, se_rustling_paper = 6, se_crushing_sound = 7, se_splash = 8, se_chains_rattling_gears_turning = 9, se_smashing_and_crushing = 10, se_gears_turning_chains_rattling = 11, se_loud_splash = 12, se_lound_crash = 13, se_crashing_rock = 14, se_sizzling = 15, se_crashing_boulder = 16, se_boulder_drop = 17, se_item_tumble_downwards = 18, se_drain_noises = 19, se_ring_in_drain = 20, se_groans_and_moans = 21, se_scratching = 22, se_glass_shattering = 23, se_egg_cracking = 24, se_gushing_sound = 25, se_glass_crashing = 26, se_egg_splatting = 27, se_sinister_laughter = 28, se_blast = 29, se_stone_breaking = 30, se_stone_crumbling = 31, se_snakes_hissing = 32, se_loud_pop = 33, se_clanking_pipe = 34, se_sewer_song = 35, se_monster_behind_boulder = 36, se_wailing_of_the_banshee = 37, se_swoosh = 38, se_explosion = 39, se_crashing_sound = 40, se_someone_summoning = 41, se_rushing_wind_noise = 42, se_splat_from_engulf = 43, se_faint_sloshing = 44, se_crunching_sound = 45, se_slurping_sound = 46, se_masticating_sound = 47, se_distant_thunder = 48, se_applause = 49, se_shrill_whistle = 50, se_someone_yells = 51, se_door_unlock_and_open = 52, se_door_open = 53, se_door_crash_open = 54, se_dry_throat_rattle = 55, se_cough = 56, se_angry_snakes = 57, se_zap_then_explosion = 58, se_zap = 59, se_horn_being_played = 60, se_mon_chugging_potion = 61, se_bugle_playing_reveille = 62, se_crash_through_floor = 63, se_thump = 64, se_scream = 65, se_tumbler_click = 66, se_gear_turn = 67, se_divine_music = 68, se_thunderclap = 69, se_sad_wailing = 70, se_maniacal_laughter = 71, se_rumbling_of_earth = 72, se_clanging_sound = 73, se_mutter_imprecations = 74, se_mutter_incantation = 75, se_angry_voice = 76, se_sceptor_pounding = 77, se_courtly_conversation = 78, se_low_buzzing = 79, se_angry_drone = 80, se_bees = 81, se_someone_searching = 82, se_guards_footsteps = 83, se_faint_chime = 84, se_loud_click = 85, se_soft_click = 86, se_squeak = 87, se_squeak_C = 88, se_squeak_D_flat = 89, se_squeak_D = 90, se_squeak_E_flat = 91, se_squeak_E = 92, se_squeak_F = 93, se_squeak_F_sharp = 94, se_squeak_G = 95, se_squeak_G_sharp = 96, se_squeak_A = 97, se_squeak_B_flat = 98, se_squeak_B = 99, se_someone_bowling = 100, se_rumbling = 101, se_loud_crash = 102, se_deafening_roar_atmospheric = 103, se_low_hum = 104, se_laughter = 105, se_cockatrice_hiss = 106, se_chant = 107, se_cracking_sound = 108, se_ripping_sound = 109, se_thud = 110, se_clank = 111, se_crumbling_sound = 112, se_soft_crackling = 113, se_crackling = 114, se_sharp_crack = 115, se_wall_of_force = 116, se_alarm = 117, se_kick_door_it_shatters = 118, se_kick_door_it_crashes_open = 119, se_bubble_rising = 120, se_bolt_of_lightning = 121, se_board_squeak = 122, se_board_squeaks_loudly = 123, se_boing = 124, se_crashed_ceiling = 125, se_clash = 126, se_crash_door = 127, se_crash = 128, se_crash_throne_destroyed = 129, se_crash_something_broke = 130, se_kadoom_boulder_falls_in = 131, se_klunk_pipe = 132, se_kerplunk_boulder_gone = 133, se_klunk = 134, se_klick = 135, se_kaboom_door_explodes = 136, se_kaboom_boom_boom = 137, se_kaablamm_of_mine = 138, se_kaboom = 139, se_splat_egg = 140, se_destroy_web = 141, se_iron_ball_dragging_you = 142, se_iron_ball_hits_you = 143, se_lid_slams_open_falls_shut = 144, se_chain_shatters = 145, se_furious_bubbling = 146, se_air_crackles = 147, se_potion_crash_and_break = 148, se_hiss = 149, se_growl = 150, se_canine_bark = 151, se_canine_growl = 152, se_canine_whine = 153, se_canine_yip = 154, se_canine_howl = 155, se_feline_yowl = 156, se_feline_meow = 157, se_feline_purr = 158, se_feline_yip = 159, se_feline_mew = 160, se_roar = 161, se_snarl = 162, se_buzz = 163, se_squeek = 164, se_squawk = 165, se_squeal = 166, se_screech = 167, se_equine_neigh = 168, se_equine_whinny = 169, se_equine_whicker = 170, se_bovine_moo = 171, se_bovine_bellow = 172, se_wail = 173, se_groan = 174, se_grunt = 175, se_gurgle = 176, se_elephant_trumpet = 177, se_snake_rattle = 178, se_hallu_growl = 179, }; #if defined(SND_LIB_QTSOUND) || defined(SND_LIB_PORTAUDIO) \ || defined(SND_LIB_OPENAL) || defined(SND_LIB_SDL_MIXER) \ || defined(SND_LIB_MINIAUDIO) || defined(SND_LIB_FMOD) \ || defined(SND_LIB_SOUND_ESCCODES) || defined(SND_LIB_VISSOUND) \ || defined(SND_LIB_WINDSOUND) #define Soundeffect(seid, vol) \ do { \ if (!Deaf && soundprocs.sound_soundeffect \ && ((soundprocs.sndcap & SNDCAP_SOUNDEFFECTS) != 0)) \ (*soundprocs.sound_soundeffect)(emptystr, (seid), (vol)); \ } while(0) #else #define Soundeffect(seid, vol) #endif #endif /* SNDPROCS_H */