Mercurial > sdl-ios-xcode
view test/testaudioinfo.c @ 4511:ae7799d16c87
Daniel Wyatt 2010-03-26 14:52:53 PDT
If a non-console Windows SDL program has a non-quoted 0th argument followed
optionally by more non-quoted arguments and then by an empty quoted argument,
it will crash (attempts to dereference a NULL pointer).
In other words, something like this:
test.exe [non-quoted args] "" [...]
The fix is a one-liner in ParseCommandLine() of
src/main/win32/SDL_win32_main.c.
You can test this with any non-console SDL program on windows like this:
1) Open a console (cmd.exe)
2) Launch the program in one of the following ways:
program ""
program arg1 ""
program arg1 "" arg3
These will not cause a crash:
"program" [...]
program "arg1" ""
When a Windows program is launched from Explorer, its 0th argument seems to
always be quoted, so it won't be a problem in that case.
I've tested this on Windows XP SP3 and Windows 7.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 12 Jul 2010 22:08:50 -0700 |
parents | 5ea5e4e6103f |
children |
line wrap: on
line source
#include <stdio.h> #include "SDL.h" static void print_devices(int iscapture) { const char *typestr = ((iscapture) ? "capture" : "output"); int n = SDL_GetNumAudioDevices(iscapture); printf("%s devices:\n", typestr); if (n == -1) printf(" Driver can't detect specific devices.\n\n", typestr); else if (n == 0) printf(" No %s devices found.\n\n", typestr); else { int i; for (i = 0; i < n; i++) { printf(" %s\n", SDL_GetAudioDeviceName(i, iscapture)); } printf("\n"); } } int main(int argc, char **argv) { /* Load the SDL library */ if (SDL_Init(SDL_INIT_AUDIO) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); return (1); } /* Print available audio drivers */ int n = SDL_GetNumAudioDrivers(); if (n == 0) { printf("No built-in audio drivers\n\n"); } else { int i; printf("Built-in audio drivers:\n"); for (i = 0; i < n; ++i) { printf(" %s\n", SDL_GetAudioDriver(i)); } printf("\n"); } printf("Using audio driver: %s\n\n", SDL_GetCurrentAudioDriver()); print_devices(0); print_devices(1); SDL_Quit(); return 0; }