From e7051737d70f3c253db4ded9bd71e46d002da404 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Oct 2020 15:00:31 -0700 Subject: [PATCH 1/4] Use 2.2's musicdef parser --- src/s_sound.c | 269 ++++++++++++++++++++++++++++---------------------- 1 file changed, 149 insertions(+), 120 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index ce62cb3e2..481eb6822 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1598,11 +1598,6 @@ static tic_t pause_starttic; /// Music Definitions /// ------------------------ -enum -{ - MUSICDEF_20, -}; - musicdef_t *musicdefstart = NULL; struct cursongcredit cursongcredit; // Currently displayed song credit info int musicdef_volume; @@ -1623,147 +1618,181 @@ static UINT16 W_CheckForMusicDefInPwad(UINT16 wadid) return INT16_MAX; // not found } -void S_LoadMusicDefs(UINT16 wadnum) +static boolean +ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) { - UINT16 lump; - char *buf; - char *buf2; - char *stoken; + musicdef_t *def; + char *value; - size_t size; - musicdef_t *def, *prev; - UINT16 line = 1; // for better error msgs + char *textline; - lump = W_CheckForMusicDefInPwad(wadnum); - if (lump == INT16_MAX) - return; - - buf = W_CacheLumpNumPwad(wadnum, lump, PU_CACHE); - size = W_LumpLengthPwad(wadnum, lump); - - // for strtok - buf2 = malloc(size+1); - if (!buf2) - I_Error("S_LoadMusicDefs: No more free memory\n"); - M_Memcpy(buf2,buf,size); - buf2[size] = '\0'; - - def = prev = NULL; - - stoken = strtok (buf2, "\r\n "); - // Find music def - while (stoken) + if (!stricmp(stoken, "lump")) { - /*if ((stoken[0] == '/' && stoken[1] == '/') - || (stoken[0] == '#')) // skip comments + value = strtok(NULL, " "); + if (!value) { - stoken = strtok(NULL, "\r\n"); // skip end of line - if (def) - stoken = strtok(NULL, "\r\n= "); - else - stoken = strtok(NULL, "\r\n "); - line++; - } - else*/ if (!stricmp(stoken, "lump")) - { - value = strtok(NULL, "\r\n "); - - if (!value) - { - CONS_Alert(CONS_WARNING, "MUSICDEF: Lump '%s' is missing name. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line); - stoken = strtok(NULL, "\r\n"); // skip end of line - goto skip_lump; - } - - // No existing musicdefs - if (!musicdefstart) - { - musicdefstart = Z_Calloc(sizeof (musicdef_t), PU_STATIC, NULL); - STRBUFCPY(musicdefstart->name, value); - strlwr(musicdefstart->name); - def = musicdefstart; - //CONS_Printf("S_LoadMusicDefs: Initialized musicdef w/ song '%s'\n", def->name); - } - else - { - def = musicdefstart; - - // Search if this is a replacement - //CONS_Printf("S_LoadMusicDefs: Searching for song replacement...\n"); - while (def) - { - if (!stricmp(def->name, value)) - { - //CONS_Printf("S_LoadMusicDefs: Found song replacement '%s'\n", def->name); - break; - } - - prev = def; - def = def->next; - } - - // Nothing found, add to the end. - if (!def) - { - def = Z_Calloc(sizeof (musicdef_t), PU_STATIC, NULL); - STRBUFCPY(def->name, value); - strlwr(def->name); - if (prev != NULL) - prev->next = def; - //CONS_Printf("S_LoadMusicDefs: Added song '%s'\n", def->name); - } - } - - def->volume = DEFAULT_MUSICDEF_VOLUME; - -skip_lump: - stoken = strtok(NULL, "\r\n "); - line++; + CONS_Alert(CONS_WARNING, + "MUSICDEF: Field '%s' is missing name. (file %s, line %d)\n", + stoken, wadfiles[wadnum]->filename, line); + return false; } else { - value = strtok(NULL, "\r\n= "); + musicdef_t **tail = &musicdefstart; - if (!value) + // Search if this is a replacement + while (*tail) { - CONS_Alert(CONS_WARNING, "MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line); - stoken = strtok(NULL, "\r\n"); // skip end of line - goto skip_field; + if (!stricmp((*tail)->name, value)) + { + break; + } + + tail = &(*tail)->next; } + // Nothing found, add to the end. + if (!(*tail)) + { + def = Z_Calloc(sizeof (musicdef_t), PU_STATIC, NULL); + + STRBUFCPY(def->name, value); + strlwr(def->name); + def->volume = DEFAULT_MUSICDEF_VOLUME; + + (*tail) = def; + } + + (*defp) = (*tail); + } + } + else + { + value = strtok(NULL, ""); + + if (value) + { + // Find the equals sign. + value = strchr(value, '='); + } + + if (!value) + { + CONS_Alert(CONS_WARNING, + "MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n", + stoken, wadfiles[wadnum]->filename, line); + return false; + } + else + { + def = (*defp); + if (!def) { - CONS_Alert(CONS_ERROR, "MUSICDEF: No music definition before field '%s'. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line); - free(buf2); - return; + CONS_Alert(CONS_ERROR, + "MUSICDEF: No music definition before field '%s'. (file %s, line %d)\n", + stoken, wadfiles[wadnum]->filename, line); + return false; } + // Skip the equals sign. + value++; + + // Now skip funny whitespace. + value += strspn(value, "\t "); + + textline = value; + + /* based ignored lumps */ if (!stricmp(stoken, "usage")) { #if 0 // Ignore for now - STRBUFCPY(def->usage, value); - for (value = def->usage; *value; value++) - if (*value == '_') *value = ' '; // turn _ into spaces. - //CONS_Printf("S_LoadMusicDefs: Set usage to '%s'\n", def->usage); + STRBUFCPY(def->usage, textline); #endif } else if (!stricmp(stoken, "source")) { - STRBUFCPY(def->source, value); - for (value = def->source; *value; value++) - if (*value == '_') *value = ' '; // turn _ into spaces. - //CONS_Printf("S_LoadMusicDefs: Set source to '%s'\n", def->source); + STRBUFCPY(def->source, textline); } else if (!stricmp(stoken, "volume")) { - def->volume = atoi(value); + def->volume = atoi(textline); } else { - CONS_Alert(CONS_WARNING, "MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line); + CONS_Alert(CONS_WARNING, + "MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", + stoken, wadfiles[wadnum]->filename, line); } - -skip_field: - stoken = strtok(NULL, "\r\n= "); - line++; } } - free(buf2); - return; + return true; +} + +void S_LoadMusicDefs(UINT16 wadnum) +{ + UINT16 lumpnum; + char *lump; + char *musdeftext; + size_t size; + + char *lf; + char *stoken; + + size_t nlf; + size_t ncr; + + musicdef_t *def = NULL; + int line = 1; // for better error msgs + + lumpnum = W_CheckForMusicDefInPwad(wadnum); + if (lumpnum == INT16_MAX) + return; + + lump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); + size = W_LumpLengthPwad(wadnum, lumpnum); + + // Null-terminated MUSICDEF lump. + musdeftext = malloc(size+1); + if (!musdeftext) + I_Error("S_LoadMusicDefs: No more free memory for the parser\n"); + M_Memcpy(musdeftext, lump, size); + musdeftext[size] = '\0'; + + // Find music def + stoken = musdeftext; + for (;;) + { + lf = strpbrk(stoken, "\r\n"); + if (lf) + { + if (*lf == '\n') + nlf = 1; + else + nlf = 0; + *lf++ = '\0';/* now we can delimit to here */ + } + + stoken = strtok(stoken, " "); + if (stoken) + { + if (! ReadMusicDefFields(wadnum, line, stoken, &def)) + break; + } + + if (lf) + { + do + { + line += nlf; + ncr = strspn(lf, "\r");/* skip CR */ + lf += ncr; + nlf = strspn(lf, "\n"); + lf += nlf; + } + while (nlf || ncr) ; + + stoken = lf;/* now the next nonempty line */ + } + else + break;/* EOF */ + } + + free(musdeftext); } // From d896fee2e501aa547c2a6a4cc9a7e7d339fd423f Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Oct 2020 15:45:10 -0700 Subject: [PATCH 2/4] Load multiple musicdef lumps from a single wad --- src/s_sound.c | 94 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index 481eb6822..a7d45e160 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1602,25 +1602,37 @@ musicdef_t *musicdefstart = NULL; struct cursongcredit cursongcredit; // Currently displayed song credit info int musicdef_volume; -// -// search for music definition in wad -// -static UINT16 W_CheckForMusicDefInPwad(UINT16 wadid) -{ - UINT16 i; - lumpinfo_t *lump_p; +static boolean +MusicDefError +( + alerttype_t level, + const char * description, + const char * field, + lumpnum_t lumpnum, + int line +){ + const wadfile_t * wad = wadfiles[WADFILENUM (lumpnum)]; + const lumpinfo_t * lump = &wad->lumpinfo[LUMPNUM (lumpnum)]; - lump_p = wadfiles[wadid]->lumpinfo; - for (i = 0; i < wadfiles[wadid]->numlumps; i++, lump_p++) - if (memcmp(lump_p->name, "MUSICDEF", 8) == 0) - return i; + CONS_Alert(level, + va("%%s|%%s: %s (line %%d)\n", description), + wad->filename, + lump->fullname, + field, + line + ); - return INT16_MAX; // not found + return false; } static boolean -ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) -{ +ReadMusicDefFields +( + lumpnum_t lumpnum, + int line, + char * stoken, + musicdef_t ** defp +){ musicdef_t *def; char *value; @@ -1631,10 +1643,9 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) value = strtok(NULL, " "); if (!value) { - CONS_Alert(CONS_WARNING, - "MUSICDEF: Field '%s' is missing name. (file %s, line %d)\n", - stoken, wadfiles[wadnum]->filename, line); - return false; + return MusicDefError(CONS_WARNING, + "Field '%'s is missing name.", + stoken, lumpnum, line); } else { @@ -1678,10 +1689,9 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) if (!value) { - CONS_Alert(CONS_WARNING, - "MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n", - stoken, wadfiles[wadnum]->filename, line); - return false; + return MusicDefError(CONS_WARNING, + "Field '%s' is missing value.", + stoken, lumpnum, line); } else { @@ -1689,10 +1699,9 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) if (!def) { - CONS_Alert(CONS_ERROR, - "MUSICDEF: No music definition before field '%s'. (file %s, line %d)\n", - stoken, wadfiles[wadnum]->filename, line); - return false; + return MusicDefError(CONS_ERROR, + "No music definition before field '%s'.", + stoken, lumpnum, line); } // Skip the equals sign. @@ -1713,9 +1722,9 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) } else if (!stricmp(stoken, "volume")) { def->volume = atoi(textline); } else { - CONS_Alert(CONS_WARNING, - "MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", - stoken, wadfiles[wadnum]->filename, line); + MusicDefError(CONS_WARNING, + "Unknown field '%s'.", + stoken, lumpnum, line); } } } @@ -1723,9 +1732,8 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) return true; } -void S_LoadMusicDefs(UINT16 wadnum) +static void S_LoadMusicDefLump(lumpnum_t lumpnum) { - UINT16 lumpnum; char *lump; char *musdeftext; size_t size; @@ -1739,12 +1747,8 @@ void S_LoadMusicDefs(UINT16 wadnum) musicdef_t *def = NULL; int line = 1; // for better error msgs - lumpnum = W_CheckForMusicDefInPwad(wadnum); - if (lumpnum == INT16_MAX) - return; - - lump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); - size = W_LumpLengthPwad(wadnum, lumpnum); + lump = W_CacheLumpNum(lumpnum, PU_CACHE); + size = W_LumpLength(lumpnum); // Null-terminated MUSICDEF lump. musdeftext = malloc(size+1); @@ -1770,7 +1774,7 @@ void S_LoadMusicDefs(UINT16 wadnum) stoken = strtok(stoken, " "); if (stoken) { - if (! ReadMusicDefFields(wadnum, line, stoken, &def)) + if (! ReadMusicDefFields(lumpnum, line, stoken, &def)) break; } @@ -1795,6 +1799,20 @@ void S_LoadMusicDefs(UINT16 wadnum) free(musdeftext); } +void S_LoadMusicDefs(UINT16 wad) +{ + const lumpnum_t wadnum = wad << 16; + + UINT16 lump = 0; + + while (( lump = W_CheckNumForNamePwad("MUSICDEF", wad, lump) ) != INT16_MAX) + { + S_LoadMusicDefLump(wadnum | lump); + + lump++; + } +} + // // S_InitMusicDefs // From 7199bba3b201269a9efe4f92a3e7ed16f49ad9ac Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Oct 2020 15:51:36 -0700 Subject: [PATCH 3/4] Update musicdef conversion utility --- tools/musicdef-2.2.1/musicdef-2.2.1.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/musicdef-2.2.1/musicdef-2.2.1.c b/tools/musicdef-2.2.1/musicdef-2.2.1.c index 65d434c8a..92a999da8 100644 --- a/tools/musicdef-2.2.1/musicdef-2.2.1.c +++ b/tools/musicdef-2.2.1/musicdef-2.2.1.c @@ -54,9 +54,8 @@ main (int ac, char **av) if (( var = strtok(buf, " =") )) { if (!( - strcasecmp(var, "TITLE") && - strcasecmp(var, "ALTTITLE") && - strcasecmp(var, "AUTHORS") + strcasecmp(var, "USAGE") && + strcasecmp(var, "SOURCE") )){ if (( val = strtok(0, "") )) { From f5329f25bf94a8f8bc3d56e8e4ea3bcd68814309 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 27 Oct 2020 17:20:57 -0700 Subject: [PATCH 4/4] Use music.pk3 --- src/d_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.c b/src/d_main.c index bf15d5bd7..db0f74fb2 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1116,7 +1116,7 @@ static void IdentifyVersion(void) } MUSICTEST("sounds.wad") - MUSICTEST("music.wad") + MUSICTEST("music.pk3") #undef MUSICTEST