diff --git a/src/sfxd.c b/src/sfxd.c index 74abc41..fd5a318 100644 --- a/src/sfxd.c +++ b/src/sfxd.c @@ -1,8 +1,10 @@ #include "common.h" #include "miniaudio.h" #include +#include #include #include +#include #include #include #include @@ -33,6 +35,8 @@ struct audio_data { struct sfx_pool { struct sfx_pool_item { char key[KEY_LENGTH]; + char path[PATH_MAX]; + ma_sound *sounds; int last_index; @@ -62,8 +66,17 @@ struct ipc_data ipc = { 0 }; struct audio_data audio = { 0 }; struct sfx_pool sounds_pool = { 0, 0, 0 }; -void usage(int argc, char **argv) { +#ifndef NO_COUNTERS +struct global_counters { + uint64_t pool_read; + uint64_t pool_write; + uint64_t hash_misses_write; + uint64_t hash_misses_read; +} global_counters = { 0 }; +#endif +void usage(int argc, char **argv) { + // TODO } int main(int argc, char **argv) { @@ -177,7 +190,7 @@ void execute_command(struct msg_target tgt, const char *command, const char *par send_txt(tgt, "DBG: pool overflow: %d/%d (%.3f%%)\n", sounds_pool.use, sounds_pool.cap, 100.0 * sounds_pool.use / (float)sounds_pool.cap); - sfx_pool_grow(sounds_pool.cap + 32); + sfx_pool_grow((int)(sounds_pool.cap * 1.5)); } send_txt(tgt, "Loading audio key=%s from %s\n", key, path); @@ -256,15 +269,29 @@ void execute_command(struct msg_target tgt, const char *command, const char *par } else if (0 == strcmp(command, "dump")) { for (int i = 0; i < sounds_pool.cap; i++) { struct sfx_pool_item item = sounds_pool.sounds[i]; - if (item.key[0] != '\0') { + if (item.key[0] == '\0') { + send_txt(tgt, "%3d (unused)\n", i); + } else { send_txt(tgt, "%3d vol=%7.5f pitch=%7.5f..%7.5f @%2d (0x%08x) \"%s\"\n", i, item.volume, item.pitch_min, item.pitch_max, item.last_index, adler32(item.key, strlen(item.key)), item.key); } } } else if (0 == strcmp(command, "source")) { execute_file(tgt, params, 0); + } else if (0 == strcmp(command, "dbg:counters")) { +#ifdef NO_COUNTERS + send_txt(tgt, "ERR: counters are disabled at compile-time with NO_COUNTERS feature flag."); +#else + send_txt(tgt, ".pool_read = %ld\n", global_counters.pool_read); + send_txt(tgt, ".pool_write = %ld\n", global_counters.pool_write); + send_txt(tgt, ".hash_misses_read = %ld\n", global_counters.hash_misses_read); + send_txt(tgt, ".hash_misses_write = %ld\n", global_counters.hash_misses_write); + send_txt(tgt, ".pool.use = %d\n", sounds_pool.use); + send_txt(tgt, ".pool.cap = %d\n", sounds_pool.cap); +#endif } else if (0 == strcmp(command, "")) { - + } else { + send_txt(tgt, "ERR: unknown command: %s\n", command); } // commands } @@ -336,6 +363,12 @@ void sfx_pool_grow(int size) { uint32_t new_hash = adler32(sounds_pool.sounds[i].key, strlen(sounds_pool.sounds[i].key)); for (int offset = 0; offset < size; offset++) { int index = (new_hash + offset) % size; +#ifndef NO_COUNTERS + global_counters.pool_write++; + if (offset != 0) { + global_counters.hash_misses_write++; + } +#endif if (new_items[index].key[0] == '\0') { memcpy(&new_items[index], &sounds_pool.sounds[i], sizeof(struct sfx_pool_item)); used++; @@ -356,6 +389,12 @@ struct sfx_pool_item *sfx_pool_lookup(const char *key) { for (int offset = 0; offset < sounds_pool.cap; offset++) { int index = (hash + offset) % sounds_pool.cap; if (0 == strncmp(key, sounds_pool.sounds[index].key, KEY_LENGTH)) { +#ifndef NO_COUNTERS + global_counters.pool_read++; + if (offset != 0) { + global_counters.hash_misses_read++; + } +#endif return &sounds_pool.sounds[index]; } } @@ -367,6 +406,12 @@ struct sfx_pool_item *sfx_pool_find_place_for(const char *key) { for (int offset = 0; offset < sounds_pool.cap; offset++) { int index = (hash + offset) % sounds_pool.cap; if (sounds_pool.sounds[index].key[0] == '\0' || 0 == strncmp(sounds_pool.sounds[index].key, key, KEY_LENGTH)) { +#ifndef NO_COUNTERS + global_counters.pool_write++; + if (offset != 0) { + global_counters.hash_misses_write++; + } +#endif return &sounds_pool.sounds[index]; } } @@ -403,6 +448,7 @@ struct sfx_pool_item *sfx_pool_load(const char *key, const char *path) { } strncpy(sound->key, key, KEY_LENGTH); + strncpy(sound->path, path, PATH_MAX); sounds_pool.use++; return sound;