aboutsummaryrefslogtreecommitdiffstats
path: root/utils/openal-info.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/openal-info.c')
-rw-r--r--utils/openal-info.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/utils/openal-info.c b/utils/openal-info.c
index 5b45ceef..12dc6311 100644
--- a/utils/openal-info.c
+++ b/utils/openal-info.c
@@ -24,6 +24,7 @@
#include <stdio.h>
#include <string.h>
+#include <stdlib.h>
#include "AL/alc.h"
#include "AL/al.h"
@@ -41,6 +42,70 @@
#endif
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+static WCHAR *FromUTF8(const char *str)
+{
+ WCHAR *out = NULL;
+ int len;
+
+ if((len=MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0)) > 0)
+ {
+ out = calloc(sizeof(WCHAR), len);
+ MultiByteToWideChar(CP_UTF8, 0, str, -1, out, len);
+ }
+ return out;
+}
+
+/* Override printf, fprintf, and fwrite so we can print UTF-8 strings. */
+static void al_fprintf(FILE *file, const char *fmt, ...)
+{
+ char str[1024];
+ WCHAR *wstr;
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsnprintf(str, sizeof(str), fmt, ap);
+ va_end(ap);
+
+ str[sizeof(str)-1] = 0;
+ wstr = FromUTF8(str);
+ if(!wstr)
+ fprintf(file, "<UTF-8 error> %s", str);
+ else
+ fprintf(file, "%ls", wstr);
+ free(wstr);
+}
+#define fprintf al_fprintf
+#define printf(...) al_fprintf(stdout, __VA_ARGS__)
+
+static size_t al_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *file)
+{
+ char str[1024];
+ WCHAR *wstr;
+ size_t len;
+
+ len = size * nmemb;
+ if(len > sizeof(str)-1)
+ len = sizeof(str)-1;
+ memcpy(str, ptr, len);
+ str[len] = 0;
+
+ wstr = FromUTF8(str);
+ if(!wstr)
+ fprintf(file, "<UTF-8 error> %s", str);
+ else
+ fprintf(file, "%ls", wstr);
+ free(wstr);
+
+ return len / size;
+}
+#define fwrite al_fwrite
+#endif
+
+
#define MAX_WIDTH 80
static void printList(const char *list, char separator)
@@ -186,6 +251,38 @@ static void printALInfo(void)
checkALErrors();
}
+static void printResamplerInfo(void)
+{
+ LPALGETSTRINGISOFT alGetStringiSOFT;
+ ALint num_resamplers;
+ ALint def_resampler;
+
+ if(!alIsExtensionPresent("AL_SOFT_source_resampler"))
+ {
+ printf("Resampler info not available\n");
+ return;
+ }
+
+ alGetStringiSOFT = alGetProcAddress("alGetStringiSOFT");
+
+ num_resamplers = alGetInteger(AL_NUM_RESAMPLERS_SOFT);
+ def_resampler = alGetInteger(AL_DEFAULT_RESAMPLER_SOFT);
+
+ if(!num_resamplers)
+ printf("!!! No resamplers found !!!\n");
+ else
+ {
+ ALint i;
+ printf("Available resamplers:\n");
+ for(i = 0;i < num_resamplers;++i)
+ {
+ const ALchar *name = alGetStringiSOFT(AL_RESAMPLER_NAME_SOFT, i);
+ printf(" %s%s\n", name, (i==def_resampler)?" *":"");
+ }
+ }
+ checkALErrors();
+}
+
static void printEFXInfo(ALCdevice *device)
{
ALCint major, minor, sends;
@@ -329,6 +426,7 @@ int main(int argc, char *argv[])
}
printALInfo();
+ printResamplerInfo();
printEFXInfo(device);
alcMakeContextCurrent(NULL);