2 * openal-info: Display information about ALC and AL.
4 * Idea based on glxinfo for OpenGL.
5 * Initial OpenAL version by Erik Hofman <erik@ehofman.com>.
6 * Further hacked by Sven Panne <sven.panne@aedion.de>.
22 static const int indentation
= 4;
23 static const int maxmimumWidth
= 79;
25 static void printChar(int c
, int *width
)
28 *width
= ((c
== '\n') ? 0 : ((*width
) + 1));
31 static void indent(int *width
)
34 for(i
= 0; i
< indentation
; i
++)
35 printChar(' ', width
);
38 static void printExtensions(const char *header
, char separator
, const char *extensions
)
40 int width
= 0, start
= 0, end
= 0;
42 printf("%s:\n", header
);
43 if(extensions
== NULL
|| extensions
[0] == '\0')
49 if(extensions
[end
] == separator
|| extensions
[end
] == '\0')
51 if(width
+ end
- start
+ 2 > maxmimumWidth
)
53 printChar('\n', &width
);
58 printChar(extensions
[start
], &width
);
61 if(extensions
[end
] == '\0')
65 if(extensions
[end
] == '\0')
67 printChar(',', &width
);
68 printChar(' ', &width
);
72 printChar('\n', &width
);
75 static void die(const char *kind
, const char *description
)
77 fprintf(stderr
, "%s error %s occured\n", kind
, description
);
81 static void checkForErrors(void)
84 ALCdevice
*device
= alcGetContextsDevice(alcGetCurrentContext());
85 ALCenum error
= alcGetError(device
);
86 if(error
!= ALC_NO_ERROR
)
87 die("ALC", (const char*)alcGetString(device
, error
));
90 ALenum error
= alGetError();
91 if(error
!= AL_NO_ERROR
)
92 die("AL", (const char*)alGetString(error
));
96 static void printDevices(ALCenum which
, const char *kind
)
98 const char *s
= alcGetString(NULL
, which
);
101 printf("Available %sdevices:\n", kind
);
110 static void printALCInfo (void)
115 if(alcIsExtensionPresent(NULL
, (const ALCchar
*)"ALC_ENUMERATION_EXT") == AL_TRUE
)
117 if(alcIsExtensionPresent(NULL
, (const ALCchar
*)"ALC_ENUMERATE_ALL_EXT") == AL_TRUE
)
118 printDevices(ALC_ALL_DEVICES_SPECIFIER
, "playback ");
120 printDevices(ALC_DEVICE_SPECIFIER
, "playback ");
121 printDevices(ALC_CAPTURE_DEVICE_SPECIFIER
, "capture ");
124 printf("No device enumeration available\n");
126 device
= alcGetContextsDevice(alcGetCurrentContext());
129 printf("Default device: %s\n",
130 alcGetString(device
, ALC_DEFAULT_DEVICE_SPECIFIER
));
132 printf("Default capture device: %s\n",
133 alcGetString(device
, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
));
135 alcGetIntegerv(device
, ALC_MAJOR_VERSION
, 1, &major
);
136 alcGetIntegerv(device
, ALC_MAJOR_VERSION
, 1, &minor
);
138 printf("ALC version: %d.%d\n", (int)major
, (int)minor
);
140 printExtensions("ALC extensions", ' ',
141 alcGetString(device
, ALC_EXTENSIONS
));
145 static void printALInfo(void)
147 printf("OpenAL vendor string: %s\n", alGetString(AL_VENDOR
));
148 printf("OpenAL renderer string: %s\n", alGetString(AL_RENDERER
));
149 printf("OpenAL version string: %s\n", alGetString(AL_VERSION
));
150 printExtensions("OpenAL extensions", ' ', alGetString(AL_EXTENSIONS
));
156 ALCdevice
*device
= alcOpenDevice(NULL
);
157 ALCcontext
*context
= alcCreateContext(device
, NULL
);
158 alcMakeContextCurrent(context
);
165 alcMakeContextCurrent(NULL
);
166 alcDestroyContext(context
);
167 alcCloseDevice(device
);