X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=0299521267dd802ccd5024467a15590fb286ed22;hb=5ae04ac2ef54f6f164a797c16c9782042cc2ce67;hp=214b27bf8299de7d20d7705d24f8653a1a5fc0bb;hpb=f4fa296527b424d80cb6ed86809986455613783c;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index 214b27bf..02995212 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -149,9 +149,14 @@ struct SoundControl typedef struct SoundControl SoundControl; static struct ArtworkListInfo *sound_info = NULL; +#if 0 static SoundInfo **Sound = NULL; +#endif static MusicInfo **Music = NULL; -static int num_sounds = 0, num_music = 0; +#if 0 +static int num_sounds = 0; +#endif +static int num_music = 0; static int stereo_volume[SOUND_MAX_LEFT2RIGHT + 1]; @@ -175,6 +180,8 @@ static void ReloadCustomSounds(); static void ReloadCustomMusic(); static void FreeSound(void *); +static SoundInfo *getSoundInfoEntryFromSoundID(int); + /* ------------------------------------------------------------------------- */ /* functions for native (non-SDL) Unix audio/mixer support */ @@ -253,13 +260,15 @@ static boolean ForkAudioProcess(void) return FALSE; } + if (audio.mixer_pid == 0) /* we are the child process */ + audio.mixer_pid = getpid(); + #if 0 - printf("PID: %d [%s]\n", getpid(), - (IS_CHILD_PROCESS(audio.mixer_pid) ? "child" : "parent")); + printf("PID: %d [%s]\n", getpid(),(IS_CHILD_PROCESS() ? "child" : "parent")); Delay(10000 * 0); #endif - if (IS_CHILD_PROCESS(audio.mixer_pid)) + if (IS_CHILD_PROCESS()) Mixer_Main(); /* this function never returns */ else close(audio.mixer_pipe[0]); /* no reading from pipe needed */ @@ -290,7 +299,7 @@ void UnixCloseAudio(void) if (audio.device_fd) close(audio.device_fd); - if (IS_PARENT_PROCESS(audio.mixer_pid)) + if (IS_PARENT_PROCESS() && HAS_CHILD_PROCESS()) kill(audio.mixer_pid, SIGTERM); } @@ -457,7 +466,7 @@ static void InitAudioDevice(struct AudioFormatInfo *afmt) static void SendSoundControlToMixerProcess(SoundControl *snd_ctrl) { - if (IS_CHILD_PROCESS(audio.mixer_pid)) + if (IS_CHILD_PROCESS()) return; if (write(audio.mixer_pipe[1], snd_ctrl, sizeof(SoundControl)) < 0) @@ -470,7 +479,7 @@ static void SendSoundControlToMixerProcess(SoundControl *snd_ctrl) static void ReadSoundControlFromMainProcess(SoundControl *snd_ctrl) { - if (IS_PARENT_PROCESS(audio.mixer_pid)) + if (IS_PARENT_PROCESS()) return; if (read(audio.mixer_pipe[0], snd_ctrl, sizeof(SoundControl)) @@ -492,7 +501,7 @@ static void WriteReloadInfoToPipe(char *set_identifier, int type) setup.override_level_sounds : setup.override_level_music); - if (IS_CHILD_PROCESS(audio.mixer_pid)) + if (IS_CHILD_PROCESS()) return; if (leveldir_current == NULL) /* should never happen */ @@ -814,6 +823,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) { SoundInfo *snd_info; int i, k; + int num_sounds = getSoundListSize(); #if 0 printf("NEW SOUND %d ARRIVED [%d] [%d ACTIVE CHANNELS]\n", @@ -830,7 +840,13 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) else if (snd_ctrl.nr >= num_sounds) return; +#if 0 snd_info = (IS_MUSIC(snd_ctrl) ? Music[snd_ctrl.nr] : Sound[snd_ctrl.nr]); +#else + snd_info = (IS_MUSIC(snd_ctrl) ? Music[snd_ctrl.nr] : + getSoundInfoEntryFromSoundID(snd_ctrl.nr)); +#endif + if (snd_info == NULL) return; @@ -1012,7 +1028,7 @@ static void HandleSoundRequest(SoundControl snd_ctrl) int i; #if defined(AUDIO_UNIX_NATIVE) - if (IS_PARENT_PROCESS(audio.mixer_pid)) + if (IS_PARENT_PROCESS()) { SendSoundControlToMixerProcess(&snd_ctrl); return; @@ -1765,41 +1781,120 @@ static void *Load_WAV(char *filename) return snd_info; } -struct FileInfo *getCurrentSoundList() +int getSoundListSize() { - return sound_info->file_list; + return (sound_info->num_file_list_entries + + sound_info->num_dynamic_file_list_entries); } -void InitSoundList(struct ConfigInfo *config_list, +struct FileInfo *getSoundListEntry(int pos) +{ + int num_list_entries = sound_info->num_file_list_entries; + int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); + + return (pos < num_list_entries ? &sound_info->file_list[list_pos] : + &sound_info->dynamic_file_list[list_pos]); +} + +static SoundInfo *getSoundInfoEntryFromSoundID(int pos) +{ + int num_list_entries = sound_info->num_file_list_entries; + int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); + SoundInfo **snd_info = + (SoundInfo **)(pos < num_list_entries ? sound_info->artwork_list : + sound_info->dynamic_artwork_list); + + return snd_info[list_pos]; +} + +int getSoundListPropertyMappingSize() +{ + return sound_info->num_property_mapping_entries; +} + +struct PropertyMapping *getSoundListPropertyMapping() +{ + return sound_info->property_mapping; +} + +void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries, struct ConfigInfo *config_suffix_list, - int num_file_list_entries) + char **base_prefixes, char **ext1_suffixes, + char **ext2_suffixes, char **ext3_suffixes, + char **ignore_tokens) { int i; sound_info = checked_calloc(sizeof(struct ArtworkListInfo)); - sound_info->type = ARTWORK_TYPE_SOUNDS; + /* ---------- initialize file list and suffix lists ---------- */ + sound_info->num_file_list_entries = num_file_list_entries; + sound_info->num_dynamic_file_list_entries = 0; + + sound_info->file_list = + getFileListFromConfigList(config_list, config_suffix_list, ignore_tokens, + num_file_list_entries); + sound_info->dynamic_file_list = NULL; + sound_info->num_suffix_list_entries = 0; for (i=0; config_suffix_list[i].token != NULL; i++) sound_info->num_suffix_list_entries++; - sound_info->file_list = - getFileListFromConfigList(config_list, config_suffix_list, - num_file_list_entries); sound_info->suffix_list = config_suffix_list; + /* ---------- initialize base prefix and suffixes lists ---------- */ + + sound_info->num_base_prefixes = 0; + for (i=0; base_prefixes[i] != NULL; i++) + sound_info->num_base_prefixes++; + + sound_info->num_ext1_suffixes = 0; + for (i=0; ext1_suffixes[i] != NULL; i++) + sound_info->num_ext1_suffixes++; + + sound_info->num_ext2_suffixes = 0; + for (i=0; ext2_suffixes[i] != NULL; i++) + sound_info->num_ext2_suffixes++; + + sound_info->num_ext3_suffixes = 0; + for (i=0; ext3_suffixes[i] != NULL; i++) + sound_info->num_ext3_suffixes++; + + sound_info->num_ignore_tokens = 0; + for (i=0; ignore_tokens[i] != NULL; i++) + sound_info->num_ignore_tokens++; + + sound_info->base_prefixes = base_prefixes; + sound_info->ext1_suffixes = ext1_suffixes; + sound_info->ext2_suffixes = ext2_suffixes; + sound_info->ext3_suffixes = ext3_suffixes; + sound_info->ignore_tokens = ignore_tokens; + + sound_info->num_property_mapping_entries = 0; + + sound_info->property_mapping = NULL; + + /* ---------- initialize artwork reference and content lists ---------- */ + + sound_info->sizeof_artwork_list_entry = sizeof(SoundInfo *); + sound_info->artwork_list = checked_calloc(num_file_list_entries * sizeof(SoundInfo *)); + sound_info->dynamic_artwork_list = NULL; sound_info->content_list = NULL; + /* ---------- initialize artwork loading/freeing functions ---------- */ + sound_info->load_artwork = Load_WAV; sound_info->free_artwork = FreeSound; +#if 0 num_sounds = sound_info->num_file_list_entries; Sound = (SoundInfo **)sound_info->artwork_list; +#endif } static MusicInfo *Load_MOD(char *filename) @@ -1883,7 +1978,7 @@ void LoadCustomMusic(void) { num_music++; Music = checked_realloc(Music, num_music * sizeof(MusicInfo *)); - Music[num_music -1] = mus_info; + Music[num_music - 1] = mus_info; } } @@ -2010,7 +2105,12 @@ static void ReloadCustomSounds() printf("DEBUG: reloading sounds '%s' ...\n", artwork.snd_current_identifier); #endif + LoadArtworkConfig(sound_info); ReloadCustomArtworkList(sound_info); + +#if 0 + num_sounds = getSoundListSize(); +#endif } static void ReloadCustomMusic() @@ -2022,19 +2122,20 @@ static void ReloadCustomMusic() LoadCustomMusic(); } -void InitReloadSounds(char *set_identifier) +void InitReloadCustomSounds(char *set_identifier) { if (!audio.sound_available) return; #if defined(AUDIO_UNIX_NATIVE) + LoadArtworkConfig(sound_info); /* also load config on sound client */ WriteReloadInfoToPipe(set_identifier, SND_CTRL_RELOAD_SOUNDS); #else ReloadCustomSounds(); #endif } -void InitReloadMusic(char *set_identifier) +void InitReloadCustomMusic(char *set_identifier) { if (!audio.music_available) return; @@ -2094,7 +2195,7 @@ void FreeMusic(MusicInfo *music) void FreeAllSounds() { - FreeCustomArtworkList(sound_info); + FreeCustomArtworkLists(sound_info); } void FreeAllMusic()