X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=835adab8f71e876904fe37ff537c93006c81ed27;hb=8e0c58b2a77c271b485e403cc6edd6ba6e0125cc;hp=a242713161fd2dd111f19257c8078a76f414ccdf;hpb=87f531efe267aa3d6a27cc3a68c68c1a4df7b18b;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index a2427131..835adab8 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -152,23 +152,7 @@ struct SoundControl }; typedef struct SoundControl SoundControl; -struct ListNode -{ - char *key; - void *content; - struct ListNode *next; -}; -typedef struct ListNode ListNode; - -static ListNode *newListNode(void); -static void addNodeToList(ListNode **, char *, void *); -static void deleteNodeFromList(ListNode **, char *, void (*function)(void *)); -static ListNode *getNodeFromKey(ListNode *, char *); -static int getNumNodes(ListNode *); - - -static struct SoundEffectInfo *sound_effect; -static ListNode *SoundFileList = NULL; +static struct ArtworkListInfo *sound_info = NULL; static SoundInfo **Sound = NULL; static MusicInfo **Music = NULL; static int num_sounds = 0, num_music = 0; @@ -972,11 +956,16 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) unsigned long playing_current = Counter(); int longest = 0, longest_nr = audio.first_sound_channel; +#if 0 +#if DEBUG + /* print some debugging information about audio channel usage */ for (i=audio.first_sound_channel; isource_filename; - -#if 0 - printf("[decrementing reference counter of sound '%s']\n", filename); -#endif - - if (--(*snd_info)->num_references <= 0) - { -#if 0 - printf("[deleting sound '%s']\n", filename); -#endif - - /* - FreeSound(*snd_info); - */ - deleteNodeFromList(&SoundFileList, filename, FreeSound); - } - - *snd_info = NULL; - } + return sound_info->file_list; } -static void replaceSoundEntry(SoundInfo **snd_info, char *filename) +void InitSoundList(struct ConfigInfo *config_list, + struct ConfigInfo *config_suffix_list, + int num_file_list_entries) { - ListNode *node; - - /* check if the old and the new sound file are the same */ - if (*snd_info && strcmp((*snd_info)->source_filename, filename) == 0) - { - /* The old and new sound are the same (have the same filename and path). - This usually means that this sound does not exist in this sound set - and a fallback to the existing sound is done. */ - -#if 0 - printf("[sound '%s' already exists (same list entry)]\n", filename); -#endif - - return; - } - - /* delete existing sound file entry */ - deleteSoundEntry(snd_info); - - /* check if the new sound file already exists in the list of sounds */ - if ((node = getNodeFromKey(SoundFileList, filename)) != NULL) - { -#if 0 - printf("[sound '%s' already exists (other list entry)]\n", filename); -#endif - - *snd_info = (SoundInfo *)node->content; - (*snd_info)->num_references++; - } - else if ((*snd_info = Load_WAV(filename)) != NULL) /* load new sound */ - { - (*snd_info)->num_references = 1; - addNodeToList(&SoundFileList, (*snd_info)->source_filename, *snd_info); - } -} - -static void LoadCustomSound(SoundInfo **snd_info, char *basename) -{ - char *filename = getCustomSoundFilename(basename); - -#if 0 - printf("GOT CUSTOM SOUND FILE '%s'\n", filename); -#endif - - if (strcmp(basename, SND_FILE_UNDEFINED) == 0) - { - deleteSoundEntry(snd_info); - return; - } + int i; - if (filename == NULL) - { - Error(ERR_WARN, "cannot find sound file '%s'", basename); - return; - } + sound_info = checked_calloc(sizeof(struct ArtworkListInfo)); - replaceSoundEntry(snd_info, filename); -} + sound_info->type = ARTWORK_TYPE_SOUNDS; -void InitSoundList(struct SoundEffectInfo *sounds_list, int num_list_entries) -{ - if (Sound == NULL) - Sound = checked_calloc(num_list_entries * sizeof(SoundInfo *)); + sound_info->num_file_list_entries = num_file_list_entries; + sound_info->num_suffix_list_entries = 0; + for (i=0; config_suffix_list[i].token != NULL; i++) + sound_info->num_suffix_list_entries++; - sound_effect = sounds_list; - num_sounds = num_list_entries; -} + sound_info->file_list = + getFileListFromConfigList(config_list, config_suffix_list, + num_file_list_entries); + sound_info->suffix_list = config_suffix_list; -void LoadSoundToList(char *basename, int list_pos) -{ - if (Sound == NULL || list_pos >= num_sounds) - return; + sound_info->artwork_list = + checked_calloc(num_file_list_entries * sizeof(SoundInfo *)); -#if 0 - printf("loading sound '%s' ... [%d]\n", - basename, getNumNodes(SoundFileList)); -#endif + sound_info->content_list = NULL; - LoadCustomSound(&Sound[list_pos], basename); + sound_info->load_artwork = Load_WAV; + sound_info->free_artwork = FreeSound; -#if 0 - printf("loading sound '%s' done [%d]\n", - basename, getNumNodes(SoundFileList)); -#endif + num_sounds = sound_info->num_file_list_entries; + Sound = (SoundInfo **)sound_info->artwork_list; } static MusicInfo *Load_MOD(char *filename) @@ -2053,157 +1966,13 @@ void StopSoundExt(int nr, int state) HandleSoundRequest(snd_ctrl); } -ListNode *newListNode() -{ - return checked_calloc(sizeof(ListNode)); -} - -void addNodeToList(ListNode **node_first, char *key, void *content) -{ - ListNode *node_new = newListNode(); - -#if 0 - printf("LIST: adding node with key '%s'\n", key); -#endif - - node_new->key = getStringCopy(key); - node_new->content = content; - node_new->next = *node_first; - *node_first = node_new; -} - -void deleteNodeFromList(ListNode **node_first, char *key, - void (*destructor_function)(void *)) -{ - if (node_first == NULL || *node_first == NULL) - return; - -#if 0 - printf("[CHECKING LIST KEY '%s' == '%s']\n", - (*node_first)->key, key); -#endif - - if (strcmp((*node_first)->key, key) == 0) - { -#if 0 - printf("[DELETING LIST ENTRY]\n"); -#endif - - free((*node_first)->key); - if (destructor_function) - destructor_function((*node_first)->content); - *node_first = (*node_first)->next; - } - else - deleteNodeFromList(&(*node_first)->next, key, destructor_function); -} - -ListNode *getNodeFromKey(ListNode *node_first, char *key) -{ - if (node_first == NULL) - return NULL; - - if (strcmp(node_first->key, key) == 0) - return node_first; - else - return getNodeFromKey(node_first->next, key); -} - -int getNumNodes(ListNode *node_first) -{ - return (node_first ? 1 + getNumNodes(node_first->next) : 0); -} - -void dumpList(ListNode *node_first) -{ - ListNode *node = node_first; - - while (node) - { - printf("['%s' (%d)]\n", node->key, - ((SoundInfo *)node->content)->num_references); - node = node->next; - } - - printf("[%d nodes]\n", getNumNodes(node_first)); -} - -static void LoadSoundsInfo() -{ - char *filename = getCustomSoundConfigFilename(); - struct SetupFileList *setup_file_list; - int i; - -#if 0 - printf("GOT CUSTOM SOUND CONFIG FILE '%s'\n", filename); -#endif - - /* always start with reliable default values */ - for (i=0; i '%s'\n", sound_effect[i].filename); - else - printf("-> UNDEFINED [-> '%s']\n", sound_effect[i].default_filename); - } -#endif - } -} - static void ReloadCustomSounds() { - static boolean draw_init_text = TRUE; /* only draw at startup */ - int i; - -#if 0 - printf("DEBUG: reloading sounds '%s' ...\n",artwork.snd_current_identifier); -#endif - - LoadSoundsInfo(); - - if (draw_init_text) - DrawInitText("Loading sounds:", 120, FC_GREEN); - #if 0 - printf("DEBUG: reloading %d sounds ...\n", num_sounds); + printf("DEBUG: reloading sounds '%s' ...\n", artwork.snd_current_identifier); #endif - for(i=0; i