+static void InitLevelsetMusicInfo()
+{
+ struct PropertyMapping *property_mapping = getMusicListPropertyMapping();
+ int num_property_mappings = getMusicListPropertyMappingSize();
+ int i, j;
+
+ /* set values to -1 to identify later as "uninitialized" values */
+ for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++)
+ for (j=0; j < MAX_LEVELS; j++)
+ levelset.music[i][j] = -1;
+
+#if 0
+ /* initialize gamemode/music mapping from static configuration */
+ for (i=0; gamemode_to_music[i].element > -1; i++)
+ {
+ int gamemode = gamemode_to_music[i].gamemode;
+ int level = gamemode_to_music[i].level;
+ int music = gamemode_to_music[i].music;
+
+ if (gamemode < 0)
+ gamemode = 0;
+
+ if (level < 0)
+ level = 0;
+
+ levelset.music[gamemode][level] = music;
+ }
+#endif
+
+ /* initialize gamemode/music mapping from dynamic configuration */
+ for (i=0; i < num_property_mappings; i++)
+ {
+ int prefix = property_mapping[i].base_index;
+ int gamemode = property_mapping[i].ext1_index;
+ int level = property_mapping[i].ext2_index;
+ int music = property_mapping[i].artwork_index;
+
+ if (prefix < 0 || prefix >= NUM_MUSIC_PREFIXES)
+ continue;
+
+ if (gamemode < 0)
+ gamemode = 0;
+
+ if (level < 0)
+ level = 0;
+
+ levelset.music[gamemode][level] = music;
+ }
+
+ /* now set all '-1' values to levelset specific default values */
+ for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++)
+ {
+ for (j=0; j < MAX_LEVELS; j++)
+ {
+ /* generic default music */
+ int default_music = levelset.music[i][0]; /* may still be -1 */
+
+ /* no music for this specific game mode and level -- use default music */
+ if (levelset.music[i][j] == -1)
+ levelset.music[i][j] = default_music;
+ }
+ }
+
+#if 0
+ /* TEST ONLY */
+ for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++)
+ for (j=0; j < MAX_LEVELS; j++)
+ if (levelset.music[i][j] != -1)
+ printf("::: levelset.music[%d][%d] == %d\n",
+ i, j, levelset.music[i][j]);
+#endif
+}
+
+static void set_music_parameters(int music, char **parameter_raw)
+{
+ int parameter[NUM_MUS_ARGS];
+ int i;
+
+ /* get integer values from string parameters */
+ for (i=0; i < NUM_MUS_ARGS; i++)
+ parameter[i] =
+ get_parameter_value(music_config_suffix[i].token, parameter_raw[i],
+ music_config_suffix[i].type);
+
+ /* explicit loop mode setting in configuration overrides default value */
+ if (parameter[MUS_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE)
+ music_info[music].loop = parameter[MUS_ARG_MODE_LOOP];
+}
+
+static void InitMusicInfo()
+{
+ int num_music = getMusicListSize();
+ int i, j;
+
+ if (music_info != NULL)
+ free(music_info);
+
+ music_info = checked_calloc(num_music * sizeof(struct MusicInfo));
+
+ for (i=0; i < num_music; i++)
+ {
+ struct FileInfo *music = getMusicListEntry(i);
+ int len_music_text = strlen(music->token);
+
+ music_info[i].loop = TRUE; /* default: play music in loop mode */
+
+ /* determine all loop music */
+
+ for (j=0; music_prefix_info[j].prefix; j++)
+ {
+ int len_prefix_text = strlen(music_prefix_info[j].prefix);
+
+ if (len_prefix_text < len_music_text &&
+ strncmp(music->token,
+ music_prefix_info[j].prefix, len_prefix_text) == 0)
+ {
+ music_info[i].loop = music_prefix_info[j].is_loop_music;
+
+ break;
+ }
+ }
+
+ set_music_parameters(i, music->parameter);
+ }
+}
+