BOOLEAN _ReleaseSoundBankData (MEM_HANDLE Snd) { STRING_TABLEPTR fxTab; LockStringTable (Snd, &fxTab); if (fxTab) { int snd_ct; TFB_SoundSample **sptr; snd_ct = fxTab->StringCount; sptr = (TFB_SoundSample **)((BYTE *)fxTab + fxTab->StringOffsets[0]); while (snd_ct--) { int i; for (i = 0; i < NUM_SOUNDSOURCES; ++i) { if (soundSource[i].sample == (*sptr)) { StopSource (i); soundSource[i].sample = NULL; } } if ((*sptr)->decoder) SoundDecoder_Free ((*sptr)->decoder); audio_DeleteBuffers ((*sptr)->num_buffers, (*sptr)->buffer); HFree ((*sptr)->buffer); if ((*sptr)->buffer_tag) HFree ((*sptr)->buffer_tag); HFree (*sptr); *sptr++ = 0; } UnlockStringTable (Snd); FreeStringTable (Snd); return (TRUE); } return (FALSE); }
MEM_HANDLE _GetSoundBankData (uio_Stream *fp, DWORD length) { int snd_ct, n; DWORD opos; char CurrentLine[1024], filename[1024]; #define MAX_FX 256 TFB_SoundSample *sndfx[MAX_FX]; STRING_TABLE Snd; (void) length; // ignored opos = uio_ftell (fp); { char *s1, *s2; if (_cur_resfile_name == 0 || (((s2 = 0), (s1 = strrchr (_cur_resfile_name, '/')) == 0) && (s2 = strrchr (_cur_resfile_name, '\\')) == 0)) n = 0; else { if (s2 > s1) s1 = s2; n = s1 - _cur_resfile_name + 1; strncpy (filename, _cur_resfile_name, n); } } snd_ct = 0; while (uio_fgets (CurrentLine, sizeof (CurrentLine), fp) && snd_ct < MAX_FX) { if (sscanf(CurrentLine, "%s", &filename[n]) == 1) { log_add (log_Info, "_GetSoundBankData(): loading %s", filename); sndfx[snd_ct] = (TFB_SoundSample *) HCalloc (sizeof (TFB_SoundSample)); sndfx[snd_ct]->decoder = SoundDecoder_Load (contentDir, filename, 4096, 0, 0); if (!sndfx[snd_ct]->decoder) { log_add (log_Warning, "_GetSoundBankData(): couldn't load %s", filename); HFree (sndfx[snd_ct]); } else { uint32 decoded_bytes; decoded_bytes = SoundDecoder_DecodeAll (sndfx[snd_ct]->decoder); log_add (log_Info, "_GetSoundBankData(): decoded_bytes %d", decoded_bytes); sndfx[snd_ct]->num_buffers = 1; sndfx[snd_ct]->buffer = (audio_Object *) HMalloc ( sizeof (audio_Object) * sndfx[snd_ct]->num_buffers); audio_GenBuffers (sndfx[snd_ct]->num_buffers, sndfx[snd_ct]->buffer); audio_BufferData (sndfx[snd_ct]->buffer[0], sndfx[snd_ct]->decoder->format, sndfx[snd_ct]->decoder->buffer, decoded_bytes, sndfx[snd_ct]->decoder->frequency); SoundDecoder_Free (sndfx[snd_ct]->decoder); sndfx[snd_ct]->decoder = NULL; ++snd_ct; } } else { log_add (log_Warning, "_GetSoundBankData: Bad file!"); } // pkunk insult fix 2002/11/12 (ftell shouldn't be needed for loop to terminate) /*if (uio_ftell (fp) - opos >= length) break;*/ } Snd = 0; if (snd_ct && (Snd = AllocStringTable ( sizeof (STRING_TABLE_DESC) + (sizeof (DWORD) * snd_ct) + (sizeof (sndfx[0]) * snd_ct) ))) { STRING_TABLEPTR fxTab; LockStringTable (Snd, &fxTab); if (fxTab == 0) { while (snd_ct--) { if (sndfx[snd_ct]->decoder) SoundDecoder_Free (sndfx[snd_ct]->decoder); HFree (sndfx[snd_ct]); } FreeStringTable (Snd); Snd = 0; } else { DWORD *offs, StringOffs; fxTab->StringCount = snd_ct; fxTab->flags = 0; offs = fxTab->StringOffsets; StringOffs = sizeof (STRING_TABLE_DESC) + (sizeof (DWORD) * snd_ct); memcpy ((BYTE *)fxTab + StringOffs, sndfx, sizeof (sndfx[0]) * snd_ct); do { *offs++ = StringOffs; StringOffs += sizeof (sndfx[0]); } while (snd_ct--); UnlockStringTable (Snd); } } return ((MEM_HANDLE)Snd); }
DIRENTRY_REF LoadDirEntryTable (uio_DirHandle *dirHandle, const char *path, const char *pattern, match_MatchType matchType, PCOUNT pnum_entries) { uio_DirList *dirList; COUNT num_entries, length; COUNT i; COUNT slen; uio_DirHandle *dir; STRING_TABLE StringTable; STRING_TABLEPTR lpST; PSTR lpStr; PDWORD lpLastOffs; dir = uio_openDirRelative (dirHandle, path, 0); assert(dir != NULL); dirList = uio_getDirList (dir, "", pattern, matchType); assert(dirList != NULL); num_entries = 0; length = 0; // First, count the amount of space needed for (i = 0; i < dirList->numNames; i++) { struct stat sb; if (dirList->names[i][0] == '.') { dirList->names[i] = NULL; continue; } if (uio_stat (dir, dirList->names[i], &sb) == -1) { dirList->names[i] = NULL; continue; } if (!S_ISREG (sb.st_mode)) { dirList->names[i] = NULL; continue; } length += strlen (dirList->names[i]) + 1; num_entries++; } uio_closeDir (dir); if (num_entries == 0) { uio_DirList_free(dirList); *pnum_entries = 0; return ((DIRENTRY_REF) 0); } slen = sizeof (STRING_TABLE_DESC) + (num_entries * sizeof (DWORD)); StringTable = AllocResourceData (slen + length, 0); LockStringTable (StringTable, &lpST); if (lpST == 0) { FreeStringTable (StringTable); uio_DirList_free(dirList); *pnum_entries = 0; return ((DIRENTRY_REF) 0); } lpST->StringCount = num_entries; lpLastOffs = &lpST->StringOffsets[0]; *lpLastOffs = slen; lpStr = (PSTR)lpST + slen; for (i = 0; i < dirList->numNames; i++) { int size; if (dirList->names[i] == NULL) continue; size = strlen (dirList->names[i]) + 1; memcpy (lpStr, dirList->names[i], size); lpLastOffs[1] = lpLastOffs[0] + size; lpLastOffs++; lpStr += size; } uio_DirList_free(dirList); *pnum_entries = num_entries; UnlockStringTable (StringTable); return ((DIRENTRY_REF) StringTable); }