mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	Update for SDL3 coding style (#6717)
I updated .clang-format and ran clang-format 14 over the src and test directories to standardize the code base.
In general I let clang-format have it's way, and added markup to prevent formatting of code that would break or be completely unreadable if formatted.
The script I ran for the src directory is added as build-scripts/clang-format-src.sh
This fixes:
#6592
#6593
#6594
(cherry picked from commit 5750bcb174)
			
			
This commit is contained in:
		| @@ -16,8 +16,8 @@ AllowShortFunctionsOnASingleLine: All | |||||||
| AllowShortIfStatementsOnASingleLine: Never | AllowShortIfStatementsOnASingleLine: Never | ||||||
| AllowShortLoopsOnASingleLine: false | AllowShortLoopsOnASingleLine: false | ||||||
|  |  | ||||||
| AlwaysBreakAfterDefinitionReturnType: All | AlwaysBreakAfterDefinitionReturnType: None | ||||||
| AlwaysBreakAfterReturnType: AllDefinitions | AlwaysBreakAfterReturnType: None | ||||||
| AlwaysBreakBeforeMultilineStrings: false | AlwaysBreakBeforeMultilineStrings: false | ||||||
| AlwaysBreakTemplateDeclarations: MultiLine | AlwaysBreakTemplateDeclarations: MultiLine | ||||||
|  |  | ||||||
| @@ -35,7 +35,7 @@ BraceWrapping: | |||||||
|   AfterUnion: true |   AfterUnion: true | ||||||
|   AfterExternBlock: false |   AfterExternBlock: false | ||||||
|   BeforeElse: false |   BeforeElse: false | ||||||
|   BeforeWhile: true |   BeforeWhile: false | ||||||
|   IndentBraces: false |   IndentBraces: false | ||||||
|   SplitEmptyFunction: true |   SplitEmptyFunction: true | ||||||
|   SplitEmptyRecord: true |   SplitEmptyRecord: true | ||||||
| @@ -48,7 +48,7 @@ IncludeBlocks: Preserve | |||||||
| # clang-format version 4.0 through 12.0: | # clang-format version 4.0 through 12.0: | ||||||
| #SortIncludes: false | #SortIncludes: false | ||||||
| # clang-format version 13.0+: | # clang-format version 13.0+: | ||||||
| #SortIncludes: Never | SortIncludes: Never | ||||||
|  |  | ||||||
| # No length limit, in case it breaks macros, you can | # No length limit, in case it breaks macros, you can | ||||||
| # disable it with /* clang-format off/on */ comments | # disable it with /* clang-format off/on */ comments | ||||||
| @@ -62,7 +62,8 @@ IndentGotoLabels: true | |||||||
| IndentPPDirectives: None | IndentPPDirectives: None | ||||||
| IndentExternBlock: NoIndent | IndentExternBlock: NoIndent | ||||||
|  |  | ||||||
| SpaceAfterCStyleCast: true | PointerAlignment: Right | ||||||
|  | SpaceAfterCStyleCast: false | ||||||
| SpacesInCStyleCastParentheses: false | SpacesInCStyleCastParentheses: false | ||||||
| SpacesInConditionalStatement: false | SpacesInConditionalStatement: false | ||||||
| SpacesInContainerLiterals: true | SpacesInContainerLiterals: true | ||||||
|   | |||||||
							
								
								
									
										32
									
								
								build-scripts/clang-format-src.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										32
									
								
								build-scripts/clang-format-src.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | cd "$(dirname $0)/../src" | ||||||
|  |  | ||||||
|  | echo "Running clang-format in $(pwd)" | ||||||
|  |  | ||||||
|  | find . -regex '.*\.[chm]p*' -exec clang-format -i {} \; | ||||||
|  |  | ||||||
|  | # Revert third-party code | ||||||
|  | git checkout \ | ||||||
|  |     events/imKStoUCS.* \ | ||||||
|  |     hidapi \ | ||||||
|  |     joystick/controller_type.c \ | ||||||
|  |     joystick/controller_type.h \ | ||||||
|  |     joystick/hidapi/steam/controller_constants.h \ | ||||||
|  |     joystick/hidapi/steam/controller_structs.h \ | ||||||
|  |     libm \ | ||||||
|  |     stdlib/SDL_malloc.c \ | ||||||
|  |     stdlib/SDL_qsort.c \ | ||||||
|  |     stdlib/SDL_strtokr.c \ | ||||||
|  |     video/arm \ | ||||||
|  |     video/khronos \ | ||||||
|  |     video/x11/edid-parse.c \ | ||||||
|  |     video/yuv2rgb | ||||||
|  | clang-format -i hidapi/SDL_hidapi.c | ||||||
|  |  | ||||||
|  | # Revert generated code | ||||||
|  | git checkout dynapi/SDL_dynapi_overrides.h | ||||||
|  | git checkout dynapi/SDL_dynapi_procs.h | ||||||
|  | git checkout render/metal/SDL_shaders_metal_*.h | ||||||
|  |  | ||||||
|  | echo "clang-format complete!" | ||||||
							
								
								
									
										57
									
								
								src/SDL.c
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								src/SDL.c
									
									
									
									
									
								
							| @@ -55,7 +55,7 @@ | |||||||
|  |  | ||||||
| /* Initialization/Cleanup routines */ | /* Initialization/Cleanup routines */ | ||||||
| #if !SDL_TIMERS_DISABLED | #if !SDL_TIMERS_DISABLED | ||||||
| # include "timer/SDL_timer_c.h" | #include "timer/SDL_timer_c.h" | ||||||
| #endif | #endif | ||||||
| #if SDL_VIDEO_DRIVER_WINDOWS | #if SDL_VIDEO_DRIVER_WINDOWS | ||||||
| extern int SDL_HelperWindowCreate(void); | extern int SDL_HelperWindowCreate(void); | ||||||
| @@ -98,8 +98,8 @@ SDL_NORETURN void SDL_ExitProcess(int exitcode) | |||||||
|        ExitProcess here that will never be reached but make MingW happy. */ |        ExitProcess here that will never be reached but make MingW happy. */ | ||||||
|     ExitProcess(exitcode); |     ExitProcess(exitcode); | ||||||
| #elif defined(__EMSCRIPTEN__) | #elif defined(__EMSCRIPTEN__) | ||||||
|     emscripten_cancel_main_loop();  /* this should "kill" the app. */ |     emscripten_cancel_main_loop();   /* this should "kill" the app. */ | ||||||
|     emscripten_force_exit(exitcode);  /* this should "kill" the app. */ |     emscripten_force_exit(exitcode); /* this should "kill" the app. */ | ||||||
|     exit(exitcode); |     exit(exitcode); | ||||||
| #elif defined(__HAIKU__)  /* Haiku has _Exit, but it's not marked noreturn. */ | #elif defined(__HAIKU__)  /* Haiku has _Exit, but it's not marked noreturn. */ | ||||||
|     _exit(exitcode); |     _exit(exitcode); | ||||||
| @@ -110,7 +110,6 @@ SDL_NORETURN void SDL_ExitProcess(int exitcode) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* The initialized subsystems */ | /* The initialized subsystems */ | ||||||
| #ifdef SDL_MAIN_NEEDED | #ifdef SDL_MAIN_NEEDED | ||||||
| static SDL_bool SDL_MainIsReady = SDL_FALSE; | static SDL_bool SDL_MainIsReady = SDL_FALSE; | ||||||
| @@ -118,11 +117,10 @@ static SDL_bool SDL_MainIsReady = SDL_FALSE; | |||||||
| static SDL_bool SDL_MainIsReady = SDL_TRUE; | static SDL_bool SDL_MainIsReady = SDL_TRUE; | ||||||
| #endif | #endif | ||||||
| static SDL_bool SDL_bInMainQuit = SDL_FALSE; | static SDL_bool SDL_bInMainQuit = SDL_FALSE; | ||||||
| static Uint8 SDL_SubsystemRefCount[ 32 ]; | static Uint8 SDL_SubsystemRefCount[32]; | ||||||
|  |  | ||||||
| /* Private helper to increment a subsystem's ref counter. */ | /* Private helper to increment a subsystem's ref counter. */ | ||||||
| static void | static void SDL_PrivateSubsystemRefCountIncr(Uint32 subsystem) | ||||||
| SDL_PrivateSubsystemRefCountIncr(Uint32 subsystem) |  | ||||||
| { | { | ||||||
|     const int subsystem_index = SDL_MostSignificantBitIndex32(subsystem); |     const int subsystem_index = SDL_MostSignificantBitIndex32(subsystem); | ||||||
|     SDL_assert((subsystem_index < 0) || (SDL_SubsystemRefCount[subsystem_index] < 255)); |     SDL_assert((subsystem_index < 0) || (SDL_SubsystemRefCount[subsystem_index] < 255)); | ||||||
| @@ -132,8 +130,7 @@ SDL_PrivateSubsystemRefCountIncr(Uint32 subsystem) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Private helper to decrement a subsystem's ref counter. */ | /* Private helper to decrement a subsystem's ref counter. */ | ||||||
| static void | static void SDL_PrivateSubsystemRefCountDecr(Uint32 subsystem) | ||||||
| SDL_PrivateSubsystemRefCountDecr(Uint32 subsystem) |  | ||||||
| { | { | ||||||
|     const int subsystem_index = SDL_MostSignificantBitIndex32(subsystem); |     const int subsystem_index = SDL_MostSignificantBitIndex32(subsystem); | ||||||
|     if ((subsystem_index >= 0) && (SDL_SubsystemRefCount[subsystem_index] > 0)) { |     if ((subsystem_index >= 0) && (SDL_SubsystemRefCount[subsystem_index] > 0)) { | ||||||
| @@ -142,8 +139,7 @@ SDL_PrivateSubsystemRefCountDecr(Uint32 subsystem) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Private helper to check if a system needs init. */ | /* Private helper to check if a system needs init. */ | ||||||
| static SDL_bool | static SDL_bool SDL_PrivateShouldInitSubsystem(Uint32 subsystem) | ||||||
| SDL_PrivateShouldInitSubsystem(Uint32 subsystem) |  | ||||||
| { | { | ||||||
|     const int subsystem_index = SDL_MostSignificantBitIndex32(subsystem); |     const int subsystem_index = SDL_MostSignificantBitIndex32(subsystem); | ||||||
|     SDL_assert((subsystem_index < 0) || (SDL_SubsystemRefCount[subsystem_index] < 255)); |     SDL_assert((subsystem_index < 0) || (SDL_SubsystemRefCount[subsystem_index] < 255)); | ||||||
| @@ -151,8 +147,8 @@ SDL_PrivateShouldInitSubsystem(Uint32 subsystem) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Private helper to check if a system needs to be quit. */ | /* Private helper to check if a system needs to be quit. */ | ||||||
| static SDL_bool | static SDL_bool SDL_PrivateShouldQuitSubsystem(Uint32 subsystem) | ||||||
| SDL_PrivateShouldQuitSubsystem(Uint32 subsystem) { | { | ||||||
|     const int subsystem_index = SDL_MostSignificantBitIndex32(subsystem); |     const int subsystem_index = SDL_MostSignificantBitIndex32(subsystem); | ||||||
|     if ((subsystem_index >= 0) && (SDL_SubsystemRefCount[subsystem_index] == 0)) { |     if ((subsystem_index >= 0) && (SDL_SubsystemRefCount[subsystem_index] == 0)) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -164,14 +160,12 @@ SDL_PrivateShouldQuitSubsystem(Uint32 subsystem) { | |||||||
|     return (((subsystem_index >= 0) && (SDL_SubsystemRefCount[subsystem_index] == 1)) || SDL_bInMainQuit) ? SDL_TRUE : SDL_FALSE; |     return (((subsystem_index >= 0) && (SDL_SubsystemRefCount[subsystem_index] == 1)) || SDL_bInMainQuit) ? SDL_TRUE : SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_SetMainReady(void) | ||||||
| SDL_SetMainReady(void) |  | ||||||
| { | { | ||||||
|     SDL_MainIsReady = SDL_TRUE; |     SDL_MainIsReady = SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_InitSubSystem(Uint32 flags) | ||||||
| SDL_InitSubSystem(Uint32 flags) |  | ||||||
| { | { | ||||||
|     Uint32 flags_initialized = 0; |     Uint32 flags_initialized = 0; | ||||||
|  |  | ||||||
| @@ -193,7 +187,7 @@ SDL_InitSubSystem(Uint32 flags) | |||||||
|         flags |= SDL_INIT_JOYSTICK; |         flags |= SDL_INIT_JOYSTICK; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if ((flags & (SDL_INIT_VIDEO|SDL_INIT_JOYSTICK|SDL_INIT_AUDIO))) { |     if ((flags & (SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO))) { | ||||||
|         /* video or joystick or audio implies events */ |         /* video or joystick or audio implies events */ | ||||||
|         flags |= SDL_INIT_EVENTS; |         flags |= SDL_INIT_EVENTS; | ||||||
|     } |     } | ||||||
| @@ -203,7 +197,7 @@ SDL_InitSubSystem(Uint32 flags) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if SDL_VIDEO_DRIVER_WINDOWS | #if SDL_VIDEO_DRIVER_WINDOWS | ||||||
|     if ((flags & (SDL_INIT_HAPTIC|SDL_INIT_JOYSTICK))) { |     if ((flags & (SDL_INIT_HAPTIC | SDL_INIT_JOYSTICK))) { | ||||||
|         if (SDL_HelperWindowCreate() < 0) { |         if (SDL_HelperWindowCreate() < 0) { | ||||||
|             goto quit_and_error; |             goto quit_and_error; | ||||||
|         } |         } | ||||||
| @@ -282,9 +276,9 @@ SDL_InitSubSystem(Uint32 flags) | |||||||
|     if ((flags & SDL_INIT_JOYSTICK)) { |     if ((flags & SDL_INIT_JOYSTICK)) { | ||||||
| #if !SDL_JOYSTICK_DISABLED | #if !SDL_JOYSTICK_DISABLED | ||||||
|         if (SDL_PrivateShouldInitSubsystem(SDL_INIT_JOYSTICK)) { |         if (SDL_PrivateShouldInitSubsystem(SDL_INIT_JOYSTICK)) { | ||||||
|            if (SDL_JoystickInit() < 0) { |             if (SDL_JoystickInit() < 0) { | ||||||
|                goto quit_and_error; |                 goto quit_and_error; | ||||||
|            } |             } | ||||||
|         } |         } | ||||||
|         SDL_PrivateSubsystemRefCountIncr(SDL_INIT_JOYSTICK); |         SDL_PrivateSubsystemRefCountIncr(SDL_INIT_JOYSTICK); | ||||||
|         flags_initialized |= SDL_INIT_JOYSTICK; |         flags_initialized |= SDL_INIT_JOYSTICK; | ||||||
| @@ -341,7 +335,7 @@ SDL_InitSubSystem(Uint32 flags) | |||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     (void) flags_initialized;  /* make static analysis happy, since this only gets used in error cases. */ |     (void)flags_initialized; /* make static analysis happy, since this only gets used in error cases. */ | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
|  |  | ||||||
| @@ -350,14 +344,12 @@ quit_and_error: | |||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_Init(Uint32 flags) | ||||||
| SDL_Init(Uint32 flags) |  | ||||||
| { | { | ||||||
|     return SDL_InitSubSystem(flags); |     return SDL_InitSubSystem(flags); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_QuitSubSystem(Uint32 flags) | ||||||
| SDL_QuitSubSystem(Uint32 flags) |  | ||||||
| { | { | ||||||
| #if defined(__OS2__) | #if defined(__OS2__) | ||||||
| #if SDL_THREAD_OS2 | #if SDL_THREAD_OS2 | ||||||
| @@ -481,8 +473,7 @@ SDL_WasInit(Uint32 flags) | |||||||
|     return initialized; |     return initialized; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_Quit(void) | ||||||
| SDL_Quit(void) |  | ||||||
| { | { | ||||||
|     SDL_bInMainQuit = SDL_TRUE; |     SDL_bInMainQuit = SDL_TRUE; | ||||||
|  |  | ||||||
| @@ -508,7 +499,7 @@ SDL_Quit(void) | |||||||
|     /* Now that every subsystem has been quit, we reset the subsystem refcount |     /* Now that every subsystem has been quit, we reset the subsystem refcount | ||||||
|      * and the list of initialized subsystems. |      * and the list of initialized subsystems. | ||||||
|      */ |      */ | ||||||
|     SDL_memset( SDL_SubsystemRefCount, 0x0, sizeof(SDL_SubsystemRefCount) ); |     SDL_memset(SDL_SubsystemRefCount, 0x0, sizeof(SDL_SubsystemRefCount)); | ||||||
|  |  | ||||||
|     SDL_TLSCleanup(); |     SDL_TLSCleanup(); | ||||||
|  |  | ||||||
| @@ -516,13 +507,13 @@ SDL_Quit(void) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Get the library version number */ | /* Get the library version number */ | ||||||
| void | void SDL_GetVersion(SDL_version *ver) | ||||||
| SDL_GetVersion(SDL_version * ver) |  | ||||||
| { | { | ||||||
|     static SDL_bool check_hint = SDL_TRUE; |     static SDL_bool check_hint = SDL_TRUE; | ||||||
|     static SDL_bool legacy_version = SDL_FALSE; |     static SDL_bool legacy_version = SDL_FALSE; | ||||||
|  |  | ||||||
|     if (ver == NULL) {        return; |     if (ver == NULL) { | ||||||
|  |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_VERSION(ver); |     SDL_VERSION(ver); | ||||||
|   | |||||||
							
								
								
									
										106
									
								
								src/SDL_assert.c
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								src/SDL_assert.c
									
									
									
									
									
								
							| @@ -48,8 +48,7 @@ | |||||||
| /* The size of the stack buffer to use for rendering assert messages. */ | /* The size of the stack buffer to use for rendering assert messages. */ | ||||||
| #define SDL_MAX_ASSERT_MESSAGE_STACK 256 | #define SDL_MAX_ASSERT_MESSAGE_STACK 256 | ||||||
|  |  | ||||||
| static SDL_assert_state SDLCALL | static SDL_assert_state SDLCALL SDL_PromptAssertion(const SDL_assert_data *data, void *userdata); | ||||||
| SDL_PromptAssertion(const SDL_assert_data *data, void *userdata); |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * We keep all triggered assertions in a singly-linked list so we can |  * We keep all triggered assertions in a singly-linked list so we can | ||||||
| @@ -65,12 +64,10 @@ static SDL_AssertionHandler assertion_handler = SDL_PromptAssertion; | |||||||
| static void *assertion_userdata = NULL; | static void *assertion_userdata = NULL; | ||||||
|  |  | ||||||
| #ifdef __GNUC__ | #ifdef __GNUC__ | ||||||
| static void | static void debug_print(const char *fmt, ...) __attribute__((format(printf, 1, 2))); | ||||||
| debug_print(const char *fmt, ...) __attribute__((format (printf, 1, 2))); |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static void | static void debug_print(const char *fmt, ...) | ||||||
| debug_print(const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|     va_start(ap, fmt); |     va_start(ap, fmt); | ||||||
| @@ -78,31 +75,30 @@ debug_print(const char *fmt, ...) | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static void SDL_AddAssertionToReport(SDL_assert_data *data) | static void SDL_AddAssertionToReport(SDL_assert_data *data) | ||||||
| { | { | ||||||
|     /* (data) is always a static struct defined with the assert macros, so |     /* (data) is always a static struct defined with the assert macros, so | ||||||
|        we don't have to worry about copying or allocating them. */ |        we don't have to worry about copying or allocating them. */ | ||||||
|     data->trigger_count++; |     data->trigger_count++; | ||||||
|     if (data->trigger_count == 1) {  /* not yet added? */ |     if (data->trigger_count == 1) { /* not yet added? */ | ||||||
|         data->next = triggered_assertions; |         data->next = triggered_assertions; | ||||||
|         triggered_assertions = data; |         triggered_assertions = data; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| #if defined(__WIN32__) || defined(__GDK__) | #if defined(__WIN32__) || defined(__GDK__) | ||||||
|     #define ENDLINE "\r\n" | #define ENDLINE "\r\n" | ||||||
| #else | #else | ||||||
|     #define ENDLINE "\n" | #define ENDLINE "\n" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static int SDL_RenderAssertMessage(char *buf, size_t buf_len, const SDL_assert_data *data) { | static int SDL_RenderAssertMessage(char *buf, size_t buf_len, const SDL_assert_data *data) | ||||||
|  | { | ||||||
|     return SDL_snprintf(buf, buf_len, |     return SDL_snprintf(buf, buf_len, | ||||||
|         "Assertion failure at %s (%s:%d), triggered %u %s:" ENDLINE "  '%s'", |                         "Assertion failure at %s (%s:%d), triggered %u %s:" ENDLINE "  '%s'", | ||||||
|         data->function, data->filename, data->linenum, |                         data->function, data->filename, data->linenum, | ||||||
|         data->trigger_count, (data->trigger_count == 1) ? "time" : "times", |                         data->trigger_count, (data->trigger_count == 1) ? "time" : "times", | ||||||
|         data->condition |                         data->condition); | ||||||
|     ); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void SDL_GenerateAssertionReport(void) | static void SDL_GenerateAssertionReport(void) | ||||||
| @@ -132,7 +128,6 @@ static void SDL_GenerateAssertionReport(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* This is not declared in any header, although it is shared between some | /* This is not declared in any header, although it is shared between some | ||||||
|     parts of SDL, because we don't want anything calling it without an |     parts of SDL, because we don't want anything calling it without an | ||||||
|     extremely good reason. */ |     extremely good reason. */ | ||||||
| @@ -142,9 +137,8 @@ extern void SDL_ExitProcess(int exitcode); | |||||||
| #endif | #endif | ||||||
| extern SDL_NORETURN void SDL_ExitProcess(int exitcode); | extern SDL_NORETURN void SDL_ExitProcess(int exitcode); | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined(__WATCOMC__) | #if defined(__WATCOMC__) | ||||||
| static void SDL_AbortAssertion (void); | static void SDL_AbortAssertion(void); | ||||||
| #pragma aux SDL_AbortAssertion aborts; | #pragma aux SDL_AbortAssertion aborts; | ||||||
| #endif | #endif | ||||||
| static SDL_NORETURN void SDL_AbortAssertion(void) | static SDL_NORETURN void SDL_AbortAssertion(void) | ||||||
| @@ -153,21 +147,20 @@ static SDL_NORETURN void SDL_AbortAssertion(void) | |||||||
|     SDL_ExitProcess(42); |     SDL_ExitProcess(42); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_assert_state SDLCALL | static SDL_assert_state SDLCALL SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) | ||||||
| SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) |  | ||||||
| { | { | ||||||
|     const char *envr; |     const char *envr; | ||||||
|     SDL_assert_state state = SDL_ASSERTION_ABORT; |     SDL_assert_state state = SDL_ASSERTION_ABORT; | ||||||
|     SDL_Window *window; |     SDL_Window *window; | ||||||
|     SDL_MessageBoxData messagebox; |     SDL_MessageBoxData messagebox; | ||||||
|     SDL_MessageBoxButtonData buttons[] = { |     SDL_MessageBoxButtonData buttons[] = { | ||||||
|         {   0,  SDL_ASSERTION_RETRY,            "Retry" }, |         { 0, SDL_ASSERTION_RETRY, "Retry" }, | ||||||
|         {   0,  SDL_ASSERTION_BREAK,            "Break" }, |         { 0, SDL_ASSERTION_BREAK, "Break" }, | ||||||
|         {   0,  SDL_ASSERTION_ABORT,            "Abort" }, |         { 0, SDL_ASSERTION_ABORT, "Abort" }, | ||||||
|         {   SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, |         { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, | ||||||
|                 SDL_ASSERTION_IGNORE,           "Ignore" }, |           SDL_ASSERTION_IGNORE, "Ignore" }, | ||||||
|         {   SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, |         { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, | ||||||
|                 SDL_ASSERTION_ALWAYS_IGNORE,    "Always Ignore" } |           SDL_ASSERTION_ALWAYS_IGNORE, "Always Ignore" } | ||||||
|     }; |     }; | ||||||
|     int selected; |     int selected; | ||||||
|  |  | ||||||
| @@ -176,7 +169,7 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) | |||||||
|     size_t buf_len = sizeof(stack_buf); |     size_t buf_len = sizeof(stack_buf); | ||||||
|     int len; |     int len; | ||||||
|  |  | ||||||
|     (void) userdata;  /* unused in default handler. */ |     (void)userdata; /* unused in default handler. */ | ||||||
|  |  | ||||||
|     /* Assume the output will fit... */ |     /* Assume the output will fit... */ | ||||||
|     len = SDL_RenderAssertMessage(message, buf_len, data); |     len = SDL_RenderAssertMessage(message, buf_len, data); | ||||||
| @@ -221,7 +214,7 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) | |||||||
|         } else if (SDL_strcmp(envr, "always_ignore") == 0) { |         } else if (SDL_strcmp(envr, "always_ignore") == 0) { | ||||||
|             return SDL_ASSERTION_ALWAYS_IGNORE; |             return SDL_ASSERTION_ALWAYS_IGNORE; | ||||||
|         } else { |         } else { | ||||||
|             return SDL_ASSERTION_ABORT;  /* oh well. */ |             return SDL_ASSERTION_ABORT; /* oh well. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -255,8 +248,9 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) | |||||||
|     } else { |     } else { | ||||||
| #if defined(__EMSCRIPTEN__) | #if defined(__EMSCRIPTEN__) | ||||||
|         /* This is nasty, but we can't block on a custom UI. */ |         /* This is nasty, but we can't block on a custom UI. */ | ||||||
|         for ( ; ; ) { |         for (;;) { | ||||||
|             SDL_bool okay = SDL_TRUE; |             SDL_bool okay = SDL_TRUE; | ||||||
|  |             /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|             char *buf = (char *) EM_ASM_INT({ |             char *buf = (char *) EM_ASM_INT({ | ||||||
|                 var str = |                 var str = | ||||||
|                     UTF8ToString($0) + '\n\n' + |                     UTF8ToString($0) + '\n\n' + | ||||||
| @@ -267,12 +261,14 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) | |||||||
|                 } |                 } | ||||||
|                 return allocate(intArrayFromString(reply), 'i8', ALLOC_NORMAL); |                 return allocate(intArrayFromString(reply), 'i8', ALLOC_NORMAL); | ||||||
|             }, message); |             }, message); | ||||||
|  |             /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
|             if (SDL_strcmp(buf, "a") == 0) { |             if (SDL_strcmp(buf, "a") == 0) { | ||||||
|                 state = SDL_ASSERTION_ABORT; |                 state = SDL_ASSERTION_ABORT; | ||||||
|             /* (currently) no break functionality on Emscripten | #if 0 /* (currently) no break functionality on Emscripten */ | ||||||
|             } else if (SDL_strcmp(buf, "b") == 0) { |             } else if (SDL_strcmp(buf, "b") == 0) { | ||||||
|                 state = SDL_ASSERTION_BREAK; */ |                 state = SDL_ASSERTION_BREAK; | ||||||
|  | #endif | ||||||
|             } else if (SDL_strcmp(buf, "r") == 0) { |             } else if (SDL_strcmp(buf, "r") == 0) { | ||||||
|                 state = SDL_ASSERTION_RETRY; |                 state = SDL_ASSERTION_RETRY; | ||||||
|             } else if (SDL_strcmp(buf, "i") == 0) { |             } else if (SDL_strcmp(buf, "i") == 0) { | ||||||
| @@ -290,11 +286,11 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) | |||||||
|         } |         } | ||||||
| #elif defined(HAVE_STDIO_H) | #elif defined(HAVE_STDIO_H) | ||||||
|         /* this is a little hacky. */ |         /* this is a little hacky. */ | ||||||
|         for ( ; ; ) { |         for (;;) { | ||||||
|             char buf[32]; |             char buf[32]; | ||||||
|             fprintf(stderr, "Abort/Break/Retry/Ignore/AlwaysIgnore? [abriA] : "); |             fprintf(stderr, "Abort/Break/Retry/Ignore/AlwaysIgnore? [abriA] : "); | ||||||
|             fflush(stderr); |             fflush(stderr); | ||||||
|             if (fgets(buf, sizeof (buf), stdin) == NULL) { |             if (fgets(buf, sizeof(buf), stdin) == NULL) { | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -330,7 +326,6 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) | |||||||
|     return state; |     return state; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| SDL_assert_state | SDL_assert_state | ||||||
| SDL_ReportAssertion(SDL_assert_data *data, const char *func, const char *file, | SDL_ReportAssertion(SDL_assert_data *data, const char *func, const char *file, | ||||||
|                     int line) |                     int line) | ||||||
| @@ -345,13 +340,13 @@ SDL_ReportAssertion(SDL_assert_data *data, const char *func, const char *file, | |||||||
|         assertion_mutex = SDL_CreateMutex(); |         assertion_mutex = SDL_CreateMutex(); | ||||||
|         if (assertion_mutex == NULL) { |         if (assertion_mutex == NULL) { | ||||||
|             SDL_AtomicUnlock(&spinlock); |             SDL_AtomicUnlock(&spinlock); | ||||||
|             return SDL_ASSERTION_IGNORE;   /* oh well, I guess. */ |             return SDL_ASSERTION_IGNORE; /* oh well, I guess. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     SDL_AtomicUnlock(&spinlock); |     SDL_AtomicUnlock(&spinlock); | ||||||
|  |  | ||||||
|     if (SDL_LockMutex(assertion_mutex) < 0) { |     if (SDL_LockMutex(assertion_mutex) < 0) { | ||||||
|         return SDL_ASSERTION_IGNORE;   /* oh well, I guess. */ |         return SDL_ASSERTION_IGNORE; /* oh well, I guess. */ | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -365,13 +360,14 @@ SDL_ReportAssertion(SDL_assert_data *data, const char *func, const char *file, | |||||||
|     SDL_AddAssertionToReport(data); |     SDL_AddAssertionToReport(data); | ||||||
|  |  | ||||||
|     assertion_running++; |     assertion_running++; | ||||||
|     if (assertion_running > 1) {   /* assert during assert! Abort. */ |     if (assertion_running > 1) { /* assert during assert! Abort. */ | ||||||
|         if (assertion_running == 2) { |         if (assertion_running == 2) { | ||||||
|             SDL_AbortAssertion(); |             SDL_AbortAssertion(); | ||||||
|         } else if (assertion_running == 3) {  /* Abort asserted! */ |         } else if (assertion_running == 3) { /* Abort asserted! */ | ||||||
|             SDL_ExitProcess(42); |             SDL_ExitProcess(42); | ||||||
|         } else { |         } else { | ||||||
|             while (1) { /* do nothing but spin; what else can you do?! */ } |             while (1) { /* do nothing but spin; what else can you do?! */ | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -379,21 +375,20 @@ SDL_ReportAssertion(SDL_assert_data *data, const char *func, const char *file, | |||||||
|         state = assertion_handler(data, assertion_userdata); |         state = assertion_handler(data, assertion_userdata); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     switch (state) |     switch (state) { | ||||||
|     { |     case SDL_ASSERTION_ALWAYS_IGNORE: | ||||||
|         case SDL_ASSERTION_ALWAYS_IGNORE: |         state = SDL_ASSERTION_IGNORE; | ||||||
|             state = SDL_ASSERTION_IGNORE; |         data->always_ignore = 1; | ||||||
|             data->always_ignore = 1; |         break; | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case SDL_ASSERTION_IGNORE: |     case SDL_ASSERTION_IGNORE: | ||||||
|         case SDL_ASSERTION_RETRY: |     case SDL_ASSERTION_RETRY: | ||||||
|         case SDL_ASSERTION_BREAK: |     case SDL_ASSERTION_BREAK: | ||||||
|             break;  /* macro handles these. */ |         break; /* macro handles these. */ | ||||||
|  |  | ||||||
|         case SDL_ASSERTION_ABORT: |     case SDL_ASSERTION_ABORT: | ||||||
|             SDL_AbortAssertion(); |         SDL_AbortAssertion(); | ||||||
|             /*break;  ...shouldn't return, but oh well. */ |         /*break;  ...shouldn't return, but oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     assertion_running--; |     assertion_running--; | ||||||
| @@ -405,7 +400,6 @@ SDL_ReportAssertion(SDL_assert_data *data, const char *func, const char *file, | |||||||
|     return state; |     return state; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void SDL_AssertionsQuit(void) | void SDL_AssertionsQuit(void) | ||||||
| { | { | ||||||
| #if SDL_ASSERT_LEVEL > 0 | #if SDL_ASSERT_LEVEL > 0 | ||||||
| @@ -440,7 +434,7 @@ void SDL_ResetAssertionReport(void) | |||||||
|     SDL_assert_data *next = NULL; |     SDL_assert_data *next = NULL; | ||||||
|     SDL_assert_data *item; |     SDL_assert_data *item; | ||||||
|     for (item = triggered_assertions; item != NULL; item = next) { |     for (item = triggered_assertions; item != NULL; item = next) { | ||||||
|         next = (SDL_assert_data *) item->next; |         next = (SDL_assert_data *)item->next; | ||||||
|         item->always_ignore = SDL_FALSE; |         item->always_ignore = SDL_FALSE; | ||||||
|         item->trigger_count = 0; |         item->trigger_count = 0; | ||||||
|         item->next = NULL; |         item->next = NULL; | ||||||
|   | |||||||
| @@ -25,10 +25,10 @@ | |||||||
|  |  | ||||||
| typedef struct SDL_DataQueuePacket | typedef struct SDL_DataQueuePacket | ||||||
| { | { | ||||||
|     size_t datalen;  /* bytes currently in use in this packet. */ |     size_t datalen;                        /* bytes currently in use in this packet. */ | ||||||
|     size_t startpos;  /* bytes currently consumed in this packet. */ |     size_t startpos;                       /* bytes currently consumed in this packet. */ | ||||||
|     struct SDL_DataQueuePacket *next;  /* next item in linked list. */ |     struct SDL_DataQueuePacket *next;      /* next item in linked list. */ | ||||||
|     Uint8 data[SDL_VARIABLE_LENGTH_ARRAY];  /* packet data */ |     Uint8 data[SDL_VARIABLE_LENGTH_ARRAY]; /* packet data */ | ||||||
| } SDL_DataQueuePacket; | } SDL_DataQueuePacket; | ||||||
|  |  | ||||||
| struct SDL_DataQueue | struct SDL_DataQueue | ||||||
| @@ -36,12 +36,11 @@ struct SDL_DataQueue | |||||||
|     SDL_DataQueuePacket *head; /* device fed from here. */ |     SDL_DataQueuePacket *head; /* device fed from here. */ | ||||||
|     SDL_DataQueuePacket *tail; /* queue fills to here. */ |     SDL_DataQueuePacket *tail; /* queue fills to here. */ | ||||||
|     SDL_DataQueuePacket *pool; /* these are unused packets. */ |     SDL_DataQueuePacket *pool; /* these are unused packets. */ | ||||||
|     size_t packet_size;   /* size of new packets */ |     size_t packet_size;        /* size of new packets */ | ||||||
|     size_t queued_bytes;  /* number of bytes of data in the queue. */ |     size_t queued_bytes;       /* number of bytes of data in the queue. */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static void | static void SDL_FreeDataQueueList(SDL_DataQueuePacket *packet) | ||||||
| SDL_FreeDataQueueList(SDL_DataQueuePacket *packet) |  | ||||||
| { | { | ||||||
|     while (packet) { |     while (packet) { | ||||||
|         SDL_DataQueuePacket *next = packet->next; |         SDL_DataQueuePacket *next = packet->next; | ||||||
| @@ -50,13 +49,12 @@ SDL_FreeDataQueueList(SDL_DataQueuePacket *packet) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* this all expects that you managed thread safety elsewhere. */ | /* this all expects that you managed thread safety elsewhere. */ | ||||||
|  |  | ||||||
| SDL_DataQueue * | SDL_DataQueue * | ||||||
| SDL_NewDataQueue(const size_t _packetlen, const size_t initialslack) | SDL_NewDataQueue(const size_t _packetlen, const size_t initialslack) | ||||||
| { | { | ||||||
|     SDL_DataQueue *queue = (SDL_DataQueue *) SDL_malloc(sizeof (SDL_DataQueue)); |     SDL_DataQueue *queue = (SDL_DataQueue *)SDL_malloc(sizeof(SDL_DataQueue)); | ||||||
|  |  | ||||||
|     if (queue == NULL) { |     if (queue == NULL) { | ||||||
|         SDL_OutOfMemory(); |         SDL_OutOfMemory(); | ||||||
| @@ -70,7 +68,7 @@ SDL_NewDataQueue(const size_t _packetlen, const size_t initialslack) | |||||||
|         queue->packet_size = packetlen; |         queue->packet_size = packetlen; | ||||||
|  |  | ||||||
|         for (i = 0; i < wantpackets; i++) { |         for (i = 0; i < wantpackets; i++) { | ||||||
|             SDL_DataQueuePacket *packet = (SDL_DataQueuePacket *) SDL_malloc(sizeof (SDL_DataQueuePacket) + packetlen); |             SDL_DataQueuePacket *packet = (SDL_DataQueuePacket *)SDL_malloc(sizeof(SDL_DataQueuePacket) + packetlen); | ||||||
|             if (packet) { /* don't care if this fails, we'll deal later. */ |             if (packet) { /* don't care if this fails, we'll deal later. */ | ||||||
|                 packet->datalen = 0; |                 packet->datalen = 0; | ||||||
|                 packet->startpos = 0; |                 packet->startpos = 0; | ||||||
| @@ -83,8 +81,7 @@ SDL_NewDataQueue(const size_t _packetlen, const size_t initialslack) | |||||||
|     return queue; |     return queue; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_FreeDataQueue(SDL_DataQueue *queue) | ||||||
| SDL_FreeDataQueue(SDL_DataQueue *queue) |  | ||||||
| { | { | ||||||
|     if (queue) { |     if (queue) { | ||||||
|         SDL_FreeDataQueueList(queue->head); |         SDL_FreeDataQueueList(queue->head); | ||||||
| @@ -93,11 +90,10 @@ SDL_FreeDataQueue(SDL_DataQueue *queue) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_ClearDataQueue(SDL_DataQueue *queue, const size_t slack) | ||||||
| SDL_ClearDataQueue(SDL_DataQueue *queue, const size_t slack) |  | ||||||
| { | { | ||||||
|     const size_t packet_size = queue ? queue->packet_size : 1; |     const size_t packet_size = queue ? queue->packet_size : 1; | ||||||
|     const size_t slackpackets = (slack + (packet_size-1)) / packet_size; |     const size_t slackpackets = (slack + (packet_size - 1)) / packet_size; | ||||||
|     SDL_DataQueuePacket *packet; |     SDL_DataQueuePacket *packet; | ||||||
|     SDL_DataQueuePacket *prev = NULL; |     SDL_DataQueuePacket *prev = NULL; | ||||||
|     size_t i; |     size_t i; | ||||||
| @@ -133,11 +129,10 @@ SDL_ClearDataQueue(SDL_DataQueue *queue, const size_t slack) | |||||||
|         queue->pool = NULL; |         queue->pool = NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_FreeDataQueueList(packet);  /* free extra packets */ |     SDL_FreeDataQueueList(packet); /* free extra packets */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_DataQueuePacket * | static SDL_DataQueuePacket *AllocateDataQueuePacket(SDL_DataQueue *queue) | ||||||
| AllocateDataQueuePacket(SDL_DataQueue *queue) |  | ||||||
| { | { | ||||||
|     SDL_DataQueuePacket *packet; |     SDL_DataQueuePacket *packet; | ||||||
|  |  | ||||||
| @@ -149,7 +144,7 @@ AllocateDataQueuePacket(SDL_DataQueue *queue) | |||||||
|         queue->pool = packet->next; |         queue->pool = packet->next; | ||||||
|     } else { |     } else { | ||||||
|         /* Have to allocate a new one! */ |         /* Have to allocate a new one! */ | ||||||
|         packet = (SDL_DataQueuePacket *) SDL_malloc(sizeof (SDL_DataQueuePacket) + queue->packet_size); |         packet = (SDL_DataQueuePacket *)SDL_malloc(sizeof(SDL_DataQueuePacket) + queue->packet_size); | ||||||
|         if (packet == NULL) { |         if (packet == NULL) { | ||||||
|             return NULL; |             return NULL; | ||||||
|         } |         } | ||||||
| @@ -169,12 +164,10 @@ AllocateDataQueuePacket(SDL_DataQueue *queue) | |||||||
|     return packet; |     return packet; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int SDL_WriteToDataQueue(SDL_DataQueue *queue, const void *_data, const size_t _len) | ||||||
| int |  | ||||||
| SDL_WriteToDataQueue(SDL_DataQueue *queue, const void *_data, const size_t _len) |  | ||||||
| { | { | ||||||
|     size_t len = _len; |     size_t len = _len; | ||||||
|     const Uint8 *data = (const Uint8 *) _data; |     const Uint8 *data = (const Uint8 *)_data; | ||||||
|     const size_t packet_size = queue ? queue->packet_size : 0; |     const size_t packet_size = queue ? queue->packet_size : 0; | ||||||
|     SDL_DataQueuePacket *orighead; |     SDL_DataQueuePacket *orighead; | ||||||
|     SDL_DataQueuePacket *origtail; |     SDL_DataQueuePacket *origtail; | ||||||
| @@ -198,9 +191,9 @@ SDL_WriteToDataQueue(SDL_DataQueue *queue, const void *_data, const size_t _len) | |||||||
|             if (packet == NULL) { |             if (packet == NULL) { | ||||||
|                 /* uhoh, reset so we've queued nothing new, free what we can. */ |                 /* uhoh, reset so we've queued nothing new, free what we can. */ | ||||||
|                 if (origtail == NULL) { |                 if (origtail == NULL) { | ||||||
|                     packet = queue->head;  /* whole queue. */ |                     packet = queue->head; /* whole queue. */ | ||||||
|                 } else { |                 } else { | ||||||
|                     packet = origtail->next;  /* what we added to existing queue. */ |                     packet = origtail->next; /* what we added to existing queue. */ | ||||||
|                     origtail->next = NULL; |                     origtail->next = NULL; | ||||||
|                     origtail->datalen = origlen; |                     origtail->datalen = origlen; | ||||||
|                 } |                 } | ||||||
| @@ -208,7 +201,7 @@ SDL_WriteToDataQueue(SDL_DataQueue *queue, const void *_data, const size_t _len) | |||||||
|                 queue->tail = origtail; |                 queue->tail = origtail; | ||||||
|                 queue->pool = NULL; |                 queue->pool = NULL; | ||||||
|  |  | ||||||
|                 SDL_FreeDataQueueList(packet);  /* give back what we can. */ |                 SDL_FreeDataQueueList(packet); /* give back what we can. */ | ||||||
|                 return SDL_OutOfMemory(); |                 return SDL_OutOfMemory(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -228,7 +221,7 @@ size_t | |||||||
| SDL_PeekIntoDataQueue(SDL_DataQueue *queue, void *_buf, const size_t _len) | SDL_PeekIntoDataQueue(SDL_DataQueue *queue, void *_buf, const size_t _len) | ||||||
| { | { | ||||||
|     size_t len = _len; |     size_t len = _len; | ||||||
|     Uint8 *buf = (Uint8 *) _buf; |     Uint8 *buf = (Uint8 *)_buf; | ||||||
|     Uint8 *ptr = buf; |     Uint8 *ptr = buf; | ||||||
|     SDL_DataQueuePacket *packet; |     SDL_DataQueuePacket *packet; | ||||||
|  |  | ||||||
| @@ -246,14 +239,14 @@ SDL_PeekIntoDataQueue(SDL_DataQueue *queue, void *_buf, const size_t _len) | |||||||
|         len -= cpy; |         len -= cpy; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return (size_t) (ptr - buf); |     return (size_t)(ptr - buf); | ||||||
| } | } | ||||||
|  |  | ||||||
| size_t | size_t | ||||||
| SDL_ReadFromDataQueue(SDL_DataQueue *queue, void *_buf, const size_t _len) | SDL_ReadFromDataQueue(SDL_DataQueue *queue, void *_buf, const size_t _len) | ||||||
| { | { | ||||||
|     size_t len = _len; |     size_t len = _len; | ||||||
|     Uint8 *buf = (Uint8 *) _buf; |     Uint8 *buf = (Uint8 *)_buf; | ||||||
|     Uint8 *ptr = buf; |     Uint8 *ptr = buf; | ||||||
|     SDL_DataQueuePacket *packet; |     SDL_DataQueuePacket *packet; | ||||||
|  |  | ||||||
| @@ -272,7 +265,7 @@ SDL_ReadFromDataQueue(SDL_DataQueue *queue, void *_buf, const size_t _len) | |||||||
|         queue->queued_bytes -= cpy; |         queue->queued_bytes -= cpy; | ||||||
|         len -= cpy; |         len -= cpy; | ||||||
|  |  | ||||||
|         if (packet->startpos == packet->datalen) {  /* packet is done, put it in the pool. */ |         if (packet->startpos == packet->datalen) { /* packet is done, put it in the pool. */ | ||||||
|             queue->head = packet->next; |             queue->head = packet->next; | ||||||
|             SDL_assert((packet->next != NULL) || (packet == queue->tail)); |             SDL_assert((packet->next != NULL) || (packet == queue->tail)); | ||||||
|             packet->next = queue->pool; |             packet->next = queue->pool; | ||||||
| @@ -283,10 +276,10 @@ SDL_ReadFromDataQueue(SDL_DataQueue *queue, void *_buf, const size_t _len) | |||||||
|     SDL_assert((queue->head != NULL) == (queue->queued_bytes != 0)); |     SDL_assert((queue->head != NULL) == (queue->queued_bytes != 0)); | ||||||
|  |  | ||||||
|     if (queue->head == NULL) { |     if (queue->head == NULL) { | ||||||
|         queue->tail = NULL;  /* in case we drained the queue entirely. */ |         queue->tail = NULL; /* in case we drained the queue entirely. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return (size_t) (ptr - buf); |     return (size_t)(ptr - buf); | ||||||
| } | } | ||||||
|  |  | ||||||
| size_t | size_t | ||||||
| @@ -314,7 +307,7 @@ SDL_ReserveSpaceInDataQueue(SDL_DataQueue *queue, const size_t len) | |||||||
|     packet = queue->head; |     packet = queue->head; | ||||||
|     if (packet) { |     if (packet) { | ||||||
|         const size_t avail = queue->packet_size - packet->datalen; |         const size_t avail = queue->packet_size - packet->datalen; | ||||||
|         if (len <= avail) {  /* we can use the space at end of this packet. */ |         if (len <= avail) { /* we can use the space at end of this packet. */ | ||||||
|             void *retval = packet->data + packet->datalen; |             void *retval = packet->data + packet->datalen; | ||||||
|             packet->datalen += len; |             packet->datalen += len; | ||||||
|             queue->queued_bytes += len; |             queue->queued_bytes += len; | ||||||
| @@ -335,4 +328,3 @@ SDL_ReserveSpaceInDataQueue(SDL_DataQueue *queue, const size_t len) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -52,4 +52,3 @@ void *SDL_ReserveSpaceInDataQueue(SDL_DataQueue *queue, const size_t len); | |||||||
| #endif /* SDL_dataqueue_h_ */ | #endif /* SDL_dataqueue_h_ */ | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -25,8 +25,7 @@ | |||||||
| #include "SDL_error.h" | #include "SDL_error.h" | ||||||
| #include "SDL_error_c.h" | #include "SDL_error_c.h" | ||||||
|  |  | ||||||
| int | int SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     /* Ignore call if invalid format pointer was passed */ |     /* Ignore call if invalid format pointer was passed */ | ||||||
|     if (fmt != NULL) { |     if (fmt != NULL) { | ||||||
| @@ -34,7 +33,7 @@ SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|         int result; |         int result; | ||||||
|         SDL_error *error = SDL_GetErrBuf(); |         SDL_error *error = SDL_GetErrBuf(); | ||||||
|  |  | ||||||
|         error->error = 1;  /* mark error as valid */ |         error->error = 1; /* mark error as valid */ | ||||||
|  |  | ||||||
|         va_start(ap, fmt); |         va_start(ap, fmt); | ||||||
|         result = SDL_vsnprintf(error->str, error->len, fmt, ap); |         result = SDL_vsnprintf(error->str, error->len, fmt, ap); | ||||||
| @@ -52,7 +51,6 @@ SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|         if (SDL_LogGetPriority(SDL_LOG_CATEGORY_ERROR) <= SDL_LOG_PRIORITY_DEBUG) { |         if (SDL_LogGetPriority(SDL_LOG_CATEGORY_ERROR) <= SDL_LOG_PRIORITY_DEBUG) { | ||||||
|             /* If we are in debug mode, print out the error message */ |             /* If we are in debug mode, print out the error message */ | ||||||
|             SDL_LogDebug(SDL_LOG_CATEGORY_ERROR, "%s", error->str); |             SDL_LogDebug(SDL_LOG_CATEGORY_ERROR, "%s", error->str); | ||||||
| @@ -70,15 +68,13 @@ SDL_GetError(void) | |||||||
|     return error->error ? error->str : ""; |     return error->error ? error->str : ""; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_ClearError(void) | ||||||
| SDL_ClearError(void) |  | ||||||
| { | { | ||||||
|     SDL_GetErrBuf()->error = 0; |     SDL_GetErrBuf()->error = 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Very common errors go here */ | /* Very common errors go here */ | ||||||
| int | int SDL_Error(SDL_errorcode code) | ||||||
| SDL_Error(SDL_errorcode code) |  | ||||||
| { | { | ||||||
|     switch (code) { |     switch (code) { | ||||||
|     case SDL_ENOMEM: |     case SDL_ENOMEM: | ||||||
| @@ -97,8 +93,7 @@ SDL_Error(SDL_errorcode code) | |||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef TEST_ERROR | #ifdef TEST_ERROR | ||||||
| int | int main(int argc, char *argv[]) | ||||||
| main(int argc, char *argv[]) |  | ||||||
| { | { | ||||||
|     char buffer[BUFSIZ + 1]; |     char buffer[BUFSIZ + 1]; | ||||||
|  |  | ||||||
| @@ -113,7 +108,6 @@ main(int argc, char *argv[]) | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| char * | char * | ||||||
| SDL_GetErrorMsg(char *errstr, int maxlen) | SDL_GetErrorMsg(char *errstr, int maxlen) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ void SDL_GUIDToString(SDL_GUID guid, char *pszGUID, int cbGUID) | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (i = 0; i < sizeof(guid.data) && i < (cbGUID-1)/2; i++) { |     for (i = 0; i < sizeof(guid.data) && i < (cbGUID - 1) / 2; i++) { | ||||||
|         /* each input byte writes 2 ascii chars, and might write a null byte. */ |         /* each input byte writes 2 ascii chars, and might write a null byte. */ | ||||||
|         /* If we don't have room for next input byte, stop */ |         /* If we don't have room for next input byte, stop */ | ||||||
|         unsigned char c = guid.data[i]; |         unsigned char c = guid.data[i]; | ||||||
| @@ -72,7 +72,7 @@ static unsigned char nibble(unsigned char c) | |||||||
| SDL_GUID SDL_GUIDFromString(const char *pchGUID) | SDL_GUID SDL_GUIDFromString(const char *pchGUID) | ||||||
| { | { | ||||||
|     SDL_GUID guid; |     SDL_GUID guid; | ||||||
|     int maxoutputbytes= sizeof(guid); |     int maxoutputbytes = sizeof(guid); | ||||||
|     size_t len = SDL_strlen(pchGUID); |     size_t len = SDL_strlen(pchGUID); | ||||||
|     Uint8 *p; |     Uint8 *p; | ||||||
|     size_t i; |     size_t i; | ||||||
| @@ -83,8 +83,8 @@ SDL_GUID SDL_GUIDFromString(const char *pchGUID) | |||||||
|     SDL_memset(&guid, 0x00, sizeof(guid)); |     SDL_memset(&guid, 0x00, sizeof(guid)); | ||||||
|  |  | ||||||
|     p = (Uint8 *)&guid; |     p = (Uint8 *)&guid; | ||||||
|     for (i = 0; (i < len) && ((p - (Uint8 *)&guid) < maxoutputbytes); i+=2, p++) { |     for (i = 0; (i < len) && ((p - (Uint8 *)&guid) < maxoutputbytes); i += 2, p++) { | ||||||
|         *p = (nibble((unsigned char)pchGUID[i]) << 4) | nibble((unsigned char)pchGUID[i+1]); |         *p = (nibble((unsigned char)pchGUID[i]) << 4) | nibble((unsigned char)pchGUID[i + 1]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return guid; |     return guid; | ||||||
|   | |||||||
| @@ -24,17 +24,18 @@ | |||||||
| #include "SDL_error.h" | #include "SDL_error.h" | ||||||
| #include "SDL_hints_c.h" | #include "SDL_hints_c.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Assuming there aren't many hints set and they aren't being queried in | /* Assuming there aren't many hints set and they aren't being queried in | ||||||
|    critical performance paths, we'll just use linked lists here. |    critical performance paths, we'll just use linked lists here. | ||||||
|  */ |  */ | ||||||
| typedef struct SDL_HintWatch { | typedef struct SDL_HintWatch | ||||||
|  | { | ||||||
|     SDL_HintCallback callback; |     SDL_HintCallback callback; | ||||||
|     void *userdata; |     void *userdata; | ||||||
|     struct SDL_HintWatch *next; |     struct SDL_HintWatch *next; | ||||||
| } SDL_HintWatch; | } SDL_HintWatch; | ||||||
|  |  | ||||||
| typedef struct SDL_Hint { | typedef struct SDL_Hint | ||||||
|  | { | ||||||
|     char *name; |     char *name; | ||||||
|     char *value; |     char *value; | ||||||
|     SDL_HintPriority priority; |     SDL_HintPriority priority; | ||||||
| @@ -68,7 +69,7 @@ SDL_SetHintWithPriority(const char *name, const char *value, | |||||||
|             } |             } | ||||||
|             if (hint->value != value && |             if (hint->value != value && | ||||||
|                 (value == NULL || !hint->value || SDL_strcmp(hint->value, value) != 0)) { |                 (value == NULL || !hint->value || SDL_strcmp(hint->value, value) != 0)) { | ||||||
|                 for (entry = hint->callbacks; entry; ) { |                 for (entry = hint->callbacks; entry;) { | ||||||
|                     /* Save the next entry in case this one is deleted */ |                     /* Save the next entry in case this one is deleted */ | ||||||
|                     SDL_HintWatch *next = entry->next; |                     SDL_HintWatch *next = entry->next; | ||||||
|                     entry->callback(entry->userdata, name, hint->value, value); |                     entry->callback(entry->userdata, name, hint->value, value); | ||||||
| @@ -113,7 +114,7 @@ SDL_ResetHint(const char *name) | |||||||
|             if ((env == NULL && hint->value != NULL) || |             if ((env == NULL && hint->value != NULL) || | ||||||
|                 (env != NULL && hint->value == NULL) || |                 (env != NULL && hint->value == NULL) || | ||||||
|                 (env != NULL && SDL_strcmp(env, hint->value) != 0)) { |                 (env != NULL && SDL_strcmp(env, hint->value) != 0)) { | ||||||
|                 for (entry = hint->callbacks; entry; ) { |                 for (entry = hint->callbacks; entry;) { | ||||||
|                     /* Save the next entry in case this one is deleted */ |                     /* Save the next entry in case this one is deleted */ | ||||||
|                     SDL_HintWatch *next = entry->next; |                     SDL_HintWatch *next = entry->next; | ||||||
|                     entry->callback(entry->userdata, name, hint->value, env); |                     entry->callback(entry->userdata, name, hint->value, env); | ||||||
| @@ -129,8 +130,7 @@ SDL_ResetHint(const char *name) | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_ResetHints(void) | ||||||
| SDL_ResetHints(void) |  | ||||||
| { | { | ||||||
|     const char *env; |     const char *env; | ||||||
|     SDL_Hint *hint; |     SDL_Hint *hint; | ||||||
| @@ -141,7 +141,7 @@ SDL_ResetHints(void) | |||||||
|         if ((env == NULL && hint->value != NULL) || |         if ((env == NULL && hint->value != NULL) || | ||||||
|             (env != NULL && hint->value == NULL) || |             (env != NULL && hint->value == NULL) || | ||||||
|             (env != NULL && SDL_strcmp(env, hint->value) != 0)) { |             (env != NULL && SDL_strcmp(env, hint->value) != 0)) { | ||||||
|             for (entry = hint->callbacks; entry; ) { |             for (entry = hint->callbacks; entry;) { | ||||||
|                 /* Save the next entry in case this one is deleted */ |                 /* Save the next entry in case this one is deleted */ | ||||||
|                 SDL_HintWatch *next = entry->next; |                 SDL_HintWatch *next = entry->next; | ||||||
|                 entry->callback(entry->userdata, hint->name, hint->value, env); |                 entry->callback(entry->userdata, hint->name, hint->value, env); | ||||||
| @@ -197,8 +197,7 @@ SDL_GetHintBoolean(const char *name, SDL_bool default_value) | |||||||
|     return SDL_GetStringBoolean(hint, default_value); |     return SDL_GetStringBoolean(hint, default_value); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata) | ||||||
| SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata) |  | ||||||
| { | { | ||||||
|     SDL_Hint *hint; |     SDL_Hint *hint; | ||||||
|     SDL_HintWatch *entry; |     SDL_HintWatch *entry; | ||||||
| @@ -259,8 +258,7 @@ SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata) | |||||||
|     callback(userdata, name, value, value); |     callback(userdata, name, value, value); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_DelHintCallback(const char *name, SDL_HintCallback callback, void *userdata) | ||||||
| SDL_DelHintCallback(const char *name, SDL_HintCallback callback, void *userdata) |  | ||||||
| { | { | ||||||
|     SDL_Hint *hint; |     SDL_Hint *hint; | ||||||
|     SDL_HintWatch *entry, *prev; |     SDL_HintWatch *entry, *prev; | ||||||
| @@ -296,7 +294,7 @@ void SDL_ClearHints(void) | |||||||
|  |  | ||||||
|         SDL_free(hint->name); |         SDL_free(hint->name); | ||||||
|         SDL_free(hint->value); |         SDL_free(hint->value); | ||||||
|         for (entry = hint->callbacks; entry; ) { |         for (entry = hint->callbacks; entry;) { | ||||||
|             SDL_HintWatch *freeable = entry; |             SDL_HintWatch *freeable = entry; | ||||||
|             entry = entry->next; |             entry = entry->next; | ||||||
|             SDL_free(freeable); |             SDL_free(freeable); | ||||||
|   | |||||||
| @@ -35,9 +35,14 @@ | |||||||
| #define SDL_VARIABLE_LENGTH_ARRAY | #define SDL_VARIABLE_LENGTH_ARRAY | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #define SDL_MAX_SMALL_ALLOC_STACKSIZE 128 | #define SDL_MAX_SMALL_ALLOC_STACKSIZE          128 | ||||||
| #define SDL_small_alloc(type, count, pisstack) ( (*(pisstack) = ((sizeof(type)*(count)) < SDL_MAX_SMALL_ALLOC_STACKSIZE)), (*(pisstack) ? SDL_stack_alloc(type, count) : (type*)SDL_malloc(sizeof(type)*(count))) ) | #define SDL_small_alloc(type, count, pisstack) ((*(pisstack) = ((sizeof(type) * (count)) < SDL_MAX_SMALL_ALLOC_STACKSIZE)), (*(pisstack) ? SDL_stack_alloc(type, count) : (type *)SDL_malloc(sizeof(type) * (count)))) | ||||||
| #define SDL_small_free(ptr, isstack) if ((isstack)) { SDL_stack_free(ptr); } else { SDL_free(ptr); } | #define SDL_small_free(ptr, isstack) \ | ||||||
|  |     if ((isstack)) {                 \ | ||||||
|  |         SDL_stack_free(ptr);         \ | ||||||
|  |     } else {                         \ | ||||||
|  |         SDL_free(ptr);               \ | ||||||
|  |     } | ||||||
|  |  | ||||||
| #include "dynapi/SDL_dynapi.h" | #include "dynapi/SDL_dynapi.h" | ||||||
|  |  | ||||||
| @@ -52,57 +57,57 @@ | |||||||
|  |  | ||||||
| /* If you run into a warning that O_CLOEXEC is redefined, update the SDL configuration header for your platform to add HAVE_O_CLOEXEC */ | /* If you run into a warning that O_CLOEXEC is redefined, update the SDL configuration header for your platform to add HAVE_O_CLOEXEC */ | ||||||
| #ifndef HAVE_O_CLOEXEC | #ifndef HAVE_O_CLOEXEC | ||||||
| #define O_CLOEXEC                       0 | #define O_CLOEXEC 0 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* A few #defines to reduce SDL2 footprint. | /* A few #defines to reduce SDL2 footprint. | ||||||
|    Only effective when library is statically linked. |    Only effective when library is statically linked. | ||||||
|    You have to manually edit this file. */ |    You have to manually edit this file. */ | ||||||
| #ifndef SDL_LEAN_AND_MEAN | #ifndef SDL_LEAN_AND_MEAN | ||||||
| #define SDL_LEAN_AND_MEAN               0 | #define SDL_LEAN_AND_MEAN 0 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Optimized functions from 'SDL_blit_0.c' | /* Optimized functions from 'SDL_blit_0.c' | ||||||
|    - blit with source BitsPerPixel < 8, palette */ |    - blit with source BitsPerPixel < 8, palette */ | ||||||
| #ifndef SDL_HAVE_BLIT_0 | #ifndef SDL_HAVE_BLIT_0 | ||||||
| #define SDL_HAVE_BLIT_0                 !SDL_LEAN_AND_MEAN | #define SDL_HAVE_BLIT_0 !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Optimized functions from 'SDL_blit_1.c' | /* Optimized functions from 'SDL_blit_1.c' | ||||||
|    - blit with source BytesPerPixel == 1, palette */ |    - blit with source BytesPerPixel == 1, palette */ | ||||||
| #ifndef SDL_HAVE_BLIT_1 | #ifndef SDL_HAVE_BLIT_1 | ||||||
| #define SDL_HAVE_BLIT_1                 !SDL_LEAN_AND_MEAN | #define SDL_HAVE_BLIT_1 !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Optimized functions from 'SDL_blit_A.c' | /* Optimized functions from 'SDL_blit_A.c' | ||||||
|    - blit with 'SDL_BLENDMODE_BLEND' blending mode */ |    - blit with 'SDL_BLENDMODE_BLEND' blending mode */ | ||||||
| #ifndef SDL_HAVE_BLIT_A | #ifndef SDL_HAVE_BLIT_A | ||||||
| #define SDL_HAVE_BLIT_A                 !SDL_LEAN_AND_MEAN | #define SDL_HAVE_BLIT_A !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Optimized functions from 'SDL_blit_N.c' | /* Optimized functions from 'SDL_blit_N.c' | ||||||
|    - blit with COLORKEY mode, or nothing */ |    - blit with COLORKEY mode, or nothing */ | ||||||
| #ifndef SDL_HAVE_BLIT_N | #ifndef SDL_HAVE_BLIT_N | ||||||
| #define SDL_HAVE_BLIT_N                 !SDL_LEAN_AND_MEAN | #define SDL_HAVE_BLIT_N !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Optimized functions from 'SDL_blit_N.c' | /* Optimized functions from 'SDL_blit_N.c' | ||||||
|    - RGB565 conversion with Lookup tables */ |    - RGB565 conversion with Lookup tables */ | ||||||
| #ifndef SDL_HAVE_BLIT_N_RGB565 | #ifndef SDL_HAVE_BLIT_N_RGB565 | ||||||
| #define SDL_HAVE_BLIT_N_RGB565          !SDL_LEAN_AND_MEAN | #define SDL_HAVE_BLIT_N_RGB565 !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Optimized functions from 'SDL_blit_AUTO.c' | /* Optimized functions from 'SDL_blit_AUTO.c' | ||||||
|    - blit with modulate color, modulate alpha, any blending mode |    - blit with modulate color, modulate alpha, any blending mode | ||||||
|    - scaling or not */ |    - scaling or not */ | ||||||
| #ifndef SDL_HAVE_BLIT_AUTO | #ifndef SDL_HAVE_BLIT_AUTO | ||||||
| #define SDL_HAVE_BLIT_AUTO              !SDL_LEAN_AND_MEAN | #define SDL_HAVE_BLIT_AUTO !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Run-Length-Encoding | /* Run-Length-Encoding | ||||||
|    - SDL_SetColorKey() called with SDL_RLEACCEL flag */ |    - SDL_SetColorKey() called with SDL_RLEACCEL flag */ | ||||||
| #ifndef SDL_HAVE_RLE | #ifndef SDL_HAVE_RLE | ||||||
| #define SDL_HAVE_RLE                    !SDL_LEAN_AND_MEAN | #define SDL_HAVE_RLE !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Software SDL_Renderer | /* Software SDL_Renderer | ||||||
| @@ -110,14 +115,14 @@ | |||||||
|    - *not* general blitting functions |    - *not* general blitting functions | ||||||
|    - {blend,draw}{fillrect,line,point} internal functions */ |    - {blend,draw}{fillrect,line,point} internal functions */ | ||||||
| #ifndef SDL_VIDEO_RENDER_SW | #ifndef SDL_VIDEO_RENDER_SW | ||||||
| #define SDL_VIDEO_RENDER_SW             !SDL_LEAN_AND_MEAN | #define SDL_VIDEO_RENDER_SW !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* YUV formats | /* YUV formats | ||||||
|    - handling of YUV surfaces |    - handling of YUV surfaces | ||||||
|    - blitting and conversion functions */ |    - blitting and conversion functions */ | ||||||
| #ifndef SDL_HAVE_YUV | #ifndef SDL_HAVE_YUV | ||||||
| #define SDL_HAVE_YUV                    !SDL_LEAN_AND_MEAN | #define SDL_HAVE_YUV !SDL_LEAN_AND_MEAN | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include "SDL_assert.h" | #include "SDL_assert.h" | ||||||
|   | |||||||
| @@ -24,10 +24,9 @@ | |||||||
| #include "./SDL_list.h" | #include "./SDL_list.h" | ||||||
|  |  | ||||||
| /* Push */ | /* Push */ | ||||||
| int | int SDL_ListAdd(SDL_ListNode **head, void *ent) | ||||||
| SDL_ListAdd(SDL_ListNode **head, void *ent) |  | ||||||
| { | { | ||||||
|     SDL_ListNode *node = SDL_malloc(sizeof (*node)); |     SDL_ListNode *node = SDL_malloc(sizeof(*node)); | ||||||
|  |  | ||||||
|     if (node == NULL) { |     if (node == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
| @@ -40,8 +39,7 @@ SDL_ListAdd(SDL_ListNode **head, void *ent) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Pop from end as a FIFO (if add with SDL_ListAdd) */ | /* Pop from end as a FIFO (if add with SDL_ListAdd) */ | ||||||
| void | void SDL_ListPop(SDL_ListNode **head, void **ent) | ||||||
| SDL_ListPop(SDL_ListNode **head, void **ent) |  | ||||||
| { | { | ||||||
|     SDL_ListNode **ptr = head; |     SDL_ListNode **ptr = head; | ||||||
|  |  | ||||||
| @@ -55,15 +53,14 @@ SDL_ListPop(SDL_ListNode **head, void **ent) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (ent) { |     if (ent) { | ||||||
|        *ent = (*ptr)->entry; |         *ent = (*ptr)->entry; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_free(*ptr); |     SDL_free(*ptr); | ||||||
|     *ptr = NULL; |     *ptr = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_ListRemove(SDL_ListNode **head, void *ent) | ||||||
| SDL_ListRemove(SDL_ListNode **head, void *ent) |  | ||||||
| { | { | ||||||
|     SDL_ListNode **ptr = head; |     SDL_ListNode **ptr = head; | ||||||
|  |  | ||||||
| @@ -78,8 +75,7 @@ SDL_ListRemove(SDL_ListNode **head, void *ent) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_ListClear(SDL_ListNode **head) | ||||||
| SDL_ListClear(SDL_ListNode **head) |  | ||||||
| { | { | ||||||
|     SDL_ListNode *l = *head; |     SDL_ListNode *l = *head; | ||||||
|     *head = NULL; |     *head = NULL; | ||||||
|   | |||||||
| @@ -28,7 +28,6 @@ typedef struct SDL_ListNode | |||||||
|     struct SDL_ListNode *next; |     struct SDL_ListNode *next; | ||||||
| } SDL_ListNode; | } SDL_ListNode; | ||||||
|  |  | ||||||
|  |  | ||||||
| int SDL_ListAdd(SDL_ListNode **head, void *ent); | int SDL_ListAdd(SDL_ListNode **head, void *ent); | ||||||
| void SDL_ListPop(SDL_ListNode **head, void **ent); | void SDL_ListPop(SDL_ListNode **head, void **ent); | ||||||
| void SDL_ListRemove(SDL_ListNode **head, void *ent); | void SDL_ListRemove(SDL_ListNode **head, void *ent); | ||||||
|   | |||||||
							
								
								
									
										141
									
								
								src/SDL_log.c
									
									
									
									
									
								
							
							
						
						
									
										141
									
								
								src/SDL_log.c
									
									
									
									
									
								
							| @@ -41,14 +41,13 @@ | |||||||
|  |  | ||||||
| #include "stdlib/SDL_vacopy.h" | #include "stdlib/SDL_vacopy.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| /* The size of the stack buffer to use for rendering log messages. */ | /* The size of the stack buffer to use for rendering log messages. */ | ||||||
| #define SDL_MAX_LOG_MESSAGE_STACK 256 | #define SDL_MAX_LOG_MESSAGE_STACK 256 | ||||||
|  |  | ||||||
| #define DEFAULT_PRIORITY                SDL_LOG_PRIORITY_CRITICAL | #define DEFAULT_PRIORITY             SDL_LOG_PRIORITY_CRITICAL | ||||||
| #define DEFAULT_ASSERT_PRIORITY         SDL_LOG_PRIORITY_WARN | #define DEFAULT_ASSERT_PRIORITY      SDL_LOG_PRIORITY_WARN | ||||||
| #define DEFAULT_APPLICATION_PRIORITY    SDL_LOG_PRIORITY_INFO | #define DEFAULT_APPLICATION_PRIORITY SDL_LOG_PRIORITY_INFO | ||||||
| #define DEFAULT_TEST_PRIORITY           SDL_LOG_PRIORITY_VERBOSE | #define DEFAULT_TEST_PRIORITY        SDL_LOG_PRIORITY_VERBOSE | ||||||
|  |  | ||||||
| typedef struct SDL_LogLevel | typedef struct SDL_LogLevel | ||||||
| { | { | ||||||
| @@ -105,8 +104,7 @@ static int SDL_android_priority[SDL_NUM_LOG_PRIORITIES] = { | |||||||
| }; | }; | ||||||
| #endif /* __ANDROID__ */ | #endif /* __ANDROID__ */ | ||||||
|  |  | ||||||
| void | void SDL_LogInit(void) | ||||||
| SDL_LogInit(void) |  | ||||||
| { | { | ||||||
|     if (log_function_mutex == NULL) { |     if (log_function_mutex == NULL) { | ||||||
|         /* if this fails we'll try to continue without it. */ |         /* if this fails we'll try to continue without it. */ | ||||||
| @@ -114,8 +112,7 @@ SDL_LogInit(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogQuit(void) | ||||||
| SDL_LogQuit(void) |  | ||||||
| { | { | ||||||
|     SDL_LogResetPriorities(); |     SDL_LogResetPriorities(); | ||||||
|     if (log_function_mutex) { |     if (log_function_mutex) { | ||||||
| @@ -124,8 +121,7 @@ SDL_LogQuit(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogSetAllPriority(SDL_LogPriority priority) | ||||||
| SDL_LogSetAllPriority(SDL_LogPriority priority) |  | ||||||
| { | { | ||||||
|     SDL_LogLevel *entry; |     SDL_LogLevel *entry; | ||||||
|  |  | ||||||
| @@ -137,8 +133,7 @@ SDL_LogSetAllPriority(SDL_LogPriority priority) | |||||||
|     SDL_application_priority = priority; |     SDL_application_priority = priority; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogSetPriority(int category, SDL_LogPriority priority) | ||||||
| SDL_LogSetPriority(int category, SDL_LogPriority priority) |  | ||||||
| { | { | ||||||
|     SDL_LogLevel *entry; |     SDL_LogLevel *entry; | ||||||
|  |  | ||||||
| @@ -181,8 +176,7 @@ SDL_LogGetPriority(int category) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogResetPriorities(void) | ||||||
| SDL_LogResetPriorities(void) |  | ||||||
| { | { | ||||||
|     SDL_LogLevel *entry; |     SDL_LogLevel *entry; | ||||||
|  |  | ||||||
| @@ -198,8 +192,7 @@ SDL_LogResetPriorities(void) | |||||||
|     SDL_test_priority = DEFAULT_TEST_PRIORITY; |     SDL_test_priority = DEFAULT_TEST_PRIORITY; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|  |  | ||||||
| @@ -208,8 +201,7 @@ SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|  |  | ||||||
| @@ -218,8 +210,7 @@ SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|  |  | ||||||
| @@ -228,8 +219,7 @@ SDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|  |  | ||||||
| @@ -238,8 +228,7 @@ SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|  |  | ||||||
| @@ -248,8 +237,7 @@ SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|  |  | ||||||
| @@ -258,8 +246,7 @@ SDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|  |  | ||||||
| @@ -268,8 +255,7 @@ SDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogMessage(int category, SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) | ||||||
| SDL_LogMessage(int category, SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) |  | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|  |  | ||||||
| @@ -279,8 +265,7 @@ SDL_LogMessage(int category, SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING | |||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef __ANDROID__ | #ifdef __ANDROID__ | ||||||
| static const char * | static const char *GetCategoryPrefix(int category) | ||||||
| GetCategoryPrefix(int category) |  | ||||||
| { | { | ||||||
|     if (category < SDL_LOG_CATEGORY_RESERVED1) { |     if (category < SDL_LOG_CATEGORY_RESERVED1) { | ||||||
|         return SDL_category_prefixes[category]; |         return SDL_category_prefixes[category]; | ||||||
| @@ -292,8 +277,7 @@ GetCategoryPrefix(int category) | |||||||
| } | } | ||||||
| #endif /* __ANDROID__ */ | #endif /* __ANDROID__ */ | ||||||
|  |  | ||||||
| void | void SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list ap) | ||||||
| SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list ap) |  | ||||||
| { | { | ||||||
|     char *message = NULL; |     char *message = NULL; | ||||||
|     char stack_buf[SDL_MAX_LOG_MESSAGE_STACK]; |     char stack_buf[SDL_MAX_LOG_MESSAGE_STACK]; | ||||||
| @@ -345,9 +329,9 @@ SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Chop off final endline. */ |     /* Chop off final endline. */ | ||||||
|     if ((len > 0) && (message[len-1] == '\n')) { |     if ((len > 0) && (message[len - 1] == '\n')) { | ||||||
|         message[--len] = '\0'; |         message[--len] = '\0'; | ||||||
|         if ((len > 0) && (message[len-1] == '\r')) {  /* catch "\r\n", too. */ |         if ((len > 0) && (message[len - 1] == '\r')) { /* catch "\r\n", too. */ | ||||||
|             message[--len] = '\0'; |             message[--len] = '\0'; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -376,9 +360,8 @@ static int consoleAttached = 0; | |||||||
| static HANDLE stderrHandle = NULL; | static HANDLE stderrHandle = NULL; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static void SDLCALL | static void SDLCALL SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, | ||||||
| SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, |                                   const char *message) | ||||||
|               const char *message) |  | ||||||
| { | { | ||||||
| #if defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) | #if defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) | ||||||
|     /* Way too many allocations here, urgh */ |     /* Way too many allocations here, urgh */ | ||||||
| @@ -399,34 +382,34 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, | |||||||
|         if (consoleAttached == 0) { |         if (consoleAttached == 0) { | ||||||
|             attachResult = AttachConsole(ATTACH_PARENT_PROCESS); |             attachResult = AttachConsole(ATTACH_PARENT_PROCESS); | ||||||
|             if (!attachResult) { |             if (!attachResult) { | ||||||
|                     attachError = GetLastError(); |                 attachError = GetLastError(); | ||||||
|                     if (attachError == ERROR_INVALID_HANDLE) { |                 if (attachError == ERROR_INVALID_HANDLE) { | ||||||
|                         /* This is expected when running from Visual Studio */ |                     /* This is expected when running from Visual Studio */ | ||||||
|                         /*OutputDebugString(TEXT("Parent process has no console\r\n"));*/ |                     /*OutputDebugString(TEXT("Parent process has no console\r\n"));*/ | ||||||
|                         consoleAttached = -1; |                     consoleAttached = -1; | ||||||
|                     } else if (attachError == ERROR_GEN_FAILURE) { |                 } else if (attachError == ERROR_GEN_FAILURE) { | ||||||
|                          OutputDebugString(TEXT("Could not attach to console of parent process\r\n")); |                     OutputDebugString(TEXT("Could not attach to console of parent process\r\n")); | ||||||
|                          consoleAttached = -1; |                     consoleAttached = -1; | ||||||
|                     } else if (attachError == ERROR_ACCESS_DENIED) {   |                 } else if (attachError == ERROR_ACCESS_DENIED) { | ||||||
|                          /* Already attached */ |                     /* Already attached */ | ||||||
|                         consoleAttached = 1; |  | ||||||
|                     } else { |  | ||||||
|                         OutputDebugString(TEXT("Error attaching console\r\n")); |  | ||||||
|                         consoleAttached = -1; |  | ||||||
|                     } |  | ||||||
|                 } else { |  | ||||||
|                     /* Newly attached */ |  | ||||||
|                     consoleAttached = 1; |                     consoleAttached = 1; | ||||||
|  |                 } else { | ||||||
|  |                     OutputDebugString(TEXT("Error attaching console\r\n")); | ||||||
|  |                     consoleAttached = -1; | ||||||
|                 } |                 } | ||||||
|  |             } else { | ||||||
|  |                 /* Newly attached */ | ||||||
|  |                 consoleAttached = 1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|                 if (consoleAttached == 1) { |             if (consoleAttached == 1) { | ||||||
|                         stderrHandle = GetStdHandle(STD_ERROR_HANDLE); |                 stderrHandle = GetStdHandle(STD_ERROR_HANDLE); | ||||||
|  |  | ||||||
|                         if (GetConsoleMode(stderrHandle, &consoleMode) == 0) { |                 if (GetConsoleMode(stderrHandle, &consoleMode) == 0) { | ||||||
|                             /* WriteConsole fails if the output is redirected to a file. Must use WriteFile instead. */ |                     /* WriteConsole fails if the output is redirected to a file. Must use WriteFile instead. */ | ||||||
|                             consoleAttached = 2; |                     consoleAttached = 2; | ||||||
|                         } |  | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
| #endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) */ | #endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) */ | ||||||
|  |  | ||||||
| @@ -441,15 +424,15 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, | |||||||
| #if !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) | #if !defined(HAVE_STDIO_H) && !defined(__WINRT__) && !defined(__GDK__) | ||||||
|         /* Screen output to stderr, if console was attached. */ |         /* Screen output to stderr, if console was attached. */ | ||||||
|         if (consoleAttached == 1) { |         if (consoleAttached == 1) { | ||||||
|                 if (!WriteConsole(stderrHandle, tstr, (DWORD) SDL_tcslen(tstr), &charsWritten, NULL)) { |             if (!WriteConsole(stderrHandle, tstr, (DWORD)SDL_tcslen(tstr), &charsWritten, NULL)) { | ||||||
|                     OutputDebugString(TEXT("Error calling WriteConsole\r\n")); |                 OutputDebugString(TEXT("Error calling WriteConsole\r\n")); | ||||||
|                     if (GetLastError() == ERROR_NOT_ENOUGH_MEMORY) { |                 if (GetLastError() == ERROR_NOT_ENOUGH_MEMORY) { | ||||||
|                         OutputDebugString(TEXT("Insufficient heap memory to write message\r\n")); |                     OutputDebugString(TEXT("Insufficient heap memory to write message\r\n")); | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|         } else if (consoleAttached == 2) { |         } else if (consoleAttached == 2) { | ||||||
|             if (!WriteFile(stderrHandle, output, (DWORD) SDL_strlen(output), &charsWritten, NULL)) { |             if (!WriteFile(stderrHandle, output, (DWORD)SDL_strlen(output), &charsWritten, NULL)) { | ||||||
|                 OutputDebugString(TEXT("Error calling WriteFile\r\n")); |                 OutputDebugString(TEXT("Error calling WriteFile\r\n")); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -467,7 +450,7 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, | |||||||
|     } |     } | ||||||
| #elif defined(__APPLE__) && (defined(SDL_VIDEO_DRIVER_COCOA) || defined(SDL_VIDEO_DRIVER_UIKIT)) | #elif defined(__APPLE__) && (defined(SDL_VIDEO_DRIVER_COCOA) || defined(SDL_VIDEO_DRIVER_UIKIT)) | ||||||
|     /* Technically we don't need Cocoa/UIKit, but that's where this function is defined for now. |     /* Technically we don't need Cocoa/UIKit, but that's where this function is defined for now. | ||||||
|     */ |      */ | ||||||
|     extern void SDL_NSLog(const char *prefix, const char *text); |     extern void SDL_NSLog(const char *prefix, const char *text); | ||||||
|     { |     { | ||||||
|         SDL_NSLog(SDL_priority_prefixes[priority], message); |         SDL_NSLog(SDL_priority_prefixes[priority], message); | ||||||
| @@ -475,17 +458,17 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, | |||||||
|     } |     } | ||||||
| #elif defined(__PSP__) || defined(__PS2__) | #elif defined(__PSP__) || defined(__PS2__) | ||||||
|     { |     { | ||||||
|         FILE*        pFile; |         FILE *pFile; | ||||||
|         pFile = fopen ("SDL_Log.txt", "a"); |         pFile = fopen("SDL_Log.txt", "a"); | ||||||
|         fprintf(pFile, "%s: %s\n", SDL_priority_prefixes[priority], message); |         fprintf(pFile, "%s: %s\n", SDL_priority_prefixes[priority], message); | ||||||
|         fclose (pFile); |         fclose(pFile); | ||||||
|     } |     } | ||||||
| #elif defined(__VITA__) | #elif defined(__VITA__) | ||||||
|     { |     { | ||||||
|         FILE*        pFile; |         FILE *pFile; | ||||||
|         pFile = fopen ("ux0:/data/SDL_Log.txt", "a"); |         pFile = fopen("ux0:/data/SDL_Log.txt", "a"); | ||||||
|         fprintf(pFile, "%s: %s\n", SDL_priority_prefixes[priority], message); |         fprintf(pFile, "%s: %s\n", SDL_priority_prefixes[priority], message); | ||||||
|         fclose (pFile); |         fclose(pFile); | ||||||
|     } |     } | ||||||
| #elif defined(__3DS__) | #elif defined(__3DS__) | ||||||
|     { |     { | ||||||
| @@ -504,8 +487,7 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata) | ||||||
| SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata) |  | ||||||
| { | { | ||||||
|     if (callback) { |     if (callback) { | ||||||
|         *callback = SDL_log_function; |         *callback = SDL_log_function; | ||||||
| @@ -515,8 +497,7 @@ SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata) | ||||||
| SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata) |  | ||||||
| { | { | ||||||
|     SDL_log_function = callback; |     SDL_log_function = callback; | ||||||
|     SDL_log_userdata = userdata; |     SDL_log_userdata = userdata; | ||||||
|   | |||||||
| @@ -37,19 +37,20 @@ | |||||||
|  |  | ||||||
| /* The __atomic_load_n() intrinsic showed up in different times for different compilers. */ | /* The __atomic_load_n() intrinsic showed up in different times for different compilers. */ | ||||||
| #if defined(__clang__) | #if defined(__clang__) | ||||||
| #  if __has_builtin(__atomic_load_n) || defined(HAVE_GCC_ATOMICS) | #if __has_builtin(__atomic_load_n) || defined(HAVE_GCC_ATOMICS) | ||||||
|      /* !!! FIXME: this advertises as available in the NDK but uses an external symbol we don't have. | /* !!! FIXME: this advertises as available in the NDK but uses an external symbol we don't have. | ||||||
|         It might be in a later NDK or we might need an extra library? --ryan. */ |    It might be in a later NDK or we might need an extra library? --ryan. */ | ||||||
| #    if !defined(__ANDROID__) | #if !defined(__ANDROID__) | ||||||
| #      define HAVE_ATOMIC_LOAD_N 1 | #define HAVE_ATOMIC_LOAD_N 1 | ||||||
| #    endif | #endif | ||||||
| #  endif | #endif | ||||||
| #elif defined(__GNUC__) | #elif defined(__GNUC__) | ||||||
| #   if (__GNUC__ >= 5) | #if (__GNUC__ >= 5) | ||||||
| #     define HAVE_ATOMIC_LOAD_N 1 | #define HAVE_ATOMIC_LOAD_N 1 | ||||||
| #   endif | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* *INDENT-OFF* */ /* clang-format off */ | ||||||
| #if defined(__WATCOMC__) && defined(__386__) | #if defined(__WATCOMC__) && defined(__386__) | ||||||
| SDL_COMPILE_TIME_ASSERT(intsize, 4==sizeof(int)); | SDL_COMPILE_TIME_ASSERT(intsize, 4==sizeof(int)); | ||||||
| #define HAVE_WATCOM_ATOMICS | #define HAVE_WATCOM_ATOMICS | ||||||
| @@ -74,7 +75,9 @@ extern __inline int _SDL_xadd_watcom(volatile int *a, int v); | |||||||
|   parm [ecx] [eax] \ |   parm [ecx] [eax] \ | ||||||
|   value [eax] \ |   value [eax] \ | ||||||
|   modify exact [eax]; |   modify exact [eax]; | ||||||
|  |  | ||||||
| #endif /* __WATCOMC__ && __386__ */ | #endif /* __WATCOMC__ && __386__ */ | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|   If any of the operations are not provided then we must emulate some |   If any of the operations are not provided then we must emulate some | ||||||
| @@ -106,16 +109,14 @@ extern __inline int _SDL_xadd_watcom(volatile int *a, int v); | |||||||
| #if EMULATE_CAS | #if EMULATE_CAS | ||||||
| static SDL_SpinLock locks[32]; | static SDL_SpinLock locks[32]; | ||||||
|  |  | ||||||
| static SDL_INLINE void | static SDL_INLINE void enterLock(void *a) | ||||||
| enterLock(void *a) |  | ||||||
| { | { | ||||||
|     uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f); |     uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f); | ||||||
|  |  | ||||||
|     SDL_AtomicLock(&locks[index]); |     SDL_AtomicLock(&locks[index]); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_INLINE void | static SDL_INLINE void leaveLock(void *a) | ||||||
| leaveLock(void *a) |  | ||||||
| { | { | ||||||
|     uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f); |     uintptr_t index = ((((uintptr_t)a) >> 3) & 0x1f); | ||||||
|  |  | ||||||
| @@ -123,7 +124,6 @@ leaveLock(void *a) | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| SDL_bool | SDL_bool | ||||||
| SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval) | SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval) | ||||||
| { | { | ||||||
| @@ -150,7 +150,7 @@ SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval) | |||||||
|  |  | ||||||
|     return retval; |     return retval; | ||||||
| #else | #else | ||||||
|     #error Please define your platform. | #error Please define your platform. | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -181,12 +181,11 @@ SDL_AtomicCASPtr(void **a, void *oldval, void *newval) | |||||||
|  |  | ||||||
|     return retval; |     return retval; | ||||||
| #else | #else | ||||||
|     #error Please define your platform. | #error Please define your platform. | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_AtomicSet(SDL_atomic_t *a, int v) | ||||||
| SDL_AtomicSet(SDL_atomic_t *a, int v) |  | ||||||
| { | { | ||||||
| #ifdef HAVE_MSC_ATOMICS | #ifdef HAVE_MSC_ATOMICS | ||||||
|     SDL_COMPILE_TIME_ASSERT(atomic_set, sizeof(long) == sizeof(a->value)); |     SDL_COMPILE_TIME_ASSERT(atomic_set, sizeof(long) == sizeof(a->value)); | ||||||
| @@ -206,7 +205,7 @@ SDL_AtomicSet(SDL_atomic_t *a, int v) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void* | void * | ||||||
| SDL_AtomicSetPtr(void **a, void *v) | SDL_AtomicSetPtr(void **a, void *v) | ||||||
| { | { | ||||||
| #if defined(HAVE_MSC_ATOMICS) | #if defined(HAVE_MSC_ATOMICS) | ||||||
| @@ -226,8 +225,7 @@ SDL_AtomicSetPtr(void **a, void *v) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_AtomicAdd(SDL_atomic_t *a, int v) | ||||||
| SDL_AtomicAdd(SDL_atomic_t *a, int v) |  | ||||||
| { | { | ||||||
| #ifdef HAVE_MSC_ATOMICS | #ifdef HAVE_MSC_ATOMICS | ||||||
|     SDL_COMPILE_TIME_ASSERT(atomic_add, sizeof(long) == sizeof(a->value)); |     SDL_COMPILE_TIME_ASSERT(atomic_add, sizeof(long) == sizeof(a->value)); | ||||||
| @@ -239,7 +237,7 @@ SDL_AtomicAdd(SDL_atomic_t *a, int v) | |||||||
| #elif defined(__SOLARIS__) | #elif defined(__SOLARIS__) | ||||||
|     int pv = a->value; |     int pv = a->value; | ||||||
|     membar_consumer(); |     membar_consumer(); | ||||||
|     atomic_add_int((volatile uint_t*)&a->value, v); |     atomic_add_int((volatile uint_t *)&a->value, v); | ||||||
|     return pv; |     return pv; | ||||||
| #else | #else | ||||||
|     int value; |     int value; | ||||||
| @@ -250,8 +248,7 @@ SDL_AtomicAdd(SDL_atomic_t *a, int v) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_AtomicGet(SDL_atomic_t *a) | ||||||
| SDL_AtomicGet(SDL_atomic_t *a) |  | ||||||
| { | { | ||||||
| #ifdef HAVE_ATOMIC_LOAD_N | #ifdef HAVE_ATOMIC_LOAD_N | ||||||
|     return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST); |     return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST); | ||||||
| @@ -299,14 +296,12 @@ SDL_AtomicGetPtr(void **a) | |||||||
| #error This file should be built in arm mode so the mcr instruction is available for memory barriers | #error This file should be built in arm mode so the mcr instruction is available for memory barriers | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| void | void SDL_MemoryBarrierReleaseFunction(void) | ||||||
| SDL_MemoryBarrierReleaseFunction(void) |  | ||||||
| { | { | ||||||
|     SDL_MemoryBarrierRelease(); |     SDL_MemoryBarrierRelease(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_MemoryBarrierAcquireFunction(void) | ||||||
| SDL_MemoryBarrierAcquireFunction(void) |  | ||||||
| { | { | ||||||
|     SDL_MemoryBarrierAcquire(); |     SDL_MemoryBarrierAcquire(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -48,6 +48,7 @@ | |||||||
| #include <libkern/OSAtomic.h> | #include <libkern/OSAtomic.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* *INDENT-OFF* */ /* clang-format off */ | ||||||
| #if defined(__WATCOMC__) && defined(__386__) | #if defined(__WATCOMC__) && defined(__386__) | ||||||
| SDL_COMPILE_TIME_ASSERT(locksize, 4==sizeof(SDL_SpinLock)); | SDL_COMPILE_TIME_ASSERT(locksize, 4==sizeof(SDL_SpinLock)); | ||||||
| extern __inline int _SDL_xchg_watcom(volatile int *a, int v); | extern __inline int _SDL_xchg_watcom(volatile int *a, int v); | ||||||
| @@ -57,6 +58,7 @@ extern __inline int _SDL_xchg_watcom(volatile int *a, int v); | |||||||
|   value [eax] \ |   value [eax] \ | ||||||
|   modify exact [eax]; |   modify exact [eax]; | ||||||
| #endif /* __WATCOMC__ && __386__ */ | #endif /* __WATCOMC__ && __386__ */ | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
| /* This function is where all the magic happens... */ | /* This function is where all the magic happens... */ | ||||||
| SDL_bool | SDL_bool | ||||||
| @@ -93,39 +95,47 @@ SDL_AtomicTryLock(SDL_SpinLock *lock) | |||||||
| #elif defined(__WATCOMC__) && defined(__386__) | #elif defined(__WATCOMC__) && defined(__386__) | ||||||
|     return _SDL_xchg_watcom(lock, 1) == 0; |     return _SDL_xchg_watcom(lock, 1) == 0; | ||||||
|  |  | ||||||
| #elif defined(__GNUC__) && defined(__arm__) && \ | #elif defined(__GNUC__) && defined(__arm__) &&               \ | ||||||
|         (defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) || \ |     (defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) ||  \ | ||||||
|          defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || \ |      defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) ||  \ | ||||||
|          defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5TE__) || \ |      defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5TE__) || \ | ||||||
|          defined(__ARM_ARCH_5TEJ__)) |      defined(__ARM_ARCH_5TEJ__)) | ||||||
|     int result; |     int result; | ||||||
|  |  | ||||||
| #if defined(__RISCOS__) | #if defined(__RISCOS__) | ||||||
|     if (__cpucap_have_rex()) { |     if (__cpucap_have_rex()) { | ||||||
|         __asm__ __volatile__ ( |         __asm__ __volatile__( | ||||||
|             "ldrex %0, [%2]\nteq   %0, #0\nstrexeq %0, %1, [%2]" |             "ldrex %0, [%2]\nteq   %0, #0\nstrexeq %0, %1, [%2]" | ||||||
|             : "=&r" (result) : "r" (1), "r" (lock) : "cc", "memory"); |             : "=&r"(result) | ||||||
|  |             : "r"(1), "r"(lock) | ||||||
|  |             : "cc", "memory"); | ||||||
|         return result == 0; |         return result == 0; | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     __asm__ __volatile__ ( |     __asm__ __volatile__( | ||||||
|         "swp %0, %1, [%2]\n" |         "swp %0, %1, [%2]\n" | ||||||
|         : "=&r,&r" (result) : "r,0" (1), "r,r" (lock) : "memory"); |         : "=&r,&r"(result) | ||||||
|  |         : "r,0"(1), "r,r"(lock) | ||||||
|  |         : "memory"); | ||||||
|     return result == 0; |     return result == 0; | ||||||
|  |  | ||||||
| #elif defined(__GNUC__) && defined(__arm__) | #elif defined(__GNUC__) && defined(__arm__) | ||||||
|     int result; |     int result; | ||||||
|     __asm__ __volatile__ ( |     __asm__ __volatile__( | ||||||
|         "ldrex %0, [%2]\nteq   %0, #0\nstrexeq %0, %1, [%2]" |         "ldrex %0, [%2]\nteq   %0, #0\nstrexeq %0, %1, [%2]" | ||||||
|         : "=&r" (result) : "r" (1), "r" (lock) : "cc", "memory"); |         : "=&r"(result) | ||||||
|  |         : "r"(1), "r"(lock) | ||||||
|  |         : "cc", "memory"); | ||||||
|     return result == 0; |     return result == 0; | ||||||
|  |  | ||||||
| #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) | #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) | ||||||
|     int result; |     int result; | ||||||
|     __asm__ __volatile__( |     __asm__ __volatile__( | ||||||
|         "lock ; xchgl %0, (%1)\n" |         "lock ; xchgl %0, (%1)\n" | ||||||
|         : "=r" (result) : "r" (lock), "0" (1) : "cc", "memory"); |         : "=r"(result) | ||||||
|  |         : "r"(lock), "0"(1) | ||||||
|  |         : "cc", "memory"); | ||||||
|     return result == 0; |     return result == 0; | ||||||
|  |  | ||||||
| #elif defined(__MACOSX__) || defined(__IPHONEOS__) | #elif defined(__MACOSX__) || defined(__IPHONEOS__) | ||||||
| @@ -150,7 +160,9 @@ SDL_AtomicTryLock(SDL_SpinLock *lock) | |||||||
|         res = SDL_TRUE; |         res = SDL_TRUE; | ||||||
|     } |     } | ||||||
|     // enable interuption |     // enable interuption | ||||||
|     if (oldintr) { EIntr(); } |     if (oldintr) { | ||||||
|  |         EIntr(); | ||||||
|  |     } | ||||||
|     return res; |     return res; | ||||||
| #else | #else | ||||||
| #error Please implement for your platform. | #error Please implement for your platform. | ||||||
| @@ -158,8 +170,7 @@ SDL_AtomicTryLock(SDL_SpinLock *lock) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_AtomicLock(SDL_SpinLock *lock) | ||||||
| SDL_AtomicLock(SDL_SpinLock *lock) |  | ||||||
| { | { | ||||||
|     int iterations = 0; |     int iterations = 0; | ||||||
|     /* FIXME: Should we have an eventual timeout? */ |     /* FIXME: Should we have an eventual timeout? */ | ||||||
| @@ -174,8 +185,7 @@ SDL_AtomicLock(SDL_SpinLock *lock) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_AtomicUnlock(SDL_SpinLock *lock) | ||||||
| SDL_AtomicUnlock(SDL_SpinLock *lock) |  | ||||||
| { | { | ||||||
| #if HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET | #if HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET | ||||||
|     __sync_lock_release(lock); |     __sync_lock_release(lock); | ||||||
| @@ -188,7 +198,7 @@ SDL_AtomicUnlock(SDL_SpinLock *lock) | |||||||
|     *lock = 0; |     *lock = 0; | ||||||
|  |  | ||||||
| #elif defined(__WATCOMC__) && defined(__386__) | #elif defined(__WATCOMC__) && defined(__386__) | ||||||
|     SDL_CompilerBarrier (); |     SDL_CompilerBarrier(); | ||||||
|     *lock = 0; |     *lock = 0; | ||||||
|  |  | ||||||
| #elif defined(__SOLARIS__) | #elif defined(__SOLARIS__) | ||||||
|   | |||||||
| @@ -132,22 +132,20 @@ static const AudioBootStrap *const bootstrap[] = { | |||||||
|     NULL |     NULL | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef HAVE_LIBSAMPLERATE_H | #ifdef HAVE_LIBSAMPLERATE_H | ||||||
| #ifdef SDL_LIBSAMPLERATE_DYNAMIC | #ifdef SDL_LIBSAMPLERATE_DYNAMIC | ||||||
| static void *SRC_lib = NULL; | static void *SRC_lib = NULL; | ||||||
| #endif | #endif | ||||||
| SDL_bool SRC_available = SDL_FALSE; | SDL_bool SRC_available = SDL_FALSE; | ||||||
| int SRC_converter = 0; | int SRC_converter = 0; | ||||||
| SRC_STATE* (*SRC_src_new)(int converter_type, int channels, int *error) = NULL; | SRC_STATE *(*SRC_src_new)(int converter_type, int channels, int *error) = NULL; | ||||||
| int (*SRC_src_process)(SRC_STATE *state, SRC_DATA *data) = NULL; | int (*SRC_src_process)(SRC_STATE *state, SRC_DATA *data) = NULL; | ||||||
| int (*SRC_src_reset)(SRC_STATE *state) = NULL; | int (*SRC_src_reset)(SRC_STATE *state) = NULL; | ||||||
| SRC_STATE* (*SRC_src_delete)(SRC_STATE *state) = NULL; | SRC_STATE *(*SRC_src_delete)(SRC_STATE *state) = NULL; | ||||||
| const char* (*SRC_src_strerror)(int error) = NULL; | const char *(*SRC_src_strerror)(int error) = NULL; | ||||||
| int (*SRC_src_simple)(SRC_DATA *data, int converter_type, int channels) = NULL; | int (*SRC_src_simple)(SRC_DATA *data, int converter_type, int channels) = NULL; | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool LoadLibSampleRate(void) | ||||||
| LoadLibSampleRate(void) |  | ||||||
| { | { | ||||||
|     const char *hint = SDL_GetHint(SDL_HINT_AUDIO_RESAMPLING_MODE); |     const char *hint = SDL_GetHint(SDL_HINT_AUDIO_RESAMPLING_MODE); | ||||||
|  |  | ||||||
| @@ -155,7 +153,7 @@ LoadLibSampleRate(void) | |||||||
|     SRC_converter = 0; |     SRC_converter = 0; | ||||||
|  |  | ||||||
|     if (!hint || *hint == '0' || SDL_strcasecmp(hint, "default") == 0) { |     if (!hint || *hint == '0' || SDL_strcasecmp(hint, "default") == 0) { | ||||||
|         return SDL_FALSE;  /* don't load anything. */ |         return SDL_FALSE; /* don't load anything. */ | ||||||
|     } else if (*hint == '1' || SDL_strcasecmp(hint, "fast") == 0) { |     } else if (*hint == '1' || SDL_strcasecmp(hint, "fast") == 0) { | ||||||
|         SRC_converter = SRC_SINC_FASTEST; |         SRC_converter = SRC_SINC_FASTEST; | ||||||
|     } else if (*hint == '2' || SDL_strcasecmp(hint, "medium") == 0) { |     } else if (*hint == '2' || SDL_strcasecmp(hint, "medium") == 0) { | ||||||
| @@ -163,7 +161,7 @@ LoadLibSampleRate(void) | |||||||
|     } else if (*hint == '3' || SDL_strcasecmp(hint, "best") == 0) { |     } else if (*hint == '3' || SDL_strcasecmp(hint, "best") == 0) { | ||||||
|         SRC_converter = SRC_SINC_BEST_QUALITY; |         SRC_converter = SRC_SINC_BEST_QUALITY; | ||||||
|     } else { |     } else { | ||||||
|         return SDL_FALSE;  /* treat it like "default", don't load anything. */ |         return SDL_FALSE; /* treat it like "default", don't load anything. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef SDL_LIBSAMPLERATE_DYNAMIC | #ifdef SDL_LIBSAMPLERATE_DYNAMIC | ||||||
| @@ -174,12 +172,14 @@ LoadLibSampleRate(void) | |||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|     SRC_src_new = (SRC_STATE* (*)(int converter_type, int channels, int *error))SDL_LoadFunction(SRC_lib, "src_new"); |     SRC_src_new = (SRC_STATE* (*)(int converter_type, int channels, int *error))SDL_LoadFunction(SRC_lib, "src_new"); | ||||||
|     SRC_src_process = (int (*)(SRC_STATE *state, SRC_DATA *data))SDL_LoadFunction(SRC_lib, "src_process"); |     SRC_src_process = (int (*)(SRC_STATE *state, SRC_DATA *data))SDL_LoadFunction(SRC_lib, "src_process"); | ||||||
|     SRC_src_reset = (int(*)(SRC_STATE *state))SDL_LoadFunction(SRC_lib, "src_reset"); |     SRC_src_reset = (int(*)(SRC_STATE *state))SDL_LoadFunction(SRC_lib, "src_reset"); | ||||||
|     SRC_src_delete = (SRC_STATE* (*)(SRC_STATE *state))SDL_LoadFunction(SRC_lib, "src_delete"); |     SRC_src_delete = (SRC_STATE* (*)(SRC_STATE *state))SDL_LoadFunction(SRC_lib, "src_delete"); | ||||||
|     SRC_src_strerror = (const char* (*)(int error))SDL_LoadFunction(SRC_lib, "src_strerror"); |     SRC_src_strerror = (const char* (*)(int error))SDL_LoadFunction(SRC_lib, "src_strerror"); | ||||||
|     SRC_src_simple = (int(*)(SRC_DATA *data, int converter_type, int channels))SDL_LoadFunction(SRC_lib, "src_simple"); |     SRC_src_simple = (int(*)(SRC_DATA *data, int converter_type, int channels))SDL_LoadFunction(SRC_lib, "src_simple"); | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
|     if (!SRC_src_new || !SRC_src_process || !SRC_src_reset || !SRC_src_delete || !SRC_src_strerror || !SRC_src_simple) { |     if (!SRC_src_new || !SRC_src_process || !SRC_src_reset || !SRC_src_delete || !SRC_src_strerror || !SRC_src_simple) { | ||||||
|         SDL_UnloadObject(SRC_lib); |         SDL_UnloadObject(SRC_lib); | ||||||
| @@ -199,8 +199,7 @@ LoadLibSampleRate(void) | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void UnloadLibSampleRate(void) | ||||||
| UnloadLibSampleRate(void) |  | ||||||
| { | { | ||||||
| #ifdef SDL_LIBSAMPLERATE_DYNAMIC | #ifdef SDL_LIBSAMPLERATE_DYNAMIC | ||||||
|     if (SRC_lib != NULL) { |     if (SRC_lib != NULL) { | ||||||
| @@ -218,8 +217,7 @@ UnloadLibSampleRate(void) | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static SDL_AudioDevice * | static SDL_AudioDevice *get_audio_device(SDL_AudioDeviceID id) | ||||||
| get_audio_device(SDL_AudioDeviceID id) |  | ||||||
| { | { | ||||||
|     id--; |     id--; | ||||||
|     if ((id >= SDL_arraysize(open_devices)) || (open_devices[id] == NULL)) { |     if ((id >= SDL_arraysize(open_devices)) || (open_devices[id] == NULL)) { | ||||||
| @@ -230,82 +228,67 @@ get_audio_device(SDL_AudioDeviceID id) | |||||||
|     return open_devices[id]; |     return open_devices[id]; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* stubs for audio drivers that don't need a specific entry point... */ | /* stubs for audio drivers that don't need a specific entry point... */ | ||||||
| static void | static void SDL_AudioDetectDevices_Default(void) | ||||||
| SDL_AudioDetectDevices_Default(void) |  | ||||||
| { | { | ||||||
|     /* you have to write your own implementation if these assertions fail. */ |     /* you have to write your own implementation if these assertions fail. */ | ||||||
|     SDL_assert(current_audio.impl.OnlyHasDefaultOutputDevice); |     SDL_assert(current_audio.impl.OnlyHasDefaultOutputDevice); | ||||||
|     SDL_assert(current_audio.impl.OnlyHasDefaultCaptureDevice || !current_audio.impl.HasCaptureSupport); |     SDL_assert(current_audio.impl.OnlyHasDefaultCaptureDevice || !current_audio.impl.HasCaptureSupport); | ||||||
|  |  | ||||||
|     SDL_AddAudioDevice(SDL_FALSE, DEFAULT_OUTPUT_DEVNAME, NULL, (void *) ((size_t) 0x1)); |     SDL_AddAudioDevice(SDL_FALSE, DEFAULT_OUTPUT_DEVNAME, NULL, (void *)((size_t)0x1)); | ||||||
|     if (current_audio.impl.HasCaptureSupport) { |     if (current_audio.impl.HasCaptureSupport) { | ||||||
|         SDL_AddAudioDevice(SDL_TRUE, DEFAULT_INPUT_DEVNAME, NULL, (void *) ((size_t) 0x2)); |         SDL_AddAudioDevice(SDL_TRUE, DEFAULT_INPUT_DEVNAME, NULL, (void *)((size_t)0x2)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioThreadInit_Default(_THIS) | ||||||
| SDL_AudioThreadInit_Default(_THIS) | { /* no-op. */ | ||||||
| {                               /* no-op. */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioThreadDeinit_Default(_THIS) | ||||||
| SDL_AudioThreadDeinit_Default(_THIS) | { /* no-op. */ | ||||||
| {                               /* no-op. */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioWaitDevice_Default(_THIS) | ||||||
| SDL_AudioWaitDevice_Default(_THIS) | { /* no-op. */ | ||||||
| {                               /* no-op. */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioPlayDevice_Default(_THIS) | ||||||
| SDL_AudioPlayDevice_Default(_THIS) | { /* no-op. */ | ||||||
| {                               /* no-op. */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *SDL_AudioGetDeviceBuf_Default(_THIS) | ||||||
| SDL_AudioGetDeviceBuf_Default(_THIS) |  | ||||||
| { | { | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int SDL_AudioCaptureFromDevice_Default(_THIS, void *buffer, int buflen) | ||||||
| SDL_AudioCaptureFromDevice_Default(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     return -1;  /* just fail immediately. */ |     return -1; /* just fail immediately. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioFlushCapture_Default(_THIS) | ||||||
| SDL_AudioFlushCapture_Default(_THIS) | { /* no-op. */ | ||||||
| {                               /* no-op. */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioCloseDevice_Default(_THIS) | ||||||
| SDL_AudioCloseDevice_Default(_THIS) | { /* no-op. */ | ||||||
| {                               /* no-op. */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioDeinitialize_Default(void) | ||||||
| SDL_AudioDeinitialize_Default(void) | { /* no-op. */ | ||||||
| {                               /* no-op. */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioFreeDeviceHandle_Default(void *handle) | ||||||
| SDL_AudioFreeDeviceHandle_Default(void *handle) | { /* no-op. */ | ||||||
| {                               /* no-op. */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int SDL_AudioOpenDevice_Default(_THIS, const char *devname) | ||||||
| static int |  | ||||||
| SDL_AudioOpenDevice_Default(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     return SDL_Unsupported(); |     return SDL_Unsupported(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_INLINE SDL_bool | static SDL_INLINE SDL_bool is_in_audio_device_thread(SDL_AudioDevice *device) | ||||||
| is_in_audio_device_thread(SDL_AudioDevice * device) |  | ||||||
| { | { | ||||||
|     /* The device thread locks the same mutex, but not through the public API. |     /* The device thread locks the same mutex, but not through the public API. | ||||||
|        This check is in case the application, in the audio callback, |        This check is in case the application, in the audio callback, | ||||||
| @@ -318,35 +301,31 @@ is_in_audio_device_thread(SDL_AudioDevice * device) | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioLockDevice_Default(SDL_AudioDevice *device) | ||||||
| SDL_AudioLockDevice_Default(SDL_AudioDevice * device) |  | ||||||
| { | { | ||||||
|     if (!is_in_audio_device_thread(device)) { |     if (!is_in_audio_device_thread(device)) { | ||||||
|         SDL_LockMutex(device->mixer_lock); |         SDL_LockMutex(device->mixer_lock); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_AudioUnlockDevice_Default(SDL_AudioDevice *device) | ||||||
| SDL_AudioUnlockDevice_Default(SDL_AudioDevice * device) |  | ||||||
| { | { | ||||||
|     if (!is_in_audio_device_thread(device)) { |     if (!is_in_audio_device_thread(device)) { | ||||||
|         SDL_UnlockMutex(device->mixer_lock); |         SDL_UnlockMutex(device->mixer_lock); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void finish_audio_entry_points_init(void) | ||||||
| finish_audio_entry_points_init(void) |  | ||||||
| { | { | ||||||
|     /* |     /* | ||||||
|      * Fill in stub functions for unused driver entry points. This lets us |      * Fill in stub functions for unused driver entry points. This lets us | ||||||
|      *  blindly call them without having to check for validity first. |      *  blindly call them without having to check for validity first. | ||||||
|      */ |      */ | ||||||
|  |  | ||||||
|  | #define FILL_STUB(x)                                   \ | ||||||
| #define FILL_STUB(x) \ |     if (current_audio.impl.x == NULL) {                \ | ||||||
|         if (current_audio.impl.x == NULL) { \ |         current_audio.impl.x = SDL_Audio##x##_Default; \ | ||||||
|             current_audio.impl.x = SDL_Audio##x##_Default; \ |     } | ||||||
|         } |  | ||||||
|     FILL_STUB(DetectDevices); |     FILL_STUB(DetectDevices); | ||||||
|     FILL_STUB(OpenDevice); |     FILL_STUB(OpenDevice); | ||||||
|     FILL_STUB(ThreadInit); |     FILL_STUB(ThreadInit); | ||||||
| @@ -364,21 +343,19 @@ finish_audio_entry_points_init(void) | |||||||
| #undef FILL_STUB | #undef FILL_STUB | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* device hotplug support... */ | /* device hotplug support... */ | ||||||
|  |  | ||||||
| static int | static int add_audio_device(const char *name, SDL_AudioSpec *spec, void *handle, SDL_AudioDeviceItem **devices, int *devCount) | ||||||
| add_audio_device(const char *name, SDL_AudioSpec *spec, void *handle, SDL_AudioDeviceItem **devices, int *devCount) |  | ||||||
| { | { | ||||||
|     int retval = -1; |     int retval = -1; | ||||||
|     SDL_AudioDeviceItem *item; |     SDL_AudioDeviceItem *item; | ||||||
|     const SDL_AudioDeviceItem *i; |     const SDL_AudioDeviceItem *i; | ||||||
|     int dupenum = 0; |     int dupenum = 0; | ||||||
|  |  | ||||||
|     SDL_assert(handle != NULL);  /* we reserve NULL, audio backends can't use it. */ |     SDL_assert(handle != NULL); /* we reserve NULL, audio backends can't use it. */ | ||||||
|     SDL_assert(name != NULL); |     SDL_assert(name != NULL); | ||||||
|  |  | ||||||
|     item = (SDL_AudioDeviceItem *) SDL_malloc(sizeof (SDL_AudioDeviceItem)); |     item = (SDL_AudioDeviceItem *)SDL_malloc(sizeof(SDL_AudioDeviceItem)); | ||||||
|     if (!item) { |     if (!item) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -403,13 +380,13 @@ add_audio_device(const char *name, SDL_AudioSpec *spec, void *handle, SDL_AudioD | |||||||
|     for (i = *devices; i != NULL; i = i->next) { |     for (i = *devices; i != NULL; i = i->next) { | ||||||
|         if (SDL_strcmp(name, i->original_name) == 0) { |         if (SDL_strcmp(name, i->original_name) == 0) { | ||||||
|             dupenum = i->dupenum + 1; |             dupenum = i->dupenum + 1; | ||||||
|             break;  /* stop at the highest-numbered dupe. */ |             break; /* stop at the highest-numbered dupe. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (dupenum) { |     if (dupenum) { | ||||||
|         const size_t len = SDL_strlen(name) + 16; |         const size_t len = SDL_strlen(name) + 16; | ||||||
|         char *replacement = (char *) SDL_malloc(len); |         char *replacement = (char *)SDL_malloc(len); | ||||||
|         if (!replacement) { |         if (!replacement) { | ||||||
|             SDL_UnlockMutex(current_audio.detectionLock); |             SDL_UnlockMutex(current_audio.detectionLock); | ||||||
|             SDL_free(item->original_name); |             SDL_free(item->original_name); | ||||||
| @@ -424,28 +401,25 @@ add_audio_device(const char *name, SDL_AudioSpec *spec, void *handle, SDL_AudioD | |||||||
|  |  | ||||||
|     item->next = *devices; |     item->next = *devices; | ||||||
|     *devices = item; |     *devices = item; | ||||||
|     retval = (*devCount)++;   /* !!! FIXME: this should be an atomic increment */ |     retval = (*devCount)++; /* !!! FIXME: this should be an atomic increment */ | ||||||
|  |  | ||||||
|     SDL_UnlockMutex(current_audio.detectionLock); |     SDL_UnlockMutex(current_audio.detectionLock); | ||||||
|  |  | ||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_INLINE int | static SDL_INLINE int add_capture_device(const char *name, SDL_AudioSpec *spec, void *handle) | ||||||
| add_capture_device(const char *name, SDL_AudioSpec *spec, void *handle) |  | ||||||
| { | { | ||||||
|     SDL_assert(current_audio.impl.HasCaptureSupport); |     SDL_assert(current_audio.impl.HasCaptureSupport); | ||||||
|     return add_audio_device(name, spec, handle, ¤t_audio.inputDevices, ¤t_audio.inputDeviceCount); |     return add_audio_device(name, spec, handle, ¤t_audio.inputDevices, ¤t_audio.inputDeviceCount); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_INLINE int | static SDL_INLINE int add_output_device(const char *name, SDL_AudioSpec *spec, void *handle) | ||||||
| add_output_device(const char *name, SDL_AudioSpec *spec, void *handle) |  | ||||||
| { | { | ||||||
|     return add_audio_device(name, spec, handle, ¤t_audio.outputDevices, ¤t_audio.outputDeviceCount); |     return add_audio_device(name, spec, handle, ¤t_audio.outputDevices, ¤t_audio.outputDeviceCount); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void free_device_list(SDL_AudioDeviceItem **devices, int *devCount) | ||||||
| free_device_list(SDL_AudioDeviceItem **devices, int *devCount) |  | ||||||
| { | { | ||||||
|     SDL_AudioDeviceItem *item, *next; |     SDL_AudioDeviceItem *item, *next; | ||||||
|     for (item = *devices; item != NULL; item = next) { |     for (item = *devices; item != NULL; item = next) { | ||||||
| @@ -464,10 +438,8 @@ free_device_list(SDL_AudioDeviceItem **devices, int *devCount) | |||||||
|     *devCount = 0; |     *devCount = 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* The audio backends call this when a new device is plugged in. */ | /* The audio backends call this when a new device is plugged in. */ | ||||||
| void | void SDL_AddAudioDevice(const SDL_bool iscapture, const char *name, SDL_AudioSpec *spec, void *handle) | ||||||
| SDL_AddAudioDevice(const SDL_bool iscapture, const char *name, SDL_AudioSpec *spec, void *handle) |  | ||||||
| { | { | ||||||
|     const int device_index = iscapture ? add_capture_device(name, spec, handle) : add_output_device(name, spec, handle); |     const int device_index = iscapture ? add_capture_device(name, spec, handle) : add_output_device(name, spec, handle); | ||||||
|     if (device_index != -1) { |     if (device_index != -1) { | ||||||
| @@ -489,11 +461,11 @@ void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device) | |||||||
|     SDL_assert(get_audio_device(device->id) == device); |     SDL_assert(get_audio_device(device->id) == device); | ||||||
|  |  | ||||||
|     if (!SDL_AtomicGet(&device->enabled)) { |     if (!SDL_AtomicGet(&device->enabled)) { | ||||||
|         return;  /* don't report disconnects more than once. */ |         return; /* don't report disconnects more than once. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (SDL_AtomicGet(&device->shutdown)) { |     if (SDL_AtomicGet(&device->shutdown)) { | ||||||
|         return;  /* don't report disconnect if we're trying to close device. */ |         return; /* don't report disconnect if we're trying to close device. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Ends the audio callback and mark the device as STOPPED, but the |     /* Ends the audio callback and mark the device as STOPPED, but the | ||||||
| @@ -513,8 +485,7 @@ void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void mark_device_removed(void *handle, SDL_AudioDeviceItem *devices, SDL_bool *removedFlag) | ||||||
| mark_device_removed(void *handle, SDL_AudioDeviceItem *devices, SDL_bool *removedFlag) |  | ||||||
| { | { | ||||||
|     SDL_AudioDeviceItem *item; |     SDL_AudioDeviceItem *item; | ||||||
|     SDL_assert(handle != NULL); |     SDL_assert(handle != NULL); | ||||||
| @@ -528,8 +499,7 @@ mark_device_removed(void *handle, SDL_AudioDeviceItem *devices, SDL_bool *remove | |||||||
| } | } | ||||||
|  |  | ||||||
| /* The audio backends call this when a device is removed from the system. */ | /* The audio backends call this when a device is removed from the system. */ | ||||||
| void | void SDL_RemoveAudioDevice(const SDL_bool iscapture, void *handle) | ||||||
| SDL_RemoveAudioDevice(const SDL_bool iscapture, void *handle) |  | ||||||
| { | { | ||||||
|     int device_index; |     int device_index; | ||||||
|     SDL_AudioDevice *device = NULL; |     SDL_AudioDevice *device = NULL; | ||||||
| @@ -572,40 +542,36 @@ SDL_RemoveAudioDevice(const SDL_bool iscapture, void *handle) | |||||||
|     current_audio.impl.FreeDeviceHandle(handle); |     current_audio.impl.FreeDeviceHandle(handle); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* buffer queueing support... */ | /* buffer queueing support... */ | ||||||
|  |  | ||||||
| static void SDLCALL | static void SDLCALL SDL_BufferQueueDrainCallback(void *userdata, Uint8 *stream, int len) | ||||||
| SDL_BufferQueueDrainCallback(void *userdata, Uint8 *stream, int len) |  | ||||||
| { | { | ||||||
|     /* this function always holds the mixer lock before being called. */ |     /* this function always holds the mixer lock before being called. */ | ||||||
|     SDL_AudioDevice *device = (SDL_AudioDevice *) userdata; |     SDL_AudioDevice *device = (SDL_AudioDevice *)userdata; | ||||||
|     size_t dequeued; |     size_t dequeued; | ||||||
|  |  | ||||||
|     SDL_assert(device != NULL);  /* this shouldn't ever happen, right?! */ |     SDL_assert(device != NULL);     /* this shouldn't ever happen, right?! */ | ||||||
|     SDL_assert(!device->iscapture);  /* this shouldn't ever happen, right?! */ |     SDL_assert(!device->iscapture); /* this shouldn't ever happen, right?! */ | ||||||
|     SDL_assert(len >= 0);  /* this shouldn't ever happen, right?! */ |     SDL_assert(len >= 0);           /* this shouldn't ever happen, right?! */ | ||||||
|  |  | ||||||
|     dequeued = SDL_ReadFromDataQueue(device->buffer_queue, stream, len); |     dequeued = SDL_ReadFromDataQueue(device->buffer_queue, stream, len); | ||||||
|     stream += dequeued; |     stream += dequeued; | ||||||
|     len -= (int) dequeued; |     len -= (int)dequeued; | ||||||
|  |  | ||||||
|     if (len > 0) {  /* fill any remaining space in the stream with silence. */ |     if (len > 0) { /* fill any remaining space in the stream with silence. */ | ||||||
|         SDL_assert(SDL_CountDataQueue(device->buffer_queue) == 0); |         SDL_assert(SDL_CountDataQueue(device->buffer_queue) == 0); | ||||||
|         SDL_memset(stream, device->callbackspec.silence, len); |         SDL_memset(stream, device->callbackspec.silence, len); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void SDLCALL | static void SDLCALL SDL_BufferQueueFillCallback(void *userdata, Uint8 *stream, int len) | ||||||
| SDL_BufferQueueFillCallback(void *userdata, Uint8 *stream, int len) |  | ||||||
| { | { | ||||||
|     /* this function always holds the mixer lock before being called. */ |     /* this function always holds the mixer lock before being called. */ | ||||||
|     SDL_AudioDevice *device = (SDL_AudioDevice *) userdata; |     SDL_AudioDevice *device = (SDL_AudioDevice *)userdata; | ||||||
|  |  | ||||||
|     SDL_assert(device != NULL);  /* this shouldn't ever happen, right?! */ |     SDL_assert(device != NULL);    /* this shouldn't ever happen, right?! */ | ||||||
|     SDL_assert(device->iscapture);  /* this shouldn't ever happen, right?! */ |     SDL_assert(device->iscapture); /* this shouldn't ever happen, right?! */ | ||||||
|     SDL_assert(len >= 0);  /* this shouldn't ever happen, right?! */ |     SDL_assert(len >= 0);          /* this shouldn't ever happen, right?! */ | ||||||
|  |  | ||||||
|     /* note that if this needs to allocate more space and run out of memory, |     /* note that if this needs to allocate more space and run out of memory, | ||||||
|        we have no choice but to quietly drop the data and hope it works out |        we have no choice but to quietly drop the data and hope it works out | ||||||
| @@ -613,14 +579,13 @@ SDL_BufferQueueFillCallback(void *userdata, Uint8 *stream, int len) | |||||||
|     SDL_WriteToDataQueue(device->buffer_queue, stream, len); |     SDL_WriteToDataQueue(device->buffer_queue, stream, len); | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_QueueAudio(SDL_AudioDeviceID devid, const void *data, Uint32 len) | ||||||
| SDL_QueueAudio(SDL_AudioDeviceID devid, const void *data, Uint32 len) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *device = get_audio_device(devid); |     SDL_AudioDevice *device = get_audio_device(devid); | ||||||
|     int rc = 0; |     int rc = 0; | ||||||
|  |  | ||||||
|     if (!device) { |     if (!device) { | ||||||
|         return -1;  /* get_audio_device() will have set the error state */ |         return -1; /* get_audio_device() will have set the error state */ | ||||||
|     } else if (device->iscapture) { |     } else if (device->iscapture) { | ||||||
|         return SDL_SetError("This is a capture device, queueing not allowed"); |         return SDL_SetError("This is a capture device, queueing not allowed"); | ||||||
|     } else if (device->callbackspec.callback != SDL_BufferQueueDrainCallback) { |     } else if (device->callbackspec.callback != SDL_BufferQueueDrainCallback) { | ||||||
| @@ -642,15 +607,15 @@ SDL_DequeueAudio(SDL_AudioDeviceID devid, void *data, Uint32 len) | |||||||
|     SDL_AudioDevice *device = get_audio_device(devid); |     SDL_AudioDevice *device = get_audio_device(devid); | ||||||
|     Uint32 rc; |     Uint32 rc; | ||||||
|  |  | ||||||
|     if ( (len == 0) ||  /* nothing to do? */ |     if ((len == 0) ||                                                     /* nothing to do? */ | ||||||
|          (!device) ||  /* called with bogus device id */ |         (!device) ||                                                      /* called with bogus device id */ | ||||||
|          (!device->iscapture) ||  /* playback devices can't dequeue */ |         (!device->iscapture) ||                                           /* playback devices can't dequeue */ | ||||||
|          (device->callbackspec.callback != SDL_BufferQueueFillCallback) ) { /* not set for queueing */ |         (device->callbackspec.callback != SDL_BufferQueueFillCallback)) { /* not set for queueing */ | ||||||
|         return 0;  /* just report zero bytes dequeued. */ |         return 0;                                                         /* just report zero bytes dequeued. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     current_audio.impl.LockDevice(device); |     current_audio.impl.LockDevice(device); | ||||||
|     rc = (Uint32) SDL_ReadFromDataQueue(device->buffer_queue, data, len); |     rc = (Uint32)SDL_ReadFromDataQueue(device->buffer_queue, data, len); | ||||||
|     current_audio.impl.UnlockDevice(device); |     current_audio.impl.UnlockDevice(device); | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
| @@ -667,23 +632,21 @@ SDL_GetQueuedAudioSize(SDL_AudioDeviceID devid) | |||||||
|  |  | ||||||
|     /* Nothing to do unless we're set up for queueing. */ |     /* Nothing to do unless we're set up for queueing. */ | ||||||
|     if (device->callbackspec.callback == SDL_BufferQueueDrainCallback || |     if (device->callbackspec.callback == SDL_BufferQueueDrainCallback || | ||||||
|         device->callbackspec.callback == SDL_BufferQueueFillCallback) |         device->callbackspec.callback == SDL_BufferQueueFillCallback) { | ||||||
|     { |  | ||||||
|         current_audio.impl.LockDevice(device); |         current_audio.impl.LockDevice(device); | ||||||
|         retval = (Uint32) SDL_CountDataQueue(device->buffer_queue); |         retval = (Uint32)SDL_CountDataQueue(device->buffer_queue); | ||||||
|         current_audio.impl.UnlockDevice(device); |         current_audio.impl.UnlockDevice(device); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_ClearQueuedAudio(SDL_AudioDeviceID devid) | ||||||
| SDL_ClearQueuedAudio(SDL_AudioDeviceID devid) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *device = get_audio_device(devid); |     SDL_AudioDevice *device = get_audio_device(devid); | ||||||
|  |  | ||||||
|     if (!device) { |     if (!device) { | ||||||
|         return;  /* nothing to do. */ |         return; /* nothing to do. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Blank out the device and release the mutex. Free it afterwards. */ |     /* Blank out the device and release the mutex. Free it afterwards. */ | ||||||
| @@ -695,12 +658,10 @@ SDL_ClearQueuedAudio(SDL_AudioDeviceID devid) | |||||||
|     current_audio.impl.UnlockDevice(device); |     current_audio.impl.UnlockDevice(device); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* The general mixing thread function */ | /* The general mixing thread function */ | ||||||
| static int SDLCALL | static int SDLCALL SDL_RunAudio(void *devicep) | ||||||
| SDL_RunAudio(void *devicep) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *device = (SDL_AudioDevice *) devicep; |     SDL_AudioDevice *device = (SDL_AudioDevice *)devicep; | ||||||
|     void *udata = device->callbackspec.userdata; |     void *udata = device->callbackspec.userdata; | ||||||
|     SDL_AudioCallback callback = device->callbackspec.callback; |     SDL_AudioCallback callback = device->callbackspec.callback; | ||||||
|     int data_len = 0; |     int data_len = 0; | ||||||
| @@ -759,15 +720,15 @@ SDL_RunAudio(void *devicep) | |||||||
|             /* if this fails...oh well. We'll play silence here. */ |             /* if this fails...oh well. We'll play silence here. */ | ||||||
|             SDL_AudioStreamPut(device->stream, data, data_len); |             SDL_AudioStreamPut(device->stream, data, data_len); | ||||||
|  |  | ||||||
|             while (SDL_AudioStreamAvailable(device->stream) >= ((int) device->spec.size)) { |             while (SDL_AudioStreamAvailable(device->stream) >= ((int)device->spec.size)) { | ||||||
|                 int got; |                 int got; | ||||||
|                 data = SDL_AtomicGet(&device->enabled) ? current_audio.impl.GetDeviceBuf(device) : NULL; |                 data = SDL_AtomicGet(&device->enabled) ? current_audio.impl.GetDeviceBuf(device) : NULL; | ||||||
|                 got = SDL_AudioStreamGet(device->stream, data ? data : device->work_buffer, device->spec.size); |                 got = SDL_AudioStreamGet(device->stream, data ? data : device->work_buffer, device->spec.size); | ||||||
|                 SDL_assert((got <= 0) || (got == device->spec.size)); |                 SDL_assert((got <= 0) || (got == device->spec.size)); | ||||||
|  |  | ||||||
|                 if (data == NULL) {  /* device is having issues... */ |                 if (data == NULL) { /* device is having issues... */ | ||||||
|                     const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq); |                     const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq); | ||||||
|                     SDL_Delay(delay);  /* wait for as long as this buffer would have played. Maybe device recovers later? */ |                     SDL_Delay(delay); /* wait for as long as this buffer would have played. Maybe device recovers later? */ | ||||||
|                 } else { |                 } else { | ||||||
|                     if (got != device->spec.size) { |                     if (got != device->spec.size) { | ||||||
|                         SDL_memset(data, device->spec.silence, device->spec.size); |                         SDL_memset(data, device->spec.silence, device->spec.size); | ||||||
| @@ -780,7 +741,7 @@ SDL_RunAudio(void *devicep) | |||||||
|             /* nothing to do; pause like we queued a buffer to play. */ |             /* nothing to do; pause like we queued a buffer to play. */ | ||||||
|             const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq); |             const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq); | ||||||
|             SDL_Delay(delay); |             SDL_Delay(delay); | ||||||
|         } else {  /* writing directly to the device. */ |         } else { /* writing directly to the device. */ | ||||||
|             /* queue this buffer and wait for it to finish playing. */ |             /* queue this buffer and wait for it to finish playing. */ | ||||||
|             current_audio.impl.PlayDevice(device); |             current_audio.impl.PlayDevice(device); | ||||||
|             current_audio.impl.WaitDevice(device); |             current_audio.impl.WaitDevice(device); | ||||||
| @@ -797,11 +758,10 @@ SDL_RunAudio(void *devicep) | |||||||
|  |  | ||||||
| /* !!! FIXME: this needs to deal with device spec changes. */ | /* !!! FIXME: this needs to deal with device spec changes. */ | ||||||
| /* The general capture thread function */ | /* The general capture thread function */ | ||||||
| static int SDLCALL | static int SDLCALL SDL_CaptureAudio(void *devicep) | ||||||
| SDL_CaptureAudio(void *devicep) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *device = (SDL_AudioDevice *) devicep; |     SDL_AudioDevice *device = (SDL_AudioDevice *)devicep; | ||||||
|     const int silence = (int) device->spec.silence; |     const int silence = (int)device->spec.silence; | ||||||
|     const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq); |     const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq); | ||||||
|     const int data_len = device->spec.size; |     const int data_len = device->spec.size; | ||||||
|     Uint8 *data; |     Uint8 *data; | ||||||
| @@ -831,11 +791,11 @@ SDL_CaptureAudio(void *devicep) | |||||||
|         Uint8 *ptr; |         Uint8 *ptr; | ||||||
|  |  | ||||||
|         if (SDL_AtomicGet(&device->paused)) { |         if (SDL_AtomicGet(&device->paused)) { | ||||||
|             SDL_Delay(delay);  /* just so we don't cook the CPU. */ |             SDL_Delay(delay); /* just so we don't cook the CPU. */ | ||||||
|             if (device->stream) { |             if (device->stream) { | ||||||
|                 SDL_AudioStreamClear(device->stream); |                 SDL_AudioStreamClear(device->stream); | ||||||
|             } |             } | ||||||
|             current_audio.impl.FlushCapture(device);  /* dump anything pending. */ |             current_audio.impl.FlushCapture(device); /* dump anything pending. */ | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -853,15 +813,15 @@ SDL_CaptureAudio(void *devicep) | |||||||
|            But we don't process it further or call the app's callback. */ |            But we don't process it further or call the app's callback. */ | ||||||
|  |  | ||||||
|         if (!SDL_AtomicGet(&device->enabled)) { |         if (!SDL_AtomicGet(&device->enabled)) { | ||||||
|             SDL_Delay(delay);  /* try to keep callback firing at normal pace. */ |             SDL_Delay(delay); /* try to keep callback firing at normal pace. */ | ||||||
|         } else { |         } else { | ||||||
|             while (still_need > 0) { |             while (still_need > 0) { | ||||||
|                 const int rc = current_audio.impl.CaptureFromDevice(device, ptr, still_need); |                 const int rc = current_audio.impl.CaptureFromDevice(device, ptr, still_need); | ||||||
|                 SDL_assert(rc <= still_need);  /* device should not overflow buffer. :) */ |                 SDL_assert(rc <= still_need); /* device should not overflow buffer. :) */ | ||||||
|                 if (rc > 0) { |                 if (rc > 0) { | ||||||
|                     still_need -= rc; |                     still_need -= rc; | ||||||
|                     ptr += rc; |                     ptr += rc; | ||||||
|                 } else {  /* uhoh, device failed for some reason! */ |                 } else { /* uhoh, device failed for some reason! */ | ||||||
|                     SDL_OpenedAudioDeviceDisconnected(device); |                     SDL_OpenedAudioDeviceDisconnected(device); | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
| @@ -877,7 +837,7 @@ SDL_CaptureAudio(void *devicep) | |||||||
|             /* if this fails...oh well. */ |             /* if this fails...oh well. */ | ||||||
|             SDL_AudioStreamPut(device->stream, data, data_len); |             SDL_AudioStreamPut(device->stream, data, data_len); | ||||||
|  |  | ||||||
|             while (SDL_AudioStreamAvailable(device->stream) >= ((int) device->callbackspec.size)) { |             while (SDL_AudioStreamAvailable(device->stream) >= ((int)device->callbackspec.size)) { | ||||||
|                 const int got = SDL_AudioStreamGet(device->stream, device->work_buffer, device->callbackspec.size); |                 const int got = SDL_AudioStreamGet(device->stream, device->work_buffer, device->callbackspec.size); | ||||||
|                 SDL_assert((got < 0) || (got == device->callbackspec.size)); |                 SDL_assert((got < 0) || (got == device->callbackspec.size)); | ||||||
|                 if (got != device->callbackspec.size) { |                 if (got != device->callbackspec.size) { | ||||||
| @@ -891,7 +851,7 @@ SDL_CaptureAudio(void *devicep) | |||||||
|                 } |                 } | ||||||
|                 SDL_UnlockMutex(device->mixer_lock); |                 SDL_UnlockMutex(device->mixer_lock); | ||||||
|             } |             } | ||||||
|         } else {  /* feeding user callback directly without streaming. */ |         } else { /* feeding user callback directly without streaming. */ | ||||||
|             /* !!! FIXME: this should be LockDevice. */ |             /* !!! FIXME: this should be LockDevice. */ | ||||||
|             SDL_LockMutex(device->mixer_lock); |             SDL_LockMutex(device->mixer_lock); | ||||||
|             if (!SDL_AtomicGet(&device->paused)) { |             if (!SDL_AtomicGet(&device->paused)) { | ||||||
| @@ -908,11 +868,11 @@ SDL_CaptureAudio(void *devicep) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static SDL_AudioFormat SDL_ParseAudioFormat(const char *string) | ||||||
| static SDL_AudioFormat |  | ||||||
| SDL_ParseAudioFormat(const char *string) |  | ||||||
| { | { | ||||||
| #define CHECK_FMT_STRING(x) if (SDL_strcmp(string, #x) == 0) return AUDIO_##x | #define CHECK_FMT_STRING(x)          \ | ||||||
|  |     if (SDL_strcmp(string, #x) == 0) \ | ||||||
|  |     return AUDIO_##x | ||||||
|     CHECK_FMT_STRING(U8); |     CHECK_FMT_STRING(U8); | ||||||
|     CHECK_FMT_STRING(S8); |     CHECK_FMT_STRING(S8); | ||||||
|     CHECK_FMT_STRING(U16LSB); |     CHECK_FMT_STRING(U16LSB); | ||||||
| @@ -935,8 +895,7 @@ SDL_ParseAudioFormat(const char *string) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_GetNumAudioDrivers(void) | ||||||
| SDL_GetNumAudioDrivers(void) |  | ||||||
| { | { | ||||||
|     return SDL_arraysize(bootstrap) - 1; |     return SDL_arraysize(bootstrap) - 1; | ||||||
| } | } | ||||||
| @@ -950,14 +909,13 @@ SDL_GetAudioDriver(int index) | |||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_AudioInit(const char *driver_name) | ||||||
| SDL_AudioInit(const char *driver_name) |  | ||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
|     SDL_bool initialized = SDL_FALSE, tried_to_init = SDL_FALSE; |     SDL_bool initialized = SDL_FALSE, tried_to_init = SDL_FALSE; | ||||||
|  |  | ||||||
|     if (SDL_GetCurrentAudioDriver()) { |     if (SDL_GetCurrentAudioDriver()) { | ||||||
|         SDL_AudioQuit();        /* shutdown driver if already running. */ |         SDL_AudioQuit(); /* shutdown driver if already running. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_zeroa(open_devices); |     SDL_zeroa(open_devices); | ||||||
| @@ -1030,7 +988,7 @@ SDL_AudioInit(const char *driver_name) | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         SDL_zero(current_audio); |         SDL_zero(current_audio); | ||||||
|         return -1;            /* No driver was available, so fail. */ |         return -1; /* No driver was available, so fail. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     current_audio.detectionLock = SDL_CreateMutex(); |     current_audio.detectionLock = SDL_CreateMutex(); | ||||||
| @@ -1057,8 +1015,7 @@ SDL_GetCurrentAudioDriver() | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Clean out devices that we've removed but had to keep around for stability. */ | /* Clean out devices that we've removed but had to keep around for stability. */ | ||||||
| static void | static void clean_out_device_list(SDL_AudioDeviceItem **devices, int *devCount, SDL_bool *removedFlag) | ||||||
| clean_out_device_list(SDL_AudioDeviceItem **devices, int *devCount, SDL_bool *removedFlag) |  | ||||||
| { | { | ||||||
|     SDL_AudioDeviceItem *item = *devices; |     SDL_AudioDeviceItem *item = *devices; | ||||||
|     SDL_AudioDeviceItem *prev = NULL; |     SDL_AudioDeviceItem *prev = NULL; | ||||||
| @@ -1089,9 +1046,7 @@ clean_out_device_list(SDL_AudioDeviceItem **devices, int *devCount, SDL_bool *re | |||||||
|     *removedFlag = SDL_FALSE; |     *removedFlag = SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int SDL_GetNumAudioDevices(int iscapture) | ||||||
| int |  | ||||||
| SDL_GetNumAudioDevices(int iscapture) |  | ||||||
| { | { | ||||||
|     int retval = 0; |     int retval = 0; | ||||||
|  |  | ||||||
| @@ -1114,7 +1069,6 @@ SDL_GetNumAudioDevices(int iscapture) | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| const char * | const char * | ||||||
| SDL_GetAudioDeviceName(int index, int iscapture) | SDL_GetAudioDeviceName(int index, int iscapture) | ||||||
| { | { | ||||||
| @@ -1145,9 +1099,7 @@ SDL_GetAudioDeviceName(int index, int iscapture) | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int SDL_GetAudioDeviceSpec(int index, int iscapture, SDL_AudioSpec *spec) | ||||||
| int |  | ||||||
| SDL_GetAudioDeviceSpec(int index, int iscapture, SDL_AudioSpec *spec) |  | ||||||
| { | { | ||||||
|     SDL_AudioDeviceItem *item; |     SDL_AudioDeviceItem *item; | ||||||
|     int i, retval; |     int i, retval; | ||||||
| @@ -1178,9 +1130,7 @@ SDL_GetAudioDeviceSpec(int index, int iscapture, SDL_AudioSpec *spec) | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int SDL_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| int |  | ||||||
| SDL_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
|     if (spec == NULL) { |     if (spec == NULL) { | ||||||
|         return SDL_InvalidParamError("spec"); |         return SDL_InvalidParamError("spec"); | ||||||
| @@ -1196,9 +1146,7 @@ SDL_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
|     return current_audio.impl.GetDefaultAudioInfo(name, spec, iscapture); |     return current_audio.impl.GetDefaultAudioInfo(name, spec, iscapture); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void close_audio_device(SDL_AudioDevice *device) | ||||||
| static void |  | ||||||
| close_audio_device(SDL_AudioDevice * device) |  | ||||||
| { | { | ||||||
|     if (!device) { |     if (!device) { | ||||||
|         return; |         return; | ||||||
| @@ -1239,34 +1187,32 @@ close_audio_device(SDL_AudioDevice * device) | |||||||
|     SDL_free(device); |     SDL_free(device); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Sanity check desired AudioSpec for SDL_OpenAudio() in (orig). |  * Sanity check desired AudioSpec for SDL_OpenAudio() in (orig). | ||||||
|  *  Fills in a sanitized copy in (prepared). |  *  Fills in a sanitized copy in (prepared). | ||||||
|  *  Returns non-zero if okay, zero on fatal parameters in (orig). |  *  Returns non-zero if okay, zero on fatal parameters in (orig). | ||||||
|  */ |  */ | ||||||
| static int | static int prepare_audiospec(const SDL_AudioSpec *orig, SDL_AudioSpec *prepared) | ||||||
| prepare_audiospec(const SDL_AudioSpec * orig, SDL_AudioSpec * prepared) |  | ||||||
| { | { | ||||||
|     SDL_copyp(prepared, orig); |     SDL_copyp(prepared, orig); | ||||||
|  |  | ||||||
|     if (orig->freq == 0) { |     if (orig->freq == 0) { | ||||||
|         const char *env = SDL_getenv("SDL_AUDIO_FREQUENCY"); |         const char *env = SDL_getenv("SDL_AUDIO_FREQUENCY"); | ||||||
|         if ((!env) || ((prepared->freq = SDL_atoi(env)) == 0)) { |         if ((!env) || ((prepared->freq = SDL_atoi(env)) == 0)) { | ||||||
|             prepared->freq = 22050;     /* a reasonable default */ |             prepared->freq = 22050; /* a reasonable default */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (orig->format == 0) { |     if (orig->format == 0) { | ||||||
|         const char *env = SDL_getenv("SDL_AUDIO_FORMAT"); |         const char *env = SDL_getenv("SDL_AUDIO_FORMAT"); | ||||||
|         if ((!env) || ((prepared->format = SDL_ParseAudioFormat(env)) == 0)) { |         if ((!env) || ((prepared->format = SDL_ParseAudioFormat(env)) == 0)) { | ||||||
|             prepared->format = AUDIO_S16;       /* a reasonable default */ |             prepared->format = AUDIO_S16; /* a reasonable default */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (orig->channels == 0) { |     if (orig->channels == 0) { | ||||||
|         const char *env = SDL_getenv("SDL_AUDIO_CHANNELS"); |         const char *env = SDL_getenv("SDL_AUDIO_CHANNELS"); | ||||||
|         if ((!env) || ((prepared->channels = (Uint8) SDL_atoi(env)) == 0)) { |         if ((!env) || ((prepared->channels = (Uint8)SDL_atoi(env)) == 0)) { | ||||||
|             prepared->channels = 2; /* a reasonable default */ |             prepared->channels = 2; /* a reasonable default */ | ||||||
|         } |         } | ||||||
|     } else if (orig->channels > 8) { |     } else if (orig->channels > 8) { | ||||||
| @@ -1276,7 +1222,7 @@ prepare_audiospec(const SDL_AudioSpec * orig, SDL_AudioSpec * prepared) | |||||||
|  |  | ||||||
|     if (orig->samples == 0) { |     if (orig->samples == 0) { | ||||||
|         const char *env = SDL_getenv("SDL_AUDIO_SAMPLES"); |         const char *env = SDL_getenv("SDL_AUDIO_SAMPLES"); | ||||||
|         if ((!env) || ((prepared->samples = (Uint16) SDL_atoi(env)) == 0)) { |         if ((!env) || ((prepared->samples = (Uint16)SDL_atoi(env)) == 0)) { | ||||||
|             /* Pick a default of ~46 ms at desired frequency */ |             /* Pick a default of ~46 ms at desired frequency */ | ||||||
|             /* !!! FIXME: remove this when the non-Po2 resampling is in. */ |             /* !!! FIXME: remove this when the non-Po2 resampling is in. */ | ||||||
|             const int samples = (prepared->freq / 1000) * 46; |             const int samples = (prepared->freq / 1000) * 46; | ||||||
| @@ -1294,10 +1240,9 @@ prepare_audiospec(const SDL_AudioSpec * orig, SDL_AudioSpec * prepared) | |||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_AudioDeviceID | static SDL_AudioDeviceID open_audio_device(const char *devname, int iscapture, | ||||||
| open_audio_device(const char *devname, int iscapture, |                                            const SDL_AudioSpec *desired, SDL_AudioSpec *obtained, | ||||||
|                   const SDL_AudioSpec * desired, SDL_AudioSpec * obtained, |                                            int allowed_changes, int min_id) | ||||||
|                   int allowed_changes, int min_id) |  | ||||||
| { | { | ||||||
|     const SDL_bool is_internal_thread = (desired->callback == NULL); |     const SDL_bool is_internal_thread = (desired->callback == NULL); | ||||||
|     SDL_AudioDeviceID id = 0; |     SDL_AudioDeviceID id = 0; | ||||||
| @@ -1409,7 +1354,7 @@ open_audio_device(const char *devname, int iscapture, | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     device = (SDL_AudioDevice *) SDL_calloc(1, sizeof (SDL_AudioDevice)); |     device = (SDL_AudioDevice *)SDL_calloc(1, sizeof(SDL_AudioDevice)); | ||||||
|     if (device == NULL) { |     if (device == NULL) { | ||||||
|         SDL_OutOfMemory(); |         SDL_OutOfMemory(); | ||||||
|         SDL_UnlockMutex(current_audio.detectionLock); |         SDL_UnlockMutex(current_audio.detectionLock); | ||||||
| @@ -1420,7 +1365,7 @@ open_audio_device(const char *devname, int iscapture, | |||||||
|     device->iscapture = iscapture ? SDL_TRUE : SDL_FALSE; |     device->iscapture = iscapture ? SDL_TRUE : SDL_FALSE; | ||||||
|     device->handle = handle; |     device->handle = handle; | ||||||
|  |  | ||||||
|     SDL_AtomicSet(&device->shutdown, 0);  /* just in case. */ |     SDL_AtomicSet(&device->shutdown, 0); /* just in case. */ | ||||||
|     SDL_AtomicSet(&device->paused, 1); |     SDL_AtomicSet(&device->paused, 1); | ||||||
|     SDL_AtomicSet(&device->enabled, 1); |     SDL_AtomicSet(&device->enabled, 1); | ||||||
|  |  | ||||||
| @@ -1483,19 +1428,19 @@ open_audio_device(const char *devname, int iscapture, | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_CalculateAudioSpec(obtained);  /* recalc after possible changes. */ |     SDL_CalculateAudioSpec(obtained); /* recalc after possible changes. */ | ||||||
|  |  | ||||||
|     device->callbackspec = *obtained; |     device->callbackspec = *obtained; | ||||||
|  |  | ||||||
|     if (build_stream) { |     if (build_stream) { | ||||||
|         if (iscapture) { |         if (iscapture) { | ||||||
|             device->stream = SDL_NewAudioStream(device->spec.format, |             device->stream = SDL_NewAudioStream(device->spec.format, | ||||||
|                                   device->spec.channels, device->spec.freq, |                                                 device->spec.channels, device->spec.freq, | ||||||
|                                   obtained->format, obtained->channels, obtained->freq); |                                                 obtained->format, obtained->channels, obtained->freq); | ||||||
|         } else { |         } else { | ||||||
|             device->stream = SDL_NewAudioStream(obtained->format, obtained->channels, |             device->stream = SDL_NewAudioStream(obtained->format, obtained->channels, | ||||||
|                                   obtained->freq, device->spec.format, |                                                 obtained->freq, device->spec.format, | ||||||
|                                   device->spec.channels, device->spec.freq); |                                                 device->spec.channels, device->spec.freq); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (!device->stream) { |         if (!device->stream) { | ||||||
| @@ -1505,7 +1450,7 @@ open_audio_device(const char *devname, int iscapture, | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (device->spec.callback == NULL) {  /* use buffer queueing? */ |     if (device->spec.callback == NULL) { /* use buffer queueing? */ | ||||||
|         /* pool a few packets to start. Enough for two callbacks. */ |         /* pool a few packets to start. Enough for two callbacks. */ | ||||||
|         device->buffer_queue = SDL_NewDataQueue(SDL_AUDIOBUFFERQUEUE_PACKETLEN, obtained->size * 2); |         device->buffer_queue = SDL_NewDataQueue(SDL_AUDIOBUFFERQUEUE_PACKETLEN, obtained->size * 2); | ||||||
|         if (!device->buffer_queue) { |         if (!device->buffer_queue) { | ||||||
| @@ -1525,7 +1470,7 @@ open_audio_device(const char *devname, int iscapture, | |||||||
|     } |     } | ||||||
|     SDL_assert(device->work_buffer_len > 0); |     SDL_assert(device->work_buffer_len > 0); | ||||||
|  |  | ||||||
|     device->work_buffer = (Uint8 *) SDL_malloc(device->work_buffer_len); |     device->work_buffer = (Uint8 *)SDL_malloc(device->work_buffer_len); | ||||||
|     if (device->work_buffer == NULL) { |     if (device->work_buffer == NULL) { | ||||||
|         close_audio_device(device); |         close_audio_device(device); | ||||||
|         SDL_UnlockMutex(current_audio.detectionLock); |         SDL_UnlockMutex(current_audio.detectionLock); | ||||||
| @@ -1533,7 +1478,7 @@ open_audio_device(const char *devname, int iscapture, | |||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     open_devices[id] = device;  /* add it to our list of open devices. */ |     open_devices[id] = device; /* add it to our list of open devices. */ | ||||||
|  |  | ||||||
|     /* Start the audio thread if necessary */ |     /* Start the audio thread if necessary */ | ||||||
|     if (!current_audio.impl.ProvidesOwnCallbackThread) { |     if (!current_audio.impl.ProvidesOwnCallbackThread) { | ||||||
| @@ -1543,7 +1488,7 @@ open_audio_device(const char *devname, int iscapture, | |||||||
|         const size_t stacksize = is_internal_thread ? 64 * 1024 : 0; |         const size_t stacksize = is_internal_thread ? 64 * 1024 : 0; | ||||||
|         char threadname[64]; |         char threadname[64]; | ||||||
|  |  | ||||||
|         SDL_snprintf(threadname, sizeof (threadname), "SDLAudio%c%d", (iscapture) ? 'C' : 'P', (int) device->id); |         SDL_snprintf(threadname, sizeof(threadname), "SDLAudio%c%d", (iscapture) ? 'C' : 'P', (int)device->id); | ||||||
|         device->thread = SDL_CreateThreadInternal(iscapture ? SDL_CaptureAudio : SDL_RunAudio, threadname, stacksize, device); |         device->thread = SDL_CreateThreadInternal(iscapture ? SDL_CaptureAudio : SDL_RunAudio, threadname, stacksize, device); | ||||||
|  |  | ||||||
|         if (device->thread == NULL) { |         if (device->thread == NULL) { | ||||||
| @@ -1558,9 +1503,7 @@ open_audio_device(const char *devname, int iscapture, | |||||||
|     return device->id; |     return device->id; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained) | ||||||
| int |  | ||||||
| SDL_OpenAudio(SDL_AudioSpec * desired, SDL_AudioSpec * obtained) |  | ||||||
| { | { | ||||||
|     SDL_AudioDeviceID id = 0; |     SDL_AudioDeviceID id = 0; | ||||||
|  |  | ||||||
| @@ -1596,7 +1539,7 @@ SDL_OpenAudio(SDL_AudioSpec * desired, SDL_AudioSpec * obtained) | |||||||
|  |  | ||||||
| SDL_AudioDeviceID | SDL_AudioDeviceID | ||||||
| SDL_OpenAudioDevice(const char *device, int iscapture, | SDL_OpenAudioDevice(const char *device, int iscapture, | ||||||
|                     const SDL_AudioSpec * desired, SDL_AudioSpec * obtained, |                     const SDL_AudioSpec *desired, SDL_AudioSpec *obtained, | ||||||
|                     int allowed_changes) |                     int allowed_changes) | ||||||
| { | { | ||||||
|     return open_audio_device(device, iscapture, desired, obtained, |     return open_audio_device(device, iscapture, desired, obtained, | ||||||
| @@ -1618,15 +1561,13 @@ SDL_GetAudioDeviceStatus(SDL_AudioDeviceID devid) | |||||||
|     return status; |     return status; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| SDL_AudioStatus | SDL_AudioStatus | ||||||
| SDL_GetAudioStatus(void) | SDL_GetAudioStatus(void) | ||||||
| { | { | ||||||
|     return SDL_GetAudioDeviceStatus(1); |     return SDL_GetAudioDeviceStatus(1); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_PauseAudioDevice(SDL_AudioDeviceID devid, int pause_on) | ||||||
| SDL_PauseAudioDevice(SDL_AudioDeviceID devid, int pause_on) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *device = get_audio_device(devid); |     SDL_AudioDevice *device = get_audio_device(devid); | ||||||
|     if (device) { |     if (device) { | ||||||
| @@ -1636,15 +1577,12 @@ SDL_PauseAudioDevice(SDL_AudioDeviceID devid, int pause_on) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_PauseAudio(int pause_on) | ||||||
| SDL_PauseAudio(int pause_on) |  | ||||||
| { | { | ||||||
|     SDL_PauseAudioDevice(1, pause_on); |     SDL_PauseAudioDevice(1, pause_on); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void SDL_LockAudioDevice(SDL_AudioDeviceID devid) | ||||||
| void |  | ||||||
| SDL_LockAudioDevice(SDL_AudioDeviceID devid) |  | ||||||
| { | { | ||||||
|     /* Obtain a lock on the mixing buffers */ |     /* Obtain a lock on the mixing buffers */ | ||||||
|     SDL_AudioDevice *device = get_audio_device(devid); |     SDL_AudioDevice *device = get_audio_device(devid); | ||||||
| @@ -1653,14 +1591,12 @@ SDL_LockAudioDevice(SDL_AudioDeviceID devid) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_LockAudio(void) | ||||||
| SDL_LockAudio(void) |  | ||||||
| { | { | ||||||
|     SDL_LockAudioDevice(1); |     SDL_LockAudioDevice(1); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_UnlockAudioDevice(SDL_AudioDeviceID devid) | ||||||
| SDL_UnlockAudioDevice(SDL_AudioDeviceID devid) |  | ||||||
| { | { | ||||||
|     /* Obtain a lock on the mixing buffers */ |     /* Obtain a lock on the mixing buffers */ | ||||||
|     SDL_AudioDevice *device = get_audio_device(devid); |     SDL_AudioDevice *device = get_audio_device(devid); | ||||||
| @@ -1669,30 +1605,26 @@ SDL_UnlockAudioDevice(SDL_AudioDeviceID devid) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_UnlockAudio(void) | ||||||
| SDL_UnlockAudio(void) |  | ||||||
| { | { | ||||||
|     SDL_UnlockAudioDevice(1); |     SDL_UnlockAudioDevice(1); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_CloseAudioDevice(SDL_AudioDeviceID devid) | ||||||
| SDL_CloseAudioDevice(SDL_AudioDeviceID devid) |  | ||||||
| { | { | ||||||
|     close_audio_device(get_audio_device(devid)); |     close_audio_device(get_audio_device(devid)); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_CloseAudio(void) | ||||||
| SDL_CloseAudio(void) |  | ||||||
| { | { | ||||||
|     SDL_CloseAudioDevice(1); |     SDL_CloseAudioDevice(1); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_AudioQuit(void) | ||||||
| SDL_AudioQuit(void) |  | ||||||
| { | { | ||||||
|     SDL_AudioDeviceID i; |     SDL_AudioDeviceID i; | ||||||
|  |  | ||||||
|     if (!current_audio.name) {  /* not initialized?! */ |     if (!current_audio.name) { /* not initialized?! */ | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1720,26 +1652,26 @@ SDL_AudioQuit(void) | |||||||
| static int format_idx; | static int format_idx; | ||||||
| static int format_idx_sub; | static int format_idx_sub; | ||||||
| static SDL_AudioFormat format_list[NUM_FORMATS][NUM_FORMATS] = { | static SDL_AudioFormat format_list[NUM_FORMATS][NUM_FORMATS] = { | ||||||
|     {AUDIO_U8, AUDIO_S8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, |     { AUDIO_U8, AUDIO_S8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, | ||||||
|      AUDIO_U16MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB}, |       AUDIO_U16MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB }, | ||||||
|     {AUDIO_S8, AUDIO_U8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, |     { AUDIO_S8, AUDIO_U8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, | ||||||
|      AUDIO_U16MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB}, |       AUDIO_U16MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB }, | ||||||
|     {AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S32LSB, |     { AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S32LSB, | ||||||
|      AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_U8, AUDIO_S8}, |       AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_U8, AUDIO_S8 }, | ||||||
|     {AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S32MSB, |     { AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S32MSB, | ||||||
|      AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_U8, AUDIO_S8}, |       AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_U8, AUDIO_S8 }, | ||||||
|     {AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_S32LSB, |     { AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_S32LSB, | ||||||
|      AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_U8, AUDIO_S8}, |       AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_U8, AUDIO_S8 }, | ||||||
|     {AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_S32MSB, |     { AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_S32MSB, | ||||||
|      AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_U8, AUDIO_S8}, |       AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_U8, AUDIO_S8 }, | ||||||
|     {AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_S16LSB, |     { AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_S16LSB, | ||||||
|      AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8}, |       AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8 }, | ||||||
|     {AUDIO_S32MSB, AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_S16MSB, |     { AUDIO_S32MSB, AUDIO_S32LSB, AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_S16MSB, | ||||||
|      AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8}, |       AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8 }, | ||||||
|     {AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_S16LSB, |     { AUDIO_F32LSB, AUDIO_F32MSB, AUDIO_S32LSB, AUDIO_S32MSB, AUDIO_S16LSB, | ||||||
|      AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8}, |       AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8 }, | ||||||
|     {AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_S32MSB, AUDIO_S32LSB, AUDIO_S16MSB, |     { AUDIO_F32MSB, AUDIO_F32LSB, AUDIO_S32MSB, AUDIO_S32LSB, AUDIO_S16MSB, | ||||||
|      AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8}, |       AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8 }, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| SDL_AudioFormat | SDL_AudioFormat | ||||||
| @@ -1763,26 +1695,25 @@ SDL_NextAudioFormat(void) | |||||||
|     return format_list[format_idx][format_idx_sub++]; |     return format_list[format_idx][format_idx_sub++]; | ||||||
| } | } | ||||||
|  |  | ||||||
| Uint8 | Uint8 SDL_SilenceValueForFormat(const SDL_AudioFormat format) | ||||||
| SDL_SilenceValueForFormat(const SDL_AudioFormat format) |  | ||||||
| { | { | ||||||
|     switch (format) { |     switch (format) { | ||||||
|         /* !!! FIXME: 0x80 isn't perfect for U16, but we can't fit 0x8000 in a |     /* !!! FIXME: 0x80 isn't perfect for U16, but we can't fit 0x8000 in a | ||||||
|            !!! FIXME:  byte for SDL_memset() use. This is actually 0.1953 percent |        !!! FIXME:  byte for SDL_memset() use. This is actually 0.1953 percent | ||||||
|            !!! FIXME:  off from silence. Maybe just don't use U16. */ |        !!! FIXME:  off from silence. Maybe just don't use U16. */ | ||||||
|         case AUDIO_U16LSB: |     case AUDIO_U16LSB: | ||||||
|         case AUDIO_U16MSB: |     case AUDIO_U16MSB: | ||||||
|         case AUDIO_U8: |     case AUDIO_U8: | ||||||
|             return 0x80; |         return 0x80; | ||||||
|  |  | ||||||
|         default: break; |     default: | ||||||
|  |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0x00; |     return 0x00; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_CalculateAudioSpec(SDL_AudioSpec *spec) | ||||||
| SDL_CalculateAudioSpec(SDL_AudioSpec * spec) |  | ||||||
| { | { | ||||||
|     spec->silence = SDL_SilenceValueForFormat(spec->format); |     spec->silence = SDL_SilenceValueForFormat(spec->format); | ||||||
|     spec->size = SDL_AUDIO_BITSIZE(spec->format) / 8; |     spec->size = SDL_AUDIO_BITSIZE(spec->format) / 8; | ||||||
| @@ -1790,13 +1721,11 @@ SDL_CalculateAudioSpec(SDL_AudioSpec * spec) | |||||||
|     spec->size *= spec->samples; |     spec->size *= spec->samples; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Moved here from SDL_mixer.c, since it relies on internals of an opened |  * Moved here from SDL_mixer.c, since it relies on internals of an opened | ||||||
|  *  audio device (and is deprecated, by the way!). |  *  audio device (and is deprecated, by the way!). | ||||||
|  */ |  */ | ||||||
| void | void SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume) | ||||||
| SDL_MixAudio(Uint8 * dst, const Uint8 * src, Uint32 len, int volume) |  | ||||||
| { | { | ||||||
|     /* Mix the user-level audio format */ |     /* Mix the user-level audio format */ | ||||||
|     SDL_AudioDevice *device = get_audio_device(1); |     SDL_AudioDevice *device = get_audio_device(1); | ||||||
|   | |||||||
| @@ -40,11 +40,11 @@ | |||||||
| #include "samplerate.h" | #include "samplerate.h" | ||||||
| extern SDL_bool SRC_available; | extern SDL_bool SRC_available; | ||||||
| extern int SRC_converter; | extern int SRC_converter; | ||||||
| extern SRC_STATE* (*SRC_src_new)(int converter_type, int channels, int *error); | extern SRC_STATE *(*SRC_src_new)(int converter_type, int channels, int *error); | ||||||
| extern int (*SRC_src_process)(SRC_STATE *state, SRC_DATA *data); | extern int (*SRC_src_process)(SRC_STATE *state, SRC_DATA *data); | ||||||
| extern int (*SRC_src_reset)(SRC_STATE *state); | extern int (*SRC_src_reset)(SRC_STATE *state); | ||||||
| extern SRC_STATE* (*SRC_src_delete)(SRC_STATE *state); | extern SRC_STATE *(*SRC_src_delete)(SRC_STATE *state); | ||||||
| extern const char* (*SRC_src_strerror)(int error); | extern const char *(*SRC_src_strerror)(int error); | ||||||
| extern int (*SRC_src_simple)(SRC_DATA *data, int converter_type, int channels); | extern int (*SRC_src_simple)(SRC_DATA *data, int converter_type, int channels); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -54,7 +54,7 @@ extern SDL_AudioFormat SDL_NextAudioFormat(void); | |||||||
|  |  | ||||||
| /* Function to calculate the size and silence for a SDL_AudioSpec */ | /* Function to calculate the size and silence for a SDL_AudioSpec */ | ||||||
| extern Uint8 SDL_SilenceValueForFormat(const SDL_AudioFormat format); | extern Uint8 SDL_SilenceValueForFormat(const SDL_AudioFormat format); | ||||||
| extern void SDL_CalculateAudioSpec(SDL_AudioSpec * spec); | extern void SDL_CalculateAudioSpec(SDL_AudioSpec *spec); | ||||||
|  |  | ||||||
| /* Choose the audio filter functions below */ | /* Choose the audio filter functions below */ | ||||||
| extern void SDL_ChooseAudioConverters(void); | extern void SDL_ChooseAudioConverters(void); | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -21,10 +21,10 @@ | |||||||
|  |  | ||||||
| /* DO NOT EDIT, THIS FILE WAS GENERATED BY build-scripts/gen_audio_resampler_filter.c */ | /* DO NOT EDIT, THIS FILE WAS GENERATED BY build-scripts/gen_audio_resampler_filter.c */ | ||||||
|  |  | ||||||
| #define RESAMPLER_ZERO_CROSSINGS 5 | #define RESAMPLER_ZERO_CROSSINGS            5 | ||||||
| #define RESAMPLER_BITS_PER_SAMPLE 16 | #define RESAMPLER_BITS_PER_SAMPLE           16 | ||||||
| #define RESAMPLER_SAMPLES_PER_ZERO_CROSSING (1 << ((RESAMPLER_BITS_PER_SAMPLE / 2) + 1)) | #define RESAMPLER_SAMPLES_PER_ZERO_CROSSING (1 << ((RESAMPLER_BITS_PER_SAMPLE / 2) + 1)) | ||||||
| #define RESAMPLER_FILTER_SIZE ((RESAMPLER_SAMPLES_PER_ZERO_CROSSING * RESAMPLER_ZERO_CROSSINGS) + 1) | #define RESAMPLER_FILTER_SIZE               ((RESAMPLER_SAMPLES_PER_ZERO_CROSSING * RESAMPLER_ZERO_CROSSINGS) + 1) | ||||||
|  |  | ||||||
| static const float ResamplerFilter[RESAMPLER_FILTER_SIZE] = { | static const float ResamplerFilter[RESAMPLER_FILTER_SIZE] = { | ||||||
|     1.000000000f, 0.999993682f, 0.999974370f, 0.999941289f, 0.999894559f, |     1.000000000f, 0.999993682f, 0.999974370f, 0.999941289f, 0.999894559f, | ||||||
| @@ -1059,4 +1059,3 @@ static const float ResamplerFilterDifference[RESAMPLER_FILTER_SIZE] = { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|  |  | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -34,9 +34,9 @@ | |||||||
|  |  | ||||||
| #ifndef _PATH_DEV_DSP | #ifndef _PATH_DEV_DSP | ||||||
| #if defined(__NETBSD__) || defined(__OPENBSD__) | #if defined(__NETBSD__) || defined(__OPENBSD__) | ||||||
| #define _PATH_DEV_DSP  "/dev/audio" | #define _PATH_DEV_DSP "/dev/audio" | ||||||
| #else | #else | ||||||
| #define _PATH_DEV_DSP  "/dev/dsp" | #define _PATH_DEV_DSP "/dev/dsp" | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
| #ifndef _PATH_DEV_DSP24 | #ifndef _PATH_DEV_DSP24 | ||||||
| @@ -46,8 +46,7 @@ | |||||||
| #define _PATH_DEV_AUDIO "/dev/audio" | #define _PATH_DEV_AUDIO "/dev/audio" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static void | static void test_device(const int iscapture, const char *fname, int flags, int (*test)(int fd)) | ||||||
| test_device(const int iscapture, const char *fname, int flags, int (*test) (int fd)) |  | ||||||
| { | { | ||||||
|     struct stat sb; |     struct stat sb; | ||||||
|     if ((stat(fname, &sb) == 0) && (S_ISCHR(sb.st_mode))) { |     if ((stat(fname, &sb) == 0) && (S_ISCHR(sb.st_mode))) { | ||||||
| @@ -65,20 +64,18 @@ test_device(const int iscapture, const char *fname, int flags, int (*test) (int | |||||||
|                  * information,  making this information inaccessible at |                  * information,  making this information inaccessible at | ||||||
|                  * enumeration time |                  * enumeration time | ||||||
|                  */ |                  */ | ||||||
|                 SDL_AddAudioDevice(iscapture, fname, NULL, (void *) (uintptr_t) dummyhandle); |                 SDL_AddAudioDevice(iscapture, fname, NULL, (void *)(uintptr_t)dummyhandle); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int test_stub(int fd) | ||||||
| test_stub(int fd) |  | ||||||
| { | { | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_EnumUnixAudioDevices_Internal(const int iscapture, const int classic, int (*test)(int)) | ||||||
| SDL_EnumUnixAudioDevices_Internal(const int iscapture, const int classic, int (*test)(int)) |  | ||||||
| { | { | ||||||
|     const int flags = iscapture ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT; |     const int flags = iscapture ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT; | ||||||
|     const char *audiodev; |     const char *audiodev; | ||||||
| @@ -97,9 +94,7 @@ SDL_EnumUnixAudioDevices_Internal(const int iscapture, const int classic, int (* | |||||||
|             struct stat sb; |             struct stat sb; | ||||||
|  |  | ||||||
|             /* Added support for /dev/sound/\* in Linux 2.4 */ |             /* Added support for /dev/sound/\* in Linux 2.4 */ | ||||||
|             if (((stat("/dev/sound", &sb) == 0) && S_ISDIR(sb.st_mode)) |             if (((stat("/dev/sound", &sb) == 0) && S_ISDIR(sb.st_mode)) && ((stat(_PATH_DEV_DSP24, &sb) == 0) && S_ISCHR(sb.st_mode))) { | ||||||
|                 && ((stat(_PATH_DEV_DSP24, &sb) == 0) |  | ||||||
|                     && S_ISCHR(sb.st_mode))) { |  | ||||||
|                 audiodev = _PATH_DEV_DSP24; |                 audiodev = _PATH_DEV_DSP24; | ||||||
|             } else { |             } else { | ||||||
|                 audiodev = _PATH_DEV_DSP; |                 audiodev = _PATH_DEV_DSP; | ||||||
| @@ -119,8 +114,7 @@ SDL_EnumUnixAudioDevices_Internal(const int iscapture, const int classic, int (* | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EnumUnixAudioDevices(const int classic, int (*test)(int)) | ||||||
| SDL_EnumUnixAudioDevices(const int classic, int (*test)(int)) |  | ||||||
| { | { | ||||||
|     SDL_EnumUnixAudioDevices_Internal(SDL_TRUE, classic, test); |     SDL_EnumUnixAudioDevices_Internal(SDL_TRUE, classic, test); | ||||||
|     SDL_EnumUnixAudioDevices_Internal(SDL_FALSE, classic, test); |     SDL_EnumUnixAudioDevices_Internal(SDL_FALSE, classic, test); | ||||||
|   | |||||||
| @@ -31,10 +31,10 @@ | |||||||
|  |  | ||||||
| #ifdef USE_BLOCKING_WRITES | #ifdef USE_BLOCKING_WRITES | ||||||
| #define OPEN_FLAGS_OUTPUT O_WRONLY | #define OPEN_FLAGS_OUTPUT O_WRONLY | ||||||
| #define OPEN_FLAGS_INPUT O_RDONLY | #define OPEN_FLAGS_INPUT  O_RDONLY | ||||||
| #else | #else | ||||||
| #define OPEN_FLAGS_OUTPUT (O_WRONLY|O_NONBLOCK) | #define OPEN_FLAGS_OUTPUT (O_WRONLY | O_NONBLOCK) | ||||||
| #define OPEN_FLAGS_INPUT (O_RDONLY|O_NONBLOCK) | #define OPEN_FLAGS_INPUT  (O_RDONLY | O_NONBLOCK) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| extern void SDL_EnumUnixAudioDevices(const int classic, int (*test)(int)); | extern void SDL_EnumUnixAudioDevices(const int classic, int (*test)(int)); | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -81,14 +81,12 @@ static const Uint8 mix8[] = { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| /* The volume ranges from 0 - 128 */ | /* The volume ranges from 0 - 128 */ | ||||||
| #define ADJUST_VOLUME(s, v) (s = (s*v)/SDL_MIX_MAXVOLUME) | #define ADJUST_VOLUME(s, v)     (s = (s * v) / SDL_MIX_MAXVOLUME) | ||||||
| #define ADJUST_VOLUME_U8(s, v)  (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128) | #define ADJUST_VOLUME_U8(s, v)  (s = (((s - 128) * v) / SDL_MIX_MAXVOLUME) + 128) | ||||||
| #define ADJUST_VOLUME_U16(s, v)  (s = (((s-32768)*v)/SDL_MIX_MAXVOLUME)+32768) | #define ADJUST_VOLUME_U16(s, v) (s = (((s - 32768) * v) / SDL_MIX_MAXVOLUME) + 32768) | ||||||
|  |  | ||||||
|  | void SDL_MixAudioFormat(Uint8 *dst, const Uint8 *src, SDL_AudioFormat format, | ||||||
| void |                         Uint32 len, int volume) | ||||||
| SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format, |  | ||||||
|                    Uint32 len, int volume) |  | ||||||
| { | { | ||||||
|     if (volume == 0) { |     if (volume == 0) { | ||||||
|         return; |         return; | ||||||
| @@ -97,258 +95,248 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format, | |||||||
|     switch (format) { |     switch (format) { | ||||||
|  |  | ||||||
|     case AUDIO_U8: |     case AUDIO_U8: | ||||||
|         { |     { | ||||||
|             Uint8 src_sample; |         Uint8 src_sample; | ||||||
|  |  | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src_sample = *src; |             src_sample = *src; | ||||||
|                 ADJUST_VOLUME_U8(src_sample, volume); |             ADJUST_VOLUME_U8(src_sample, volume); | ||||||
|                 *dst = mix8[*dst + src_sample]; |             *dst = mix8[*dst + src_sample]; | ||||||
|                 ++dst; |             ++dst; | ||||||
|                 ++src; |             ++src; | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_S8: |     case AUDIO_S8: | ||||||
|         { |     { | ||||||
|             Sint8 *dst8, *src8; |         Sint8 *dst8, *src8; | ||||||
|             Sint8 src_sample; |         Sint8 src_sample; | ||||||
|             int dst_sample; |         int dst_sample; | ||||||
|             const int max_audioval = SDL_MAX_SINT8; |         const int max_audioval = SDL_MAX_SINT8; | ||||||
|             const int min_audioval = SDL_MIN_SINT8; |         const int min_audioval = SDL_MIN_SINT8; | ||||||
|  |  | ||||||
|             src8 = (Sint8 *) src; |         src8 = (Sint8 *)src; | ||||||
|             dst8 = (Sint8 *) dst; |         dst8 = (Sint8 *)dst; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src_sample = *src8; |             src_sample = *src8; | ||||||
|                 ADJUST_VOLUME(src_sample, volume); |             ADJUST_VOLUME(src_sample, volume); | ||||||
|                 dst_sample = *dst8 + src_sample; |             dst_sample = *dst8 + src_sample; | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 *dst8 = dst_sample; |  | ||||||
|                 ++dst8; |  | ||||||
|                 ++src8; |  | ||||||
|             } |             } | ||||||
|  |             *dst8 = dst_sample; | ||||||
|  |             ++dst8; | ||||||
|  |             ++src8; | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_S16LSB: |     case AUDIO_S16LSB: | ||||||
|         { |     { | ||||||
|             Sint16 src1, src2; |         Sint16 src1, src2; | ||||||
|             int dst_sample; |         int dst_sample; | ||||||
|             const int max_audioval = SDL_MAX_SINT16; |         const int max_audioval = SDL_MAX_SINT16; | ||||||
|             const int min_audioval = SDL_MIN_SINT16; |         const int min_audioval = SDL_MIN_SINT16; | ||||||
|  |  | ||||||
|             len /= 2; |         len /= 2; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src1 = SDL_SwapLE16(*(Sint16 *)src); |             src1 = SDL_SwapLE16(*(Sint16 *)src); | ||||||
|                 ADJUST_VOLUME(src1, volume); |             ADJUST_VOLUME(src1, volume); | ||||||
|                 src2 = SDL_SwapLE16(*(Sint16 *)dst); |             src2 = SDL_SwapLE16(*(Sint16 *)dst); | ||||||
|                 src += 2; |             src += 2; | ||||||
|                 dst_sample = src1 + src2; |             dst_sample = src1 + src2; | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 *(Sint16 *)dst = SDL_SwapLE16(dst_sample); |  | ||||||
|                 dst += 2; |  | ||||||
|             } |             } | ||||||
|  |             *(Sint16 *)dst = SDL_SwapLE16(dst_sample); | ||||||
|  |             dst += 2; | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_S16MSB: |     case AUDIO_S16MSB: | ||||||
|         { |     { | ||||||
|             Sint16 src1, src2; |         Sint16 src1, src2; | ||||||
|             int dst_sample; |         int dst_sample; | ||||||
|             const int max_audioval = SDL_MAX_SINT16; |         const int max_audioval = SDL_MAX_SINT16; | ||||||
|             const int min_audioval = SDL_MIN_SINT16; |         const int min_audioval = SDL_MIN_SINT16; | ||||||
|  |  | ||||||
|             len /= 2; |         len /= 2; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src1 = SDL_SwapBE16(*(Sint16 *)src); |             src1 = SDL_SwapBE16(*(Sint16 *)src); | ||||||
|                 ADJUST_VOLUME(src1, volume); |             ADJUST_VOLUME(src1, volume); | ||||||
|                 src2 = SDL_SwapBE16(*(Sint16 *)dst); |             src2 = SDL_SwapBE16(*(Sint16 *)dst); | ||||||
|                 src += 2; |             src += 2; | ||||||
|                 dst_sample = src1 + src2; |             dst_sample = src1 + src2; | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 *(Sint16 *)dst = SDL_SwapBE16(dst_sample); |  | ||||||
|                 dst += 2; |  | ||||||
|             } |             } | ||||||
|  |             *(Sint16 *)dst = SDL_SwapBE16(dst_sample); | ||||||
|  |             dst += 2; | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_U16LSB: |     case AUDIO_U16LSB: | ||||||
|         { |     { | ||||||
|             Uint16 src1, src2; |         Uint16 src1, src2; | ||||||
|             int dst_sample; |         int dst_sample; | ||||||
|             const int max_audioval = SDL_MAX_SINT16; |         const int max_audioval = SDL_MAX_SINT16; | ||||||
|             const int min_audioval = SDL_MIN_SINT16; |         const int min_audioval = SDL_MIN_SINT16; | ||||||
|  |  | ||||||
|             len /= 2; |         len /= 2; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src1 = SDL_SwapLE16(*(Uint16 *)src); |             src1 = SDL_SwapLE16(*(Uint16 *)src); | ||||||
|                 ADJUST_VOLUME_U16(src1, volume); |             ADJUST_VOLUME_U16(src1, volume); | ||||||
|                 src2 = SDL_SwapLE16(*(Uint16 *)dst); |             src2 = SDL_SwapLE16(*(Uint16 *)dst); | ||||||
|                 src += 2; |             src += 2; | ||||||
|                 dst_sample = src1 + src2 - 32768 * 2; |             dst_sample = src1 + src2 - 32768 * 2; | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 dst_sample += 32768; |  | ||||||
|                 *(Uint16 *)dst = SDL_SwapLE16(dst_sample); |  | ||||||
|                 dst += 2; |  | ||||||
|             } |             } | ||||||
|  |             dst_sample += 32768; | ||||||
|  |             *(Uint16 *)dst = SDL_SwapLE16(dst_sample); | ||||||
|  |             dst += 2; | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_U16MSB: |     case AUDIO_U16MSB: | ||||||
|         { |     { | ||||||
|             Uint16 src1, src2; |         Uint16 src1, src2; | ||||||
|             int dst_sample; |         int dst_sample; | ||||||
|             const int max_audioval = SDL_MAX_SINT16; |         const int max_audioval = SDL_MAX_SINT16; | ||||||
|             const int min_audioval = SDL_MIN_SINT16; |         const int min_audioval = SDL_MIN_SINT16; | ||||||
|  |  | ||||||
|             len /= 2; |         len /= 2; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src1 = SDL_SwapBE16(*(Uint16 *)src); |             src1 = SDL_SwapBE16(*(Uint16 *)src); | ||||||
|                 ADJUST_VOLUME_U16(src1, volume); |             ADJUST_VOLUME_U16(src1, volume); | ||||||
|                 src2 = SDL_SwapBE16(*(Uint16 *)dst); |             src2 = SDL_SwapBE16(*(Uint16 *)dst); | ||||||
|                 src += 2; |             src += 2; | ||||||
|                 dst_sample = src1 + src2 - 32768 * 2; |             dst_sample = src1 + src2 - 32768 * 2; | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 dst_sample += 32768; |  | ||||||
|                 *(Uint16 *)dst = SDL_SwapBE16(dst_sample); |  | ||||||
|                 dst += 2; |  | ||||||
|             } |             } | ||||||
|  |             dst_sample += 32768; | ||||||
|  |             *(Uint16 *)dst = SDL_SwapBE16(dst_sample); | ||||||
|  |             dst += 2; | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_S32LSB: |     case AUDIO_S32LSB: | ||||||
|         { |     { | ||||||
|             const Uint32 *src32 = (Uint32 *) src; |         const Uint32 *src32 = (Uint32 *)src; | ||||||
|             Uint32 *dst32 = (Uint32 *) dst; |         Uint32 *dst32 = (Uint32 *)dst; | ||||||
|             Sint64 src1, src2; |         Sint64 src1, src2; | ||||||
|             Sint64 dst_sample; |         Sint64 dst_sample; | ||||||
|             const Sint64 max_audioval = SDL_MAX_SINT32; |         const Sint64 max_audioval = SDL_MAX_SINT32; | ||||||
|             const Sint64 min_audioval = SDL_MIN_SINT32; |         const Sint64 min_audioval = SDL_MIN_SINT32; | ||||||
|  |  | ||||||
|             len /= 4; |         len /= 4; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src1 = (Sint64) ((Sint32) SDL_SwapLE32(*src32)); |             src1 = (Sint64)((Sint32)SDL_SwapLE32(*src32)); | ||||||
|                 src32++; |             src32++; | ||||||
|                 ADJUST_VOLUME(src1, volume); |             ADJUST_VOLUME(src1, volume); | ||||||
|                 src2 = (Sint64) ((Sint32) SDL_SwapLE32(*dst32)); |             src2 = (Sint64)((Sint32)SDL_SwapLE32(*dst32)); | ||||||
|                 dst_sample = src1 + src2; |             dst_sample = src1 + src2; | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 *(dst32++) = SDL_SwapLE32((Uint32) ((Sint32) dst_sample)); |  | ||||||
|             } |             } | ||||||
|  |             *(dst32++) = SDL_SwapLE32((Uint32)((Sint32)dst_sample)); | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_S32MSB: |     case AUDIO_S32MSB: | ||||||
|         { |     { | ||||||
|             const Uint32 *src32 = (Uint32 *) src; |         const Uint32 *src32 = (Uint32 *)src; | ||||||
|             Uint32 *dst32 = (Uint32 *) dst; |         Uint32 *dst32 = (Uint32 *)dst; | ||||||
|             Sint64 src1, src2; |         Sint64 src1, src2; | ||||||
|             Sint64 dst_sample; |         Sint64 dst_sample; | ||||||
|             const Sint64 max_audioval = SDL_MAX_SINT32; |         const Sint64 max_audioval = SDL_MAX_SINT32; | ||||||
|             const Sint64 min_audioval = SDL_MIN_SINT32; |         const Sint64 min_audioval = SDL_MIN_SINT32; | ||||||
|  |  | ||||||
|             len /= 4; |         len /= 4; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src1 = (Sint64) ((Sint32) SDL_SwapBE32(*src32)); |             src1 = (Sint64)((Sint32)SDL_SwapBE32(*src32)); | ||||||
|                 src32++; |             src32++; | ||||||
|                 ADJUST_VOLUME(src1, volume); |             ADJUST_VOLUME(src1, volume); | ||||||
|                 src2 = (Sint64) ((Sint32) SDL_SwapBE32(*dst32)); |             src2 = (Sint64)((Sint32)SDL_SwapBE32(*dst32)); | ||||||
|                 dst_sample = src1 + src2; |             dst_sample = src1 + src2; | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 *(dst32++) = SDL_SwapBE32((Uint32) ((Sint32) dst_sample)); |  | ||||||
|             } |             } | ||||||
|  |             *(dst32++) = SDL_SwapBE32((Uint32)((Sint32)dst_sample)); | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_F32LSB: |     case AUDIO_F32LSB: | ||||||
|         { |     { | ||||||
|             const float fmaxvolume = 1.0f / ((float) SDL_MIX_MAXVOLUME); |         const float fmaxvolume = 1.0f / ((float)SDL_MIX_MAXVOLUME); | ||||||
|             const float fvolume = (float) volume; |         const float fvolume = (float)volume; | ||||||
|             const float *src32 = (float *) src; |         const float *src32 = (float *)src; | ||||||
|             float *dst32 = (float *) dst; |         float *dst32 = (float *)dst; | ||||||
|             float src1, src2; |         float src1, src2; | ||||||
|             double dst_sample; |         double dst_sample; | ||||||
|             /* !!! FIXME: are these right? */ |         /* !!! FIXME: are these right? */ | ||||||
|             const double max_audioval = 3.402823466e+38F; |         const double max_audioval = 3.402823466e+38F; | ||||||
|             const double min_audioval = -3.402823466e+38F; |         const double min_audioval = -3.402823466e+38F; | ||||||
|  |  | ||||||
|             len /= 4; |         len /= 4; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src1 = ((SDL_SwapFloatLE(*src32) * fvolume) * fmaxvolume); |             src1 = ((SDL_SwapFloatLE(*src32) * fvolume) * fmaxvolume); | ||||||
|                 src2 = SDL_SwapFloatLE(*dst32); |             src2 = SDL_SwapFloatLE(*dst32); | ||||||
|                 src32++; |             src32++; | ||||||
|  |  | ||||||
|                 dst_sample = ((double) src1) + ((double) src2); |             dst_sample = ((double)src1) + ((double)src2); | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 *(dst32++) = SDL_SwapFloatLE((float) dst_sample); |  | ||||||
|             } |             } | ||||||
|  |             *(dst32++) = SDL_SwapFloatLE((float)dst_sample); | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     case AUDIO_F32MSB: |     case AUDIO_F32MSB: | ||||||
|         { |     { | ||||||
|             const float fmaxvolume = 1.0f / ((float) SDL_MIX_MAXVOLUME); |         const float fmaxvolume = 1.0f / ((float)SDL_MIX_MAXVOLUME); | ||||||
|             const float fvolume = (float) volume; |         const float fvolume = (float)volume; | ||||||
|             const float *src32 = (float *) src; |         const float *src32 = (float *)src; | ||||||
|             float *dst32 = (float *) dst; |         float *dst32 = (float *)dst; | ||||||
|             float src1, src2; |         float src1, src2; | ||||||
|             double dst_sample; |         double dst_sample; | ||||||
|             /* !!! FIXME: are these right? */ |         /* !!! FIXME: are these right? */ | ||||||
|             const double max_audioval = 3.402823466e+38F; |         const double max_audioval = 3.402823466e+38F; | ||||||
|             const double min_audioval = -3.402823466e+38F; |         const double min_audioval = -3.402823466e+38F; | ||||||
|  |  | ||||||
|             len /= 4; |         len /= 4; | ||||||
|             while (len--) { |         while (len--) { | ||||||
|                 src1 = ((SDL_SwapFloatBE(*src32) * fvolume) * fmaxvolume); |             src1 = ((SDL_SwapFloatBE(*src32) * fvolume) * fmaxvolume); | ||||||
|                 src2 = SDL_SwapFloatBE(*dst32); |             src2 = SDL_SwapFloatBE(*dst32); | ||||||
|                 src32++; |             src32++; | ||||||
|  |  | ||||||
|                 dst_sample = ((double) src1) + ((double) src2); |             dst_sample = ((double)src1) + ((double)src2); | ||||||
|                 if (dst_sample > max_audioval) { |             if (dst_sample > max_audioval) { | ||||||
|                     dst_sample = max_audioval; |                 dst_sample = max_audioval; | ||||||
|                 } else if (dst_sample < min_audioval) { |             } else if (dst_sample < min_audioval) { | ||||||
|                     dst_sample = min_audioval; |                 dst_sample = min_audioval; | ||||||
|                 } |  | ||||||
|                 *(dst32++) = SDL_SwapFloatBE((float) dst_sample); |  | ||||||
|             } |             } | ||||||
|  |             *(dst32++) = SDL_SwapFloatBE((float)dst_sample); | ||||||
|         } |         } | ||||||
|         break; |     } break; | ||||||
|  |  | ||||||
|     default:                   /* If this happens... FIXME! */ |     default: /* If this happens... FIXME! */ | ||||||
|         SDL_SetError("SDL_MixAudioFormat(): unknown audio format"); |         SDL_SetError("SDL_MixAudioFormat(): unknown audio format"); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -30,11 +30,11 @@ | |||||||
|  |  | ||||||
| /* !!! FIXME: These are wordy and unlocalized... */ | /* !!! FIXME: These are wordy and unlocalized... */ | ||||||
| #define DEFAULT_OUTPUT_DEVNAME "System audio output device" | #define DEFAULT_OUTPUT_DEVNAME "System audio output device" | ||||||
| #define DEFAULT_INPUT_DEVNAME "System audio capture device" | #define DEFAULT_INPUT_DEVNAME  "System audio capture device" | ||||||
|  |  | ||||||
| /* The SDL audio driver */ | /* The SDL audio driver */ | ||||||
| typedef struct SDL_AudioDevice SDL_AudioDevice; | typedef struct SDL_AudioDevice SDL_AudioDevice; | ||||||
| #define _THIS   SDL_AudioDevice *_this | #define _THIS SDL_AudioDevice *_this | ||||||
|  |  | ||||||
| /* Audio targets should call this as devices are added to the system (such as | /* Audio targets should call this as devices are added to the system (such as | ||||||
|    a USB headset being plugged in), and should also be called for |    a USB headset being plugged in), and should also be called for | ||||||
| @@ -64,21 +64,21 @@ extern void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device); | |||||||
|  |  | ||||||
| typedef struct SDL_AudioDriverImpl | typedef struct SDL_AudioDriverImpl | ||||||
| { | { | ||||||
|     void (*DetectDevices) (void); |     void (*DetectDevices)(void); | ||||||
|     int (*OpenDevice) (_THIS, const char *devname); |     int (*OpenDevice)(_THIS, const char *devname); | ||||||
|     void (*ThreadInit) (_THIS); /* Called by audio thread at start */ |     void (*ThreadInit)(_THIS);   /* Called by audio thread at start */ | ||||||
|     void (*ThreadDeinit) (_THIS); /* Called by audio thread at end */ |     void (*ThreadDeinit)(_THIS); /* Called by audio thread at end */ | ||||||
|     void (*WaitDevice) (_THIS); |     void (*WaitDevice)(_THIS); | ||||||
|     void (*PlayDevice) (_THIS); |     void (*PlayDevice)(_THIS); | ||||||
|     Uint8 *(*GetDeviceBuf) (_THIS); |     Uint8 *(*GetDeviceBuf)(_THIS); | ||||||
|     int (*CaptureFromDevice) (_THIS, void *buffer, int buflen); |     int (*CaptureFromDevice)(_THIS, void *buffer, int buflen); | ||||||
|     void (*FlushCapture) (_THIS); |     void (*FlushCapture)(_THIS); | ||||||
|     void (*CloseDevice) (_THIS); |     void (*CloseDevice)(_THIS); | ||||||
|     void (*LockDevice) (_THIS); |     void (*LockDevice)(_THIS); | ||||||
|     void (*UnlockDevice) (_THIS); |     void (*UnlockDevice)(_THIS); | ||||||
|     void (*FreeDeviceHandle) (void *handle);  /**< SDL is done with handle from SDL_AddAudioDevice() */ |     void (*FreeDeviceHandle)(void *handle); /**< SDL is done with handle from SDL_AddAudioDevice() */ | ||||||
|     void (*Deinitialize) (void); |     void (*Deinitialize)(void); | ||||||
|     int (*GetDefaultAudioInfo) (char **name, SDL_AudioSpec *spec, int iscapture); |     int (*GetDefaultAudioInfo)(char **name, SDL_AudioSpec *spec, int iscapture); | ||||||
|  |  | ||||||
|     /* !!! FIXME: add pause(), so we can optimize instead of mixing silence. */ |     /* !!! FIXME: add pause(), so we can optimize instead of mixing silence. */ | ||||||
|  |  | ||||||
| @@ -91,7 +91,6 @@ typedef struct SDL_AudioDriverImpl | |||||||
|     SDL_bool SupportsNonPow2Samples; |     SDL_bool SupportsNonPow2Samples; | ||||||
| } SDL_AudioDriverImpl; | } SDL_AudioDriverImpl; | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef struct SDL_AudioDeviceItem | typedef struct SDL_AudioDeviceItem | ||||||
| { | { | ||||||
|     void *handle; |     void *handle; | ||||||
| @@ -102,7 +101,6 @@ typedef struct SDL_AudioDeviceItem | |||||||
|     struct SDL_AudioDeviceItem *next; |     struct SDL_AudioDeviceItem *next; | ||||||
| } SDL_AudioDeviceItem; | } SDL_AudioDeviceItem; | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef struct SDL_AudioDriver | typedef struct SDL_AudioDriver | ||||||
| { | { | ||||||
|     /* * * */ |     /* * * */ | ||||||
| @@ -125,7 +123,6 @@ typedef struct SDL_AudioDriver | |||||||
|     SDL_AudioDeviceItem *inputDevices; |     SDL_AudioDeviceItem *inputDevices; | ||||||
| } SDL_AudioDriver; | } SDL_AudioDriver; | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Define the SDL audio driver structure */ | /* Define the SDL audio driver structure */ | ||||||
| struct SDL_AudioDevice | struct SDL_AudioDevice | ||||||
| { | { | ||||||
| @@ -176,8 +173,8 @@ typedef struct AudioBootStrap | |||||||
| { | { | ||||||
|     const char *name; |     const char *name; | ||||||
|     const char *desc; |     const char *desc; | ||||||
|     SDL_bool (*init) (SDL_AudioDriverImpl * impl); |     SDL_bool (*init)(SDL_AudioDriverImpl *impl); | ||||||
|     SDL_bool demand_only;  /* 1==request explicitly, or it won't be available. */ |     SDL_bool demand_only; /* 1==request explicitly, or it won't be available. */ | ||||||
| } AudioBootStrap; | } AudioBootStrap; | ||||||
|  |  | ||||||
| /* Not all of these are available in a given build. Use #ifdefs, etc. */ | /* Not all of these are available in a given build. Use #ifdefs, etc. */ | ||||||
|   | |||||||
| @@ -43,8 +43,7 @@ | |||||||
|  * Returns 0 on success, or -1 if the multiplication overflows, in which case f1 |  * Returns 0 on success, or -1 if the multiplication overflows, in which case f1 | ||||||
|  * does not get modified. |  * does not get modified. | ||||||
|  */ |  */ | ||||||
| static int | static int SafeMult(size_t *f1, size_t f2) | ||||||
| SafeMult(size_t *f1, size_t f2) |  | ||||||
| { | { | ||||||
|     if (*f1 > 0 && SIZE_MAX / *f1 <= f2) { |     if (*f1 > 0 && SIZE_MAX / *f1 <= f2) { | ||||||
|         return -1; |         return -1; | ||||||
| @@ -66,21 +65,24 @@ typedef struct ADPCM_DecoderState | |||||||
|     void *cstate;           /* Decoding state for each channel. */ |     void *cstate;           /* Decoding state for each channel. */ | ||||||
|  |  | ||||||
|     /* ADPCM data. */ |     /* ADPCM data. */ | ||||||
|     struct { |     struct | ||||||
|  |     { | ||||||
|         Uint8 *data; |         Uint8 *data; | ||||||
|         size_t size; |         size_t size; | ||||||
|         size_t pos; |         size_t pos; | ||||||
|     } input; |     } input; | ||||||
|  |  | ||||||
|     /* Current ADPCM block in the ADPCM data above. */ |     /* Current ADPCM block in the ADPCM data above. */ | ||||||
|     struct { |     struct | ||||||
|  |     { | ||||||
|         Uint8 *data; |         Uint8 *data; | ||||||
|         size_t size; |         size_t size; | ||||||
|         size_t pos; |         size_t pos; | ||||||
|     } block; |     } block; | ||||||
|  |  | ||||||
|     /* Decoded 16-bit PCM data. */ |     /* Decoded 16-bit PCM data. */ | ||||||
|     struct { |     struct | ||||||
|  |     { | ||||||
|         Sint16 *data; |         Sint16 *data; | ||||||
|         size_t size; |         size_t size; | ||||||
|         size_t pos; |         size_t pos; | ||||||
| @@ -102,8 +104,7 @@ typedef struct MS_ADPCM_ChannelState | |||||||
| } MS_ADPCM_ChannelState; | } MS_ADPCM_ChannelState; | ||||||
|  |  | ||||||
| #ifdef SDL_WAVE_DEBUG_LOG_FORMAT | #ifdef SDL_WAVE_DEBUG_LOG_FORMAT | ||||||
| static void | static void WaveDebugLogFormat(WaveFile *file) | ||||||
| WaveDebugLogFormat(WaveFile *file) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|     const char *fmtstr = "WAVE file: %s, %u Hz, %s, %u bits, %u %s/s"; |     const char *fmtstr = "WAVE file: %s, %u Hz, %s, %u bits, %u %s/s"; | ||||||
| @@ -137,55 +138,60 @@ WaveDebugLogFormat(WaveFile *file) | |||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #define SDL_WAVE_DEBUG_CHANNELCFG(STR, CODE) case CODE: wavechannel = STR; break; | #define SDL_WAVE_DEBUG_CHANNELCFG(STR, CODE) \ | ||||||
| #define SDL_WAVE_DEBUG_CHANNELSTR(STR, CODE) if (format->channelmask & CODE) { \ |     case CODE:                               \ | ||||||
|     SDL_strlcat(channelstr, channelstr[0] ? "-" STR : STR, sizeof(channelstr));} |         wavechannel = STR;                   \ | ||||||
|  |         break; | ||||||
|  | #define SDL_WAVE_DEBUG_CHANNELSTR(STR, CODE)                                        \ | ||||||
|  |     if (format->channelmask & CODE) {                                               \ | ||||||
|  |         SDL_strlcat(channelstr, channelstr[0] ? "-" STR : STR, sizeof(channelstr)); \ | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (format->formattag == EXTENSIBLE_CODE && format->channelmask > 0) { |     if (format->formattag == EXTENSIBLE_CODE && format->channelmask > 0) { | ||||||
|         switch (format->channelmask) { |         switch (format->channelmask) { | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("1.0 Mono",         0x4) |             SDL_WAVE_DEBUG_CHANNELCFG("1.0 Mono", 0x4) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("1.1 Mono",         0xc) |             SDL_WAVE_DEBUG_CHANNELCFG("1.1 Mono", 0xc) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("2.0 Stereo",       0x3) |             SDL_WAVE_DEBUG_CHANNELCFG("2.0 Stereo", 0x3) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("2.1 Stereo",       0xb) |             SDL_WAVE_DEBUG_CHANNELCFG("2.1 Stereo", 0xb) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("3.0 Stereo",       0x7) |             SDL_WAVE_DEBUG_CHANNELCFG("3.0 Stereo", 0x7) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("3.1 Stereo",       0xf) |             SDL_WAVE_DEBUG_CHANNELCFG("3.1 Stereo", 0xf) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("3.0 Surround",     0x103) |             SDL_WAVE_DEBUG_CHANNELCFG("3.0 Surround", 0x103) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("3.1 Surround",     0x10b) |             SDL_WAVE_DEBUG_CHANNELCFG("3.1 Surround", 0x10b) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("4.0 Quad",         0x33) |             SDL_WAVE_DEBUG_CHANNELCFG("4.0 Quad", 0x33) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("4.1 Quad",         0x3b) |             SDL_WAVE_DEBUG_CHANNELCFG("4.1 Quad", 0x3b) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("4.0 Surround",     0x107) |             SDL_WAVE_DEBUG_CHANNELCFG("4.0 Surround", 0x107) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("4.1 Surround",     0x10f) |             SDL_WAVE_DEBUG_CHANNELCFG("4.1 Surround", 0x10f) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("5.0",              0x37) |             SDL_WAVE_DEBUG_CHANNELCFG("5.0", 0x37) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("5.1",              0x3f) |             SDL_WAVE_DEBUG_CHANNELCFG("5.1", 0x3f) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("5.0 Side",         0x607) |             SDL_WAVE_DEBUG_CHANNELCFG("5.0 Side", 0x607) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("5.1 Side",         0x60f) |             SDL_WAVE_DEBUG_CHANNELCFG("5.1 Side", 0x60f) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("6.0",              0x137) |             SDL_WAVE_DEBUG_CHANNELCFG("6.0", 0x137) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("6.1",              0x13f) |             SDL_WAVE_DEBUG_CHANNELCFG("6.1", 0x13f) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("6.0 Side",         0x707) |             SDL_WAVE_DEBUG_CHANNELCFG("6.0 Side", 0x707) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("6.1 Side",         0x70f) |             SDL_WAVE_DEBUG_CHANNELCFG("6.1 Side", 0x70f) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("7.0",              0xf7) |             SDL_WAVE_DEBUG_CHANNELCFG("7.0", 0xf7) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("7.1",              0xff) |             SDL_WAVE_DEBUG_CHANNELCFG("7.1", 0xff) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("7.0 Side",         0x6c7) |             SDL_WAVE_DEBUG_CHANNELCFG("7.0 Side", 0x6c7) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("7.1 Side",         0x6cf) |             SDL_WAVE_DEBUG_CHANNELCFG("7.1 Side", 0x6cf) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("7.0 Surround",     0x637) |             SDL_WAVE_DEBUG_CHANNELCFG("7.0 Surround", 0x637) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("7.1 Surround",     0x63f) |             SDL_WAVE_DEBUG_CHANNELCFG("7.1 Surround", 0x63f) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("9.0 Surround",     0x5637) |             SDL_WAVE_DEBUG_CHANNELCFG("9.0 Surround", 0x5637) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("9.1 Surround",     0x563f) |             SDL_WAVE_DEBUG_CHANNELCFG("9.1 Surround", 0x563f) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("11.0 Surround",    0x56f7) |             SDL_WAVE_DEBUG_CHANNELCFG("11.0 Surround", 0x56f7) | ||||||
|             SDL_WAVE_DEBUG_CHANNELCFG("11.1 Surround",    0x56ff) |             SDL_WAVE_DEBUG_CHANNELCFG("11.1 Surround", 0x56ff) | ||||||
|         default: |         default: | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("FL",  0x1) |             SDL_WAVE_DEBUG_CHANNELSTR("FL", 0x1) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("FR",  0x2) |             SDL_WAVE_DEBUG_CHANNELSTR("FR", 0x2) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("FC",  0x4) |             SDL_WAVE_DEBUG_CHANNELSTR("FC", 0x4) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("LF",  0x8) |             SDL_WAVE_DEBUG_CHANNELSTR("LF", 0x8) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("BL",  0x10) |             SDL_WAVE_DEBUG_CHANNELSTR("BL", 0x10) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("BR",  0x20) |             SDL_WAVE_DEBUG_CHANNELSTR("BR", 0x20) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("FLC", 0x40) |             SDL_WAVE_DEBUG_CHANNELSTR("FLC", 0x40) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("FRC", 0x80) |             SDL_WAVE_DEBUG_CHANNELSTR("FRC", 0x80) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("BC",  0x100) |             SDL_WAVE_DEBUG_CHANNELSTR("BC", 0x100) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("SL",  0x200) |             SDL_WAVE_DEBUG_CHANNELSTR("SL", 0x200) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("SR",  0x400) |             SDL_WAVE_DEBUG_CHANNELSTR("SR", 0x400) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("TC",  0x800) |             SDL_WAVE_DEBUG_CHANNELSTR("TC", 0x800) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("TFL", 0x1000) |             SDL_WAVE_DEBUG_CHANNELSTR("TFL", 0x1000) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("TFC", 0x2000) |             SDL_WAVE_DEBUG_CHANNELSTR("TFC", 0x2000) | ||||||
|             SDL_WAVE_DEBUG_CHANNELSTR("TFR", 0x4000) |             SDL_WAVE_DEBUG_CHANNELSTR("TFR", 0x4000) | ||||||
| @@ -226,33 +232,32 @@ WaveDebugLogFormat(WaveFile *file) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef SDL_WAVE_DEBUG_DUMP_FORMAT | #ifdef SDL_WAVE_DEBUG_DUMP_FORMAT | ||||||
| static void | static void WaveDebugDumpFormat(WaveFile *file, Uint32 rifflen, Uint32 fmtlen, Uint32 datalen) | ||||||
| WaveDebugDumpFormat(WaveFile *file, Uint32 rifflen, Uint32 fmtlen, Uint32 datalen) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|     const char *fmtstr1 = "WAVE chunk dump:\n" |     const char *fmtstr1 = "WAVE chunk dump:\n" | ||||||
|         "-------------------------------------------\n" |                           "-------------------------------------------\n" | ||||||
|         "RIFF                            %11u\n" |                           "RIFF                            %11u\n" | ||||||
|         "-------------------------------------------\n" |                           "-------------------------------------------\n" | ||||||
|         "    fmt                         %11u\n" |                           "    fmt                         %11u\n" | ||||||
|         "        wFormatTag                   0x%04x\n" |                           "        wFormatTag                   0x%04x\n" | ||||||
|         "        nChannels               %11u\n" |                           "        nChannels               %11u\n" | ||||||
|         "        nSamplesPerSec          %11u\n" |                           "        nSamplesPerSec          %11u\n" | ||||||
|         "        nAvgBytesPerSec         %11u\n" |                           "        nAvgBytesPerSec         %11u\n" | ||||||
|         "        nBlockAlign             %11u\n"; |                           "        nBlockAlign             %11u\n"; | ||||||
|     const char *fmtstr2 = "        wBitsPerSample          %11u\n"; |     const char *fmtstr2 = "        wBitsPerSample          %11u\n"; | ||||||
|     const char *fmtstr3 = "        cbSize                  %11u\n"; |     const char *fmtstr3 = "        cbSize                  %11u\n"; | ||||||
|     const char *fmtstr4a = "        wValidBitsPerSample     %11u\n"; |     const char *fmtstr4a = "        wValidBitsPerSample     %11u\n"; | ||||||
|     const char *fmtstr4b = "        wSamplesPerBlock        %11u\n"; |     const char *fmtstr4b = "        wSamplesPerBlock        %11u\n"; | ||||||
|     const char *fmtstr5 = "        dwChannelMask            0x%08x\n" |     const char *fmtstr5 = "        dwChannelMask            0x%08x\n" | ||||||
|         "        SubFormat\n" |                           "        SubFormat\n" | ||||||
|         "        %08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x\n"; |                           "        %08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x\n"; | ||||||
|     const char *fmtstr6 = "-------------------------------------------\n" |     const char *fmtstr6 = "-------------------------------------------\n" | ||||||
|         " fact\n" |                           " fact\n" | ||||||
|         "  dwSampleLength                %11u\n"; |                           "  dwSampleLength                %11u\n"; | ||||||
|     const char *fmtstr7 = "-------------------------------------------\n" |     const char *fmtstr7 = "-------------------------------------------\n" | ||||||
|         " data                           %11u\n" |                           " data                           %11u\n" | ||||||
|         "-------------------------------------------\n"; |                           "-------------------------------------------\n"; | ||||||
|     char *dumpstr; |     char *dumpstr; | ||||||
|     size_t dumppos = 0; |     size_t dumppos = 0; | ||||||
|     const size_t bufsize = 1024; |     const size_t bufsize = 1024; | ||||||
| @@ -317,8 +322,7 @@ WaveDebugDumpFormat(WaveFile *file, Uint32 rifflen, Uint32 fmtlen, Uint32 datale | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static Sint64 | static Sint64 WaveAdjustToFactValue(WaveFile *file, Sint64 sampleframes) | ||||||
| WaveAdjustToFactValue(WaveFile *file, Sint64 sampleframes) |  | ||||||
| { | { | ||||||
|     if (file->fact.status == 2) { |     if (file->fact.status == 2) { | ||||||
|         if (file->facthint == FactStrict && sampleframes < file->fact.samplelength) { |         if (file->facthint == FactStrict && sampleframes < file->fact.samplelength) { | ||||||
| @@ -331,8 +335,7 @@ WaveAdjustToFactValue(WaveFile *file, Sint64 sampleframes) | |||||||
|     return sampleframes; |     return sampleframes; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int MS_ADPCM_CalculateSampleFrames(WaveFile *file, size_t datalength) | ||||||
| MS_ADPCM_CalculateSampleFrames(WaveFile *file, size_t datalength) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|     const size_t blockheadersize = (size_t)file->format.channels * 7; |     const size_t blockheadersize = (size_t)file->format.channels * 7; | ||||||
| @@ -371,8 +374,7 @@ MS_ADPCM_CalculateSampleFrames(WaveFile *file, size_t datalength) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int MS_ADPCM_Init(WaveFile *file, size_t datalength) | ||||||
| MS_ADPCM_Init(WaveFile *file, size_t datalength) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|     WaveChunk *chunk = &file->chunk; |     WaveChunk *chunk = &file->chunk; | ||||||
| @@ -380,7 +382,7 @@ MS_ADPCM_Init(WaveFile *file, size_t datalength) | |||||||
|     const size_t blockdatasize = (size_t)format->blockalign - blockheadersize; |     const size_t blockdatasize = (size_t)format->blockalign - blockheadersize; | ||||||
|     const size_t blockframebitsize = (size_t)format->bitspersample * format->channels; |     const size_t blockframebitsize = (size_t)format->bitspersample * format->channels; | ||||||
|     const size_t blockdatasamples = (blockdatasize * 8) / blockframebitsize; |     const size_t blockdatasamples = (blockdatasize * 8) / blockframebitsize; | ||||||
|     const Sint16 presetcoeffs[14] = {256, 0, 512, -256, 0, 0, 192, 64, 240, 0, 460, -208, 392, -232}; |     const Sint16 presetcoeffs[14] = { 256, 0, 512, -256, 0, 0, 192, 64, 240, 0, 460, -208, 392, -232 }; | ||||||
|     size_t i, coeffcount; |     size_t i, coeffcount; | ||||||
|     MS_ADPCM_CoeffData *coeffdata; |     MS_ADPCM_CoeffData *coeffdata; | ||||||
|  |  | ||||||
| @@ -490,8 +492,7 @@ MS_ADPCM_Init(WaveFile *file, size_t datalength) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static Sint16 | static Sint16 MS_ADPCM_ProcessNibble(MS_ADPCM_ChannelState *cstate, Sint32 sample1, Sint32 sample2, Uint8 nybble) | ||||||
| MS_ADPCM_ProcessNibble(MS_ADPCM_ChannelState *cstate, Sint32 sample1, Sint32 sample2, Uint8 nybble) |  | ||||||
| { | { | ||||||
|     const Sint32 max_audioval = 32767; |     const Sint32 max_audioval = 32767; | ||||||
|     const Sint32 min_audioval = -32768; |     const Sint32 min_audioval = -32768; | ||||||
| @@ -527,8 +528,7 @@ MS_ADPCM_ProcessNibble(MS_ADPCM_ChannelState *cstate, Sint32 sample1, Sint32 sam | |||||||
|     return (Sint16)new_sample; |     return (Sint16)new_sample; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int MS_ADPCM_DecodeBlockHeader(ADPCM_DecoderState *state) | ||||||
| MS_ADPCM_DecodeBlockHeader(ADPCM_DecoderState *state) |  | ||||||
| { | { | ||||||
|     Uint8 coeffindex; |     Uint8 coeffindex; | ||||||
|     const Uint32 channels = state->channels; |     const Uint32 channels = state->channels; | ||||||
| @@ -588,8 +588,7 @@ MS_ADPCM_DecodeBlockHeader(ADPCM_DecoderState *state) | |||||||
|  * will always contain full sample frames (same sample count for each channel). |  * will always contain full sample frames (same sample count for each channel). | ||||||
|  * Incomplete sample frames are discarded. |  * Incomplete sample frames are discarded. | ||||||
|  */ |  */ | ||||||
| static int | static int MS_ADPCM_DecodeBlockData(ADPCM_DecoderState *state) | ||||||
| MS_ADPCM_DecodeBlockData(ADPCM_DecoderState *state) |  | ||||||
| { | { | ||||||
|     Uint16 nybble = 0; |     Uint16 nybble = 0; | ||||||
|     Sint16 sample1, sample2; |     Sint16 sample1, sample2; | ||||||
| @@ -636,8 +635,7 @@ MS_ADPCM_DecodeBlockData(ADPCM_DecoderState *state) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int MS_ADPCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | ||||||
| MS_ADPCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) |  | ||||||
| { | { | ||||||
|     int result; |     int result; | ||||||
|     size_t bytesleft, outputsize; |     size_t bytesleft, outputsize; | ||||||
| @@ -736,8 +734,7 @@ MS_ADPCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int IMA_ADPCM_CalculateSampleFrames(WaveFile *file, size_t datalength) | ||||||
| IMA_ADPCM_CalculateSampleFrames(WaveFile *file, size_t datalength) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|     const size_t blockheadersize = (size_t)format->channels * 4; |     const size_t blockheadersize = (size_t)format->channels * 4; | ||||||
| @@ -790,8 +787,7 @@ IMA_ADPCM_CalculateSampleFrames(WaveFile *file, size_t datalength) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int IMA_ADPCM_Init(WaveFile *file, size_t datalength) | ||||||
| IMA_ADPCM_Init(WaveFile *file, size_t datalength) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|     WaveChunk *chunk = &file->chunk; |     WaveChunk *chunk = &file->chunk; | ||||||
| @@ -856,8 +852,7 @@ IMA_ADPCM_Init(WaveFile *file, size_t datalength) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static Sint16 | static Sint16 IMA_ADPCM_ProcessNibble(Sint8 *cindex, Sint16 lastsample, Uint8 nybble) | ||||||
| IMA_ADPCM_ProcessNibble(Sint8 *cindex, Sint16 lastsample, Uint8 nybble) |  | ||||||
| { | { | ||||||
|     const Sint32 max_audioval = 32767; |     const Sint32 max_audioval = 32767; | ||||||
|     const Sint32 min_audioval = -32768; |     const Sint32 min_audioval = -32768; | ||||||
| @@ -926,12 +921,11 @@ IMA_ADPCM_ProcessNibble(Sint8 *cindex, Sint16 lastsample, Uint8 nybble) | |||||||
|     return (Sint16)sample; |     return (Sint16)sample; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int IMA_ADPCM_DecodeBlockHeader(ADPCM_DecoderState *state) | ||||||
| IMA_ADPCM_DecodeBlockHeader(ADPCM_DecoderState *state) |  | ||||||
| { | { | ||||||
|     Sint16 step; |     Sint16 step; | ||||||
|     Uint32 c; |     Uint32 c; | ||||||
|     Uint8 *cstate = (Uint8 *) state->cstate; |     Uint8 *cstate = (Uint8 *)state->cstate; | ||||||
|  |  | ||||||
|     for (c = 0; c < state->channels; c++) { |     for (c = 0; c < state->channels; c++) { | ||||||
|         size_t o = state->block.pos + c * 4; |         size_t o = state->block.pos + c * 4; | ||||||
| @@ -949,7 +943,7 @@ IMA_ADPCM_DecodeBlockHeader(ADPCM_DecoderState *state) | |||||||
|  |  | ||||||
|         /* Reserved byte in block header, should be 0. */ |         /* Reserved byte in block header, should be 0. */ | ||||||
|         if (state->block.data[o + 3] != 0) { |         if (state->block.data[o + 3] != 0) { | ||||||
|             /* Uh oh, corrupt data?  Buggy code? */ ; |             /* Uh oh, corrupt data?  Buggy code? */; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -966,8 +960,7 @@ IMA_ADPCM_DecodeBlockHeader(ADPCM_DecoderState *state) | |||||||
|  * contains full sample frames (same sample count for each channel). |  * contains full sample frames (same sample count for each channel). | ||||||
|  * Incomplete sample frames are discarded. |  * Incomplete sample frames are discarded. | ||||||
|  */ |  */ | ||||||
| static int | static int IMA_ADPCM_DecodeBlockData(ADPCM_DecoderState *state) | ||||||
| IMA_ADPCM_DecodeBlockData(ADPCM_DecoderState *state) |  | ||||||
| { | { | ||||||
|     size_t i; |     size_t i; | ||||||
|     int retval = 0; |     int retval = 0; | ||||||
| @@ -1036,8 +1029,7 @@ IMA_ADPCM_DecodeBlockData(ADPCM_DecoderState *state) | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int IMA_ADPCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | ||||||
| IMA_ADPCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) |  | ||||||
| { | { | ||||||
|     int result; |     int result; | ||||||
|     size_t bytesleft, outputsize; |     size_t bytesleft, outputsize; | ||||||
| @@ -1140,8 +1132,7 @@ IMA_ADPCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LAW_Init(WaveFile *file, size_t datalength) | ||||||
| LAW_Init(WaveFile *file, size_t datalength) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|  |  | ||||||
| @@ -1169,8 +1160,7 @@ LAW_Init(WaveFile *file, size_t datalength) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LAW_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | ||||||
| LAW_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) |  | ||||||
| { | { | ||||||
| #ifdef SDL_WAVE_LAW_LUT | #ifdef SDL_WAVE_LAW_LUT | ||||||
|     const Sint16 alaw_lut[256] = { |     const Sint16 alaw_lut[256] = { | ||||||
| @@ -1312,8 +1302,7 @@ LAW_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int PCM_Init(WaveFile *file, size_t datalength) | ||||||
| PCM_Init(WaveFile *file, size_t datalength) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|  |  | ||||||
| @@ -1356,8 +1345,7 @@ PCM_Init(WaveFile *file, size_t datalength) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int PCM_ConvertSint24ToSint32(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | ||||||
| PCM_ConvertSint24ToSint32(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|     WaveChunk *chunk = &file->chunk; |     WaveChunk *chunk = &file->chunk; | ||||||
| @@ -1408,8 +1396,7 @@ PCM_ConvertSint24ToSint32(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int PCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | ||||||
| PCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|     WaveChunk *chunk = &file->chunk; |     WaveChunk *chunk = &file->chunk; | ||||||
| @@ -1451,8 +1438,7 @@ PCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static WaveRiffSizeHint | static WaveRiffSizeHint WaveGetRiffSizeHint() | ||||||
| WaveGetRiffSizeHint() |  | ||||||
| { | { | ||||||
|     const char *hint = SDL_GetHint(SDL_HINT_WAVE_RIFF_CHUNK_SIZE); |     const char *hint = SDL_GetHint(SDL_HINT_WAVE_RIFF_CHUNK_SIZE); | ||||||
|  |  | ||||||
| @@ -1471,8 +1457,7 @@ WaveGetRiffSizeHint() | |||||||
|     return RiffSizeNoHint; |     return RiffSizeNoHint; | ||||||
| } | } | ||||||
|  |  | ||||||
| static WaveTruncationHint | static WaveTruncationHint WaveGetTruncationHint() | ||||||
| WaveGetTruncationHint() |  | ||||||
| { | { | ||||||
|     const char *hint = SDL_GetHint(SDL_HINT_WAVE_TRUNCATION); |     const char *hint = SDL_GetHint(SDL_HINT_WAVE_TRUNCATION); | ||||||
|  |  | ||||||
| @@ -1491,8 +1476,7 @@ WaveGetTruncationHint() | |||||||
|     return TruncNoHint; |     return TruncNoHint; | ||||||
| } | } | ||||||
|  |  | ||||||
| static WaveFactChunkHint | static WaveFactChunkHint WaveGetFactChunkHint() | ||||||
| WaveGetFactChunkHint() |  | ||||||
| { | { | ||||||
|     const char *hint = SDL_GetHint(SDL_HINT_WAVE_FACT_CHUNK); |     const char *hint = SDL_GetHint(SDL_HINT_WAVE_FACT_CHUNK); | ||||||
|  |  | ||||||
| @@ -1511,8 +1495,7 @@ WaveGetFactChunkHint() | |||||||
|     return FactNoHint; |     return FactNoHint; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WaveFreeChunkData(WaveChunk *chunk) | ||||||
| WaveFreeChunkData(WaveChunk *chunk) |  | ||||||
| { | { | ||||||
|     if (chunk->data != NULL) { |     if (chunk->data != NULL) { | ||||||
|         SDL_free(chunk->data); |         SDL_free(chunk->data); | ||||||
| @@ -1521,8 +1504,7 @@ WaveFreeChunkData(WaveChunk *chunk) | |||||||
|     chunk->size = 0; |     chunk->size = 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int WaveNextChunk(SDL_RWops *src, WaveChunk *chunk) | ||||||
| WaveNextChunk(SDL_RWops *src, WaveChunk *chunk) |  | ||||||
| { | { | ||||||
|     Uint32 chunkheader[2]; |     Uint32 chunkheader[2]; | ||||||
|     Sint64 nextposition = chunk->position + chunk->length; |     Sint64 nextposition = chunk->position + chunk->length; | ||||||
| @@ -1554,8 +1536,7 @@ WaveNextChunk(SDL_RWops *src, WaveChunk *chunk) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int WaveReadPartialChunkData(SDL_RWops *src, WaveChunk *chunk, size_t length) | ||||||
| WaveReadPartialChunkData(SDL_RWops *src, WaveChunk *chunk, size_t length) |  | ||||||
| { | { | ||||||
|     WaveFreeChunkData(chunk); |     WaveFreeChunkData(chunk); | ||||||
|  |  | ||||||
| @@ -1564,7 +1545,7 @@ WaveReadPartialChunkData(SDL_RWops *src, WaveChunk *chunk, size_t length) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (length > 0) { |     if (length > 0) { | ||||||
|         chunk->data = (Uint8 *) SDL_malloc(length); |         chunk->data = (Uint8 *)SDL_malloc(length); | ||||||
|         if (chunk->data == NULL) { |         if (chunk->data == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -1583,30 +1564,32 @@ WaveReadPartialChunkData(SDL_RWops *src, WaveChunk *chunk, size_t length) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int WaveReadChunkData(SDL_RWops *src, WaveChunk *chunk) | ||||||
| WaveReadChunkData(SDL_RWops *src, WaveChunk *chunk) |  | ||||||
| { | { | ||||||
|     return WaveReadPartialChunkData(src, chunk, chunk->length); |     return WaveReadPartialChunkData(src, chunk, chunk->length); | ||||||
| } | } | ||||||
|  |  | ||||||
| typedef struct WaveExtensibleGUID { | typedef struct WaveExtensibleGUID | ||||||
|  | { | ||||||
|     Uint16 encoding; |     Uint16 encoding; | ||||||
|     Uint8 guid[16]; |     Uint8 guid[16]; | ||||||
| } WaveExtensibleGUID; | } WaveExtensibleGUID; | ||||||
|  |  | ||||||
| /* Some of the GUIDs that are used by WAVEFORMATEXTENSIBLE. */ | /* Some of the GUIDs that are used by WAVEFORMATEXTENSIBLE. */ | ||||||
| #define WAVE_FORMATTAG_GUID(tag) {(tag) & 0xff, (tag) >> 8, 0, 0, 0, 0, 16, 0, 128, 0, 0, 170, 0, 56, 155, 113} | #define WAVE_FORMATTAG_GUID(tag)                                                     \ | ||||||
|  |     {                                                                                \ | ||||||
|  |         (tag) & 0xff, (tag) >> 8, 0, 0, 0, 0, 16, 0, 128, 0, 0, 170, 0, 56, 155, 113 \ | ||||||
|  |     } | ||||||
| static WaveExtensibleGUID extensible_guids[] = { | static WaveExtensibleGUID extensible_guids[] = { | ||||||
|     {PCM_CODE,        WAVE_FORMATTAG_GUID(PCM_CODE)}, |     { PCM_CODE, WAVE_FORMATTAG_GUID(PCM_CODE) }, | ||||||
|     {MS_ADPCM_CODE,   WAVE_FORMATTAG_GUID(MS_ADPCM_CODE)}, |     { MS_ADPCM_CODE, WAVE_FORMATTAG_GUID(MS_ADPCM_CODE) }, | ||||||
|     {IEEE_FLOAT_CODE, WAVE_FORMATTAG_GUID(IEEE_FLOAT_CODE)}, |     { IEEE_FLOAT_CODE, WAVE_FORMATTAG_GUID(IEEE_FLOAT_CODE) }, | ||||||
|     {ALAW_CODE,       WAVE_FORMATTAG_GUID(ALAW_CODE)}, |     { ALAW_CODE, WAVE_FORMATTAG_GUID(ALAW_CODE) }, | ||||||
|     {MULAW_CODE,      WAVE_FORMATTAG_GUID(MULAW_CODE)}, |     { MULAW_CODE, WAVE_FORMATTAG_GUID(MULAW_CODE) }, | ||||||
|     {IMA_ADPCM_CODE,  WAVE_FORMATTAG_GUID(IMA_ADPCM_CODE)} |     { IMA_ADPCM_CODE, WAVE_FORMATTAG_GUID(IMA_ADPCM_CODE) } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static Uint16 | static Uint16 WaveGetFormatGUIDEncoding(WaveFormat *format) | ||||||
| WaveGetFormatGUIDEncoding(WaveFormat *format) |  | ||||||
| { | { | ||||||
|     size_t i; |     size_t i; | ||||||
|     for (i = 0; i < SDL_arraysize(extensible_guids); i++) { |     for (i = 0; i < SDL_arraysize(extensible_guids); i++) { | ||||||
| @@ -1617,8 +1600,7 @@ WaveGetFormatGUIDEncoding(WaveFormat *format) | |||||||
|     return UNKNOWN_CODE; |     return UNKNOWN_CODE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int WaveReadFormat(WaveFile *file) | ||||||
| WaveReadFormat(WaveFile *file) |  | ||||||
| { | { | ||||||
|     WaveChunk *chunk = &file->chunk; |     WaveChunk *chunk = &file->chunk; | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
| @@ -1679,8 +1661,7 @@ WaveReadFormat(WaveFile *file) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int WaveCheckFormat(WaveFile *file, size_t datalength) | ||||||
| WaveCheckFormat(WaveFile *file, size_t datalength) |  | ||||||
| { | { | ||||||
|     WaveFormat *format = &file->format; |     WaveFormat *format = &file->format; | ||||||
|  |  | ||||||
| @@ -1787,8 +1768,7 @@ WaveCheckFormat(WaveFile *file, size_t datalength) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int WaveLoad(SDL_RWops *src, WaveFile *file, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len) | ||||||
| WaveLoad(SDL_RWops *src, WaveFile *file, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len) |  | ||||||
| { | { | ||||||
|     int result; |     int result; | ||||||
|     Uint32 chunkcount = 0; |     Uint32 chunkcount = 0; | ||||||
| @@ -2053,7 +2033,7 @@ WaveLoad(SDL_RWops *src, WaveFile *file, SDL_AudioSpec *spec, Uint8 **audio_buf, | |||||||
|     SDL_zerop(spec); |     SDL_zerop(spec); | ||||||
|     spec->freq = format->frequency; |     spec->freq = format->frequency; | ||||||
|     spec->channels = (Uint8)format->channels; |     spec->channels = (Uint8)format->channels; | ||||||
|     spec->samples = 4096;       /* Good default buffer size */ |     spec->samples = 4096; /* Good default buffer size */ | ||||||
|  |  | ||||||
|     switch (format->encoding) { |     switch (format->encoding) { | ||||||
|     case MS_ADPCM_CODE: |     case MS_ADPCM_CODE: | ||||||
| @@ -2150,8 +2130,7 @@ SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_b | |||||||
| /* Since the WAV memory is allocated in the shared library, it must also | /* Since the WAV memory is allocated in the shared library, it must also | ||||||
|    be freed here.  (Necessary under Win32, VC++) |    be freed here.  (Necessary under Win32, VC++) | ||||||
|  */ |  */ | ||||||
| void | void SDL_FreeWAV(Uint8 *audio_buf) | ||||||
| SDL_FreeWAV(Uint8 *audio_buf) |  | ||||||
| { | { | ||||||
|     SDL_free(audio_buf); |     SDL_free(audio_buf); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -26,14 +26,14 @@ | |||||||
| /* Define values for Microsoft WAVE format */ | /* Define values for Microsoft WAVE format */ | ||||||
| /*******************************************/ | /*******************************************/ | ||||||
| /* FOURCC */ | /* FOURCC */ | ||||||
| #define RIFF            0x46464952      /* "RIFF" */ | #define RIFF 0x46464952 /* "RIFF" */ | ||||||
| #define WAVE            0x45564157      /* "WAVE" */ | #define WAVE 0x45564157 /* "WAVE" */ | ||||||
| #define FACT            0x74636166      /* "fact" */ | #define FACT 0x74636166 /* "fact" */ | ||||||
| #define LIST            0x5453494c      /* "LIST" */ | #define LIST 0x5453494c /* "LIST" */ | ||||||
| #define BEXT            0x74786562      /* "bext" */ | #define BEXT 0x74786562 /* "bext" */ | ||||||
| #define JUNK            0x4B4E554A      /* "JUNK" */ | #define JUNK 0x4B4E554A /* "JUNK" */ | ||||||
| #define FMT             0x20746D66      /* "fmt " */ | #define FMT  0x20746D66 /* "fmt " */ | ||||||
| #define DATA            0x61746164      /* "data" */ | #define DATA 0x61746164 /* "data" */ | ||||||
| /* Format tags */ | /* Format tags */ | ||||||
| #define UNKNOWN_CODE    0x0000 | #define UNKNOWN_CODE    0x0000 | ||||||
| #define PCM_CODE        0x0001 | #define PCM_CODE        0x0001 | ||||||
| @@ -49,13 +49,13 @@ | |||||||
| /* Stores the WAVE format information. */ | /* Stores the WAVE format information. */ | ||||||
| typedef struct WaveFormat | typedef struct WaveFormat | ||||||
| { | { | ||||||
|     Uint16 formattag;       /* Raw value of the first field in the fmt chunk data. */ |     Uint16 formattag;     /* Raw value of the first field in the fmt chunk data. */ | ||||||
|     Uint16 encoding;        /* Actual encoding, possibly from the extensible header. */ |     Uint16 encoding;      /* Actual encoding, possibly from the extensible header. */ | ||||||
|     Uint16 channels;        /* Number of channels. */ |     Uint16 channels;      /* Number of channels. */ | ||||||
|     Uint32 frequency;       /* Sampling rate in Hz. */ |     Uint32 frequency;     /* Sampling rate in Hz. */ | ||||||
|     Uint32 byterate;        /* Average bytes per second. */ |     Uint32 byterate;      /* Average bytes per second. */ | ||||||
|     Uint16 blockalign;      /* Bytes per block. */ |     Uint16 blockalign;    /* Bytes per block. */ | ||||||
|     Uint16 bitspersample;   /* Currently supported are 8, 16, 24, 32, and 4 for ADPCM. */ |     Uint16 bitspersample; /* Currently supported are 8, 16, 24, 32, and 4 for ADPCM. */ | ||||||
|  |  | ||||||
|     /* Extra information size. Number of extra bytes starting at byte 18 in the |     /* Extra information size. Number of extra bytes starting at byte 18 in the | ||||||
|      * fmt chunk data. This is at least 22 for the extensible header. |      * fmt chunk data. This is at least 22 for the extensible header. | ||||||
| @@ -66,11 +66,12 @@ typedef struct WaveFormat | |||||||
|     Uint16 validsamplebits; |     Uint16 validsamplebits; | ||||||
|     Uint32 samplesperblock; /* For compressed formats. Can be zero. Actually 16 bits in the header. */ |     Uint32 samplesperblock; /* For compressed formats. Can be zero. Actually 16 bits in the header. */ | ||||||
|     Uint32 channelmask; |     Uint32 channelmask; | ||||||
|     Uint8 subformat[16];    /* A format GUID. */ |     Uint8 subformat[16]; /* A format GUID. */ | ||||||
| } WaveFormat; | } WaveFormat; | ||||||
|  |  | ||||||
| /* Stores information on the fact chunk. */ | /* Stores information on the fact chunk. */ | ||||||
| typedef struct WaveFact { | typedef struct WaveFact | ||||||
|  | { | ||||||
|     /* Represents the state of the fact chunk in the WAVE file. |     /* Represents the state of the fact chunk in the WAVE file. | ||||||
|      * Set to -1 if the fact chunk is invalid. |      * Set to -1 if the fact chunk is invalid. | ||||||
|      * Set to 0 if the fact chunk is not present |      * Set to 0 if the fact chunk is not present | ||||||
| @@ -101,7 +102,8 @@ typedef struct WaveChunk | |||||||
| } WaveChunk; | } WaveChunk; | ||||||
|  |  | ||||||
| /* Controls how the size of the RIFF chunk affects the loading of a WAVE file. */ | /* Controls how the size of the RIFF chunk affects the loading of a WAVE file. */ | ||||||
| typedef enum WaveRiffSizeHint { | typedef enum WaveRiffSizeHint | ||||||
|  | { | ||||||
|     RiffSizeNoHint, |     RiffSizeNoHint, | ||||||
|     RiffSizeForce, |     RiffSizeForce, | ||||||
|     RiffSizeIgnoreZero, |     RiffSizeIgnoreZero, | ||||||
| @@ -110,7 +112,8 @@ typedef enum WaveRiffSizeHint { | |||||||
| } WaveRiffSizeHint; | } WaveRiffSizeHint; | ||||||
|  |  | ||||||
| /* Controls how a truncated WAVE file is handled. */ | /* Controls how a truncated WAVE file is handled. */ | ||||||
| typedef enum WaveTruncationHint { | typedef enum WaveTruncationHint | ||||||
|  | { | ||||||
|     TruncNoHint, |     TruncNoHint, | ||||||
|     TruncVeryStrict, |     TruncVeryStrict, | ||||||
|     TruncStrict, |     TruncStrict, | ||||||
| @@ -119,7 +122,8 @@ typedef enum WaveTruncationHint { | |||||||
| } WaveTruncationHint; | } WaveTruncationHint; | ||||||
|  |  | ||||||
| /* Controls how the fact chunk affects the loading of a WAVE file. */ | /* Controls how the fact chunk affects the loading of a WAVE file. */ | ||||||
| typedef enum WaveFactChunkHint { | typedef enum WaveFactChunkHint | ||||||
|  | { | ||||||
|     FactNoHint, |     FactNoHint, | ||||||
|     FactTruncate, |     FactTruncate, | ||||||
|     FactStrict, |     FactStrict, | ||||||
| @@ -139,7 +143,7 @@ typedef struct WaveFile | |||||||
|      */ |      */ | ||||||
|     Sint64 sampleframes; |     Sint64 sampleframes; | ||||||
|  |  | ||||||
|     void *decoderdata;   /* Some decoders require extra data for a state. */ |     void *decoderdata; /* Some decoders require extra data for a state. */ | ||||||
|  |  | ||||||
|     WaveRiffSizeHint riffhint; |     WaveRiffSizeHint riffhint; | ||||||
|     WaveTruncationHint trunchint; |     WaveTruncationHint trunchint; | ||||||
|   | |||||||
| @@ -30,17 +30,17 @@ | |||||||
|  |  | ||||||
| /* Debug */ | /* Debug */ | ||||||
| #if 0 | #if 0 | ||||||
| #  define LOGI(...) SDL_Log(__VA_ARGS__); | #define LOGI(...) SDL_Log(__VA_ARGS__); | ||||||
| #else | #else | ||||||
| #  define LOGI(...) | #define LOGI(...) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| typedef struct AAUDIO_Data | typedef struct AAUDIO_Data | ||||||
| { | { | ||||||
|     AAudioStreamBuilder *builder; |     AAudioStreamBuilder *builder; | ||||||
|     void *handle; |     void *handle; | ||||||
| #define SDL_PROC(ret,func,params) ret (*func) params; | #define SDL_PROC(ret, func, params) ret(*func) params; | ||||||
| #  include "SDL_aaudiofuncs.h" | #include "SDL_aaudiofuncs.h" | ||||||
| #undef SDL_PROC | #undef SDL_PROC | ||||||
| } AAUDIO_Data; | } AAUDIO_Data; | ||||||
| static AAUDIO_Data ctx; | static AAUDIO_Data ctx; | ||||||
| @@ -50,28 +50,27 @@ static SDL_AudioDevice *captureDevice = NULL; | |||||||
|  |  | ||||||
| static int aaudio_LoadFunctions(AAUDIO_Data *data) | static int aaudio_LoadFunctions(AAUDIO_Data *data) | ||||||
| { | { | ||||||
| #define SDL_PROC(ret,func,params)                                                                   \ | #define SDL_PROC(ret, func, params)                                                             \ | ||||||
|     do {                                                                                            \ |     do {                                                                                        \ | ||||||
|         data->func = SDL_LoadFunction(data->handle, #func);                                         \ |         data->func = SDL_LoadFunction(data->handle, #func);                                     \ | ||||||
|         if (! data->func) {                                                                         \ |         if (!data->func) {                                                                      \ | ||||||
|             return SDL_SetError("Couldn't load AAUDIO function %s: %s", #func, SDL_GetError());     \ |             return SDL_SetError("Couldn't load AAUDIO function %s: %s", #func, SDL_GetError()); \ | ||||||
|         }                                                                                           \ |         }                                                                                       \ | ||||||
|     } while (0); |     } while (0); | ||||||
| #include "SDL_aaudiofuncs.h" | #include "SDL_aaudiofuncs.h" | ||||||
| #undef SDL_PROC | #undef SDL_PROC | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void aaudio_errorCallback( AAudioStream *stream, void *userData, aaudio_result_t error ); | void aaudio_errorCallback(AAudioStream *stream, void *userData, aaudio_result_t error); | ||||||
| void aaudio_errorCallback( AAudioStream *stream, void *userData, aaudio_result_t error ) | void aaudio_errorCallback(AAudioStream *stream, void *userData, aaudio_result_t error) | ||||||
| { | { | ||||||
|     LOGI( "SDL aaudio_errorCallback: %d - %s", error, ctx.AAudio_convertResultToText( error ) ); |     LOGI("SDL aaudio_errorCallback: %d - %s", error, ctx.AAudio_convertResultToText(error)); | ||||||
| } | } | ||||||
|  |  | ||||||
| #define LIB_AAUDIO_SO "libaaudio.so" | #define LIB_AAUDIO_SO "libaaudio.so" | ||||||
|  |  | ||||||
| static int | static int aaudio_OpenDevice(_THIS, const char *devname) | ||||||
| aaudio_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *private; |     struct SDL_PrivateAudioData *private; | ||||||
|     SDL_bool iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
| @@ -94,7 +93,7 @@ aaudio_OpenDevice(_THIS, const char *devname) | |||||||
|         audioDevice = this; |         audioDevice = this; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->hidden = (struct SDL_PrivateAudioData *) SDL_calloc(1, (sizeof *this->hidden)); |     this->hidden = (struct SDL_PrivateAudioData *)SDL_calloc(1, (sizeof *this->hidden)); | ||||||
|     if (this->hidden == NULL) { |     if (this->hidden == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -116,11 +115,11 @@ aaudio_OpenDevice(_THIS, const char *devname) | |||||||
|         ctx.AAudioStreamBuilder_setFormat(ctx.builder, format); |         ctx.AAudioStreamBuilder_setFormat(ctx.builder, format); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ctx.AAudioStreamBuilder_setErrorCallback( ctx.builder, aaudio_errorCallback, private ); |     ctx.AAudioStreamBuilder_setErrorCallback(ctx.builder, aaudio_errorCallback, private); | ||||||
|  |  | ||||||
|     LOGI("AAudio Try to open %u hz %u bit chan %u %s samples %u", |     LOGI("AAudio Try to open %u hz %u bit chan %u %s samples %u", | ||||||
|           this->spec.freq, SDL_AUDIO_BITSIZE(this->spec.format), |          this->spec.freq, SDL_AUDIO_BITSIZE(this->spec.format), | ||||||
|           this->spec.channels, (this->spec.format & 0x1000) ? "BE" : "LE", this->spec.samples); |          this->spec.channels, (this->spec.format & 0x1000) ? "BE" : "LE", this->spec.samples); | ||||||
|  |  | ||||||
|     res = ctx.AAudioStreamBuilder_openStream(ctx.builder, &private->stream); |     res = ctx.AAudioStreamBuilder_openStream(ctx.builder, &private->stream); | ||||||
|     if (res != AAUDIO_OK) { |     if (res != AAUDIO_OK) { | ||||||
| @@ -140,15 +139,15 @@ aaudio_OpenDevice(_THIS, const char *devname) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     LOGI("AAudio Try to open %u hz %u bit chan %u %s samples %u", |     LOGI("AAudio Try to open %u hz %u bit chan %u %s samples %u", | ||||||
|           this->spec.freq, SDL_AUDIO_BITSIZE(this->spec.format), |          this->spec.freq, SDL_AUDIO_BITSIZE(this->spec.format), | ||||||
|           this->spec.channels, (this->spec.format & 0x1000) ? "BE" : "LE", this->spec.samples); |          this->spec.channels, (this->spec.format & 0x1000) ? "BE" : "LE", this->spec.samples); | ||||||
|  |  | ||||||
|     SDL_CalculateAudioSpec(&this->spec); |     SDL_CalculateAudioSpec(&this->spec); | ||||||
|  |  | ||||||
|     /* Allocate mixing buffer */ |     /* Allocate mixing buffer */ | ||||||
|     if (!iscapture) { |     if (!iscapture) { | ||||||
|         private->mixlen = this->spec.size; |         private->mixlen = this->spec.size; | ||||||
|         private->mixbuf = (Uint8 *) SDL_malloc(private->mixlen); |         private->mixbuf = (Uint8 *)SDL_malloc(private->mixlen); | ||||||
|         if (private->mixbuf == NULL) { |         if (private->mixbuf == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -167,8 +166,7 @@ aaudio_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void aaudio_CloseDevice(_THIS) | ||||||
| aaudio_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *private = this->hidden; |     struct SDL_PrivateAudioData *private = this->hidden; | ||||||
|     aaudio_result_t res; |     aaudio_result_t res; | ||||||
| @@ -202,20 +200,18 @@ aaudio_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *aaudio_GetDeviceBuf(_THIS) | ||||||
| aaudio_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *private = this->hidden; |     struct SDL_PrivateAudioData *private = this->hidden; | ||||||
|     return private->mixbuf; |     return private->mixbuf; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void aaudio_PlayDevice(_THIS) | ||||||
| aaudio_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *private = this->hidden; |     struct SDL_PrivateAudioData *private = this->hidden; | ||||||
|     aaudio_result_t res; |     aaudio_result_t res; | ||||||
|     int64_t timeoutNanoseconds = 1 * 1000 * 1000; /* 8 ms */ |     int64_t timeoutNanoseconds = 1 * 1000 * 1000; /* 8 ms */ | ||||||
|     res = ctx.AAudioStream_write(private->stream,  private->mixbuf, private->mixlen / private->frame_size, timeoutNanoseconds); |     res = ctx.AAudioStream_write(private->stream, private->mixbuf, private->mixlen / private->frame_size, timeoutNanoseconds); | ||||||
|     if (res < 0) { |     if (res < 0) { | ||||||
|         LOGI("%s : %s", __func__, ctx.AAudio_convertResultToText(res)); |         LOGI("%s : %s", __func__, ctx.AAudio_convertResultToText(res)); | ||||||
|     } else { |     } else { | ||||||
| @@ -235,13 +231,12 @@ aaudio_PlayDevice(_THIS) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int aaudio_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| aaudio_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *private = this->hidden; |     struct SDL_PrivateAudioData *private = this->hidden; | ||||||
|     aaudio_result_t res; |     aaudio_result_t res; | ||||||
|     int64_t timeoutNanoseconds = 8 * 1000 * 1000; /* 8 ms */ |     int64_t timeoutNanoseconds = 8 * 1000 * 1000; /* 8 ms */ | ||||||
|     res = ctx.AAudioStream_read(private->stream,  buffer, buflen / private->frame_size, timeoutNanoseconds); |     res = ctx.AAudioStream_read(private->stream, buffer, buflen / private->frame_size, timeoutNanoseconds); | ||||||
|     if (res < 0) { |     if (res < 0) { | ||||||
|         LOGI("%s : %s", __func__, ctx.AAudio_convertResultToText(res)); |         LOGI("%s : %s", __func__, ctx.AAudio_convertResultToText(res)); | ||||||
|         return -1; |         return -1; | ||||||
| @@ -250,8 +245,7 @@ aaudio_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     return res * private->frame_size; |     return res * private->frame_size; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void aaudio_Deinitialize(void) | ||||||
| aaudio_Deinitialize(void) |  | ||||||
| { | { | ||||||
|     LOGI(__func__); |     LOGI(__func__); | ||||||
|     if (ctx.handle) { |     if (ctx.handle) { | ||||||
| @@ -269,8 +263,7 @@ aaudio_Deinitialize(void) | |||||||
|     LOGI("End AAUDIO %s", SDL_GetError()); |     LOGI("End AAUDIO %s", SDL_GetError()); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool aaudio_Init(SDL_AudioDriverImpl *impl) | ||||||
| aaudio_Init(SDL_AudioDriverImpl *impl) |  | ||||||
| { | { | ||||||
|     aaudio_result_t res; |     aaudio_result_t res; | ||||||
|     LOGI(__func__); |     LOGI(__func__); | ||||||
| @@ -345,7 +338,7 @@ void aaudio_PauseDevices(void) | |||||||
|     /* TODO: Handle multiple devices? */ |     /* TODO: Handle multiple devices? */ | ||||||
|     struct SDL_PrivateAudioData *private; |     struct SDL_PrivateAudioData *private; | ||||||
|     if (audioDevice != NULL && audioDevice->hidden != NULL) { |     if (audioDevice != NULL && audioDevice->hidden != NULL) { | ||||||
|         private = (struct SDL_PrivateAudioData *) audioDevice->hidden; |         private = (struct SDL_PrivateAudioData *)audioDevice->hidden; | ||||||
|  |  | ||||||
|         if (private->stream) { |         if (private->stream) { | ||||||
|             aaudio_result_t res = ctx.AAudioStream_requestPause(private->stream); |             aaudio_result_t res = ctx.AAudioStream_requestPause(private->stream); | ||||||
| @@ -366,7 +359,7 @@ void aaudio_PauseDevices(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (captureDevice != NULL && captureDevice->hidden != NULL) { |     if (captureDevice != NULL && captureDevice->hidden != NULL) { | ||||||
|         private = (struct SDL_PrivateAudioData *) captureDevice->hidden; |         private = (struct SDL_PrivateAudioData *)captureDevice->hidden; | ||||||
|  |  | ||||||
|         if (private->stream) { |         if (private->stream) { | ||||||
|             /* Pause() isn't implemented for 'capture', use Stop() */ |             /* Pause() isn't implemented for 'capture', use Stop() */ | ||||||
| @@ -394,7 +387,7 @@ void aaudio_ResumeDevices(void) | |||||||
|     /* TODO: Handle multiple devices? */ |     /* TODO: Handle multiple devices? */ | ||||||
|     struct SDL_PrivateAudioData *private; |     struct SDL_PrivateAudioData *private; | ||||||
|     if (audioDevice != NULL && audioDevice->hidden != NULL) { |     if (audioDevice != NULL && audioDevice->hidden != NULL) { | ||||||
|         private = (struct SDL_PrivateAudioData *) audioDevice->hidden; |         private = (struct SDL_PrivateAudioData *)audioDevice->hidden; | ||||||
|  |  | ||||||
|         if (private->resume) { |         if (private->resume) { | ||||||
|             SDL_AtomicSet(&audioDevice->paused, 0); |             SDL_AtomicSet(&audioDevice->paused, 0); | ||||||
| @@ -412,7 +405,7 @@ void aaudio_ResumeDevices(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (captureDevice != NULL && captureDevice->hidden != NULL) { |     if (captureDevice != NULL && captureDevice->hidden != NULL) { | ||||||
|         private = (struct SDL_PrivateAudioData *) captureDevice->hidden; |         private = (struct SDL_PrivateAudioData *)captureDevice->hidden; | ||||||
|  |  | ||||||
|         if (private->resume) { |         if (private->resume) { | ||||||
|             SDL_AtomicSet(&captureDevice->paused, 0); |             SDL_AtomicSet(&captureDevice->paused, 0); | ||||||
| @@ -435,24 +428,24 @@ void aaudio_ResumeDevices(void) | |||||||
|  None of the standard state queries indicate any problem in my testing. And the error callback doesn't actually get called. |  None of the standard state queries indicate any problem in my testing. And the error callback doesn't actually get called. | ||||||
|  But, AAudioStream_getTimestamp() does return AAUDIO_ERROR_INVALID_STATE |  But, AAudioStream_getTimestamp() does return AAUDIO_ERROR_INVALID_STATE | ||||||
| */ | */ | ||||||
| SDL_bool aaudio_DetectBrokenPlayState( void ) | SDL_bool aaudio_DetectBrokenPlayState(void) | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *private; |     struct SDL_PrivateAudioData *private; | ||||||
|     int64_t framePosition, timeNanoseconds; |     int64_t framePosition, timeNanoseconds; | ||||||
|     aaudio_result_t res; |     aaudio_result_t res; | ||||||
|  |  | ||||||
|     if (audioDevice == NULL || !audioDevice->hidden ) { |     if (audioDevice == NULL || !audioDevice->hidden) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private = audioDevice->hidden; |     private = audioDevice->hidden; | ||||||
|  |  | ||||||
|     res = ctx.AAudioStream_getTimestamp( private->stream, CLOCK_MONOTONIC, &framePosition, &timeNanoseconds ); |     res = ctx.AAudioStream_getTimestamp(private->stream, CLOCK_MONOTONIC, &framePosition, &timeNanoseconds); | ||||||
|     if ( res == AAUDIO_ERROR_INVALID_STATE ) { |     if (res == AAUDIO_ERROR_INVALID_STATE) { | ||||||
|         aaudio_stream_state_t currentState = ctx.AAudioStream_getState( private->stream ); |         aaudio_stream_state_t currentState = ctx.AAudioStream_getState(private->stream); | ||||||
|         /* AAudioStream_getTimestamp() will also return AAUDIO_ERROR_INVALID_STATE while the stream is still initially starting. But we only care if it silently went invalid while playing. */ |         /* AAudioStream_getTimestamp() will also return AAUDIO_ERROR_INVALID_STATE while the stream is still initially starting. But we only care if it silently went invalid while playing. */ | ||||||
|         if ( currentState == AAUDIO_STREAM_STATE_STARTED ) { |         if (currentState == AAUDIO_STREAM_STATE_STARTED) { | ||||||
|             LOGI( "SDL aaudio_DetectBrokenPlayState: detected invalid audio device state: AAudioStream_getTimestamp result=%d, framePosition=%lld, timeNanoseconds=%lld, getState=%d", (int)res, (long long)framePosition, (long long)timeNanoseconds, (int)currentState ); |             LOGI("SDL aaudio_DetectBrokenPlayState: detected invalid audio device state: AAudioStream_getTimestamp result=%d, framePosition=%lld, timeNanoseconds=%lld, getState=%d", (int)res, (long long)framePosition, (long long)timeNanoseconds, (int)currentState); | ||||||
|             return SDL_TRUE; |             return SDL_TRUE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ | |||||||
| #include <aaudio/AAudio.h> | #include <aaudio/AAudio.h> | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
| @@ -47,7 +47,6 @@ void aaudio_ResumeDevices(void); | |||||||
| void aaudio_PauseDevices(void); | void aaudio_PauseDevices(void); | ||||||
| SDL_bool aaudio_DetectBrokenPlayState(void); | SDL_bool aaudio_DetectBrokenPlayState(void); | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* _SDL_aaudio_h */ | #endif /* _SDL_aaudio_h */ | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|   | |||||||
| @@ -19,62 +19,61 @@ | |||||||
|   3. This notice may not be removed or altered from any source distribution. |   3. This notice may not be removed or altered from any source distribution. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| #define SDL_PROC_UNUSED(ret,func,params) | #define SDL_PROC_UNUSED(ret, func, params) | ||||||
|  |  | ||||||
| SDL_PROC(const char *, AAudio_convertResultToText, (aaudio_result_t returnCode)) | SDL_PROC(const char *, AAudio_convertResultToText, (aaudio_result_t returnCode)) | ||||||
| SDL_PROC(const char *, AAudio_convertStreamStateToText, (aaudio_stream_state_t state)) | SDL_PROC(const char *, AAudio_convertStreamStateToText, (aaudio_stream_state_t state)) | ||||||
| SDL_PROC(aaudio_result_t, AAudio_createStreamBuilder, (AAudioStreamBuilder** builder)) | SDL_PROC(aaudio_result_t, AAudio_createStreamBuilder, (AAudioStreamBuilder * *builder)) | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setDeviceId, (AAudioStreamBuilder* builder, int32_t deviceId)) | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setDeviceId, (AAudioStreamBuilder * builder, int32_t deviceId)) | ||||||
| SDL_PROC(void, AAudioStreamBuilder_setSampleRate, (AAudioStreamBuilder* builder, int32_t sampleRate)) | SDL_PROC(void, AAudioStreamBuilder_setSampleRate, (AAudioStreamBuilder * builder, int32_t sampleRate)) | ||||||
| SDL_PROC(void, AAudioStreamBuilder_setChannelCount, (AAudioStreamBuilder* builder, int32_t channelCount)) | SDL_PROC(void, AAudioStreamBuilder_setChannelCount, (AAudioStreamBuilder * builder, int32_t channelCount)) | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setSamplesPerFrame, (AAudioStreamBuilder* builder, int32_t samplesPerFrame)) | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setSamplesPerFrame, (AAudioStreamBuilder * builder, int32_t samplesPerFrame)) | ||||||
| SDL_PROC(void, AAudioStreamBuilder_setFormat, (AAudioStreamBuilder* builder, aaudio_format_t format)) | SDL_PROC(void, AAudioStreamBuilder_setFormat, (AAudioStreamBuilder * builder, aaudio_format_t format)) | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setSharingMode, (AAudioStreamBuilder* builder, aaudio_sharing_mode_t sharingMode)) | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setSharingMode, (AAudioStreamBuilder * builder, aaudio_sharing_mode_t sharingMode)) | ||||||
| SDL_PROC(void, AAudioStreamBuilder_setDirection, (AAudioStreamBuilder* builder, aaudio_direction_t direction)) | SDL_PROC(void, AAudioStreamBuilder_setDirection, (AAudioStreamBuilder * builder, aaudio_direction_t direction)) | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setBufferCapacityInFrames, (AAudioStreamBuilder* builder, int32_t numFrames)) | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setBufferCapacityInFrames, (AAudioStreamBuilder * builder, int32_t numFrames)) | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setPerformanceMode, (AAudioStreamBuilder* builder, aaudio_performance_mode_t mode)) | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setPerformanceMode, (AAudioStreamBuilder * builder, aaudio_performance_mode_t mode)) | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setUsage, (AAudioStreamBuilder* builder, aaudio_usage_t usage)) /* API 28 */ | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setUsage, (AAudioStreamBuilder * builder, aaudio_usage_t usage))                                         /* API 28 */ | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setContentType, (AAudioStreamBuilder* builder, aaudio_content_type_t contentType)) /* API 28 */ | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setContentType, (AAudioStreamBuilder * builder, aaudio_content_type_t contentType))                      /* API 28 */ | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setInputPreset, (AAudioStreamBuilder* builder, aaudio_input_preset_t inputPreset)) /* API 28 */ | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setInputPreset, (AAudioStreamBuilder * builder, aaudio_input_preset_t inputPreset))                      /* API 28 */ | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setAllowedCapturePolicy, (AAudioStreamBuilder* builder, aaudio_allowed_capture_policy_t capturePolicy)) /* API 29 */ | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setAllowedCapturePolicy, (AAudioStreamBuilder * builder, aaudio_allowed_capture_policy_t capturePolicy)) /* API 29 */ | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setSessionId, (AAudioStreamBuilder* builder, aaudio_session_id_t sessionId)) /* API 28 */ | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setSessionId, (AAudioStreamBuilder * builder, aaudio_session_id_t sessionId))                            /* API 28 */ | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setPrivacySensitive, (AAudioStreamBuilder* builder, bool privacySensitive)) /* API 30 */ | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setPrivacySensitive, (AAudioStreamBuilder * builder, bool privacySensitive))                             /* API 30 */ | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setDataCallback, (AAudioStreamBuilder* builder, AAudioStream_dataCallback callback, void *userData)) | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setDataCallback, (AAudioStreamBuilder * builder, AAudioStream_dataCallback callback, void *userData)) | ||||||
| SDL_PROC_UNUSED(void, AAudioStreamBuilder_setFramesPerDataCallback, (AAudioStreamBuilder* builder, int32_t numFrames)) | SDL_PROC_UNUSED(void, AAudioStreamBuilder_setFramesPerDataCallback, (AAudioStreamBuilder * builder, int32_t numFrames)) | ||||||
| SDL_PROC(void, AAudioStreamBuilder_setErrorCallback, (AAudioStreamBuilder* builder, AAudioStream_errorCallback callback, void *userData)) | SDL_PROC(void, AAudioStreamBuilder_setErrorCallback, (AAudioStreamBuilder * builder, AAudioStream_errorCallback callback, void *userData)) | ||||||
| SDL_PROC(aaudio_result_t , AAudioStreamBuilder_openStream, (AAudioStreamBuilder* builder, AAudioStream** stream)) | SDL_PROC(aaudio_result_t, AAudioStreamBuilder_openStream, (AAudioStreamBuilder * builder, AAudioStream **stream)) | ||||||
| SDL_PROC(aaudio_result_t , AAudioStreamBuilder_delete, (AAudioStreamBuilder* builder)) | SDL_PROC(aaudio_result_t, AAudioStreamBuilder_delete, (AAudioStreamBuilder * builder)) | ||||||
| SDL_PROC_UNUSED(aaudio_result_t , AAudioStream_release, (AAudioStream* stream)) /* API 30 */ | SDL_PROC_UNUSED(aaudio_result_t, AAudioStream_release, (AAudioStream * stream)) /* API 30 */ | ||||||
| SDL_PROC(aaudio_result_t , AAudioStream_close, (AAudioStream* stream)) | SDL_PROC(aaudio_result_t, AAudioStream_close, (AAudioStream * stream)) | ||||||
| SDL_PROC(aaudio_result_t , AAudioStream_requestStart, (AAudioStream* stream)) | SDL_PROC(aaudio_result_t, AAudioStream_requestStart, (AAudioStream * stream)) | ||||||
| SDL_PROC(aaudio_result_t , AAudioStream_requestPause, (AAudioStream* stream)) | SDL_PROC(aaudio_result_t, AAudioStream_requestPause, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(aaudio_result_t , AAudioStream_requestFlush, (AAudioStream* stream)) | SDL_PROC_UNUSED(aaudio_result_t, AAudioStream_requestFlush, (AAudioStream * stream)) | ||||||
| SDL_PROC(aaudio_result_t , AAudioStream_requestStop, (AAudioStream* stream)) | SDL_PROC(aaudio_result_t, AAudioStream_requestStop, (AAudioStream * stream)) | ||||||
| SDL_PROC(aaudio_stream_state_t, AAudioStream_getState, (AAudioStream* stream)) | SDL_PROC(aaudio_stream_state_t, AAudioStream_getState, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(aaudio_result_t, AAudioStream_waitForStateChange, (AAudioStream* stream, aaudio_stream_state_t inputState, aaudio_stream_state_t *nextState, int64_t timeoutNanoseconds)) | SDL_PROC_UNUSED(aaudio_result_t, AAudioStream_waitForStateChange, (AAudioStream * stream, aaudio_stream_state_t inputState, aaudio_stream_state_t *nextState, int64_t timeoutNanoseconds)) | ||||||
| SDL_PROC(aaudio_result_t, AAudioStream_read, (AAudioStream* stream, void *buffer, int32_t numFrames, int64_t timeoutNanoseconds)) | SDL_PROC(aaudio_result_t, AAudioStream_read, (AAudioStream * stream, void *buffer, int32_t numFrames, int64_t timeoutNanoseconds)) | ||||||
| SDL_PROC(aaudio_result_t, AAudioStream_write, (AAudioStream* stream, const void *buffer, int32_t numFrames, int64_t timeoutNanoseconds)) | SDL_PROC(aaudio_result_t, AAudioStream_write, (AAudioStream * stream, const void *buffer, int32_t numFrames, int64_t timeoutNanoseconds)) | ||||||
| SDL_PROC_UNUSED(aaudio_result_t, AAudioStream_setBufferSizeInFrames, (AAudioStream* stream, int32_t numFrames)) | SDL_PROC_UNUSED(aaudio_result_t, AAudioStream_setBufferSizeInFrames, (AAudioStream * stream, int32_t numFrames)) | ||||||
| SDL_PROC_UNUSED(int32_t, AAudioStream_getBufferSizeInFrames, (AAudioStream* stream)) | SDL_PROC_UNUSED(int32_t, AAudioStream_getBufferSizeInFrames, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(int32_t, AAudioStream_getFramesPerBurst, (AAudioStream* stream)) | SDL_PROC_UNUSED(int32_t, AAudioStream_getFramesPerBurst, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(int32_t, AAudioStream_getBufferCapacityInFrames, (AAudioStream* stream)) | SDL_PROC_UNUSED(int32_t, AAudioStream_getBufferCapacityInFrames, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(int32_t, AAudioStream_getFramesPerDataCallback, (AAudioStream* stream)) | SDL_PROC_UNUSED(int32_t, AAudioStream_getFramesPerDataCallback, (AAudioStream * stream)) | ||||||
| SDL_PROC(int32_t, AAudioStream_getXRunCount, (AAudioStream* stream)) | SDL_PROC(int32_t, AAudioStream_getXRunCount, (AAudioStream * stream)) | ||||||
| SDL_PROC(int32_t, AAudioStream_getSampleRate, (AAudioStream* stream)) | SDL_PROC(int32_t, AAudioStream_getSampleRate, (AAudioStream * stream)) | ||||||
| SDL_PROC(int32_t, AAudioStream_getChannelCount, (AAudioStream* stream)) | SDL_PROC(int32_t, AAudioStream_getChannelCount, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(int32_t, AAudioStream_getSamplesPerFrame, (AAudioStream* stream)) | SDL_PROC_UNUSED(int32_t, AAudioStream_getSamplesPerFrame, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(int32_t, AAudioStream_getDeviceId, (AAudioStream* stream)) | SDL_PROC_UNUSED(int32_t, AAudioStream_getDeviceId, (AAudioStream * stream)) | ||||||
| SDL_PROC(aaudio_format_t, AAudioStream_getFormat, (AAudioStream* stream)) | SDL_PROC(aaudio_format_t, AAudioStream_getFormat, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(aaudio_sharing_mode_t, AAudioStream_getSharingMode, (AAudioStream* stream)) | SDL_PROC_UNUSED(aaudio_sharing_mode_t, AAudioStream_getSharingMode, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(aaudio_performance_mode_t, AAudioStream_getPerformanceMode, (AAudioStream* stream)) | SDL_PROC_UNUSED(aaudio_performance_mode_t, AAudioStream_getPerformanceMode, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(aaudio_direction_t, AAudioStream_getDirection, (AAudioStream* stream)) | SDL_PROC_UNUSED(aaudio_direction_t, AAudioStream_getDirection, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(int64_t, AAudioStream_getFramesWritten, (AAudioStream* stream)) | SDL_PROC_UNUSED(int64_t, AAudioStream_getFramesWritten, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(int64_t, AAudioStream_getFramesRead, (AAudioStream* stream)) | SDL_PROC_UNUSED(int64_t, AAudioStream_getFramesRead, (AAudioStream * stream)) | ||||||
| SDL_PROC_UNUSED(aaudio_session_id_t, AAudioStream_getSessionId, (AAudioStream* stream)) /* API 28 */ | SDL_PROC_UNUSED(aaudio_session_id_t, AAudioStream_getSessionId, (AAudioStream * stream)) /* API 28 */ | ||||||
| SDL_PROC(aaudio_result_t, AAudioStream_getTimestamp, (AAudioStream* stream, clockid_t clockid, int64_t *framePosition, int64_t *timeNanoseconds)) | SDL_PROC(aaudio_result_t, AAudioStream_getTimestamp, (AAudioStream * stream, clockid_t clockid, int64_t *framePosition, int64_t *timeNanoseconds)) | ||||||
| SDL_PROC_UNUSED(aaudio_usage_t, AAudioStream_getUsage, (AAudioStream* stream)) /* API 28 */ | SDL_PROC_UNUSED(aaudio_usage_t, AAudioStream_getUsage, (AAudioStream * stream))                                 /* API 28 */ | ||||||
| SDL_PROC_UNUSED(aaudio_content_type_t, AAudioStream_getContentType, (AAudioStream* stream)) /* API 28 */ | SDL_PROC_UNUSED(aaudio_content_type_t, AAudioStream_getContentType, (AAudioStream * stream))                    /* API 28 */ | ||||||
| SDL_PROC_UNUSED(aaudio_input_preset_t, AAudioStream_getInputPreset, (AAudioStream* stream)) /* API 28 */ | SDL_PROC_UNUSED(aaudio_input_preset_t, AAudioStream_getInputPreset, (AAudioStream * stream))                    /* API 28 */ | ||||||
| SDL_PROC_UNUSED(aaudio_allowed_capture_policy_t, AAudioStream_getAllowedCapturePolicy, ( AAudioStream* stream)) /* API 29 */ | SDL_PROC_UNUSED(aaudio_allowed_capture_policy_t, AAudioStream_getAllowedCapturePolicy, (AAudioStream * stream)) /* API 29 */ | ||||||
| SDL_PROC_UNUSED(bool, AAudioStream_isPrivacySensitive, (AAudioStream* stream)) /* API 30 */ | SDL_PROC_UNUSED(bool, AAudioStream_isPrivacySensitive, (AAudioStream * stream))                                 /* API 30 */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ | |||||||
| /* Allow access to a raw mixing buffer */ | /* Allow access to a raw mixing buffer */ | ||||||
|  |  | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <signal.h>             /* For kill() */ | #include <signal.h> /* For kill() */ | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
| #include "SDL_timer.h" | #include "SDL_timer.h" | ||||||
| @@ -46,64 +46,46 @@ | |||||||
| #include "SDL_loadso.h" | #include "SDL_loadso.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static int (*ALSA_snd_pcm_open) | static int (*ALSA_snd_pcm_open)(snd_pcm_t **, const char *, snd_pcm_stream_t, int); | ||||||
|   (snd_pcm_t **, const char *, snd_pcm_stream_t, int); | static int (*ALSA_snd_pcm_close)(snd_pcm_t *pcm); | ||||||
| static int (*ALSA_snd_pcm_close) (snd_pcm_t * pcm); | static snd_pcm_sframes_t (*ALSA_snd_pcm_writei)(snd_pcm_t *, const void *, snd_pcm_uframes_t); | ||||||
| static snd_pcm_sframes_t (*ALSA_snd_pcm_writei) | static snd_pcm_sframes_t (*ALSA_snd_pcm_readi)(snd_pcm_t *, void *, snd_pcm_uframes_t); | ||||||
|   (snd_pcm_t *, const void *, snd_pcm_uframes_t); | static int (*ALSA_snd_pcm_recover)(snd_pcm_t *, int, int); | ||||||
| static snd_pcm_sframes_t (*ALSA_snd_pcm_readi) | static int (*ALSA_snd_pcm_prepare)(snd_pcm_t *); | ||||||
|   (snd_pcm_t *, void *, snd_pcm_uframes_t); | static int (*ALSA_snd_pcm_drain)(snd_pcm_t *); | ||||||
| static int (*ALSA_snd_pcm_recover) (snd_pcm_t *, int, int); | static const char *(*ALSA_snd_strerror)(int); | ||||||
| static int (*ALSA_snd_pcm_prepare) (snd_pcm_t *); | static size_t (*ALSA_snd_pcm_hw_params_sizeof)(void); | ||||||
| static int (*ALSA_snd_pcm_drain) (snd_pcm_t *); | static size_t (*ALSA_snd_pcm_sw_params_sizeof)(void); | ||||||
| static const char *(*ALSA_snd_strerror) (int); | static void (*ALSA_snd_pcm_hw_params_copy)(snd_pcm_hw_params_t *, const snd_pcm_hw_params_t *); | ||||||
| static size_t(*ALSA_snd_pcm_hw_params_sizeof) (void); | static int (*ALSA_snd_pcm_hw_params_any)(snd_pcm_t *, snd_pcm_hw_params_t *); | ||||||
| static size_t(*ALSA_snd_pcm_sw_params_sizeof) (void); | static int (*ALSA_snd_pcm_hw_params_set_access)(snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_access_t); | ||||||
| static void (*ALSA_snd_pcm_hw_params_copy) | static int (*ALSA_snd_pcm_hw_params_set_format)(snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_format_t); | ||||||
|   (snd_pcm_hw_params_t *, const snd_pcm_hw_params_t *); | static int (*ALSA_snd_pcm_hw_params_set_channels)(snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int); | ||||||
| static int (*ALSA_snd_pcm_hw_params_any) (snd_pcm_t *, snd_pcm_hw_params_t *); | static int (*ALSA_snd_pcm_hw_params_get_channels)(const snd_pcm_hw_params_t *, unsigned int *); | ||||||
| static int (*ALSA_snd_pcm_hw_params_set_access) | static int (*ALSA_snd_pcm_hw_params_set_rate_near)(snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int *, int *); | ||||||
|   (snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_access_t); | static int (*ALSA_snd_pcm_hw_params_set_period_size_near)(snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_uframes_t *, int *); | ||||||
| static int (*ALSA_snd_pcm_hw_params_set_format) | static int (*ALSA_snd_pcm_hw_params_get_period_size)(const snd_pcm_hw_params_t *, snd_pcm_uframes_t *, int *); | ||||||
|   (snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_format_t); | static int (*ALSA_snd_pcm_hw_params_set_periods_min)(snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int *, int *); | ||||||
| static int (*ALSA_snd_pcm_hw_params_set_channels) | static int (*ALSA_snd_pcm_hw_params_set_periods_first)(snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int *, int *); | ||||||
|   (snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int); | static int (*ALSA_snd_pcm_hw_params_get_periods)(const snd_pcm_hw_params_t *, unsigned int *, int *); | ||||||
| static int (*ALSA_snd_pcm_hw_params_get_channels) | static int (*ALSA_snd_pcm_hw_params_set_buffer_size_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *, snd_pcm_uframes_t *); | ||||||
|   (const snd_pcm_hw_params_t *, unsigned int *); | static int (*ALSA_snd_pcm_hw_params_get_buffer_size)(const snd_pcm_hw_params_t *, snd_pcm_uframes_t *); | ||||||
| static int (*ALSA_snd_pcm_hw_params_set_rate_near) | static int (*ALSA_snd_pcm_hw_params)(snd_pcm_t *, snd_pcm_hw_params_t *); | ||||||
|   (snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int *, int *); | static int (*ALSA_snd_pcm_sw_params_current)(snd_pcm_t *, | ||||||
| static int (*ALSA_snd_pcm_hw_params_set_period_size_near) |                                              snd_pcm_sw_params_t *); | ||||||
|   (snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_uframes_t *, int *); | static int (*ALSA_snd_pcm_sw_params_set_start_threshold)(snd_pcm_t *, snd_pcm_sw_params_t *, snd_pcm_uframes_t); | ||||||
| static int (*ALSA_snd_pcm_hw_params_get_period_size) | static int (*ALSA_snd_pcm_sw_params)(snd_pcm_t *, snd_pcm_sw_params_t *); | ||||||
|   (const snd_pcm_hw_params_t *, snd_pcm_uframes_t *, int *); | static int (*ALSA_snd_pcm_nonblock)(snd_pcm_t *, int); | ||||||
| static int (*ALSA_snd_pcm_hw_params_set_periods_min) |  | ||||||
|   (snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int *, int *); |  | ||||||
| static int (*ALSA_snd_pcm_hw_params_set_periods_first) |  | ||||||
|   (snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int *, int *); |  | ||||||
| static int (*ALSA_snd_pcm_hw_params_get_periods) |  | ||||||
|   (const snd_pcm_hw_params_t *, unsigned int *, int *); |  | ||||||
| static int (*ALSA_snd_pcm_hw_params_set_buffer_size_near) |  | ||||||
|   (snd_pcm_t *pcm, snd_pcm_hw_params_t *, snd_pcm_uframes_t *); |  | ||||||
| static int (*ALSA_snd_pcm_hw_params_get_buffer_size) |  | ||||||
|   (const snd_pcm_hw_params_t *, snd_pcm_uframes_t *); |  | ||||||
| static int (*ALSA_snd_pcm_hw_params) (snd_pcm_t *, snd_pcm_hw_params_t *); |  | ||||||
| static int (*ALSA_snd_pcm_sw_params_current) (snd_pcm_t *, |  | ||||||
|                                               snd_pcm_sw_params_t *); |  | ||||||
| static int (*ALSA_snd_pcm_sw_params_set_start_threshold) |  | ||||||
|   (snd_pcm_t *, snd_pcm_sw_params_t *, snd_pcm_uframes_t); |  | ||||||
| static int (*ALSA_snd_pcm_sw_params) (snd_pcm_t *, snd_pcm_sw_params_t *); |  | ||||||
| static int (*ALSA_snd_pcm_nonblock) (snd_pcm_t *, int); |  | ||||||
| static int (*ALSA_snd_pcm_wait)(snd_pcm_t *, int); | static int (*ALSA_snd_pcm_wait)(snd_pcm_t *, int); | ||||||
| static int (*ALSA_snd_pcm_sw_params_set_avail_min) | static int (*ALSA_snd_pcm_sw_params_set_avail_min)(snd_pcm_t *, snd_pcm_sw_params_t *, snd_pcm_uframes_t); | ||||||
|   (snd_pcm_t *, snd_pcm_sw_params_t *, snd_pcm_uframes_t); |  | ||||||
| static int (*ALSA_snd_pcm_reset)(snd_pcm_t *); | static int (*ALSA_snd_pcm_reset)(snd_pcm_t *); | ||||||
| static int (*ALSA_snd_device_name_hint) (int, const char *, void ***); | static int (*ALSA_snd_device_name_hint)(int, const char *, void ***); | ||||||
| static char* (*ALSA_snd_device_name_get_hint) (const void *, const char *); | static char *(*ALSA_snd_device_name_get_hint)(const void *, const char *); | ||||||
| static int (*ALSA_snd_device_name_free_hint) (void **); | static int (*ALSA_snd_device_name_free_hint)(void **); | ||||||
| static snd_pcm_sframes_t (*ALSA_snd_pcm_avail)(snd_pcm_t *); | static snd_pcm_sframes_t (*ALSA_snd_pcm_avail)(snd_pcm_t *); | ||||||
| #ifdef SND_CHMAP_API_VERSION | #ifdef SND_CHMAP_API_VERSION | ||||||
| static snd_pcm_chmap_t* (*ALSA_snd_pcm_get_chmap) (snd_pcm_t *); | static snd_pcm_chmap_t *(*ALSA_snd_pcm_get_chmap)(snd_pcm_t *); | ||||||
| static int (*ALSA_snd_pcm_chmap_print) (const snd_pcm_chmap_t *map, size_t maxlen, char *buf); | static int (*ALSA_snd_pcm_chmap_print)(const snd_pcm_chmap_t *map, size_t maxlen, char *buf); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef SDL_AUDIO_DRIVER_ALSA_DYNAMIC | #ifdef SDL_AUDIO_DRIVER_ALSA_DYNAMIC | ||||||
| @@ -113,8 +95,7 @@ static int (*ALSA_snd_pcm_chmap_print) (const snd_pcm_chmap_t *map, size_t maxle | |||||||
| static const char *alsa_library = SDL_AUDIO_DRIVER_ALSA_DYNAMIC; | static const char *alsa_library = SDL_AUDIO_DRIVER_ALSA_DYNAMIC; | ||||||
| static void *alsa_handle = NULL; | static void *alsa_handle = NULL; | ||||||
|  |  | ||||||
| static int | static int load_alsa_sym(const char *fn, void **addr) | ||||||
| load_alsa_sym(const char *fn, void **addr) |  | ||||||
| { | { | ||||||
|     *addr = SDL_LoadFunction(alsa_handle, fn); |     *addr = SDL_LoadFunction(alsa_handle, fn); | ||||||
|     if (*addr == NULL) { |     if (*addr == NULL) { | ||||||
| @@ -126,14 +107,14 @@ load_alsa_sym(const char *fn, void **addr) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | ||||||
| #define SDL_ALSA_SYM(x) \ | #define SDL_ALSA_SYM(x)                                 \ | ||||||
|     if (!load_alsa_sym(#x, (void **) (char *) &ALSA_##x)) return -1 |     if (!load_alsa_sym(#x, (void **)(char *)&ALSA_##x)) \ | ||||||
|  |     return -1 | ||||||
| #else | #else | ||||||
| #define SDL_ALSA_SYM(x) ALSA_##x = x | #define SDL_ALSA_SYM(x) ALSA_##x = x | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static int | static int load_alsa_syms(void) | ||||||
| load_alsa_syms(void) |  | ||||||
| { | { | ||||||
|     SDL_ALSA_SYM(snd_pcm_open); |     SDL_ALSA_SYM(snd_pcm_open); | ||||||
|     SDL_ALSA_SYM(snd_pcm_close); |     SDL_ALSA_SYM(snd_pcm_close); | ||||||
| @@ -183,8 +164,7 @@ load_alsa_syms(void) | |||||||
|  |  | ||||||
| #ifdef SDL_AUDIO_DRIVER_ALSA_DYNAMIC | #ifdef SDL_AUDIO_DRIVER_ALSA_DYNAMIC | ||||||
|  |  | ||||||
| static void | static void UnloadALSALibrary(void) | ||||||
| UnloadALSALibrary(void) |  | ||||||
| { | { | ||||||
|     if (alsa_handle != NULL) { |     if (alsa_handle != NULL) { | ||||||
|         SDL_UnloadObject(alsa_handle); |         SDL_UnloadObject(alsa_handle); | ||||||
| @@ -192,8 +172,7 @@ UnloadALSALibrary(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadALSALibrary(void) | ||||||
| LoadALSALibrary(void) |  | ||||||
| { | { | ||||||
|     int retval = 0; |     int retval = 0; | ||||||
|     if (alsa_handle == NULL) { |     if (alsa_handle == NULL) { | ||||||
| @@ -213,13 +192,11 @@ LoadALSALibrary(void) | |||||||
|  |  | ||||||
| #else | #else | ||||||
|  |  | ||||||
| static void | static void UnloadALSALibrary(void) | ||||||
| UnloadALSALibrary(void) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadALSALibrary(void) | ||||||
| LoadALSALibrary(void) |  | ||||||
| { | { | ||||||
|     load_alsa_syms(); |     load_alsa_syms(); | ||||||
|     return 0; |     return 0; | ||||||
| @@ -227,8 +204,7 @@ LoadALSALibrary(void) | |||||||
|  |  | ||||||
| #endif /* SDL_AUDIO_DRIVER_ALSA_DYNAMIC */ | #endif /* SDL_AUDIO_DRIVER_ALSA_DYNAMIC */ | ||||||
|  |  | ||||||
| static const char * | static const char *get_audio_device(void *handle, const int channels) | ||||||
| get_audio_device(void *handle, const int channels) |  | ||||||
| { | { | ||||||
|     const char *device; |     const char *device; | ||||||
|  |  | ||||||
| @@ -237,7 +213,7 @@ get_audio_device(void *handle, const int channels) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* !!! FIXME: we also check "SDL_AUDIO_DEVICE_NAME" at the higher level. */ |     /* !!! FIXME: we also check "SDL_AUDIO_DEVICE_NAME" at the higher level. */ | ||||||
|     device = SDL_getenv("AUDIODEV");    /* Is there a standard variable name? */ |     device = SDL_getenv("AUDIODEV"); /* Is there a standard variable name? */ | ||||||
|     if (device != NULL) { |     if (device != NULL) { | ||||||
|         return device; |         return device; | ||||||
|     } |     } | ||||||
| @@ -251,49 +227,50 @@ get_audio_device(void *handle, const int channels) | |||||||
|     return "default"; |     return "default"; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* This function waits until it is possible to write a full sound buffer */ | /* This function waits until it is possible to write a full sound buffer */ | ||||||
| static void | static void ALSA_WaitDevice(_THIS) | ||||||
| ALSA_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
| #if SDL_ALSA_NON_BLOCKING | #if SDL_ALSA_NON_BLOCKING | ||||||
|     const snd_pcm_sframes_t needed = (snd_pcm_sframes_t) this->spec.samples; |     const snd_pcm_sframes_t needed = (snd_pcm_sframes_t)this->spec.samples; | ||||||
|     while (SDL_AtomicGet(&this->enabled)) { |     while (SDL_AtomicGet(&this->enabled)) { | ||||||
|         const snd_pcm_sframes_t rc = ALSA_snd_pcm_avail(this->hidden->pcm_handle); |         const snd_pcm_sframes_t rc = ALSA_snd_pcm_avail(this->hidden->pcm_handle); | ||||||
|         if ((rc < 0) && (rc != -EAGAIN)) { |         if ((rc < 0) && (rc != -EAGAIN)) { | ||||||
|             /* Hmm, not much we can do - abort */ |             /* Hmm, not much we can do - abort */ | ||||||
|             fprintf(stderr, "ALSA snd_pcm_avail failed (unrecoverable): %s\n", |             fprintf(stderr, "ALSA snd_pcm_avail failed (unrecoverable): %s\n", | ||||||
|                         ALSA_snd_strerror(rc)); |                     ALSA_snd_strerror(rc)); | ||||||
|             SDL_OpenedAudioDeviceDisconnected(this); |             SDL_OpenedAudioDeviceDisconnected(this); | ||||||
|             return; |             return; | ||||||
|         } else if (rc < needed) { |         } else if (rc < needed) { | ||||||
|             const Uint32 delay = ((needed - (SDL_max(rc, 0))) * 1000) / this->spec.freq; |             const Uint32 delay = ((needed - (SDL_max(rc, 0))) * 1000) / this->spec.freq; | ||||||
|             SDL_Delay(SDL_max(delay, 10)); |             SDL_Delay(SDL_max(delay, 10)); | ||||||
|         } else { |         } else { | ||||||
|             break;  /* ready to go! */ |             break; /* ready to go! */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* !!! FIXME: is there a channel swizzler in alsalib instead? */ | /* !!! FIXME: is there a channel swizzler in alsalib instead? */ | ||||||
| /* | /* | ||||||
|  * https://bugzilla.libsdl.org/show_bug.cgi?id=110 |  * https://bugzilla.libsdl.org/show_bug.cgi?id=110 | ||||||
|  * "For Linux ALSA, this is FL-FR-RL-RR-C-LFE |  * "For Linux ALSA, this is FL-FR-RL-RR-C-LFE | ||||||
|  *  and for Windows DirectX [and CoreAudio], this is FL-FR-C-LFE-RL-RR" |  *  and for Windows DirectX [and CoreAudio], this is FL-FR-C-LFE-RL-RR" | ||||||
|  */ |  */ | ||||||
| #define SWIZ6(T) \ | #define SWIZ6(T)                                                                  \ | ||||||
| static void swizzle_alsa_channels_6_##T(void *buffer, const Uint32 bufferlen) { \ |     static void swizzle_alsa_channels_6_##T(void *buffer, const Uint32 bufferlen) \ | ||||||
|     T *ptr = (T *) buffer; \ |     {                                                                             \ | ||||||
|     Uint32 i; \ |         T *ptr = (T *)buffer;                                                     \ | ||||||
|     for (i = 0; i < bufferlen; i++, ptr += 6) { \ |         Uint32 i;                                                                 \ | ||||||
|         T tmp; \ |         for (i = 0; i < bufferlen; i++, ptr += 6) {                               \ | ||||||
|         tmp = ptr[2]; ptr[2] = ptr[4]; ptr[4] = tmp; \ |             T tmp;                                                                \ | ||||||
|         tmp = ptr[3]; ptr[3] = ptr[5]; ptr[5] = tmp; \ |             tmp = ptr[2];                                                         \ | ||||||
|     } \ |             ptr[2] = ptr[4];                                                      \ | ||||||
| } |             ptr[4] = tmp;                                                         \ | ||||||
|  |             tmp = ptr[3];                                                         \ | ||||||
|  |             ptr[3] = ptr[5];                                                      \ | ||||||
|  |             ptr[5] = tmp;                                                         \ | ||||||
|  |         }                                                                         \ | ||||||
|  |     } | ||||||
|  |  | ||||||
| /* !!! FIXME: is there a channel swizzler in alsalib instead? */ | /* !!! FIXME: is there a channel swizzler in alsalib instead? */ | ||||||
| /* !!! FIXME: this screams for a SIMD shuffle operation. */ | /* !!! FIXME: this screams for a SIMD shuffle operation. */ | ||||||
| @@ -302,31 +279,32 @@ static void swizzle_alsa_channels_6_##T(void *buffer, const Uint32 bufferlen) { | |||||||
|  * For Linux ALSA, this appears to be FL-FR-RL-RR-C-LFE-SL-SR |  * For Linux ALSA, this appears to be FL-FR-RL-RR-C-LFE-SL-SR | ||||||
|  *  and for Windows DirectX [and CoreAudio], this is FL-FR-C-LFE-SL-SR-RL-RR" |  *  and for Windows DirectX [and CoreAudio], this is FL-FR-C-LFE-SL-SR-RL-RR" | ||||||
|  */ |  */ | ||||||
| #define SWIZ8(T) \ | #define SWIZ8(T)                                                                  \ | ||||||
| static void swizzle_alsa_channels_8_##T(void *buffer, const Uint32 bufferlen) { \ |     static void swizzle_alsa_channels_8_##T(void *buffer, const Uint32 bufferlen) \ | ||||||
|     T *ptr = (T *) buffer; \ |     {                                                                             \ | ||||||
|     Uint32 i; \ |         T *ptr = (T *)buffer;                                                     \ | ||||||
|     for (i = 0; i < bufferlen; i++, ptr += 6) { \ |         Uint32 i;                                                                 \ | ||||||
|         const T center = ptr[2]; \ |         for (i = 0; i < bufferlen; i++, ptr += 6) {                               \ | ||||||
|         const T subwoofer = ptr[3]; \ |             const T center = ptr[2];                                              \ | ||||||
|         const T side_left = ptr[4]; \ |             const T subwoofer = ptr[3];                                           \ | ||||||
|         const T side_right = ptr[5]; \ |             const T side_left = ptr[4];                                           \ | ||||||
|         const T rear_left = ptr[6]; \ |             const T side_right = ptr[5];                                          \ | ||||||
|         const T rear_right = ptr[7]; \ |             const T rear_left = ptr[6];                                           \ | ||||||
|         ptr[2] = rear_left; \ |             const T rear_right = ptr[7];                                          \ | ||||||
|         ptr[3] = rear_right; \ |             ptr[2] = rear_left;                                                   \ | ||||||
|         ptr[4] = center; \ |             ptr[3] = rear_right;                                                  \ | ||||||
|         ptr[5] = subwoofer; \ |             ptr[4] = center;                                                      \ | ||||||
|         ptr[6] = side_left; \ |             ptr[5] = subwoofer;                                                   \ | ||||||
|         ptr[7] = side_right; \ |             ptr[6] = side_left;                                                   \ | ||||||
|     } \ |             ptr[7] = side_right;                                                  \ | ||||||
| } |         }                                                                         \ | ||||||
|  |     } | ||||||
|  |  | ||||||
| #define CHANNEL_SWIZZLE(x) \ | #define CHANNEL_SWIZZLE(x) \ | ||||||
|     x(Uint64) \ |     x(Uint64)              \ | ||||||
|     x(Uint32) \ |         x(Uint32)          \ | ||||||
|     x(Uint16) \ |             x(Uint16)      \ | ||||||
|     x(Uint8) |                 x(Uint8) | ||||||
|  |  | ||||||
| CHANNEL_SWIZZLE(SWIZ6) | CHANNEL_SWIZZLE(SWIZ6) | ||||||
| CHANNEL_SWIZZLE(SWIZ8) | CHANNEL_SWIZZLE(SWIZ8) | ||||||
| @@ -335,53 +313,59 @@ CHANNEL_SWIZZLE(SWIZ8) | |||||||
| #undef SWIZ6 | #undef SWIZ6 | ||||||
| #undef SWIZ8 | #undef SWIZ8 | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Called right before feeding this->hidden->mixbuf to the hardware. Swizzle |  * Called right before feeding this->hidden->mixbuf to the hardware. Swizzle | ||||||
|  *  channels from Windows/Mac order to the format alsalib will want. |  *  channels from Windows/Mac order to the format alsalib will want. | ||||||
|  */ |  */ | ||||||
| static void | static void swizzle_alsa_channels(_THIS, void *buffer, Uint32 bufferlen) | ||||||
| swizzle_alsa_channels(_THIS, void *buffer, Uint32 bufferlen) |  | ||||||
| { | { | ||||||
|     switch (this->spec.channels) { |     switch (this->spec.channels) { | ||||||
|         #define CHANSWIZ(chans) \ | #define CHANSWIZ(chans)                                                \ | ||||||
|         case chans: \ |     case chans:                                                        \ | ||||||
|             switch ((this->spec.format & (0xFF))) { \ |         switch ((this->spec.format & (0xFF))) {                        \ | ||||||
|                 case 8: swizzle_alsa_channels_##chans##_Uint8(buffer, bufferlen); break; \ |         case 8:                                                        \ | ||||||
|                 case 16: swizzle_alsa_channels_##chans##_Uint16(buffer, bufferlen); break; \ |             swizzle_alsa_channels_##chans##_Uint8(buffer, bufferlen);  \ | ||||||
|                 case 32: swizzle_alsa_channels_##chans##_Uint32(buffer, bufferlen); break; \ |             break;                                                     \ | ||||||
|                 case 64: swizzle_alsa_channels_##chans##_Uint64(buffer, bufferlen); break; \ |         case 16:                                                       \ | ||||||
|                 default: SDL_assert(!"unhandled bitsize"); break; \ |             swizzle_alsa_channels_##chans##_Uint16(buffer, bufferlen); \ | ||||||
|             } \ |             break;                                                     \ | ||||||
|             return; |         case 32:                                                       \ | ||||||
|  |             swizzle_alsa_channels_##chans##_Uint32(buffer, bufferlen); \ | ||||||
|  |             break;                                                     \ | ||||||
|  |         case 64:                                                       \ | ||||||
|  |             swizzle_alsa_channels_##chans##_Uint64(buffer, bufferlen); \ | ||||||
|  |             break;                                                     \ | ||||||
|  |         default:                                                       \ | ||||||
|  |             SDL_assert(!"unhandled bitsize");                          \ | ||||||
|  |             break;                                                     \ | ||||||
|  |         }                                                              \ | ||||||
|  |         return; | ||||||
|  |  | ||||||
|         CHANSWIZ(6); |         CHANSWIZ(6); | ||||||
|         CHANSWIZ(8); |         CHANSWIZ(8); | ||||||
|         #undef CHANSWIZ | #undef CHANSWIZ | ||||||
|         default: break; |     default: | ||||||
|  |         break; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef SND_CHMAP_API_VERSION | #ifdef SND_CHMAP_API_VERSION | ||||||
| /* Some devices have the right channel map, no swizzling necessary */ | /* Some devices have the right channel map, no swizzling necessary */ | ||||||
| static void | static void no_swizzle(_THIS, void *buffer, Uint32 bufferlen) | ||||||
| no_swizzle(_THIS, void *buffer, Uint32 bufferlen) |  | ||||||
| { | { | ||||||
| } | } | ||||||
| #endif /* SND_CHMAP_API_VERSION */ | #endif /* SND_CHMAP_API_VERSION */ | ||||||
|  |  | ||||||
|  | static void ALSA_PlayDevice(_THIS) | ||||||
| static void |  | ||||||
| ALSA_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     const Uint8 *sample_buf = (const Uint8 *) this->hidden->mixbuf; |     const Uint8 *sample_buf = (const Uint8 *)this->hidden->mixbuf; | ||||||
|     const int frame_size = ((SDL_AUDIO_BITSIZE(this->spec.format)) / 8) * |     const int frame_size = ((SDL_AUDIO_BITSIZE(this->spec.format)) / 8) * | ||||||
|                                 this->spec.channels; |                            this->spec.channels; | ||||||
|     snd_pcm_uframes_t frames_left = ((snd_pcm_uframes_t) this->spec.samples); |     snd_pcm_uframes_t frames_left = ((snd_pcm_uframes_t)this->spec.samples); | ||||||
|  |  | ||||||
|     this->hidden->swizzle_func(this, this->hidden->mixbuf, frames_left); |     this->hidden->swizzle_func(this, this->hidden->mixbuf, frames_left); | ||||||
|  |  | ||||||
|     while ( frames_left > 0 && SDL_AtomicGet(&this->enabled) ) { |     while (frames_left > 0 && SDL_AtomicGet(&this->enabled)) { | ||||||
|         int status = ALSA_snd_pcm_writei(this->hidden->pcm_handle, |         int status = ALSA_snd_pcm_writei(this->hidden->pcm_handle, | ||||||
|                                          sample_buf, frames_left); |                                          sample_buf, frames_left); | ||||||
|  |  | ||||||
| @@ -413,29 +397,27 @@ ALSA_PlayDevice(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *ALSA_GetDeviceBuf(_THIS) | ||||||
| ALSA_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return this->hidden->mixbuf; |     return this->hidden->mixbuf; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int ALSA_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| ALSA_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     Uint8 *sample_buf = (Uint8 *) buffer; |     Uint8 *sample_buf = (Uint8 *)buffer; | ||||||
|     const int frame_size = ((SDL_AUDIO_BITSIZE(this->spec.format)) / 8) * |     const int frame_size = ((SDL_AUDIO_BITSIZE(this->spec.format)) / 8) * | ||||||
|                                 this->spec.channels; |                            this->spec.channels; | ||||||
|     const int total_frames = buflen / frame_size; |     const int total_frames = buflen / frame_size; | ||||||
|     snd_pcm_uframes_t frames_left = total_frames; |     snd_pcm_uframes_t frames_left = total_frames; | ||||||
|     snd_pcm_uframes_t wait_time = frame_size / 2; |     snd_pcm_uframes_t wait_time = frame_size / 2; | ||||||
|  |  | ||||||
|     SDL_assert((buflen % frame_size) == 0); |     SDL_assert((buflen % frame_size) == 0); | ||||||
|  |  | ||||||
|     while ( frames_left > 0 && SDL_AtomicGet(&this->enabled) ) { |     while (frames_left > 0 && SDL_AtomicGet(&this->enabled)) { | ||||||
|         int status; |         int status; | ||||||
|  |  | ||||||
|         status = ALSA_snd_pcm_readi(this->hidden->pcm_handle, |         status = ALSA_snd_pcm_readi(this->hidden->pcm_handle, | ||||||
|                                         sample_buf, frames_left); |                                     sample_buf, frames_left); | ||||||
|  |  | ||||||
|         if (status == -EAGAIN) { |         if (status == -EAGAIN) { | ||||||
|             ALSA_snd_pcm_wait(this->hidden->pcm_handle, wait_time); |             ALSA_snd_pcm_wait(this->hidden->pcm_handle, wait_time); | ||||||
| @@ -462,14 +444,12 @@ ALSA_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     return (total_frames - frames_left) * frame_size; |     return (total_frames - frames_left) * frame_size; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void ALSA_FlushCapture(_THIS) | ||||||
| ALSA_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     ALSA_snd_pcm_reset(this->hidden->pcm_handle); |     ALSA_snd_pcm_reset(this->hidden->pcm_handle); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void ALSA_CloseDevice(_THIS) | ||||||
| ALSA_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (this->hidden->pcm_handle) { |     if (this->hidden->pcm_handle) { | ||||||
|         /* Wait for the submitted audio to drain |         /* Wait for the submitted audio to drain | ||||||
| @@ -484,8 +464,7 @@ ALSA_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int ALSA_set_buffer_size(_THIS, snd_pcm_hw_params_t *params) | ||||||
| ALSA_set_buffer_size(_THIS, snd_pcm_hw_params_t *params) |  | ||||||
| { | { | ||||||
|     int status; |     int status; | ||||||
|     snd_pcm_hw_params_t *hwparams; |     snd_pcm_hw_params_t *hwparams; | ||||||
| @@ -499,49 +478,48 @@ ALSA_set_buffer_size(_THIS, snd_pcm_hw_params_t *params) | |||||||
|     /* Attempt to match the period size to the requested buffer size */ |     /* Attempt to match the period size to the requested buffer size */ | ||||||
|     persize = this->spec.samples; |     persize = this->spec.samples; | ||||||
|     status = ALSA_snd_pcm_hw_params_set_period_size_near( |     status = ALSA_snd_pcm_hw_params_set_period_size_near( | ||||||
|                 this->hidden->pcm_handle, hwparams, &persize, NULL); |         this->hidden->pcm_handle, hwparams, &persize, NULL); | ||||||
|     if ( status < 0 ) { |     if (status < 0) { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Need to at least double buffer */ |     /* Need to at least double buffer */ | ||||||
|     periods = 2; |     periods = 2; | ||||||
|     status = ALSA_snd_pcm_hw_params_set_periods_min( |     status = ALSA_snd_pcm_hw_params_set_periods_min( | ||||||
|                 this->hidden->pcm_handle, hwparams, &periods, NULL); |         this->hidden->pcm_handle, hwparams, &periods, NULL); | ||||||
|     if ( status < 0 ) { |     if (status < 0) { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     status = ALSA_snd_pcm_hw_params_set_periods_first( |     status = ALSA_snd_pcm_hw_params_set_periods_first( | ||||||
|                 this->hidden->pcm_handle, hwparams, &periods, NULL); |         this->hidden->pcm_handle, hwparams, &periods, NULL); | ||||||
|     if ( status < 0 ) { |     if (status < 0) { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* "set" the hardware with the desired parameters */ |     /* "set" the hardware with the desired parameters */ | ||||||
|     status = ALSA_snd_pcm_hw_params(this->hidden->pcm_handle, hwparams); |     status = ALSA_snd_pcm_hw_params(this->hidden->pcm_handle, hwparams); | ||||||
|     if ( status < 0 ) { |     if (status < 0) { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->spec.samples = persize; |     this->spec.samples = persize; | ||||||
|  |  | ||||||
|     /* This is useful for debugging */ |     /* This is useful for debugging */ | ||||||
|     if ( SDL_getenv("SDL_AUDIO_ALSA_DEBUG") ) { |     if (SDL_getenv("SDL_AUDIO_ALSA_DEBUG")) { | ||||||
|         snd_pcm_uframes_t bufsize; |         snd_pcm_uframes_t bufsize; | ||||||
|  |  | ||||||
|         ALSA_snd_pcm_hw_params_get_buffer_size(hwparams, &bufsize); |         ALSA_snd_pcm_hw_params_get_buffer_size(hwparams, &bufsize); | ||||||
|  |  | ||||||
|         fprintf(stderr, |         fprintf(stderr, | ||||||
|             "ALSA: period size = %ld, periods = %u, buffer size = %lu\n", |                 "ALSA: period size = %ld, periods = %u, buffer size = %lu\n", | ||||||
|             persize, periods, bufsize); |                 persize, periods, bufsize); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int ALSA_OpenDevice(_THIS, const char *devname) | ||||||
| ALSA_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     int status = 0; |     int status = 0; | ||||||
|     SDL_bool iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
| @@ -568,9 +546,9 @@ ALSA_OpenDevice(_THIS, const char *devname) | |||||||
|     /* Open the audio device */ |     /* Open the audio device */ | ||||||
|     /* Name of device should depend on # channels in spec */ |     /* Name of device should depend on # channels in spec */ | ||||||
|     status = ALSA_snd_pcm_open(&pcm_handle, |     status = ALSA_snd_pcm_open(&pcm_handle, | ||||||
|                 get_audio_device(this->handle, this->spec.channels), |                                get_audio_device(this->handle, this->spec.channels), | ||||||
|                 iscapture ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, |                                iscapture ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, | ||||||
|                 SND_PCM_NONBLOCK); |                                SND_PCM_NONBLOCK); | ||||||
|  |  | ||||||
|     if (status < 0) { |     if (status < 0) { | ||||||
|         return SDL_SetError("ALSA: Couldn't open audio device: %s", ALSA_snd_strerror(status)); |         return SDL_SetError("ALSA: Couldn't open audio device: %s", ALSA_snd_strerror(status)); | ||||||
| @@ -707,18 +685,18 @@ ALSA_OpenDevice(_THIS, const char *devname) | |||||||
|     /* Allocate mixing buffer */ |     /* Allocate mixing buffer */ | ||||||
|     if (!iscapture) { |     if (!iscapture) { | ||||||
|         this->hidden->mixlen = this->spec.size; |         this->hidden->mixlen = this->spec.size; | ||||||
|         this->hidden->mixbuf = (Uint8 *) SDL_malloc(this->hidden->mixlen); |         this->hidden->mixbuf = (Uint8 *)SDL_malloc(this->hidden->mixlen); | ||||||
|         if (this->hidden->mixbuf == NULL) { |         if (this->hidden->mixbuf == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
|         SDL_memset(this->hidden->mixbuf, this->spec.silence, this->hidden->mixlen); |         SDL_memset(this->hidden->mixbuf, this->spec.silence, this->hidden->mixlen); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     #if !SDL_ALSA_NON_BLOCKING | #if !SDL_ALSA_NON_BLOCKING | ||||||
|     if (!iscapture) { |     if (!iscapture) { | ||||||
|         ALSA_snd_pcm_nonblock(pcm_handle, 0); |         ALSA_snd_pcm_nonblock(pcm_handle, 0); | ||||||
|     } |     } | ||||||
|     #endif | #endif | ||||||
|  |  | ||||||
|     /* We're ready to rock and roll. :-) */ |     /* We're ready to rock and roll. :-) */ | ||||||
|     return 0; |     return 0; | ||||||
| @@ -731,10 +709,9 @@ typedef struct ALSA_Device | |||||||
|     struct ALSA_Device *next; |     struct ALSA_Device *next; | ||||||
| } ALSA_Device; | } ALSA_Device; | ||||||
|  |  | ||||||
| static void | static void add_device(const int iscapture, const char *name, void *hint, ALSA_Device **pSeen) | ||||||
| add_device(const int iscapture, const char *name, void *hint, ALSA_Device **pSeen) |  | ||||||
| { | { | ||||||
|     ALSA_Device *dev = SDL_malloc(sizeof (ALSA_Device)); |     ALSA_Device *dev = SDL_malloc(sizeof(ALSA_Device)); | ||||||
|     char *desc; |     char *desc; | ||||||
|     char *handle = NULL; |     char *handle = NULL; | ||||||
|     char *ptr; |     char *ptr; | ||||||
| @@ -754,7 +731,7 @@ add_device(const int iscapture, const char *name, void *hint, ALSA_Device **pSee | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         desc = (char *) name; |         desc = (char *)name; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_assert(name != NULL); |     SDL_assert(name != NULL); | ||||||
| @@ -791,11 +768,9 @@ add_device(const int iscapture, const char *name, void *hint, ALSA_Device **pSee | |||||||
|     *pSeen = dev; |     *pSeen = dev; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static ALSA_Device *hotplug_devices = NULL; | static ALSA_Device *hotplug_devices = NULL; | ||||||
|  |  | ||||||
| static void | static void ALSA_HotplugIteration(void) | ||||||
| ALSA_HotplugIteration(void) |  | ||||||
| { | { | ||||||
|     void **hints = NULL; |     void **hints = NULL; | ||||||
|     ALSA_Device *dev; |     ALSA_Device *dev; | ||||||
| @@ -810,7 +785,7 @@ ALSA_HotplugIteration(void) | |||||||
|         int bestmatch = 0xFFFF; |         int bestmatch = 0xFFFF; | ||||||
|         size_t match_len = 0; |         size_t match_len = 0; | ||||||
|         int defaultdev = -1; |         int defaultdev = -1; | ||||||
|         static const char * const prefixes[] = { |         static const char *const prefixes[] = { | ||||||
|             "hw:", "sysdefault:", "default:", NULL |             "hw:", "sysdefault:", "default:", NULL | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
| @@ -853,7 +828,7 @@ ALSA_HotplugIteration(void) | |||||||
|  |  | ||||||
|             /* if we didn't find a device name prefix we like at all... */ |             /* if we didn't find a device name prefix we like at all... */ | ||||||
|             if ((match == NULL) && (defaultdev != i)) { |             if ((match == NULL) && (defaultdev != i)) { | ||||||
|                 continue;  /* ...skip anything that isn't the default device. */ |                 continue; /* ...skip anything that isn't the default device. */ | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             name = ALSA_snd_device_name_get_hint(hints[i], "NAME"); |             name = ALSA_snd_device_name_get_hint(hints[i], "NAME"); | ||||||
| @@ -879,7 +854,7 @@ ALSA_HotplugIteration(void) | |||||||
|                 prev = NULL; |                 prev = NULL; | ||||||
|                 for (dev = unseen; dev; dev = next) { |                 for (dev = unseen; dev; dev = next) { | ||||||
|                     next = dev->next; |                     next = dev->next; | ||||||
|                     if ( (SDL_strcmp(dev->name, name) == 0) && (((isinput) && dev->iscapture) || ((isoutput) && !dev->iscapture)) ) { |                     if ((SDL_strcmp(dev->name, name) == 0) && (((isinput) && dev->iscapture) || ((isoutput) && !dev->iscapture))) { | ||||||
|                         if (prev) { |                         if (prev) { | ||||||
|                             prev->next = next; |                             prev->next = next; | ||||||
|                         } else { |                         } else { | ||||||
| @@ -911,7 +886,7 @@ ALSA_HotplugIteration(void) | |||||||
|  |  | ||||||
|         ALSA_snd_device_name_free_hint(hints); |         ALSA_snd_device_name_free_hint(hints); | ||||||
|  |  | ||||||
|         hotplug_devices = seen;   /* now we have a known-good list of attached devices. */ |         hotplug_devices = seen; /* now we have a known-good list of attached devices. */ | ||||||
|  |  | ||||||
|         /* report anything still in unseen as removed. */ |         /* report anything still in unseen as removed. */ | ||||||
|         for (dev = unseen; dev; dev = next) { |         for (dev = unseen; dev; dev = next) { | ||||||
| @@ -928,8 +903,7 @@ ALSA_HotplugIteration(void) | |||||||
| static SDL_atomic_t ALSA_hotplug_shutdown; | static SDL_atomic_t ALSA_hotplug_shutdown; | ||||||
| static SDL_Thread *ALSA_hotplug_thread; | static SDL_Thread *ALSA_hotplug_thread; | ||||||
|  |  | ||||||
| static int SDLCALL | static int SDLCALL ALSA_HotplugThread(void *arg) | ||||||
| ALSA_HotplugThread(void *arg) |  | ||||||
| { | { | ||||||
|     SDL_SetThreadPriority(SDL_THREAD_PRIORITY_LOW); |     SDL_SetThreadPriority(SDL_THREAD_PRIORITY_LOW); | ||||||
|  |  | ||||||
| @@ -940,17 +914,16 @@ ALSA_HotplugThread(void *arg) | |||||||
|             SDL_Delay(100); |             SDL_Delay(100); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ALSA_HotplugIteration();  /* run the check. */ |         ALSA_HotplugIteration(); /* run the check. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static void | static void ALSA_DetectDevices(void) | ||||||
| ALSA_DetectDevices(void) |  | ||||||
| { | { | ||||||
|     ALSA_HotplugIteration();  /* run once now before a thread continues to check. */ |     ALSA_HotplugIteration(); /* run once now before a thread continues to check. */ | ||||||
|  |  | ||||||
| #if SDL_ALSA_HOTPLUG_THREAD | #if SDL_ALSA_HOTPLUG_THREAD | ||||||
|     SDL_AtomicSet(&ALSA_hotplug_shutdown, 0); |     SDL_AtomicSet(&ALSA_hotplug_shutdown, 0); | ||||||
| @@ -959,8 +932,7 @@ ALSA_DetectDevices(void) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void ALSA_Deinitialize(void) | ||||||
| ALSA_Deinitialize(void) |  | ||||||
| { | { | ||||||
|     ALSA_Device *dev; |     ALSA_Device *dev; | ||||||
|     ALSA_Device *next; |     ALSA_Device *next; | ||||||
| @@ -985,8 +957,7 @@ ALSA_Deinitialize(void) | |||||||
|     UnloadALSALibrary(); |     UnloadALSALibrary(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool ALSA_Init(SDL_AudioDriverImpl *impl) | ||||||
| ALSA_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     if (LoadALSALibrary() < 0) { |     if (LoadALSALibrary() < 0) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -1006,10 +977,9 @@ ALSA_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->SupportsNonPow2Samples = SDL_TRUE; |     impl->SupportsNonPow2Samples = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| AudioBootStrap ALSA_bootstrap = { | AudioBootStrap ALSA_bootstrap = { | ||||||
|     "alsa", "ALSA PCM audio", ALSA_Init, SDL_FALSE |     "alsa", "ALSA PCM audio", ALSA_Init, SDL_FALSE | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|   | |||||||
| @@ -32,11 +32,10 @@ | |||||||
|  |  | ||||||
| #include <android/log.h> | #include <android/log.h> | ||||||
|  |  | ||||||
| static SDL_AudioDevice* audioDevice = NULL; | static SDL_AudioDevice *audioDevice = NULL; | ||||||
| static SDL_AudioDevice* captureDevice = NULL; | static SDL_AudioDevice *captureDevice = NULL; | ||||||
|  |  | ||||||
| static int | static int ANDROIDAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| ANDROIDAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
|     SDL_bool iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
| @@ -50,7 +49,7 @@ ANDROIDAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|         audioDevice = this; |         audioDevice = this; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->hidden = (struct SDL_PrivateAudioData *) SDL_calloc(1, (sizeof *this->hidden)); |     this->hidden = (struct SDL_PrivateAudioData *)SDL_calloc(1, (sizeof *this->hidden)); | ||||||
|     if (this->hidden == NULL) { |     if (this->hidden == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -78,32 +77,27 @@ ANDROIDAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void ANDROIDAUDIO_PlayDevice(_THIS) | ||||||
| ANDROIDAUDIO_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     Android_JNI_WriteAudioBuffer(); |     Android_JNI_WriteAudioBuffer(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *ANDROIDAUDIO_GetDeviceBuf(_THIS) | ||||||
| ANDROIDAUDIO_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return Android_JNI_GetAudioBuffer(); |     return Android_JNI_GetAudioBuffer(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int ANDROIDAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| ANDROIDAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     return Android_JNI_CaptureAudioBuffer(buffer, buflen); |     return Android_JNI_CaptureAudioBuffer(buffer, buflen); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void ANDROIDAUDIO_FlushCapture(_THIS) | ||||||
| ANDROIDAUDIO_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     Android_JNI_FlushCapturedAudio(); |     Android_JNI_FlushCapturedAudio(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void ANDROIDAUDIO_CloseDevice(_THIS) | ||||||
| ANDROIDAUDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     /* At this point SDL_CloseAudioDevice via close_audio_device took care of terminating the audio thread |     /* At this point SDL_CloseAudioDevice via close_audio_device took care of terminating the audio thread | ||||||
|        so it's safe to terminate the Java side buffer and AudioTrack |        so it's safe to terminate the Java side buffer and AudioTrack | ||||||
| @@ -119,8 +113,7 @@ ANDROIDAUDIO_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool ANDROIDAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| ANDROIDAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->OpenDevice = ANDROIDAUDIO_OpenDevice; |     impl->OpenDevice = ANDROIDAUDIO_OpenDevice; | ||||||
| @@ -135,7 +128,7 @@ ANDROIDAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->OnlyHasDefaultOutputDevice = SDL_TRUE; |     impl->OnlyHasDefaultOutputDevice = SDL_TRUE; | ||||||
|     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; |     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap ANDROIDAUDIO_bootstrap = { | AudioBootStrap ANDROIDAUDIO_bootstrap = { | ||||||
| @@ -148,7 +141,7 @@ void ANDROIDAUDIO_PauseDevices(void) | |||||||
|     /* TODO: Handle multiple devices? */ |     /* TODO: Handle multiple devices? */ | ||||||
|     struct SDL_PrivateAudioData *private; |     struct SDL_PrivateAudioData *private; | ||||||
|     if (audioDevice != NULL && audioDevice->hidden != NULL) { |     if (audioDevice != NULL && audioDevice->hidden != NULL) { | ||||||
|         private = (struct SDL_PrivateAudioData *) audioDevice->hidden; |         private = (struct SDL_PrivateAudioData *)audioDevice->hidden; | ||||||
|         if (SDL_AtomicGet(&audioDevice->paused)) { |         if (SDL_AtomicGet(&audioDevice->paused)) { | ||||||
|             /* The device is already paused, leave it alone */ |             /* The device is already paused, leave it alone */ | ||||||
|             private->resume = SDL_FALSE; |             private->resume = SDL_FALSE; | ||||||
| @@ -160,7 +153,7 @@ void ANDROIDAUDIO_PauseDevices(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (captureDevice != NULL && captureDevice->hidden != NULL) { |     if (captureDevice != NULL && captureDevice->hidden != NULL) { | ||||||
|         private = (struct SDL_PrivateAudioData *) captureDevice->hidden; |         private = (struct SDL_PrivateAudioData *)captureDevice->hidden; | ||||||
|         if (SDL_AtomicGet(&captureDevice->paused)) { |         if (SDL_AtomicGet(&captureDevice->paused)) { | ||||||
|             /* The device is already paused, leave it alone */ |             /* The device is already paused, leave it alone */ | ||||||
|             private->resume = SDL_FALSE; |             private->resume = SDL_FALSE; | ||||||
| @@ -178,7 +171,7 @@ void ANDROIDAUDIO_ResumeDevices(void) | |||||||
|     /* TODO: Handle multiple devices? */ |     /* TODO: Handle multiple devices? */ | ||||||
|     struct SDL_PrivateAudioData *private; |     struct SDL_PrivateAudioData *private; | ||||||
|     if (audioDevice != NULL && audioDevice->hidden != NULL) { |     if (audioDevice != NULL && audioDevice->hidden != NULL) { | ||||||
|         private = (struct SDL_PrivateAudioData *) audioDevice->hidden; |         private = (struct SDL_PrivateAudioData *)audioDevice->hidden; | ||||||
|         if (private->resume) { |         if (private->resume) { | ||||||
|             SDL_AtomicSet(&audioDevice->paused, 0); |             SDL_AtomicSet(&audioDevice->paused, 0); | ||||||
|             private->resume = SDL_FALSE; |             private->resume = SDL_FALSE; | ||||||
| @@ -187,7 +180,7 @@ void ANDROIDAUDIO_ResumeDevices(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (captureDevice != NULL && captureDevice->hidden != NULL) { |     if (captureDevice != NULL && captureDevice->hidden != NULL) { | ||||||
|         private = (struct SDL_PrivateAudioData *) captureDevice->hidden; |         private = (struct SDL_PrivateAudioData *)captureDevice->hidden; | ||||||
|         if (private->resume) { |         if (private->resume) { | ||||||
|             SDL_AtomicSet(&captureDevice->paused, 0); |             SDL_AtomicSet(&captureDevice->paused, 0); | ||||||
|             private->resume = SDL_FALSE; |             private->resume = SDL_FALSE; | ||||||
| @@ -204,4 +197,3 @@ void ANDROIDAUDIO_PauseDevices(void) {} | |||||||
| #endif /* SDL_AUDIO_DRIVER_ANDROID */ | #endif /* SDL_AUDIO_DRIVER_ANDROID */ | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|   | |||||||
| @@ -48,7 +48,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|   | |||||||
| @@ -34,21 +34,20 @@ | |||||||
| #define DEBUG_COREAUDIO 0 | #define DEBUG_COREAUDIO 0 | ||||||
|  |  | ||||||
| #if DEBUG_COREAUDIO | #if DEBUG_COREAUDIO | ||||||
|     #define CHECK_RESULT(msg) \ | #define CHECK_RESULT(msg)                                                 \ | ||||||
|         if (result != noErr) { \ |     if (result != noErr) {                                                \ | ||||||
|             printf("COREAUDIO: Got error %d from '%s'!\n", (int) result, msg); \ |         printf("COREAUDIO: Got error %d from '%s'!\n", (int)result, msg); \ | ||||||
|             SDL_SetError("CoreAudio error (%s): %d", msg, (int) result); \ |         SDL_SetError("CoreAudio error (%s): %d", msg, (int)result);       \ | ||||||
|             return 0; \ |         return 0;                                                         \ | ||||||
|         } |     } | ||||||
| #else | #else | ||||||
|     #define CHECK_RESULT(msg) \ | #define CHECK_RESULT(msg)                                           \ | ||||||
|         if (result != noErr) { \ |     if (result != noErr) {                                          \ | ||||||
|             SDL_SetError("CoreAudio error (%s): %d", msg, (int) result); \ |         SDL_SetError("CoreAudio error (%s): %d", msg, (int)result); \ | ||||||
|             return 0; \ |         return 0;                                                   \ | ||||||
|         } |     } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
| static const AudioObjectPropertyAddress devlist_address = { | static const AudioObjectPropertyAddress devlist_address = { | ||||||
|     kAudioHardwarePropertyDevices, |     kAudioHardwarePropertyDevices, | ||||||
| @@ -68,10 +67,9 @@ typedef struct AudioDeviceList | |||||||
| static AudioDeviceList *output_devs = NULL; | static AudioDeviceList *output_devs = NULL; | ||||||
| static AudioDeviceList *capture_devs = NULL; | static AudioDeviceList *capture_devs = NULL; | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool add_to_internal_dev_list(const int iscapture, AudioDeviceID devId) | ||||||
| add_to_internal_dev_list(const int iscapture, AudioDeviceID devId) |  | ||||||
| { | { | ||||||
|     AudioDeviceList *item = (AudioDeviceList *) SDL_malloc(sizeof (AudioDeviceList)); |     AudioDeviceList *item = (AudioDeviceList *)SDL_malloc(sizeof(AudioDeviceList)); | ||||||
|     if (item == NULL) { |     if (item == NULL) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
|     } |     } | ||||||
| @@ -87,16 +85,14 @@ add_to_internal_dev_list(const int iscapture, AudioDeviceID devId) | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void addToDevList(const char *name, SDL_AudioSpec *spec, const int iscapture, AudioDeviceID devId, void *data) | ||||||
| addToDevList(const char *name, SDL_AudioSpec *spec, const int iscapture, AudioDeviceID devId, void *data) |  | ||||||
| { | { | ||||||
|     if (add_to_internal_dev_list(iscapture, devId)) { |     if (add_to_internal_dev_list(iscapture, devId)) { | ||||||
|         SDL_AddAudioDevice(iscapture, name, spec, (void *) ((size_t) devId)); |         SDL_AddAudioDevice(iscapture, name, spec, (void *)((size_t)devId)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void build_device_list(int iscapture, addDevFn addfn, void *addfndata) | ||||||
| build_device_list(int iscapture, addDevFn addfn, void *addfndata) |  | ||||||
| { | { | ||||||
|     OSStatus result = noErr; |     OSStatus result = noErr; | ||||||
|     UInt32 size = 0; |     UInt32 size = 0; | ||||||
| @@ -109,7 +105,7 @@ build_device_list(int iscapture, addDevFn addfn, void *addfndata) | |||||||
|     if (result != kAudioHardwareNoError) |     if (result != kAudioHardwareNoError) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     devs = (AudioDeviceID *) alloca(size); |     devs = (AudioDeviceID *)alloca(size); | ||||||
|     if (devs == NULL) |     if (devs == NULL) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
| @@ -118,7 +114,7 @@ build_device_list(int iscapture, addDevFn addfn, void *addfndata) | |||||||
|     if (result != kAudioHardwareNoError) |     if (result != kAudioHardwareNoError) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     max = size / sizeof (AudioDeviceID); |     max = size / sizeof(AudioDeviceID); | ||||||
|     for (i = 0; i < max; i++) { |     for (i = 0; i < max; i++) { | ||||||
|         CFStringRef cfstr = NULL; |         CFStringRef cfstr = NULL; | ||||||
|         char *ptr = NULL; |         char *ptr = NULL; | ||||||
| @@ -148,7 +144,7 @@ build_device_list(int iscapture, addDevFn addfn, void *addfndata) | |||||||
|         if (result != noErr) |         if (result != noErr) | ||||||
|             continue; |             continue; | ||||||
|  |  | ||||||
|         buflist = (AudioBufferList *) SDL_malloc(size); |         buflist = (AudioBufferList *)SDL_malloc(size); | ||||||
|         if (buflist == NULL) |         if (buflist == NULL) | ||||||
|             continue; |             continue; | ||||||
|  |  | ||||||
| @@ -168,13 +164,13 @@ build_device_list(int iscapture, addDevFn addfn, void *addfndata) | |||||||
|         if (spec.channels == 0) |         if (spec.channels == 0) | ||||||
|             continue; |             continue; | ||||||
|  |  | ||||||
|         size = sizeof (sampleRate); |         size = sizeof(sampleRate); | ||||||
|         result = AudioObjectGetPropertyData(dev, &freqaddr, 0, NULL, &size, &sampleRate); |         result = AudioObjectGetPropertyData(dev, &freqaddr, 0, NULL, &size, &sampleRate); | ||||||
|         if (result == noErr) { |         if (result == noErr) { | ||||||
|             spec.freq = (int) sampleRate; |             spec.freq = (int)sampleRate; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         size = sizeof (CFStringRef); |         size = sizeof(CFStringRef); | ||||||
|         result = AudioObjectGetPropertyData(dev, &nameaddr, 0, NULL, &size, &cfstr); |         result = AudioObjectGetPropertyData(dev, &nameaddr, 0, NULL, &size, &cfstr); | ||||||
|         if (result != kAudioHardwareNoError) |         if (result != kAudioHardwareNoError) | ||||||
|             continue; |             continue; | ||||||
| @@ -182,10 +178,9 @@ build_device_list(int iscapture, addDevFn addfn, void *addfndata) | |||||||
|         len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfstr), |         len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfstr), | ||||||
|                                                 kCFStringEncodingUTF8); |                                                 kCFStringEncodingUTF8); | ||||||
|  |  | ||||||
|         ptr = (char *) SDL_malloc(len + 1); |         ptr = (char *)SDL_malloc(len + 1); | ||||||
|         usable = ((ptr != NULL) && |         usable = ((ptr != NULL) && | ||||||
|                   (CFStringGetCString |                   (CFStringGetCString(cfstr, ptr, len + 1, kCFStringEncodingUTF8))); | ||||||
|                    (cfstr, ptr, len + 1, kCFStringEncodingUTF8))); |  | ||||||
|  |  | ||||||
|         CFRelease(cfstr); |         CFRelease(cfstr); | ||||||
|  |  | ||||||
| @@ -204,16 +199,15 @@ build_device_list(int iscapture, addDevFn addfn, void *addfndata) | |||||||
| #if DEBUG_COREAUDIO | #if DEBUG_COREAUDIO | ||||||
|             printf("COREAUDIO: Found %s device #%d: '%s' (devid %d)\n", |             printf("COREAUDIO: Found %s device #%d: '%s' (devid %d)\n", | ||||||
|                    ((iscapture) ? "capture" : "output"), |                    ((iscapture) ? "capture" : "output"), | ||||||
|                    (int) i, ptr, (int) dev); |                    (int)i, ptr, (int)dev); | ||||||
| #endif | #endif | ||||||
|             addfn(ptr, &spec, iscapture, dev, addfndata); |             addfn(ptr, &spec, iscapture, dev, addfndata); | ||||||
|         } |         } | ||||||
|         SDL_free(ptr);  /* addfn() would have copied the string. */ |         SDL_free(ptr); /* addfn() would have copied the string. */ | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void free_audio_device_list(AudioDeviceList **list) | ||||||
| free_audio_device_list(AudioDeviceList **list) |  | ||||||
| { | { | ||||||
|     AudioDeviceList *item = *list; |     AudioDeviceList *item = *list; | ||||||
|     while (item) { |     while (item) { | ||||||
| @@ -224,17 +218,15 @@ free_audio_device_list(AudioDeviceList **list) | |||||||
|     *list = NULL; |     *list = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void COREAUDIO_DetectDevices(void) | ||||||
| COREAUDIO_DetectDevices(void) |  | ||||||
| { | { | ||||||
|     build_device_list(SDL_TRUE, addToDevList, NULL); |     build_device_list(SDL_TRUE, addToDevList, NULL); | ||||||
|     build_device_list(SDL_FALSE, addToDevList, NULL); |     build_device_list(SDL_FALSE, addToDevList, NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void build_device_change_list(const char *name, SDL_AudioSpec *spec, const int iscapture, AudioDeviceID devId, void *data) | ||||||
| build_device_change_list(const char *name, SDL_AudioSpec *spec, const int iscapture, AudioDeviceID devId, void *data) |  | ||||||
| { | { | ||||||
|     AudioDeviceList **list = (AudioDeviceList **) data; |     AudioDeviceList **list = (AudioDeviceList **)data; | ||||||
|     AudioDeviceList *item; |     AudioDeviceList *item; | ||||||
|     for (item = *list; item != NULL; item = item->next) { |     for (item = *list; item != NULL; item = item->next) { | ||||||
|         if (item->devid == devId) { |         if (item->devid == devId) { | ||||||
| @@ -243,12 +235,11 @@ build_device_change_list(const char *name, SDL_AudioSpec *spec, const int iscapt | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     add_to_internal_dev_list(iscapture, devId);  /* new device, add it. */ |     add_to_internal_dev_list(iscapture, devId); /* new device, add it. */ | ||||||
|     SDL_AddAudioDevice(iscapture, name, spec, (void *) ((size_t) devId)); |     SDL_AddAudioDevice(iscapture, name, spec, (void *)((size_t)devId)); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void reprocess_device_list(const int iscapture, AudioDeviceList **list) | ||||||
| reprocess_device_list(const int iscapture, AudioDeviceList **list) |  | ||||||
| { | { | ||||||
|     AudioDeviceList *item; |     AudioDeviceList *item; | ||||||
|     AudioDeviceList *prev = NULL; |     AudioDeviceList *prev = NULL; | ||||||
| @@ -265,7 +256,7 @@ reprocess_device_list(const int iscapture, AudioDeviceList **list) | |||||||
|         if (item->alive) { |         if (item->alive) { | ||||||
|             prev = item; |             prev = item; | ||||||
|         } else { |         } else { | ||||||
|             SDL_RemoveAudioDevice(iscapture, (void *) ((size_t) item->devid)); |             SDL_RemoveAudioDevice(iscapture, (void *)((size_t)item->devid)); | ||||||
|             if (prev) { |             if (prev) { | ||||||
|                 prev->next = item->next; |                 prev->next = item->next; | ||||||
|             } else { |             } else { | ||||||
| @@ -278,8 +269,7 @@ reprocess_device_list(const int iscapture, AudioDeviceList **list) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* this is called when the system's list of available audio devices changes. */ | /* this is called when the system's list of available audio devices changes. */ | ||||||
| static OSStatus | static OSStatus device_list_changed(AudioObjectID systemObj, UInt32 num_addr, const AudioObjectPropertyAddress *addrs, void *data) | ||||||
| device_list_changed(AudioObjectID systemObj, UInt32 num_addr, const AudioObjectPropertyAddress *addrs, void *data) |  | ||||||
| { | { | ||||||
|     reprocess_device_list(SDL_TRUE, &capture_devs); |     reprocess_device_list(SDL_TRUE, &capture_devs); | ||||||
|     reprocess_device_list(SDL_FALSE, &output_devs); |     reprocess_device_list(SDL_FALSE, &output_devs); | ||||||
| @@ -287,7 +277,6 @@ device_list_changed(AudioObjectID systemObj, UInt32 num_addr, const AudioObjectP | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| static int open_playback_devices; | static int open_playback_devices; | ||||||
| static int open_capture_devices; | static int open_capture_devices; | ||||||
| static int num_open_devices; | static int num_open_devices; | ||||||
| @@ -339,16 +328,14 @@ static void interruption_begin(_THIS) | |||||||
|  |  | ||||||
| static void interruption_end(_THIS) | static void interruption_end(_THIS) | ||||||
| { | { | ||||||
|     if (this != NULL && this->hidden != NULL && this->hidden->audioQueue != NULL |     if (this != NULL && this->hidden != NULL && this->hidden->audioQueue != NULL && this->hidden->interrupted && AudioQueueStart(this->hidden->audioQueue, NULL) == AVAudioSessionErrorCodeNone) { | ||||||
|     && this->hidden->interrupted |  | ||||||
|     && AudioQueueStart(this->hidden->audioQueue, NULL) == AVAudioSessionErrorCodeNone) { |  | ||||||
|         this->hidden->interrupted = SDL_FALSE; |         this->hidden->interrupted = SDL_FALSE; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @interface SDLInterruptionListener : NSObject | @interface SDLInterruptionListener : NSObject | ||||||
|  |  | ||||||
| @property (nonatomic, assign) SDL_AudioDevice *device; | @property(nonatomic, assign) SDL_AudioDevice *device; | ||||||
|  |  | ||||||
| @end | @end | ||||||
|  |  | ||||||
| @@ -356,7 +343,7 @@ static void interruption_end(_THIS) | |||||||
|  |  | ||||||
| - (void)audioSessionInterruption:(NSNotification *)note | - (void)audioSessionInterruption:(NSNotification *)note | ||||||
| { | { | ||||||
|     @synchronized (self) { |     @synchronized(self) { | ||||||
|         NSNumber *type = note.userInfo[AVAudioSessionInterruptionTypeKey]; |         NSNumber *type = note.userInfo[AVAudioSessionInterruptionTypeKey]; | ||||||
|         if (type.unsignedIntegerValue == AVAudioSessionInterruptionTypeBegan) { |         if (type.unsignedIntegerValue == AVAudioSessionInterruptionTypeBegan) { | ||||||
|             interruption_begin(self.device); |             interruption_begin(self.device); | ||||||
| @@ -368,7 +355,7 @@ static void interruption_end(_THIS) | |||||||
|  |  | ||||||
| - (void)applicationBecameActive:(NSNotification *)note | - (void)applicationBecameActive:(NSNotification *)note | ||||||
| { | { | ||||||
|     @synchronized (self) { |     @synchronized(self) { | ||||||
|         interruption_end(self.device); |         interruption_end(self.device); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -504,9 +491,9 @@ static BOOL update_audio_session(_THIS, SDL_bool open, SDL_bool allow_playandrec | |||||||
|             this->hidden->interruption_listener = CFBridgingRetain(listener); |             this->hidden->interruption_listener = CFBridgingRetain(listener); | ||||||
|         } else { |         } else { | ||||||
|             SDLInterruptionListener *listener = nil; |             SDLInterruptionListener *listener = nil; | ||||||
|             listener = (SDLInterruptionListener *) CFBridgingRelease(this->hidden->interruption_listener); |             listener = (SDLInterruptionListener *)CFBridgingRelease(this->hidden->interruption_listener); | ||||||
|             [center removeObserver:listener]; |             [center removeObserver:listener]; | ||||||
|             @synchronized (listener) { |             @synchronized(listener) { | ||||||
|                 listener.device = NULL; |                 listener.device = NULL; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -516,25 +503,23 @@ static BOOL update_audio_session(_THIS, SDL_bool open, SDL_bool allow_playandrec | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| /* The AudioQueue callback */ | /* The AudioQueue callback */ | ||||||
| static void | static void outputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer) | ||||||
| outputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) inUserData; |     SDL_AudioDevice *this = (SDL_AudioDevice *)inUserData; | ||||||
|  |  | ||||||
|     /* This flag is set before this->mixer_lock is destroyed during |     /* This flag is set before this->mixer_lock is destroyed during | ||||||
|        shutdown, so check it before grabbing the mutex, and then check it |        shutdown, so check it before grabbing the mutex, and then check it | ||||||
|        again _after_ in case we blocked waiting on the lock. */ |        again _after_ in case we blocked waiting on the lock. */ | ||||||
|     if (SDL_AtomicGet(&this->shutdown)) { |     if (SDL_AtomicGet(&this->shutdown)) { | ||||||
|         return;  /* don't do anything, since we don't even want to enqueue this buffer again. */ |         return; /* don't do anything, since we don't even want to enqueue this buffer again. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_LockMutex(this->mixer_lock); |     SDL_LockMutex(this->mixer_lock); | ||||||
|  |  | ||||||
|     if (SDL_AtomicGet(&this->shutdown)) { |     if (SDL_AtomicGet(&this->shutdown)) { | ||||||
|         SDL_UnlockMutex(this->mixer_lock); |         SDL_UnlockMutex(this->mixer_lock); | ||||||
|         return;  /* don't do anything, since we don't even want to enqueue this buffer again. */ |         return; /* don't do anything, since we don't even want to enqueue this buffer again. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!SDL_AtomicGet(&this->enabled) || SDL_AtomicGet(&this->paused)) { |     if (!SDL_AtomicGet(&this->enabled) || SDL_AtomicGet(&this->paused)) { | ||||||
| @@ -542,7 +527,7 @@ outputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffe | |||||||
|         SDL_memset(inBuffer->mAudioData, this->spec.silence, inBuffer->mAudioDataBytesCapacity); |         SDL_memset(inBuffer->mAudioData, this->spec.silence, inBuffer->mAudioDataBytesCapacity); | ||||||
|     } else if (this->stream) { |     } else if (this->stream) { | ||||||
|         UInt32 remaining = inBuffer->mAudioDataBytesCapacity; |         UInt32 remaining = inBuffer->mAudioDataBytesCapacity; | ||||||
|         Uint8 *ptr = (Uint8 *) inBuffer->mAudioData; |         Uint8 *ptr = (Uint8 *)inBuffer->mAudioData; | ||||||
|  |  | ||||||
|         while (remaining > 0) { |         while (remaining > 0) { | ||||||
|             if (SDL_AudioStreamAvailable(this->stream) == 0) { |             if (SDL_AudioStreamAvailable(this->stream) == 0) { | ||||||
| @@ -568,14 +553,14 @@ outputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffe | |||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         UInt32 remaining = inBuffer->mAudioDataBytesCapacity; |         UInt32 remaining = inBuffer->mAudioDataBytesCapacity; | ||||||
|         Uint8 *ptr = (Uint8 *) inBuffer->mAudioData; |         Uint8 *ptr = (Uint8 *)inBuffer->mAudioData; | ||||||
|  |  | ||||||
|         while (remaining > 0) { |         while (remaining > 0) { | ||||||
|             UInt32 len; |             UInt32 len; | ||||||
|             if (this->hidden->bufferOffset >= this->hidden->bufferSize) { |             if (this->hidden->bufferOffset >= this->hidden->bufferSize) { | ||||||
|                 /* Generate the data */ |                 /* Generate the data */ | ||||||
|                 (*this->callbackspec.callback)(this->callbackspec.userdata, |                 (*this->callbackspec.callback)(this->callbackspec.userdata, | ||||||
|                             this->hidden->buffer, this->hidden->bufferSize); |                                                this->hidden->buffer, this->hidden->bufferSize); | ||||||
|                 this->hidden->bufferOffset = 0; |                 this->hidden->bufferOffset = 0; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -583,8 +568,7 @@ outputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffe | |||||||
|             if (len > remaining) { |             if (len > remaining) { | ||||||
|                 len = remaining; |                 len = remaining; | ||||||
|             } |             } | ||||||
|             SDL_memcpy(ptr, (char *)this->hidden->buffer + |             SDL_memcpy(ptr, (char *)this->hidden->buffer + this->hidden->bufferOffset, len); | ||||||
|                        this->hidden->bufferOffset, len); |  | ||||||
|             ptr = ptr + len; |             ptr = ptr + len; | ||||||
|             remaining -= len; |             remaining -= len; | ||||||
|             this->hidden->bufferOffset += len; |             this->hidden->bufferOffset += len; | ||||||
| @@ -598,20 +582,19 @@ outputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffe | |||||||
|     SDL_UnlockMutex(this->mixer_lock); |     SDL_UnlockMutex(this->mixer_lock); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void inputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, | ||||||
| inputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, |                           const AudioTimeStamp *inStartTime, UInt32 inNumberPacketDescriptions, | ||||||
|               const AudioTimeStamp *inStartTime, UInt32 inNumberPacketDescriptions, |                           const AudioStreamPacketDescription *inPacketDescs) | ||||||
|               const AudioStreamPacketDescription *inPacketDescs) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) inUserData; |     SDL_AudioDevice *this = (SDL_AudioDevice *)inUserData; | ||||||
|  |  | ||||||
|     if (SDL_AtomicGet(&this->shutdown)) { |     if (SDL_AtomicGet(&this->shutdown)) { | ||||||
|         return;  /* don't do anything. */ |         return; /* don't do anything. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* ignore unless we're active. */ |     /* ignore unless we're active. */ | ||||||
|     if (!SDL_AtomicGet(&this->paused) && SDL_AtomicGet(&this->enabled)) { |     if (!SDL_AtomicGet(&this->paused) && SDL_AtomicGet(&this->enabled)) { | ||||||
|         const Uint8 *ptr = (const Uint8 *) inBuffer->mAudioData; |         const Uint8 *ptr = (const Uint8 *)inBuffer->mAudioData; | ||||||
|         UInt32 remaining = inBuffer->mAudioDataByteSize; |         UInt32 remaining = inBuffer->mAudioDataByteSize; | ||||||
|         while (remaining > 0) { |         while (remaining > 0) { | ||||||
|             UInt32 len = this->hidden->bufferSize - this->hidden->bufferOffset; |             UInt32 len = this->hidden->bufferSize - this->hidden->bufferOffset; | ||||||
| @@ -636,35 +619,32 @@ inputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer | |||||||
|     AudioQueueEnqueueBuffer(this->hidden->audioQueue, inBuffer, 0, NULL); |     AudioQueueEnqueueBuffer(this->hidden->audioQueue, inBuffer, 0, NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
| static const AudioObjectPropertyAddress alive_address = | static const AudioObjectPropertyAddress alive_address = { | ||||||
| { |  | ||||||
|     kAudioDevicePropertyDeviceIsAlive, |     kAudioDevicePropertyDeviceIsAlive, | ||||||
|     kAudioObjectPropertyScopeGlobal, |     kAudioObjectPropertyScopeGlobal, | ||||||
|     kAudioObjectPropertyElementMain |     kAudioObjectPropertyElementMain | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static OSStatus | static OSStatus device_unplugged(AudioObjectID devid, UInt32 num_addr, const AudioObjectPropertyAddress *addrs, void *data) | ||||||
| device_unplugged(AudioObjectID devid, UInt32 num_addr, const AudioObjectPropertyAddress *addrs, void *data) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) data; |     SDL_AudioDevice *this = (SDL_AudioDevice *)data; | ||||||
|     SDL_bool dead = SDL_FALSE; |     SDL_bool dead = SDL_FALSE; | ||||||
|     UInt32 isAlive = 1; |     UInt32 isAlive = 1; | ||||||
|     UInt32 size = sizeof (isAlive); |     UInt32 size = sizeof(isAlive); | ||||||
|     OSStatus error; |     OSStatus error; | ||||||
|  |  | ||||||
|     if (!SDL_AtomicGet(&this->enabled)) { |     if (!SDL_AtomicGet(&this->enabled)) { | ||||||
|         return 0;  /* already known to be dead. */ |         return 0; /* already known to be dead. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     error = AudioObjectGetPropertyData(this->hidden->deviceID, &alive_address, |     error = AudioObjectGetPropertyData(this->hidden->deviceID, &alive_address, | ||||||
|                                        0, NULL, &size, &isAlive); |                                        0, NULL, &size, &isAlive); | ||||||
|  |  | ||||||
|     if (error == kAudioHardwareBadDeviceError) { |     if (error == kAudioHardwareBadDeviceError) { | ||||||
|         dead = SDL_TRUE;  /* device was unplugged. */ |         dead = SDL_TRUE; /* device was unplugged. */ | ||||||
|     } else if ((error == kAudioHardwareNoError) && (!isAlive)) { |     } else if ((error == kAudioHardwareNoError) && (!isAlive)) { | ||||||
|         dead = SDL_TRUE;  /* device died in some other way. */ |         dead = SDL_TRUE; /* device died in some other way. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (dead) { |     if (dead) { | ||||||
| @@ -675,20 +655,18 @@ device_unplugged(AudioObjectID devid, UInt32 num_addr, const AudioObjectProperty | |||||||
| } | } | ||||||
|  |  | ||||||
| /* macOS calls this when the default device changed (if we have a default device open). */ | /* macOS calls this when the default device changed (if we have a default device open). */ | ||||||
| static OSStatus | static OSStatus default_device_changed(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses, void *inUserData) | ||||||
| default_device_changed(AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses, void *inUserData) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) inUserData; |     SDL_AudioDevice *this = (SDL_AudioDevice *)inUserData; | ||||||
|     #if DEBUG_COREAUDIO | #if DEBUG_COREAUDIO | ||||||
|     printf("COREAUDIO: default device changed for SDL audio device %p!\n", this); |     printf("COREAUDIO: default device changed for SDL audio device %p!\n", this); | ||||||
|     #endif | #endif | ||||||
|     SDL_AtomicSet(&this->hidden->device_change_flag, 1);  /* let the audioqueue thread pick up on this when safe to do so. */ |     SDL_AtomicSet(&this->hidden->device_change_flag, 1); /* let the audioqueue thread pick up on this when safe to do so. */ | ||||||
|     return noErr; |     return noErr; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static void | static void COREAUDIO_CloseDevice(_THIS) | ||||||
| COREAUDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     const SDL_bool iscapture = this->iscapture; |     const SDL_bool iscapture = this->iscapture; | ||||||
|     int i; |     int i; | ||||||
| @@ -696,7 +674,7 @@ COREAUDIO_CloseDevice(_THIS) | |||||||
| /* !!! FIXME: what does iOS do when a bluetooth audio device vanishes? Headphones unplugged? */ | /* !!! FIXME: what does iOS do when a bluetooth audio device vanishes? Headphones unplugged? */ | ||||||
| /* !!! FIXME: (we only do a "default" device on iOS right now...can we do more?) */ | /* !!! FIXME: (we only do a "default" device on iOS right now...can we do more?) */ | ||||||
| #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
|     if (this->handle != NULL) {  /* we don't register this listener for default devices. */ |     if (this->handle != NULL) { /* we don't register this listener for default devices. */ | ||||||
|         AudioObjectRemovePropertyListener(this->hidden->deviceID, &alive_address, device_unplugged, this); |         AudioObjectRemovePropertyListener(this->hidden->deviceID, &alive_address, device_unplugged, this); | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| @@ -710,7 +688,7 @@ COREAUDIO_CloseDevice(_THIS) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (this->hidden->thread) { |     if (this->hidden->thread) { | ||||||
|         SDL_assert(SDL_AtomicGet(&this->shutdown) != 0);  /* should have been set by SDL_audio.c */ |         SDL_assert(SDL_AtomicGet(&this->shutdown) != 0); /* should have been set by SDL_audio.c */ | ||||||
|         SDL_WaitThread(this->hidden->thread, NULL); |         SDL_WaitThread(this->hidden->thread, NULL); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -728,7 +706,7 @@ COREAUDIO_CloseDevice(_THIS) | |||||||
|         if (open_devices[i] == this) { |         if (open_devices[i] == this) { | ||||||
|             --num_open_devices; |             --num_open_devices; | ||||||
|             if (i < num_open_devices) { |             if (i < num_open_devices) { | ||||||
|                 SDL_memmove(&open_devices[i], &open_devices[i+1], sizeof(open_devices[i])*(num_open_devices - i)); |                 SDL_memmove(&open_devices[i], &open_devices[i + 1], sizeof(open_devices[i]) * (num_open_devices - i)); | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| @@ -750,12 +728,11 @@ COREAUDIO_CloseDevice(_THIS) | |||||||
| } | } | ||||||
|  |  | ||||||
| #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
| static int | static int prepare_device(_THIS) | ||||||
| prepare_device(_THIS) |  | ||||||
| { | { | ||||||
|     void *handle = this->handle; |     void *handle = this->handle; | ||||||
|     SDL_bool iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
|     AudioDeviceID devid = (AudioDeviceID) ((size_t) handle); |     AudioDeviceID devid = (AudioDeviceID)((size_t)handle); | ||||||
|     OSStatus result = noErr; |     OSStatus result = noErr; | ||||||
|     UInt32 size = 0; |     UInt32 size = 0; | ||||||
|     UInt32 alive = 0; |     UInt32 alive = 0; | ||||||
| @@ -768,23 +745,20 @@ prepare_device(_THIS) | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     if (handle == NULL) { |     if (handle == NULL) { | ||||||
|         size = sizeof (AudioDeviceID); |         size = sizeof(AudioDeviceID); | ||||||
|         addr.mSelector = |         addr.mSelector = | ||||||
|             ((iscapture) ? kAudioHardwarePropertyDefaultInputDevice : |             ((iscapture) ? kAudioHardwarePropertyDefaultInputDevice : kAudioHardwarePropertyDefaultOutputDevice); | ||||||
|             kAudioHardwarePropertyDefaultOutputDevice); |  | ||||||
|         result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr, |         result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr, | ||||||
|                                             0, NULL, &size, &devid); |                                             0, NULL, &size, &devid); | ||||||
|         CHECK_RESULT("AudioHardwareGetProperty (default device)"); |         CHECK_RESULT("AudioHardwareGetProperty (default device)"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     addr.mSelector = kAudioDevicePropertyDeviceIsAlive; |     addr.mSelector = kAudioDevicePropertyDeviceIsAlive; | ||||||
|     addr.mScope = iscapture ? kAudioDevicePropertyScopeInput : |     addr.mScope = iscapture ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; | ||||||
|                     kAudioDevicePropertyScopeOutput; |  | ||||||
|  |  | ||||||
|     size = sizeof (alive); |     size = sizeof(alive); | ||||||
|     result = AudioObjectGetPropertyData(devid, &addr, 0, NULL, &size, &alive); |     result = AudioObjectGetPropertyData(devid, &addr, 0, NULL, &size, &alive); | ||||||
|     CHECK_RESULT |     CHECK_RESULT("AudioDeviceGetProperty (kAudioDevicePropertyDeviceIsAlive)"); | ||||||
|         ("AudioDeviceGetProperty (kAudioDevicePropertyDeviceIsAlive)"); |  | ||||||
|  |  | ||||||
|     if (!alive) { |     if (!alive) { | ||||||
|         SDL_SetError("CoreAudio: requested device exists, but isn't alive."); |         SDL_SetError("CoreAudio: requested device exists, but isn't alive."); | ||||||
| @@ -792,7 +766,7 @@ prepare_device(_THIS) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     addr.mSelector = kAudioDevicePropertyHogMode; |     addr.mSelector = kAudioDevicePropertyHogMode; | ||||||
|     size = sizeof (pid); |     size = sizeof(pid); | ||||||
|     result = AudioObjectGetPropertyData(devid, &addr, 0, NULL, &size, &pid); |     result = AudioObjectGetPropertyData(devid, &addr, 0, NULL, &size, &pid); | ||||||
|  |  | ||||||
|     /* some devices don't support this property, so errors are fine here. */ |     /* some devices don't support this property, so errors are fine here. */ | ||||||
| @@ -805,8 +779,7 @@ prepare_device(_THIS) | |||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int assign_device_to_audioqueue(_THIS) | ||||||
| assign_device_to_audioqueue(_THIS) |  | ||||||
| { | { | ||||||
|     const AudioObjectPropertyAddress prop = { |     const AudioObjectPropertyAddress prop = { | ||||||
|         kAudioDevicePropertyDeviceUID, |         kAudioDevicePropertyDeviceUID, | ||||||
| @@ -816,7 +789,7 @@ assign_device_to_audioqueue(_THIS) | |||||||
|  |  | ||||||
|     OSStatus result; |     OSStatus result; | ||||||
|     CFStringRef devuid; |     CFStringRef devuid; | ||||||
|     UInt32 devuidsize = sizeof (devuid); |     UInt32 devuidsize = sizeof(devuid); | ||||||
|     result = AudioObjectGetPropertyData(this->hidden->deviceID, &prop, 0, NULL, &devuidsize, &devuid); |     result = AudioObjectGetPropertyData(this->hidden->deviceID, &prop, 0, NULL, &devuidsize, &devuid); | ||||||
|     CHECK_RESULT("AudioObjectGetPropertyData (kAudioDevicePropertyDeviceUID)"); |     CHECK_RESULT("AudioObjectGetPropertyData (kAudioDevicePropertyDeviceUID)"); | ||||||
|     result = AudioQueueSetProperty(this->hidden->audioQueue, kAudioQueueProperty_CurrentDevice, &devuid, devuidsize); |     result = AudioQueueSetProperty(this->hidden->audioQueue, kAudioQueueProperty_CurrentDevice, &devuid, devuidsize); | ||||||
| @@ -826,8 +799,7 @@ assign_device_to_audioqueue(_THIS) | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static int | static int prepare_audioqueue(_THIS) | ||||||
| prepare_audioqueue(_THIS) |  | ||||||
| { | { | ||||||
|     const AudioStreamBasicDescription *strdesc = &this->hidden->strdesc; |     const AudioStreamBasicDescription *strdesc = &this->hidden->strdesc; | ||||||
|     const int iscapture = this->iscapture; |     const int iscapture = this->iscapture; | ||||||
| @@ -835,7 +807,8 @@ prepare_audioqueue(_THIS) | |||||||
|     int i, numAudioBuffers = 2; |     int i, numAudioBuffers = 2; | ||||||
|     AudioChannelLayout layout; |     AudioChannelLayout layout; | ||||||
|     double MINIMUM_AUDIO_BUFFER_TIME_MS; |     double MINIMUM_AUDIO_BUFFER_TIME_MS; | ||||||
|     const double msecs = (this->spec.samples / ((double) this->spec.freq)) * 1000.0;; |     const double msecs = (this->spec.samples / ((double)this->spec.freq)) * 1000.0; | ||||||
|  |     ; | ||||||
|  |  | ||||||
|     SDL_assert(CFRunLoopGetCurrent() != NULL); |     SDL_assert(CFRunLoopGetCurrent() != NULL); | ||||||
|  |  | ||||||
| @@ -847,7 +820,7 @@ prepare_audioqueue(_THIS) | |||||||
|         CHECK_RESULT("AudioQueueNewOutput"); |         CHECK_RESULT("AudioQueueNewOutput"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
|     if (!assign_device_to_audioqueue(this)) { |     if (!assign_device_to_audioqueue(this)) { | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| @@ -861,7 +834,7 @@ prepare_audioqueue(_THIS) | |||||||
|         /* If this fails, oh well, we won't notice a device had an extraordinary event take place. */ |         /* If this fails, oh well, we won't notice a device had an extraordinary event take place. */ | ||||||
|         AudioObjectAddPropertyListener(this->hidden->deviceID, &alive_address, device_unplugged, this); |         AudioObjectAddPropertyListener(this->hidden->deviceID, &alive_address, device_unplugged, this); | ||||||
|     } |     } | ||||||
|     #endif | #endif | ||||||
|  |  | ||||||
|     /* Calculate the final parameters for this audio specification */ |     /* Calculate the final parameters for this audio specification */ | ||||||
|     SDL_CalculateAudioSpec(&this->spec); |     SDL_CalculateAudioSpec(&this->spec); | ||||||
| @@ -918,12 +891,12 @@ prepare_audioqueue(_THIS) | |||||||
|         MINIMUM_AUDIO_BUFFER_TIME_MS = 40.0; |         MINIMUM_AUDIO_BUFFER_TIME_MS = 40.0; | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|     if (msecs < MINIMUM_AUDIO_BUFFER_TIME_MS) {  /* use more buffers if we have a VERY small sample set. */ |     if (msecs < MINIMUM_AUDIO_BUFFER_TIME_MS) { /* use more buffers if we have a VERY small sample set. */ | ||||||
|         numAudioBuffers = ((int)SDL_ceil(MINIMUM_AUDIO_BUFFER_TIME_MS / msecs) * 2); |         numAudioBuffers = ((int)SDL_ceil(MINIMUM_AUDIO_BUFFER_TIME_MS / msecs) * 2); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->hidden->numAudioBuffers = numAudioBuffers; |     this->hidden->numAudioBuffers = numAudioBuffers; | ||||||
|     this->hidden->audioBuffer = SDL_calloc(1, sizeof (AudioQueueBufferRef) * numAudioBuffers); |     this->hidden->audioBuffer = SDL_calloc(1, sizeof(AudioQueueBufferRef) * numAudioBuffers); | ||||||
|     if (this->hidden->audioBuffer == NULL) { |     if (this->hidden->audioBuffer == NULL) { | ||||||
|         SDL_OutOfMemory(); |         SDL_OutOfMemory(); | ||||||
|         return 0; |         return 0; | ||||||
| @@ -950,24 +923,23 @@ prepare_audioqueue(_THIS) | |||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int audioqueue_thread(void *arg) | ||||||
| audioqueue_thread(void *arg) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) arg; |     SDL_AudioDevice *this = (SDL_AudioDevice *)arg; | ||||||
|     int rc; |     int rc; | ||||||
|  |  | ||||||
|     #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
|     const AudioObjectPropertyAddress default_device_address = { |     const AudioObjectPropertyAddress default_device_address = { | ||||||
|         this->iscapture ? kAudioHardwarePropertyDefaultInputDevice : kAudioHardwarePropertyDefaultOutputDevice, |         this->iscapture ? kAudioHardwarePropertyDefaultInputDevice : kAudioHardwarePropertyDefaultOutputDevice, | ||||||
|         kAudioObjectPropertyScopeGlobal, |         kAudioObjectPropertyScopeGlobal, | ||||||
|         kAudioObjectPropertyElementMain |         kAudioObjectPropertyElementMain | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     if (this->handle == NULL) {  /* opened the default device? Register to know if the user picks a new default. */ |     if (this->handle == NULL) { /* opened the default device? Register to know if the user picks a new default. */ | ||||||
|         /* we don't care if this fails; we just won't change to new default devices, but we still otherwise function in this case. */ |         /* we don't care if this fails; we just won't change to new default devices, but we still otherwise function in this case. */ | ||||||
|         AudioObjectAddPropertyListener(kAudioObjectSystemObject, &default_device_address, default_device_changed, this); |         AudioObjectAddPropertyListener(kAudioObjectSystemObject, &default_device_address, default_device_changed, this); | ||||||
|     } |     } | ||||||
|     #endif | #endif | ||||||
|  |  | ||||||
|     rc = prepare_audioqueue(this); |     rc = prepare_audioqueue(this); | ||||||
|     if (!rc) { |     if (!rc) { | ||||||
| @@ -984,14 +956,14 @@ audioqueue_thread(void *arg) | |||||||
|     while (!SDL_AtomicGet(&this->shutdown)) { |     while (!SDL_AtomicGet(&this->shutdown)) { | ||||||
|         CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.10, 1); |         CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.10, 1); | ||||||
|  |  | ||||||
|         #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
|         if ((this->handle == NULL) && SDL_AtomicGet(&this->hidden->device_change_flag)) { |         if ((this->handle == NULL) && SDL_AtomicGet(&this->hidden->device_change_flag)) { | ||||||
|             const AudioDeviceID prev_devid = this->hidden->deviceID; |             const AudioDeviceID prev_devid = this->hidden->deviceID; | ||||||
|             SDL_AtomicSet(&this->hidden->device_change_flag, 0); |             SDL_AtomicSet(&this->hidden->device_change_flag, 0); | ||||||
|  |  | ||||||
|             #if DEBUG_COREAUDIO | #if DEBUG_COREAUDIO | ||||||
|             printf("COREAUDIO: audioqueue_thread is trying to switch to new default device!\n"); |             printf("COREAUDIO: audioqueue_thread is trying to switch to new default device!\n"); | ||||||
|             #endif | #endif | ||||||
|  |  | ||||||
|             /* if any of this fails, there's not much to do but wait to see if the user gives up |             /* if any of this fails, there's not much to do but wait to see if the user gives up | ||||||
|                and quits (flagging the audioqueue for shutdown), or toggles to some other system |                and quits (flagging the audioqueue for shutdown), or toggles to some other system | ||||||
| @@ -1009,26 +981,25 @@ audioqueue_thread(void *arg) | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         #endif | #endif | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!this->iscapture) {  /* Drain off any pending playback. */ |     if (!this->iscapture) { /* Drain off any pending playback. */ | ||||||
|         const CFTimeInterval secs = (((this->spec.size / (SDL_AUDIO_BITSIZE(this->spec.format) / 8)) / this->spec.channels) / ((CFTimeInterval) this->spec.freq)) * 2.0; |         const CFTimeInterval secs = (((this->spec.size / (SDL_AUDIO_BITSIZE(this->spec.format) / 8)) / this->spec.channels) / ((CFTimeInterval)this->spec.freq)) * 2.0; | ||||||
|         CFRunLoopRunInMode(kCFRunLoopDefaultMode, secs, 0); |         CFRunLoopRunInMode(kCFRunLoopDefaultMode, secs, 0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
|     if (this->handle == NULL) { |     if (this->handle == NULL) { | ||||||
|         /* we don't care if this fails; we just won't change to new default devices, but we still otherwise function in this case. */ |         /* we don't care if this fails; we just won't change to new default devices, but we still otherwise function in this case. */ | ||||||
|         AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &default_device_address, default_device_changed, this); |         AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &default_device_address, default_device_changed, this); | ||||||
|     } |     } | ||||||
|     #endif | #endif | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int COREAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| COREAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     AudioStreamBasicDescription *strdesc; |     AudioStreamBasicDescription *strdesc; | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
| @@ -1064,7 +1035,7 @@ COREAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     /* Stop CoreAudio from doing expensive audio rate conversion */ |     /* Stop CoreAudio from doing expensive audio rate conversion */ | ||||||
|     @autoreleasepool { |     @autoreleasepool { | ||||||
|         AVAudioSession* session = [AVAudioSession sharedInstance]; |         AVAudioSession *session = [AVAudioSession sharedInstance]; | ||||||
|         [session setPreferredSampleRate:this->spec.freq error:nil]; |         [session setPreferredSampleRate:this->spec.freq error:nil]; | ||||||
|         this->spec.freq = (int)session.sampleRate; |         this->spec.freq = (int)session.sampleRate; | ||||||
| #if TARGET_OS_TV | #if TARGET_OS_TV | ||||||
| @@ -1108,7 +1079,7 @@ COREAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!test_format) {      /* shouldn't happen, but just in case... */ |     if (!test_format) { /* shouldn't happen, but just in case... */ | ||||||
|         return SDL_SetError("%s: Unsupported audio format", "coreaudio"); |         return SDL_SetError("%s: Unsupported audio format", "coreaudio"); | ||||||
|     } |     } | ||||||
|     this->spec.format = test_format; |     this->spec.format = test_format; | ||||||
| @@ -1133,7 +1104,7 @@ COREAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     /* This has to init in a new thread so it can get its own CFRunLoop. :/ */ |     /* This has to init in a new thread so it can get its own CFRunLoop. :/ */ | ||||||
|     this->hidden->ready_semaphore = SDL_CreateSemaphore(0); |     this->hidden->ready_semaphore = SDL_CreateSemaphore(0); | ||||||
|     if (!this->hidden->ready_semaphore) { |     if (!this->hidden->ready_semaphore) { | ||||||
|         return -1;  /* oh well. */ |         return -1; /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->hidden->thread = SDL_CreateThreadInternal(audioqueue_thread, "AudioQueue thread", 512 * 1024, this); |     this->hidden->thread = SDL_CreateThreadInternal(audioqueue_thread, "AudioQueue thread", 512 * 1024, this); | ||||||
| @@ -1153,10 +1124,9 @@ COREAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
| } | } | ||||||
|  |  | ||||||
| #if !MACOSX_COREAUDIO | #if !MACOSX_COREAUDIO | ||||||
| static int | static int COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
|     AVAudioSession* session = [AVAudioSession sharedInstance]; |     AVAudioSession *session = [AVAudioSession sharedInstance]; | ||||||
|  |  | ||||||
|     if (name != NULL) { |     if (name != NULL) { | ||||||
|         *name = NULL; |         *name = NULL; | ||||||
| @@ -1166,9 +1136,8 @@ COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
|     spec->channels = [session outputNumberOfChannels]; |     spec->channels = [session outputNumberOfChannels]; | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| #else /* MACOSX_COREAUDIO */ | #else  /* MACOSX_COREAUDIO */ | ||||||
| static int | static int COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
|     AudioDeviceID devid; |     AudioDeviceID devid; | ||||||
|     AudioBufferList *buflist; |     AudioBufferList *buflist; | ||||||
| @@ -1207,7 +1176,7 @@ COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
|  |  | ||||||
|     /* Get the Device ID */ |     /* Get the Device ID */ | ||||||
|     cfstr = NULL; |     cfstr = NULL; | ||||||
|     size = sizeof (AudioDeviceID); |     size = sizeof(AudioDeviceID); | ||||||
|     result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr, |     result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr, | ||||||
|                                         0, NULL, &size, &devid); |                                         0, NULL, &size, &devid); | ||||||
|  |  | ||||||
| @@ -1217,7 +1186,7 @@ COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
|  |  | ||||||
|     if (name != NULL) { |     if (name != NULL) { | ||||||
|         /* Use the Device ID to get the name */ |         /* Use the Device ID to get the name */ | ||||||
|         size = sizeof (CFStringRef); |         size = sizeof(CFStringRef); | ||||||
|         result = AudioObjectGetPropertyData(devid, &nameaddr, 0, NULL, &size, &cfstr); |         result = AudioObjectGetPropertyData(devid, &nameaddr, 0, NULL, &size, &cfstr); | ||||||
|  |  | ||||||
|         if (result != noErr) { |         if (result != noErr) { | ||||||
| @@ -1225,8 +1194,8 @@ COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfstr), |         len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfstr), | ||||||
|                                                         kCFStringEncodingUTF8); |                                                 kCFStringEncodingUTF8); | ||||||
|         devname = (char *) SDL_malloc(len + 1); |         devname = (char *)SDL_malloc(len + 1); | ||||||
|         usable = ((devname != NULL) && |         usable = ((devname != NULL) && | ||||||
|                   (CFStringGetCString(cfstr, devname, len + 1, kCFStringEncodingUTF8))); |                   (CFStringGetCString(cfstr, devname, len + 1, kCFStringEncodingUTF8))); | ||||||
|         CFRelease(cfstr); |         CFRelease(cfstr); | ||||||
| @@ -1258,13 +1227,13 @@ COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
|         return SDL_SetError("%s: Default Device Sample Rate not found", "coreaudio"); |         return SDL_SetError("%s: Default Device Sample Rate not found", "coreaudio"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     spec->freq = (int) sampleRate; |     spec->freq = (int)sampleRate; | ||||||
|  |  | ||||||
|     result = AudioObjectGetPropertyDataSize(devid, &bufaddr, 0, NULL, &size); |     result = AudioObjectGetPropertyDataSize(devid, &bufaddr, 0, NULL, &size); | ||||||
|     if (result != noErr) |     if (result != noErr) | ||||||
|         return SDL_SetError("%s: Default Device Data Size not found", "coreaudio"); |         return SDL_SetError("%s: Default Device Data Size not found", "coreaudio"); | ||||||
|  |  | ||||||
|     buflist = (AudioBufferList *) SDL_malloc(size); |     buflist = (AudioBufferList *)SDL_malloc(size); | ||||||
|     if (buflist == NULL) |     if (buflist == NULL) | ||||||
|         return SDL_SetError("%s: Default Device Buffer List not found", "coreaudio"); |         return SDL_SetError("%s: Default Device Buffer List not found", "coreaudio"); | ||||||
|  |  | ||||||
| @@ -1288,8 +1257,7 @@ COREAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
| } | } | ||||||
| #endif /* MACOSX_COREAUDIO */ | #endif /* MACOSX_COREAUDIO */ | ||||||
|  |  | ||||||
| static void | static void COREAUDIO_Deinitialize(void) | ||||||
| COREAUDIO_Deinitialize(void) |  | ||||||
| { | { | ||||||
| #if MACOSX_COREAUDIO | #if MACOSX_COREAUDIO | ||||||
|     AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &devlist_address, device_list_changed, NULL); |     AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &devlist_address, device_list_changed, NULL); | ||||||
| @@ -1298,8 +1266,7 @@ COREAUDIO_Deinitialize(void) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool COREAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| COREAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->OpenDevice = COREAUDIO_OpenDevice; |     impl->OpenDevice = COREAUDIO_OpenDevice; | ||||||
| @@ -1319,7 +1286,7 @@ COREAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->SupportsNonPow2Samples = SDL_TRUE; |     impl->SupportsNonPow2Samples = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap COREAUDIO_bootstrap = { | AudioBootStrap COREAUDIO_bootstrap = { | ||||||
|   | |||||||
| @@ -44,21 +44,20 @@ static SDL_bool SupportsIMMDevice = SDL_FALSE; | |||||||
| #endif /* HAVE_MMDEVICEAPI_H */ | #endif /* HAVE_MMDEVICEAPI_H */ | ||||||
|  |  | ||||||
| /* DirectX function pointers for audio */ | /* DirectX function pointers for audio */ | ||||||
| static void* DSoundDLL = NULL; | static void *DSoundDLL = NULL; | ||||||
| typedef HRESULT (WINAPI *fnDirectSoundCreate8)(LPGUID,LPDIRECTSOUND*,LPUNKNOWN); | typedef HRESULT(WINAPI *fnDirectSoundCreate8)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); | ||||||
| typedef HRESULT (WINAPI *fnDirectSoundEnumerateW)(LPDSENUMCALLBACKW, LPVOID); | typedef HRESULT(WINAPI *fnDirectSoundEnumerateW)(LPDSENUMCALLBACKW, LPVOID); | ||||||
| typedef HRESULT (WINAPI *fnDirectSoundCaptureCreate8)(LPCGUID,LPDIRECTSOUNDCAPTURE8 *,LPUNKNOWN); | typedef HRESULT(WINAPI *fnDirectSoundCaptureCreate8)(LPCGUID, LPDIRECTSOUNDCAPTURE8 *, LPUNKNOWN); | ||||||
| typedef HRESULT (WINAPI *fnDirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW,LPVOID); | typedef HRESULT(WINAPI *fnDirectSoundCaptureEnumerateW)(LPDSENUMCALLBACKW, LPVOID); | ||||||
| static fnDirectSoundCreate8 pDirectSoundCreate8 = NULL; | static fnDirectSoundCreate8 pDirectSoundCreate8 = NULL; | ||||||
| static fnDirectSoundEnumerateW pDirectSoundEnumerateW = NULL; | static fnDirectSoundEnumerateW pDirectSoundEnumerateW = NULL; | ||||||
| static fnDirectSoundCaptureCreate8 pDirectSoundCaptureCreate8 = NULL; | static fnDirectSoundCaptureCreate8 pDirectSoundCaptureCreate8 = NULL; | ||||||
| static fnDirectSoundCaptureEnumerateW pDirectSoundCaptureEnumerateW = NULL; | static fnDirectSoundCaptureEnumerateW pDirectSoundCaptureEnumerateW = NULL; | ||||||
|  |  | ||||||
| static const GUID SDL_KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010,{ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | static const GUID SDL_KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | ||||||
| static const GUID SDL_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { 0x00000003, 0x0000, 0x0010,{ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | static const GUID SDL_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | ||||||
|  |  | ||||||
| static void | static void DSOUND_Unload(void) | ||||||
| DSOUND_Unload(void) |  | ||||||
| { | { | ||||||
|     pDirectSoundCreate8 = NULL; |     pDirectSoundCreate8 = NULL; | ||||||
|     pDirectSoundEnumerateW = NULL; |     pDirectSoundEnumerateW = NULL; | ||||||
| @@ -71,9 +70,7 @@ DSOUND_Unload(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int DSOUND_Load(void) | ||||||
| static int |  | ||||||
| DSOUND_Load(void) |  | ||||||
| { | { | ||||||
|     int loaded = 0; |     int loaded = 0; | ||||||
|  |  | ||||||
| @@ -83,17 +80,19 @@ DSOUND_Load(void) | |||||||
|     if (DSoundDLL == NULL) { |     if (DSoundDLL == NULL) { | ||||||
|         SDL_SetError("DirectSound: failed to load DSOUND.DLL"); |         SDL_SetError("DirectSound: failed to load DSOUND.DLL"); | ||||||
|     } else { |     } else { | ||||||
|         /* Now make sure we have DirectX 8 or better... */ | /* Now make sure we have DirectX 8 or better... */ | ||||||
|         #define DSOUNDLOAD(f) { \ | #define DSOUNDLOAD(f)                                  \ | ||||||
|             p##f = (fn##f) SDL_LoadFunction(DSoundDLL, #f); \ |     {                                                  \ | ||||||
|             if (!p##f) loaded = 0; \ |         p##f = (fn##f)SDL_LoadFunction(DSoundDLL, #f); \ | ||||||
|         } |         if (!p##f)                                     \ | ||||||
|         loaded = 1;  /* will reset if necessary. */ |             loaded = 0;                                \ | ||||||
|  |     } | ||||||
|  |         loaded = 1; /* will reset if necessary. */ | ||||||
|         DSOUNDLOAD(DirectSoundCreate8); |         DSOUNDLOAD(DirectSoundCreate8); | ||||||
|         DSOUNDLOAD(DirectSoundEnumerateW); |         DSOUNDLOAD(DirectSoundEnumerateW); | ||||||
|         DSOUNDLOAD(DirectSoundCaptureCreate8); |         DSOUNDLOAD(DirectSoundCaptureCreate8); | ||||||
|         DSOUNDLOAD(DirectSoundCaptureEnumerateW); |         DSOUNDLOAD(DirectSoundCaptureEnumerateW); | ||||||
|         #undef DSOUNDLOAD | #undef DSOUNDLOAD | ||||||
|  |  | ||||||
|         if (!loaded) { |         if (!loaded) { | ||||||
|             SDL_SetError("DirectSound: System doesn't appear to have DX8."); |             SDL_SetError("DirectSound: System doesn't appear to have DX8."); | ||||||
| @@ -107,8 +106,7 @@ DSOUND_Load(void) | |||||||
|     return loaded; |     return loaded; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int SetDSerror(const char *function, int code) | ||||||
| SetDSerror(const char *function, int code) |  | ||||||
| { | { | ||||||
|     const char *error; |     const char *error; | ||||||
|  |  | ||||||
| @@ -154,14 +152,12 @@ SetDSerror(const char *function, int code) | |||||||
|     return SDL_SetError("%s: %s (0x%x)", function, error, code); |     return SDL_SetError("%s: %s (0x%x)", function, error, code); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DSOUND_FreeDeviceHandle(void *handle) | ||||||
| DSOUND_FreeDeviceHandle(void *handle) |  | ||||||
| { | { | ||||||
|     SDL_free(handle); |     SDL_free(handle); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int DSOUND_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| DSOUND_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
| #if HAVE_MMDEVICEAPI_H | #if HAVE_MMDEVICEAPI_H | ||||||
|     if (SupportsIMMDevice) { |     if (SupportsIMMDevice) { | ||||||
| @@ -171,29 +167,27 @@ DSOUND_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
|     return SDL_Unsupported(); |     return SDL_Unsupported(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static BOOL CALLBACK | static BOOL CALLBACK FindAllDevs(LPGUID guid, LPCWSTR desc, LPCWSTR module, LPVOID data) | ||||||
| FindAllDevs(LPGUID guid, LPCWSTR desc, LPCWSTR module, LPVOID data) |  | ||||||
| { | { | ||||||
|     const int iscapture = (int) ((size_t) data); |     const int iscapture = (int)((size_t)data); | ||||||
|     if (guid != NULL) {  /* skip default device */ |     if (guid != NULL) { /* skip default device */ | ||||||
|         char *str = WIN_LookupAudioDeviceName(desc, guid); |         char *str = WIN_LookupAudioDeviceName(desc, guid); | ||||||
|         if (str != NULL) { |         if (str != NULL) { | ||||||
|             LPGUID cpyguid = (LPGUID) SDL_malloc(sizeof (GUID)); |             LPGUID cpyguid = (LPGUID)SDL_malloc(sizeof(GUID)); | ||||||
|             SDL_memcpy(cpyguid, guid, sizeof (GUID)); |             SDL_memcpy(cpyguid, guid, sizeof(GUID)); | ||||||
|  |  | ||||||
|             /* Note that spec is NULL, because we are required to connect to the |             /* Note that spec is NULL, because we are required to connect to the | ||||||
|              * device before getting the channel mask and output format, making |              * device before getting the channel mask and output format, making | ||||||
|              * this information inaccessible at enumeration time |              * this information inaccessible at enumeration time | ||||||
|              */ |              */ | ||||||
|             SDL_AddAudioDevice(iscapture, str, NULL, cpyguid); |             SDL_AddAudioDevice(iscapture, str, NULL, cpyguid); | ||||||
|             SDL_free(str);  /* addfn() makes a copy of this string. */ |             SDL_free(str); /* addfn() makes a copy of this string. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     return TRUE;  /* keep enumerating. */ |     return TRUE; /* keep enumerating. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DSOUND_DetectDevices(void) | ||||||
| DSOUND_DetectDevices(void) |  | ||||||
| { | { | ||||||
| #if HAVE_MMDEVICEAPI_H | #if HAVE_MMDEVICEAPI_H | ||||||
|     if (SupportsIMMDevice) { |     if (SupportsIMMDevice) { | ||||||
| @@ -207,9 +201,7 @@ DSOUND_DetectDevices(void) | |||||||
| #endif /* HAVE_MMDEVICEAPI_H*/ | #endif /* HAVE_MMDEVICEAPI_H*/ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void DSOUND_WaitDevice(_THIS) | ||||||
| static void |  | ||||||
| DSOUND_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
|     DWORD status = 0; |     DWORD status = 0; | ||||||
|     DWORD cursor = 0; |     DWORD cursor = 0; | ||||||
| @@ -266,8 +258,7 @@ DSOUND_WaitDevice(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DSOUND_PlayDevice(_THIS) | ||||||
| DSOUND_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     /* Unlock the buffer, allowing it to play */ |     /* Unlock the buffer, allowing it to play */ | ||||||
|     if (this->hidden->locked_buf) { |     if (this->hidden->locked_buf) { | ||||||
| @@ -277,8 +268,7 @@ DSOUND_PlayDevice(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *DSOUND_GetDeviceBuf(_THIS) | ||||||
| DSOUND_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     DWORD cursor = 0; |     DWORD cursor = 0; | ||||||
|     DWORD junk = 0; |     DWORD junk = 0; | ||||||
| @@ -319,14 +309,13 @@ DSOUND_GetDeviceBuf(_THIS) | |||||||
|     /* Lock the audio buffer */ |     /* Lock the audio buffer */ | ||||||
|     result = IDirectSoundBuffer_Lock(this->hidden->mixbuf, cursor, |     result = IDirectSoundBuffer_Lock(this->hidden->mixbuf, cursor, | ||||||
|                                      this->spec.size, |                                      this->spec.size, | ||||||
|                                      (LPVOID *) & this->hidden->locked_buf, |                                      (LPVOID *)&this->hidden->locked_buf, | ||||||
|                                      &rawlen, NULL, &junk, 0); |                                      &rawlen, NULL, &junk, 0); | ||||||
|     if (result == DSERR_BUFFERLOST) { |     if (result == DSERR_BUFFERLOST) { | ||||||
|         IDirectSoundBuffer_Restore(this->hidden->mixbuf); |         IDirectSoundBuffer_Restore(this->hidden->mixbuf); | ||||||
|         result = IDirectSoundBuffer_Lock(this->hidden->mixbuf, cursor, |         result = IDirectSoundBuffer_Lock(this->hidden->mixbuf, cursor, | ||||||
|                                          this->spec.size, |                                          this->spec.size, | ||||||
|                                          (LPVOID *) & this-> |                                          (LPVOID *)&this->hidden->locked_buf, &rawlen, NULL, | ||||||
|                                          hidden->locked_buf, &rawlen, NULL, |  | ||||||
|                                          &junk, 0); |                                          &junk, 0); | ||||||
|     } |     } | ||||||
|     if (result != DS_OK) { |     if (result != DS_OK) { | ||||||
| @@ -336,8 +325,7 @@ DSOUND_GetDeviceBuf(_THIS) | |||||||
|     return this->hidden->locked_buf; |     return this->hidden->locked_buf; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int DSOUND_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| DSOUND_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = this->hidden; |     struct SDL_PrivateAudioData *h = this->hidden; | ||||||
|     DWORD junk, cursor, ptr1len, ptr2len; |     DWORD junk, cursor, ptr1len, ptr2len; | ||||||
| @@ -346,7 +334,7 @@ DSOUND_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     SDL_assert(buflen == this->spec.size); |     SDL_assert(buflen == this->spec.size); | ||||||
|  |  | ||||||
|     while (SDL_TRUE) { |     while (SDL_TRUE) { | ||||||
|         if (SDL_AtomicGet(&this->shutdown)) {  /* in case the buffer froze... */ |         if (SDL_AtomicGet(&this->shutdown)) { /* in case the buffer froze... */ | ||||||
|             SDL_memset(buffer, this->spec.silence, buflen); |             SDL_memset(buffer, this->spec.silence, buflen); | ||||||
|             return buflen; |             return buflen; | ||||||
|         } |         } | ||||||
| @@ -355,7 +343,7 @@ DSOUND_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|         if ((cursor / this->spec.size) == h->lastchunk) { |         if ((cursor / this->spec.size) == h->lastchunk) { | ||||||
|             SDL_Delay(1);  /* FIXME: find out how much time is left and sleep that long */ |             SDL_Delay(1); /* FIXME: find out how much time is left and sleep that long */ | ||||||
|         } else { |         } else { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| @@ -380,8 +368,7 @@ DSOUND_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     return ptr1len; |     return ptr1len; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DSOUND_FlushCapture(_THIS) | ||||||
| DSOUND_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = this->hidden; |     struct SDL_PrivateAudioData *h = this->hidden; | ||||||
|     DWORD junk, cursor; |     DWORD junk, cursor; | ||||||
| @@ -390,8 +377,7 @@ DSOUND_FlushCapture(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DSOUND_CloseDevice(_THIS) | ||||||
| DSOUND_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (this->hidden->mixbuf != NULL) { |     if (this->hidden->mixbuf != NULL) { | ||||||
|         IDirectSoundBuffer_Stop(this->hidden->mixbuf); |         IDirectSoundBuffer_Stop(this->hidden->mixbuf); | ||||||
| @@ -414,8 +400,7 @@ DSOUND_CloseDevice(_THIS) | |||||||
|    number of audio chunks available in the created buffer. This is for |    number of audio chunks available in the created buffer. This is for | ||||||
|    playback devices, not capture. |    playback devices, not capture. | ||||||
| */ | */ | ||||||
| static int | static int CreateSecondary(_THIS, const DWORD bufsize, WAVEFORMATEX *wfmt) | ||||||
| CreateSecondary(_THIS, const DWORD bufsize, WAVEFORMATEX *wfmt) |  | ||||||
| { | { | ||||||
|     LPDIRECTSOUND sndObj = this->hidden->sound; |     LPDIRECTSOUND sndObj = this->hidden->sound; | ||||||
|     LPDIRECTSOUNDBUFFER *sndbuf = &this->hidden->mixbuf; |     LPDIRECTSOUNDBUFFER *sndbuf = &this->hidden->mixbuf; | ||||||
| @@ -439,14 +424,14 @@ CreateSecondary(_THIS, const DWORD bufsize, WAVEFORMATEX *wfmt) | |||||||
|  |  | ||||||
|     /* Silence the initial audio buffer */ |     /* Silence the initial audio buffer */ | ||||||
|     result = IDirectSoundBuffer_Lock(*sndbuf, 0, format.dwBufferBytes, |     result = IDirectSoundBuffer_Lock(*sndbuf, 0, format.dwBufferBytes, | ||||||
|                                      (LPVOID *) & pvAudioPtr1, &dwAudioBytes1, |                                      (LPVOID *)&pvAudioPtr1, &dwAudioBytes1, | ||||||
|                                      (LPVOID *) & pvAudioPtr2, &dwAudioBytes2, |                                      (LPVOID *)&pvAudioPtr2, &dwAudioBytes2, | ||||||
|                                      DSBLOCK_ENTIREBUFFER); |                                      DSBLOCK_ENTIREBUFFER); | ||||||
|     if (result == DS_OK) { |     if (result == DS_OK) { | ||||||
|         SDL_memset(pvAudioPtr1, this->spec.silence, dwAudioBytes1); |         SDL_memset(pvAudioPtr1, this->spec.silence, dwAudioBytes1); | ||||||
|         IDirectSoundBuffer_Unlock(*sndbuf, |         IDirectSoundBuffer_Unlock(*sndbuf, | ||||||
|                                   (LPVOID) pvAudioPtr1, dwAudioBytes1, |                                   (LPVOID)pvAudioPtr1, dwAudioBytes1, | ||||||
|                                   (LPVOID) pvAudioPtr2, dwAudioBytes2); |                                   (LPVOID)pvAudioPtr2, dwAudioBytes2); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* We're ready to go */ |     /* We're ready to go */ | ||||||
| @@ -457,8 +442,7 @@ CreateSecondary(_THIS, const DWORD bufsize, WAVEFORMATEX *wfmt) | |||||||
|    number of audio chunks available in the created buffer. This is for |    number of audio chunks available in the created buffer. This is for | ||||||
|    capture devices, not playback. |    capture devices, not playback. | ||||||
| */ | */ | ||||||
| static int | static int CreateCaptureBuffer(_THIS, const DWORD bufsize, WAVEFORMATEX *wfmt) | ||||||
| CreateCaptureBuffer(_THIS, const DWORD bufsize, WAVEFORMATEX *wfmt) |  | ||||||
| { | { | ||||||
|     LPDIRECTSOUNDCAPTURE capture = this->hidden->capture; |     LPDIRECTSOUNDCAPTURE capture = this->hidden->capture; | ||||||
|     LPDIRECTSOUNDCAPTUREBUFFER *capturebuf = &this->hidden->capturebuf; |     LPDIRECTSOUNDCAPTUREBUFFER *capturebuf = &this->hidden->capturebuf; | ||||||
| @@ -466,7 +450,7 @@ CreateCaptureBuffer(_THIS, const DWORD bufsize, WAVEFORMATEX *wfmt) | |||||||
|     HRESULT result; |     HRESULT result; | ||||||
|  |  | ||||||
|     SDL_zero(format); |     SDL_zero(format); | ||||||
|     format.dwSize = sizeof (format); |     format.dwSize = sizeof(format); | ||||||
|     format.dwFlags = DSCBCAPS_WAVEMAPPED; |     format.dwFlags = DSCBCAPS_WAVEMAPPED; | ||||||
|     format.dwBufferBytes = bufsize; |     format.dwBufferBytes = bufsize; | ||||||
|     format.lpwfxFormat = wfmt; |     format.lpwfxFormat = wfmt; | ||||||
| @@ -497,15 +481,14 @@ CreateCaptureBuffer(_THIS, const DWORD bufsize, WAVEFORMATEX *wfmt) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int DSOUND_OpenDevice(_THIS, const char *devname) | ||||||
| DSOUND_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     const DWORD numchunks = 8; |     const DWORD numchunks = 8; | ||||||
|     HRESULT result; |     HRESULT result; | ||||||
|     SDL_bool tried_format = SDL_FALSE; |     SDL_bool tried_format = SDL_FALSE; | ||||||
|     SDL_bool iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
|     LPGUID guid = (LPGUID) this->handle; |     LPGUID guid = (LPGUID)this->handle; | ||||||
|     DWORD bufsize; |     DWORD bufsize; | ||||||
|  |  | ||||||
|     /* Initialize all variables that we clean on shutdown */ |     /* Initialize all variables that we clean on shutdown */ | ||||||
| @@ -551,8 +534,8 @@ DSOUND_OpenDevice(_THIS, const char *devname) | |||||||
|             bufsize = numchunks * this->spec.size; |             bufsize = numchunks * this->spec.size; | ||||||
|             if ((bufsize < DSBSIZE_MIN) || (bufsize > DSBSIZE_MAX)) { |             if ((bufsize < DSBSIZE_MIN) || (bufsize > DSBSIZE_MAX)) { | ||||||
|                 SDL_SetError("Sound buffer size must be between %d and %d", |                 SDL_SetError("Sound buffer size must be between %d and %d", | ||||||
|                              (int) ((DSBSIZE_MIN < numchunks) ? 1 : DSBSIZE_MIN / numchunks), |                              (int)((DSBSIZE_MIN < numchunks) ? 1 : DSBSIZE_MIN / numchunks), | ||||||
|                              (int) (DSBSIZE_MAX / numchunks)); |                              (int)(DSBSIZE_MAX / numchunks)); | ||||||
|             } else { |             } else { | ||||||
|                 int rc; |                 int rc; | ||||||
|                 WAVEFORMATEXTENSIBLE wfmt; |                 WAVEFORMATEXTENSIBLE wfmt; | ||||||
| @@ -568,8 +551,7 @@ DSOUND_OpenDevice(_THIS, const char *devname) | |||||||
|                     } |                     } | ||||||
|                     wfmt.Samples.wValidBitsPerSample = SDL_AUDIO_BITSIZE(this->spec.format); |                     wfmt.Samples.wValidBitsPerSample = SDL_AUDIO_BITSIZE(this->spec.format); | ||||||
|  |  | ||||||
|                     switch (this->spec.channels) |                     switch (this->spec.channels) { | ||||||
|                     { |  | ||||||
|                     case 3: /* 3.0 (or 2.1) */ |                     case 3: /* 3.0 (or 2.1) */ | ||||||
|                         wfmt.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER; |                         wfmt.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER; | ||||||
|                         break; |                         break; | ||||||
| @@ -604,7 +586,7 @@ DSOUND_OpenDevice(_THIS, const char *devname) | |||||||
|                 wfmt.Format.nBlockAlign = wfmt.Format.nChannels * (wfmt.Format.wBitsPerSample / 8); |                 wfmt.Format.nBlockAlign = wfmt.Format.nChannels * (wfmt.Format.wBitsPerSample / 8); | ||||||
|                 wfmt.Format.nAvgBytesPerSec = wfmt.Format.nSamplesPerSec * wfmt.Format.nBlockAlign; |                 wfmt.Format.nAvgBytesPerSec = wfmt.Format.nSamplesPerSec * wfmt.Format.nBlockAlign; | ||||||
|  |  | ||||||
|                 rc = iscapture ? CreateCaptureBuffer(this, bufsize, (WAVEFORMATEX*) &wfmt) : CreateSecondary(this, bufsize, (WAVEFORMATEX*) &wfmt); |                 rc = iscapture ? CreateCaptureBuffer(this, bufsize, (WAVEFORMATEX *)&wfmt) : CreateSecondary(this, bufsize, (WAVEFORMATEX *)&wfmt); | ||||||
|                 if (rc == 0) { |                 if (rc == 0) { | ||||||
|                     this->hidden->num_buffers = numchunks; |                     this->hidden->num_buffers = numchunks; | ||||||
|                     break; |                     break; | ||||||
| @@ -619,19 +601,17 @@ DSOUND_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     if (!test_format) { |     if (!test_format) { | ||||||
|         if (tried_format) { |         if (tried_format) { | ||||||
|             return -1;  /* CreateSecondary() should have called SDL_SetError(). */ |             return -1; /* CreateSecondary() should have called SDL_SetError(). */ | ||||||
|         } |         } | ||||||
|         return SDL_SetError("%s: Unsupported audio format", "directsound"); |         return SDL_SetError("%s: Unsupported audio format", "directsound"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Playback buffers will auto-start playing in DSOUND_WaitDevice() */ |     /* Playback buffers will auto-start playing in DSOUND_WaitDevice() */ | ||||||
|  |  | ||||||
|     return 0;                   /* good to go. */ |     return 0; /* good to go. */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void DSOUND_Deinitialize(void) | ||||||
| static void |  | ||||||
| DSOUND_Deinitialize(void) |  | ||||||
| { | { | ||||||
| #if HAVE_MMDEVICEAPI_H | #if HAVE_MMDEVICEAPI_H | ||||||
|     if (SupportsIMMDevice) { |     if (SupportsIMMDevice) { | ||||||
| @@ -642,9 +622,7 @@ DSOUND_Deinitialize(void) | |||||||
|     DSOUND_Unload(); |     DSOUND_Unload(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static SDL_bool DSOUND_Init(SDL_AudioDriverImpl *impl) | ||||||
| static SDL_bool |  | ||||||
| DSOUND_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     if (!DSOUND_Load()) { |     if (!DSOUND_Load()) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -670,7 +648,7 @@ DSOUND_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->SupportsNonPow2Samples = SDL_TRUE; |     impl->SupportsNonPow2Samples = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap DSOUND_bootstrap = { | AudioBootStrap DSOUND_bootstrap = { | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| /* The DirectSound objects */ | /* The DirectSound objects */ | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
|   | |||||||
| @@ -36,21 +36,19 @@ | |||||||
|  |  | ||||||
| /* !!! FIXME: these should be SDL hints, not environment variables. */ | /* !!! FIXME: these should be SDL hints, not environment variables. */ | ||||||
| /* environment variables and defaults. */ | /* environment variables and defaults. */ | ||||||
| #define DISKENVR_OUTFILE         "SDL_DISKAUDIOFILE" | #define DISKENVR_OUTFILE    "SDL_DISKAUDIOFILE" | ||||||
| #define DISKDEFAULT_OUTFILE      "sdlaudio.raw" | #define DISKDEFAULT_OUTFILE "sdlaudio.raw" | ||||||
| #define DISKENVR_INFILE         "SDL_DISKAUDIOFILEIN" | #define DISKENVR_INFILE     "SDL_DISKAUDIOFILEIN" | ||||||
| #define DISKDEFAULT_INFILE      "sdlaudio-in.raw" | #define DISKDEFAULT_INFILE  "sdlaudio-in.raw" | ||||||
| #define DISKENVR_IODELAY      "SDL_DISKAUDIODELAY" | #define DISKENVR_IODELAY    "SDL_DISKAUDIODELAY" | ||||||
|  |  | ||||||
| /* This function waits until it is possible to write a full sound buffer */ | /* This function waits until it is possible to write a full sound buffer */ | ||||||
| static void | static void DISKAUDIO_WaitDevice(_THIS) | ||||||
| DISKAUDIO_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
|     SDL_Delay(_this->hidden->io_delay); |     SDL_Delay(_this->hidden->io_delay); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DISKAUDIO_PlayDevice(_THIS) | ||||||
| DISKAUDIO_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     const size_t written = SDL_RWwrite(_this->hidden->io, |     const size_t written = SDL_RWwrite(_this->hidden->io, | ||||||
|                                        _this->hidden->mixbuf, |                                        _this->hidden->mixbuf, | ||||||
| @@ -65,14 +63,12 @@ DISKAUDIO_PlayDevice(_THIS) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *DISKAUDIO_GetDeviceBuf(_THIS) | ||||||
| DISKAUDIO_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return _this->hidden->mixbuf; |     return _this->hidden->mixbuf; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int DISKAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| DISKAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = _this->hidden; |     struct SDL_PrivateAudioData *h = _this->hidden; | ||||||
|     const int origbuflen = buflen; |     const int origbuflen = buflen; | ||||||
| @@ -81,9 +77,9 @@ DISKAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|  |  | ||||||
|     if (h->io) { |     if (h->io) { | ||||||
|         const size_t br = SDL_RWread(h->io, buffer, 1, buflen); |         const size_t br = SDL_RWread(h->io, buffer, 1, buflen); | ||||||
|         buflen -= (int) br; |         buflen -= (int)br; | ||||||
|         buffer = ((Uint8 *) buffer) + br; |         buffer = ((Uint8 *)buffer) + br; | ||||||
|         if (buflen > 0) {  /* EOF (or error, but whatever). */ |         if (buflen > 0) { /* EOF (or error, but whatever). */ | ||||||
|             SDL_RWclose(h->io); |             SDL_RWclose(h->io); | ||||||
|             h->io = NULL; |             h->io = NULL; | ||||||
|         } |         } | ||||||
| @@ -95,15 +91,12 @@ DISKAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     return origbuflen; |     return origbuflen; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DISKAUDIO_FlushCapture(_THIS) | ||||||
| DISKAUDIO_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     /* no op...we don't advance the file pointer or anything. */ |     /* no op...we don't advance the file pointer or anything. */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void DISKAUDIO_CloseDevice(_THIS) | ||||||
| static void |  | ||||||
| DISKAUDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (_this->hidden->io != NULL) { |     if (_this->hidden->io != NULL) { | ||||||
|         SDL_RWclose(_this->hidden->io); |         SDL_RWclose(_this->hidden->io); | ||||||
| @@ -112,9 +105,7 @@ DISKAUDIO_CloseDevice(_THIS) | |||||||
|     SDL_free(_this->hidden); |     SDL_free(_this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static const char *get_filename(const SDL_bool iscapture, const char *devname) | ||||||
| static const char * |  | ||||||
| get_filename(const SDL_bool iscapture, const char *devname) |  | ||||||
| { | { | ||||||
|     if (devname == NULL) { |     if (devname == NULL) { | ||||||
|         devname = SDL_getenv(iscapture ? DISKENVR_INFILE : DISKENVR_OUTFILE); |         devname = SDL_getenv(iscapture ? DISKENVR_INFILE : DISKENVR_OUTFILE); | ||||||
| @@ -125,8 +116,7 @@ get_filename(const SDL_bool iscapture, const char *devname) | |||||||
|     return devname; |     return devname; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int DISKAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| DISKAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     void *handle = _this->handle; |     void *handle = _this->handle; | ||||||
|     /* handle != NULL means "user specified the placeholder name on the fake detected device list" */ |     /* handle != NULL means "user specified the placeholder name on the fake detected device list" */ | ||||||
| @@ -155,7 +145,7 @@ DISKAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     /* Allocate mixing buffer */ |     /* Allocate mixing buffer */ | ||||||
|     if (!iscapture) { |     if (!iscapture) { | ||||||
|         _this->hidden->mixbuf = (Uint8 *) SDL_malloc(_this->spec.size); |         _this->hidden->mixbuf = (Uint8 *)SDL_malloc(_this->spec.size); | ||||||
|         if (_this->hidden->mixbuf == NULL) { |         if (_this->hidden->mixbuf == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -163,24 +153,22 @@ DISKAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_LogCritical(SDL_LOG_CATEGORY_AUDIO, |     SDL_LogCritical(SDL_LOG_CATEGORY_AUDIO, | ||||||
|                 "You are using the SDL disk i/o audio driver!\n"); |                     "You are using the SDL disk i/o audio driver!\n"); | ||||||
|     SDL_LogCritical(SDL_LOG_CATEGORY_AUDIO, |     SDL_LogCritical(SDL_LOG_CATEGORY_AUDIO, | ||||||
|                 " %s file [%s].\n", iscapture ? "Reading from" : "Writing to", |                     " %s file [%s].\n", iscapture ? "Reading from" : "Writing to", | ||||||
|                 fname); |                     fname); | ||||||
|  |  | ||||||
|     /* We're ready to rock and roll. :-) */ |     /* We're ready to rock and roll. :-) */ | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DISKAUDIO_DetectDevices(void) | ||||||
| DISKAUDIO_DetectDevices(void) |  | ||||||
| { | { | ||||||
|     SDL_AddAudioDevice(SDL_FALSE, DEFAULT_OUTPUT_DEVNAME, NULL, (void *) 0x1); |     SDL_AddAudioDevice(SDL_FALSE, DEFAULT_OUTPUT_DEVNAME, NULL, (void *)0x1); | ||||||
|     SDL_AddAudioDevice(SDL_TRUE, DEFAULT_INPUT_DEVNAME, NULL, (void *) 0x2); |     SDL_AddAudioDevice(SDL_TRUE, DEFAULT_INPUT_DEVNAME, NULL, (void *)0x2); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool DISKAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| DISKAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->OpenDevice = DISKAUDIO_OpenDevice; |     impl->OpenDevice = DISKAUDIO_OpenDevice; | ||||||
| @@ -197,7 +185,7 @@ DISKAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->SupportsNonPow2Samples = SDL_TRUE; |     impl->SupportsNonPow2Samples = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap DISKAUDIO_bootstrap = { | AudioBootStrap DISKAUDIO_bootstrap = { | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *_this | #define _THIS SDL_AudioDevice *_this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|   | |||||||
| @@ -24,8 +24,8 @@ | |||||||
|  |  | ||||||
| /* Allow access to a raw mixing buffer */ | /* Allow access to a raw mixing buffer */ | ||||||
|  |  | ||||||
| #include <stdio.h>              /* For perror() */ | #include <stdio.h>  /* For perror() */ | ||||||
| #include <string.h>             /* For strerror() */ | #include <string.h> /* For strerror() */ | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| @@ -42,16 +42,12 @@ | |||||||
| #include "../SDL_audiodev_c.h" | #include "../SDL_audiodev_c.h" | ||||||
| #include "SDL_dspaudio.h" | #include "SDL_dspaudio.h" | ||||||
|  |  | ||||||
|  | static void DSP_DetectDevices(void) | ||||||
| static void |  | ||||||
| DSP_DetectDevices(void) |  | ||||||
| { | { | ||||||
|     SDL_EnumUnixAudioDevices(0, NULL); |     SDL_EnumUnixAudioDevices(0, NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void DSP_CloseDevice(_THIS) | ||||||
| static void |  | ||||||
| DSP_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (this->hidden->audio_fd >= 0) { |     if (this->hidden->audio_fd >= 0) { | ||||||
|         close(this->hidden->audio_fd); |         close(this->hidden->audio_fd); | ||||||
| @@ -60,9 +56,7 @@ DSP_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int DSP_OpenDevice(_THIS, const char *devname) | ||||||
| static int |  | ||||||
| DSP_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     SDL_bool iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
|     const int flags = ((iscapture) ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT); |     const int flags = ((iscapture) ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT); | ||||||
| @@ -205,11 +199,12 @@ DSP_OpenDevice(_THIS, const char *devname) | |||||||
|     SDL_CalculateAudioSpec(&this->spec); |     SDL_CalculateAudioSpec(&this->spec); | ||||||
|  |  | ||||||
|     /* Determine the power of two of the fragment size */ |     /* Determine the power of two of the fragment size */ | ||||||
|     for (frag_spec = 0; (0x01U << frag_spec) < this->spec.size; ++frag_spec); |     for (frag_spec = 0; (0x01U << frag_spec) < this->spec.size; ++frag_spec) | ||||||
|  |         ; | ||||||
|     if ((0x01U << frag_spec) != this->spec.size) { |     if ((0x01U << frag_spec) != this->spec.size) { | ||||||
|         return SDL_SetError("Fragment size must be a power of two"); |         return SDL_SetError("Fragment size must be a power of two"); | ||||||
|     } |     } | ||||||
|     frag_spec |= 0x00020000;    /* two fragments, for low latency */ |     frag_spec |= 0x00020000; /* two fragments, for low latency */ | ||||||
|  |  | ||||||
|     /* Set the audio buffering parameters */ |     /* Set the audio buffering parameters */ | ||||||
| #ifdef DEBUG_AUDIO | #ifdef DEBUG_AUDIO | ||||||
| @@ -233,7 +228,7 @@ DSP_OpenDevice(_THIS, const char *devname) | |||||||
|     /* Allocate mixing buffer */ |     /* Allocate mixing buffer */ | ||||||
|     if (!iscapture) { |     if (!iscapture) { | ||||||
|         this->hidden->mixlen = this->spec.size; |         this->hidden->mixlen = this->spec.size; | ||||||
|         this->hidden->mixbuf = (Uint8 *) SDL_malloc(this->hidden->mixlen); |         this->hidden->mixbuf = (Uint8 *)SDL_malloc(this->hidden->mixlen); | ||||||
|         if (this->hidden->mixbuf == NULL) { |         if (this->hidden->mixbuf == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -244,9 +239,7 @@ DSP_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void DSP_PlayDevice(_THIS) | ||||||
| static void |  | ||||||
| DSP_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = this->hidden; |     struct SDL_PrivateAudioData *h = this->hidden; | ||||||
|     if (write(h->audio_fd, h->mixbuf, h->mixlen) == -1) { |     if (write(h->audio_fd, h->mixbuf, h->mixlen) == -1) { | ||||||
| @@ -258,27 +251,24 @@ DSP_PlayDevice(_THIS) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *DSP_GetDeviceBuf(_THIS) | ||||||
| DSP_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return this->hidden->mixbuf; |     return this->hidden->mixbuf; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int DSP_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| DSP_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     return (int)read(this->hidden->audio_fd, buffer, buflen); |     return (int)read(this->hidden->audio_fd, buffer, buflen); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DSP_FlushCapture(_THIS) | ||||||
| DSP_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = this->hidden; |     struct SDL_PrivateAudioData *h = this->hidden; | ||||||
|     audio_buf_info info; |     audio_buf_info info; | ||||||
|     if (ioctl(h->audio_fd, SNDCTL_DSP_GETISPACE, &info) == 0) { |     if (ioctl(h->audio_fd, SNDCTL_DSP_GETISPACE, &info) == 0) { | ||||||
|         while (info.bytes > 0) { |         while (info.bytes > 0) { | ||||||
|             char buf[512]; |             char buf[512]; | ||||||
|             const size_t len = SDL_min(sizeof (buf), info.bytes); |             const size_t len = SDL_min(sizeof(buf), info.bytes); | ||||||
|             const ssize_t br = read(h->audio_fd, buf, len); |             const ssize_t br = read(h->audio_fd, buf, len); | ||||||
|             if (br <= 0) { |             if (br <= 0) { | ||||||
|                 break; |                 break; | ||||||
| @@ -289,22 +279,20 @@ DSP_FlushCapture(_THIS) | |||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool InitTimeDevicesExist = SDL_FALSE; | static SDL_bool InitTimeDevicesExist = SDL_FALSE; | ||||||
| static int | static int look_for_devices_test(int fd) | ||||||
| look_for_devices_test(int fd) |  | ||||||
| { | { | ||||||
|     InitTimeDevicesExist = SDL_TRUE;  /* note that _something_ exists. */ |     InitTimeDevicesExist = SDL_TRUE; /* note that _something_ exists. */ | ||||||
|     /* Don't add to the device list, we're just seeing if any devices exist. */ |     /* Don't add to the device list, we're just seeing if any devices exist. */ | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool DSP_Init(SDL_AudioDriverImpl *impl) | ||||||
| DSP_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     InitTimeDevicesExist = SDL_FALSE; |     InitTimeDevicesExist = SDL_FALSE; | ||||||
|     SDL_EnumUnixAudioDevices(0, look_for_devices_test); |     SDL_EnumUnixAudioDevices(0, look_for_devices_test); | ||||||
|     if (!InitTimeDevicesExist) { |     if (!InitTimeDevicesExist) { | ||||||
|         SDL_SetError("dsp: No such audio device"); |         SDL_SetError("dsp: No such audio device"); | ||||||
|         return SDL_FALSE;  /* maybe try a different backend. */ |         return SDL_FALSE; /* maybe try a different backend. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
| @@ -319,10 +307,9 @@ DSP_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->AllowsArbitraryDeviceNames = SDL_TRUE; |     impl->AllowsArbitraryDeviceNames = SDL_TRUE; | ||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| AudioBootStrap DSP_bootstrap = { | AudioBootStrap DSP_bootstrap = { | ||||||
|     "dsp", "OSS /dev/dsp standard audio", DSP_Init, SDL_FALSE |     "dsp", "OSS /dev/dsp standard audio", DSP_Init, SDL_FALSE | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
| @@ -37,7 +37,7 @@ struct SDL_PrivateAudioData | |||||||
|     Uint8 *mixbuf; |     Uint8 *mixbuf; | ||||||
|     int mixlen; |     int mixlen; | ||||||
| }; | }; | ||||||
| #define FUDGE_TICKS 10      /* The scheduler overhead ticks per frame */ | #define FUDGE_TICKS 10 /* The scheduler overhead ticks per frame */ | ||||||
|  |  | ||||||
| #endif /* SDL_dspaudio_h_ */ | #endif /* SDL_dspaudio_h_ */ | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|   | |||||||
| @@ -27,15 +27,14 @@ | |||||||
| #include "../SDL_audio_c.h" | #include "../SDL_audio_c.h" | ||||||
| #include "SDL_dummyaudio.h" | #include "SDL_dummyaudio.h" | ||||||
|  |  | ||||||
| static int | static int DUMMYAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| DUMMYAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     _this->hidden = (void *) 0x1;  /* just something non-NULL */ |     _this->hidden = (void *)0x1; /* just something non-NULL */ | ||||||
|     return 0;                   /* always succeeds. */ |  | ||||||
|  |     return 0; /* always succeeds. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int DUMMYAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| DUMMYAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     /* Delay to make this sort of simulate real audio input. */ |     /* Delay to make this sort of simulate real audio input. */ | ||||||
|     SDL_Delay((_this->spec.samples * 1000) / _this->spec.freq); |     SDL_Delay((_this->spec.samples * 1000) / _this->spec.freq); | ||||||
| @@ -45,8 +44,7 @@ DUMMYAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     return buflen; |     return buflen; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool DUMMYAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| DUMMYAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->OpenDevice = DUMMYAUDIO_OpenDevice; |     impl->OpenDevice = DUMMYAUDIO_OpenDevice; | ||||||
| @@ -56,7 +54,7 @@ DUMMYAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; |     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; | ||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap DUMMYAUDIO_bootstrap = { | AudioBootStrap DUMMYAUDIO_bootstrap = { | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *_this | #define _THIS SDL_AudioDevice *_this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|   | |||||||
| @@ -33,10 +33,10 @@ | |||||||
|    !!! FIXME:  true always once pthread support becomes widespread. Revisit this code |    !!! FIXME:  true always once pthread support becomes widespread. Revisit this code | ||||||
|    !!! FIXME:  at some point and see what needs to be done for that! */ |    !!! FIXME:  at some point and see what needs to be done for that! */ | ||||||
|  |  | ||||||
| static void | static void FeedAudioDevice(_THIS, const void *buf, const int buflen) | ||||||
| FeedAudioDevice(_THIS, const void *buf, const int buflen) |  | ||||||
| { | { | ||||||
|     const int framelen = (SDL_AUDIO_BITSIZE(this->spec.format) / 8) * this->spec.channels; |     const int framelen = (SDL_AUDIO_BITSIZE(this->spec.format) / 8) * this->spec.channels; | ||||||
|  |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|     MAIN_THREAD_EM_ASM({ |     MAIN_THREAD_EM_ASM({ | ||||||
|         var SDL2 = Module['SDL2']; |         var SDL2 = Module['SDL2']; | ||||||
|         var numChannels = SDL2.audio.currentOutputBuffer['numberOfChannels']; |         var numChannels = SDL2.audio.currentOutputBuffer['numberOfChannels']; | ||||||
| @@ -51,10 +51,10 @@ FeedAudioDevice(_THIS, const void *buf, const int buflen) | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }, buf, buflen / framelen); |     }, buf, buflen / framelen); | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void HandleAudioProcess(_THIS) | ||||||
| HandleAudioProcess(_THIS) |  | ||||||
| { | { | ||||||
|     SDL_AudioCallback callback = this->callbackspec.callback; |     SDL_AudioCallback callback = this->callbackspec.callback; | ||||||
|     const int stream_len = this->callbackspec.size; |     const int stream_len = this->callbackspec.size; | ||||||
| @@ -70,12 +70,12 @@ HandleAudioProcess(_THIS) | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (this->stream == NULL) {  /* no conversion necessary. */ |     if (this->stream == NULL) { /* no conversion necessary. */ | ||||||
|         SDL_assert(this->spec.size == stream_len); |         SDL_assert(this->spec.size == stream_len); | ||||||
|         callback(this->callbackspec.userdata, this->work_buffer, stream_len); |         callback(this->callbackspec.userdata, this->work_buffer, stream_len); | ||||||
|     } else {  /* streaming/converting */ |     } else { /* streaming/converting */ | ||||||
|         int got; |         int got; | ||||||
|         while (SDL_AudioStreamAvailable(this->stream) < ((int) this->spec.size)) { |         while (SDL_AudioStreamAvailable(this->stream) < ((int)this->spec.size)) { | ||||||
|             callback(this->callbackspec.userdata, this->work_buffer, stream_len); |             callback(this->callbackspec.userdata, this->work_buffer, stream_len); | ||||||
|             if (SDL_AudioStreamPut(this->stream, this->work_buffer, stream_len) == -1) { |             if (SDL_AudioStreamPut(this->stream, this->work_buffer, stream_len) == -1) { | ||||||
|                 SDL_AudioStreamClear(this->stream); |                 SDL_AudioStreamClear(this->stream); | ||||||
| @@ -94,8 +94,7 @@ HandleAudioProcess(_THIS) | |||||||
|     FeedAudioDevice(this, this->work_buffer, this->spec.size); |     FeedAudioDevice(this, this->work_buffer, this->spec.size); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void HandleCaptureProcess(_THIS) | ||||||
| HandleCaptureProcess(_THIS) |  | ||||||
| { | { | ||||||
|     SDL_AudioCallback callback = this->callbackspec.callback; |     SDL_AudioCallback callback = this->callbackspec.callback; | ||||||
|     const int stream_len = this->callbackspec.size; |     const int stream_len = this->callbackspec.size; | ||||||
| @@ -106,6 +105,7 @@ HandleCaptureProcess(_THIS) | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|     MAIN_THREAD_EM_ASM({ |     MAIN_THREAD_EM_ASM({ | ||||||
|         var SDL2 = Module['SDL2']; |         var SDL2 = Module['SDL2']; | ||||||
|         var numChannels = SDL2.capture.currentCaptureBuffer.numberOfChannels; |         var numChannels = SDL2.capture.currentCaptureBuffer.numberOfChannels; | ||||||
| @@ -126,13 +126,14 @@ HandleCaptureProcess(_THIS) | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }, this->work_buffer, (this->spec.size / sizeof (float)) / this->spec.channels); |     }, this->work_buffer, (this->spec.size / sizeof (float)) / this->spec.channels); | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
|     /* okay, we've got an interleaved float32 array in C now. */ |     /* okay, we've got an interleaved float32 array in C now. */ | ||||||
|  |  | ||||||
|     if (this->stream == NULL) {  /* no conversion necessary. */ |     if (this->stream == NULL) { /* no conversion necessary. */ | ||||||
|         SDL_assert(this->spec.size == stream_len); |         SDL_assert(this->spec.size == stream_len); | ||||||
|         callback(this->callbackspec.userdata, this->work_buffer, stream_len); |         callback(this->callbackspec.userdata, this->work_buffer, stream_len); | ||||||
|     } else {  /* streaming/converting */ |     } else { /* streaming/converting */ | ||||||
|         if (SDL_AudioStreamPut(this->stream, this->work_buffer, this->spec.size) == -1) { |         if (SDL_AudioStreamPut(this->stream, this->work_buffer, this->spec.size) == -1) { | ||||||
|             SDL_AtomicSet(&this->enabled, 0); |             SDL_AtomicSet(&this->enabled, 0); | ||||||
|         } |         } | ||||||
| @@ -143,15 +144,14 @@ HandleCaptureProcess(_THIS) | |||||||
|             if (got != stream_len) { |             if (got != stream_len) { | ||||||
|                 SDL_memset(this->work_buffer, this->callbackspec.silence, stream_len); |                 SDL_memset(this->work_buffer, this->callbackspec.silence, stream_len); | ||||||
|             } |             } | ||||||
|             callback(this->callbackspec.userdata, this->work_buffer, stream_len);  /* Send it to the app. */ |             callback(this->callbackspec.userdata, this->work_buffer, stream_len); /* Send it to the app. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void EMSCRIPTENAUDIO_CloseDevice(_THIS) | ||||||
| static void |  | ||||||
| EMSCRIPTENAUDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|  |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|     MAIN_THREAD_EM_ASM({ |     MAIN_THREAD_EM_ASM({ | ||||||
|         var SDL2 = Module['SDL2']; |         var SDL2 = Module['SDL2']; | ||||||
|         if ($0) { |         if ($0) { | ||||||
| @@ -190,14 +190,14 @@ EMSCRIPTENAUDIO_CloseDevice(_THIS) | |||||||
|             SDL2.audioContext = undefined; |             SDL2.audioContext = undefined; | ||||||
|         } |         } | ||||||
|     }, this->iscapture); |     }, this->iscapture); | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
| #if 0  /* !!! FIXME: currently not used. Can we move some stuff off the SDL2 namespace? --ryan. */ | #if 0  /* !!! FIXME: currently not used. Can we move some stuff off the SDL2 namespace? --ryan. */ | ||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
|     SDL_bool iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
| @@ -205,6 +205,7 @@ EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     /* based on parts of library_sdl.js */ |     /* based on parts of library_sdl.js */ | ||||||
|  |  | ||||||
|  |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|     /* create context */ |     /* create context */ | ||||||
|     result = MAIN_THREAD_EM_ASM_INT({ |     result = MAIN_THREAD_EM_ASM_INT({ | ||||||
|         if(typeof(Module['SDL2']) === 'undefined') { |         if(typeof(Module['SDL2']) === 'undefined') { | ||||||
| @@ -229,6 +230,8 @@ EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|         } |         } | ||||||
|         return SDL2.audioContext === undefined ? -1 : 0; |         return SDL2.audioContext === undefined ? -1 : 0; | ||||||
|     }, iscapture); |     }, iscapture); | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
|     if (result < 0) { |     if (result < 0) { | ||||||
|         return SDL_SetError("Web Audio API is not available!"); |         return SDL_SetError("Web Audio API is not available!"); | ||||||
|     } |     } | ||||||
| @@ -268,6 +271,7 @@ EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     SDL_CalculateAudioSpec(&this->spec); |     SDL_CalculateAudioSpec(&this->spec); | ||||||
|  |  | ||||||
|  |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|     if (iscapture) { |     if (iscapture) { | ||||||
|         /* The idea is to take the capture media stream, hook it up to an |         /* The idea is to take the capture media stream, hook it up to an | ||||||
|            audio graph where we can pass it through a ScriptProcessorNode |            audio graph where we can pass it through a ScriptProcessorNode | ||||||
| @@ -339,17 +343,16 @@ EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|             SDL2.audio.scriptProcessorNode['connect'](SDL2.audioContext['destination']); |             SDL2.audio.scriptProcessorNode['connect'](SDL2.audioContext['destination']); | ||||||
|         }, this->spec.channels, this->spec.samples, HandleAudioProcess, this); |         }, this->spec.channels, this->spec.samples, HandleAudioProcess, this); | ||||||
|     } |     } | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void EMSCRIPTENAUDIO_LockOrUnlockDeviceWithNoMixerLock(SDL_AudioDevice *device) | ||||||
| EMSCRIPTENAUDIO_LockOrUnlockDeviceWithNoMixerLock(SDL_AudioDevice * device) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool EMSCRIPTENAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| EMSCRIPTENAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     SDL_bool available, capture_available; |     SDL_bool available, capture_available; | ||||||
|  |  | ||||||
| @@ -363,6 +366,7 @@ EMSCRIPTENAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->LockDevice = impl->UnlockDevice = EMSCRIPTENAUDIO_LockOrUnlockDeviceWithNoMixerLock; |     impl->LockDevice = impl->UnlockDevice = EMSCRIPTENAUDIO_LockOrUnlockDeviceWithNoMixerLock; | ||||||
|     impl->ProvidesOwnCallbackThread = SDL_TRUE; |     impl->ProvidesOwnCallbackThread = SDL_TRUE; | ||||||
|  |  | ||||||
|  |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|     /* check availability */ |     /* check availability */ | ||||||
|     available = MAIN_THREAD_EM_ASM_INT({ |     available = MAIN_THREAD_EM_ASM_INT({ | ||||||
|         if (typeof(AudioContext) !== 'undefined') { |         if (typeof(AudioContext) !== 'undefined') { | ||||||
| @@ -372,11 +376,13 @@ EMSCRIPTENAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     }); |     }); | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
|     if (!available) { |     if (!available) { | ||||||
|         SDL_SetError("No audio context available"); |         SDL_SetError("No audio context available"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|     capture_available = available && MAIN_THREAD_EM_ASM_INT({ |     capture_available = available && MAIN_THREAD_EM_ASM_INT({ | ||||||
|         if ((typeof(navigator.mediaDevices) !== 'undefined') && (typeof(navigator.mediaDevices.getUserMedia) !== 'undefined')) { |         if ((typeof(navigator.mediaDevices) !== 'undefined') && (typeof(navigator.mediaDevices.getUserMedia) !== 'undefined')) { | ||||||
|             return true; |             return true; | ||||||
| @@ -385,6 +391,7 @@ EMSCRIPTENAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     }); |     }); | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
|     impl->HasCaptureSupport = capture_available ? SDL_TRUE : SDL_FALSE; |     impl->HasCaptureSupport = capture_available ? SDL_TRUE : SDL_FALSE; | ||||||
|     impl->OnlyHasDefaultCaptureDevice = capture_available ? SDL_TRUE : SDL_FALSE; |     impl->OnlyHasDefaultCaptureDevice = capture_available ? SDL_TRUE : SDL_FALSE; | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|   | |||||||
| @@ -42,8 +42,7 @@ extern "C" | |||||||
|  |  | ||||||
| /* !!! FIXME: have the callback call the higher level to avoid code dupe. */ | /* !!! FIXME: have the callback call the higher level to avoid code dupe. */ | ||||||
| /* The Haiku callback for handling the audio buffer */ | /* The Haiku callback for handling the audio buffer */ | ||||||
| static void | static void FillSound(void *device, void *stream, size_t len, | ||||||
| FillSound(void *device, void *stream, size_t len, |  | ||||||
|           const media_raw_audio_format & format) |           const media_raw_audio_format & format) | ||||||
| { | { | ||||||
|     SDL_AudioDevice *audio = (SDL_AudioDevice *) device; |     SDL_AudioDevice *audio = (SDL_AudioDevice *) device; | ||||||
| @@ -85,8 +84,7 @@ FillSound(void *device, void *stream, size_t len, | |||||||
|     SDL_UnlockMutex(audio->mixer_lock); |     SDL_UnlockMutex(audio->mixer_lock); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void HAIKUAUDIO_CloseDevice(_THIS) | ||||||
| HAIKUAUDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (_this->hidden->audio_obj) { |     if (_this->hidden->audio_obj) { | ||||||
|         _this->hidden->audio_obj->Stop(); |         _this->hidden->audio_obj->Stop(); | ||||||
| @@ -100,8 +98,7 @@ static const int sig_list[] = { | |||||||
|     SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGALRM, SIGTERM, SIGWINCH, 0 |     SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGALRM, SIGTERM, SIGWINCH, 0 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static inline void | static inline void MaskSignals(sigset_t * omask) | ||||||
| MaskSignals(sigset_t * omask) |  | ||||||
| { | { | ||||||
|     sigset_t mask; |     sigset_t mask; | ||||||
|     int i; |     int i; | ||||||
| @@ -113,15 +110,13 @@ MaskSignals(sigset_t * omask) | |||||||
|     sigprocmask(SIG_BLOCK, &mask, omask); |     sigprocmask(SIG_BLOCK, &mask, omask); | ||||||
| } | } | ||||||
|  |  | ||||||
| static inline void | static inline void UnmaskSignals(sigset_t * omask) | ||||||
| UnmaskSignals(sigset_t * omask) |  | ||||||
| { | { | ||||||
|     sigprocmask(SIG_SETMASK, omask, NULL); |     sigprocmask(SIG_SETMASK, omask, NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static int | static int HAIKUAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| HAIKUAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     media_raw_audio_format format; |     media_raw_audio_format format; | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
| @@ -208,14 +203,12 @@ HAIKUAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void HAIKUAUDIO_Deinitialize(void) | ||||||
| HAIKUAUDIO_Deinitialize(void) |  | ||||||
| { | { | ||||||
|     SDL_QuitBeApp(); |     SDL_QuitBeApp(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool HAIKUAUDIO_Init(SDL_AudioDriverImpl * impl) | ||||||
| HAIKUAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     /* Initialize the Be Application, if it's not already started */ |     /* Initialize the Be Application, if it's not already started */ | ||||||
|     if (SDL_InitBeApp() < 0) { |     if (SDL_InitBeApp() < 0) { | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *_this | #define _THIS SDL_AudioDevice *_this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|   | |||||||
| @@ -29,36 +29,33 @@ | |||||||
| #include "SDL_loadso.h" | #include "SDL_loadso.h" | ||||||
| #include "../../thread/SDL_systhread.h" | #include "../../thread/SDL_systhread.h" | ||||||
|  |  | ||||||
|  | static jack_client_t *(*JACK_jack_client_open)(const char *, jack_options_t, jack_status_t *, ...); | ||||||
| static jack_client_t * (*JACK_jack_client_open) (const char *, jack_options_t, jack_status_t *, ...); | static int (*JACK_jack_client_close)(jack_client_t *); | ||||||
| static int (*JACK_jack_client_close) (jack_client_t *); | static void (*JACK_jack_on_shutdown)(jack_client_t *, JackShutdownCallback, void *); | ||||||
| static void (*JACK_jack_on_shutdown) (jack_client_t *, JackShutdownCallback, void *); | static int (*JACK_jack_activate)(jack_client_t *); | ||||||
| static int (*JACK_jack_activate) (jack_client_t *); | static int (*JACK_jack_deactivate)(jack_client_t *); | ||||||
| static int (*JACK_jack_deactivate) (jack_client_t *); | static void *(*JACK_jack_port_get_buffer)(jack_port_t *, jack_nframes_t); | ||||||
| static void * (*JACK_jack_port_get_buffer) (jack_port_t *, jack_nframes_t); | static int (*JACK_jack_port_unregister)(jack_client_t *, jack_port_t *); | ||||||
| static int (*JACK_jack_port_unregister) (jack_client_t *, jack_port_t *); | static void (*JACK_jack_free)(void *); | ||||||
| static void (*JACK_jack_free) (void *); | static const char **(*JACK_jack_get_ports)(jack_client_t *, const char *, const char *, unsigned long); | ||||||
| static const char ** (*JACK_jack_get_ports) (jack_client_t *, const char *, const char *, unsigned long); | static jack_nframes_t (*JACK_jack_get_sample_rate)(jack_client_t *); | ||||||
| static jack_nframes_t (*JACK_jack_get_sample_rate) (jack_client_t *); | static jack_nframes_t (*JACK_jack_get_buffer_size)(jack_client_t *); | ||||||
| static jack_nframes_t (*JACK_jack_get_buffer_size) (jack_client_t *); | static jack_port_t *(*JACK_jack_port_register)(jack_client_t *, const char *, const char *, unsigned long, unsigned long); | ||||||
| static jack_port_t * (*JACK_jack_port_register) (jack_client_t *, const char *, const char *, unsigned long, unsigned long); | static jack_port_t *(*JACK_jack_port_by_name)(jack_client_t *, const char *); | ||||||
| static jack_port_t * (*JACK_jack_port_by_name) (jack_client_t *, const char *); | static const char *(*JACK_jack_port_name)(const jack_port_t *); | ||||||
| static const char * (*JACK_jack_port_name) (const jack_port_t *); | static const char *(*JACK_jack_port_type)(const jack_port_t *); | ||||||
| static const char * (*JACK_jack_port_type) (const jack_port_t *); | static int (*JACK_jack_connect)(jack_client_t *, const char *, const char *); | ||||||
| static int (*JACK_jack_connect) (jack_client_t *, const char *, const char *); | static int (*JACK_jack_set_process_callback)(jack_client_t *, JackProcessCallback, void *); | ||||||
| static int (*JACK_jack_set_process_callback) (jack_client_t *, JackProcessCallback, void *); |  | ||||||
|  |  | ||||||
| static int load_jack_syms(void); | static int load_jack_syms(void); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef SDL_AUDIO_DRIVER_JACK_DYNAMIC | #ifdef SDL_AUDIO_DRIVER_JACK_DYNAMIC | ||||||
|  |  | ||||||
| static const char *jack_library = SDL_AUDIO_DRIVER_JACK_DYNAMIC; | static const char *jack_library = SDL_AUDIO_DRIVER_JACK_DYNAMIC; | ||||||
| static void *jack_handle = NULL; | static void *jack_handle = NULL; | ||||||
|  |  | ||||||
| /* !!! FIXME: this is copy/pasted in several places now */ | /* !!! FIXME: this is copy/pasted in several places now */ | ||||||
| static int | static int load_jack_sym(const char *fn, void **addr) | ||||||
| load_jack_sym(const char *fn, void **addr) |  | ||||||
| { | { | ||||||
|     *addr = SDL_LoadFunction(jack_handle, fn); |     *addr = SDL_LoadFunction(jack_handle, fn); | ||||||
|     if (*addr == NULL) { |     if (*addr == NULL) { | ||||||
| @@ -70,11 +67,11 @@ load_jack_sym(const char *fn, void **addr) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | ||||||
| #define SDL_JACK_SYM(x) \ | #define SDL_JACK_SYM(x)                                 \ | ||||||
|     if (!load_jack_sym(#x, (void **) (char *) &JACK_##x)) return -1 |     if (!load_jack_sym(#x, (void **)(char *)&JACK_##x)) \ | ||||||
|  |     return -1 | ||||||
|  |  | ||||||
| static void | static void UnloadJackLibrary(void) | ||||||
| UnloadJackLibrary(void) |  | ||||||
| { | { | ||||||
|     if (jack_handle != NULL) { |     if (jack_handle != NULL) { | ||||||
|         SDL_UnloadObject(jack_handle); |         SDL_UnloadObject(jack_handle); | ||||||
| @@ -82,8 +79,7 @@ UnloadJackLibrary(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadJackLibrary(void) | ||||||
| LoadJackLibrary(void) |  | ||||||
| { | { | ||||||
|     int retval = 0; |     int retval = 0; | ||||||
|     if (jack_handle == NULL) { |     if (jack_handle == NULL) { | ||||||
| @@ -105,13 +101,11 @@ LoadJackLibrary(void) | |||||||
|  |  | ||||||
| #define SDL_JACK_SYM(x) JACK_##x = x | #define SDL_JACK_SYM(x) JACK_##x = x | ||||||
|  |  | ||||||
| static void | static void UnloadJackLibrary(void) | ||||||
| UnloadJackLibrary(void) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadJackLibrary(void) | ||||||
| LoadJackLibrary(void) |  | ||||||
| { | { | ||||||
|     load_jack_syms(); |     load_jack_syms(); | ||||||
|     return 0; |     return 0; | ||||||
| @@ -119,9 +113,7 @@ LoadJackLibrary(void) | |||||||
|  |  | ||||||
| #endif /* SDL_AUDIO_DRIVER_JACK_DYNAMIC */ | #endif /* SDL_AUDIO_DRIVER_JACK_DYNAMIC */ | ||||||
|  |  | ||||||
|  | static int load_jack_syms(void) | ||||||
| static int |  | ||||||
| load_jack_syms(void) |  | ||||||
| { | { | ||||||
|     SDL_JACK_SYM(jack_client_open); |     SDL_JACK_SYM(jack_client_open); | ||||||
|     SDL_JACK_SYM(jack_client_close); |     SDL_JACK_SYM(jack_client_close); | ||||||
| @@ -143,23 +135,20 @@ load_jack_syms(void) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void jackShutdownCallback(void *arg) /* JACK went away; device is lost. */ | ||||||
| static void |  | ||||||
| jackShutdownCallback(void *arg)  /* JACK went away; device is lost. */ |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) arg; |     SDL_AudioDevice *this = (SDL_AudioDevice *)arg; | ||||||
|     SDL_OpenedAudioDeviceDisconnected(this); |     SDL_OpenedAudioDeviceDisconnected(this); | ||||||
|     SDL_SemPost(this->hidden->iosem);  /* unblock the SDL thread. */ |     SDL_SemPost(this->hidden->iosem); /* unblock the SDL thread. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| // !!! FIXME: implement and register these! | // !!! FIXME: implement and register these! | ||||||
| //typedef int(* JackSampleRateCallback)(jack_nframes_t nframes, void *arg) | // typedef int(* JackSampleRateCallback)(jack_nframes_t nframes, void *arg) | ||||||
| //typedef int(* JackBufferSizeCallback)(jack_nframes_t nframes, void *arg) | // typedef int(* JackBufferSizeCallback)(jack_nframes_t nframes, void *arg) | ||||||
|  |  | ||||||
| static int | static int jackProcessPlaybackCallback(jack_nframes_t nframes, void *arg) | ||||||
| jackProcessPlaybackCallback(jack_nframes_t nframes, void *arg) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) arg; |     SDL_AudioDevice *this = (SDL_AudioDevice *)arg; | ||||||
|     jack_port_t **ports = this->hidden->sdlports; |     jack_port_t **ports = this->hidden->sdlports; | ||||||
|     const int total_channels = this->spec.channels; |     const int total_channels = this->spec.channels; | ||||||
|     const int total_frames = this->spec.samples; |     const int total_frames = this->spec.samples; | ||||||
| @@ -171,9 +160,9 @@ jackProcessPlaybackCallback(jack_nframes_t nframes, void *arg) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (channelsi = 0; channelsi < total_channels; channelsi++) { |     for (channelsi = 0; channelsi < total_channels; channelsi++) { | ||||||
|         float *dst = (float *) JACK_jack_port_get_buffer(ports[channelsi], nframes); |         float *dst = (float *)JACK_jack_port_get_buffer(ports[channelsi], nframes); | ||||||
|         if (dst) { |         if (dst) { | ||||||
|             const float *src = ((float *) this->hidden->iobuffer) + channelsi; |             const float *src = ((float *)this->hidden->iobuffer) + channelsi; | ||||||
|             int framesi; |             int framesi; | ||||||
|             for (framesi = 0; framesi < total_frames; framesi++) { |             for (framesi = 0; framesi < total_frames; framesi++) { | ||||||
|                 *(dst++) = *src; |                 *(dst++) = *src; | ||||||
| @@ -182,14 +171,12 @@ jackProcessPlaybackCallback(jack_nframes_t nframes, void *arg) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_SemPost(this->hidden->iosem);  /* tell SDL thread we're done; refill the buffer. */ |     SDL_SemPost(this->hidden->iosem); /* tell SDL thread we're done; refill the buffer. */ | ||||||
|     return 0;  /* success */ |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* This function waits until it is possible to write a full sound buffer */ | /* This function waits until it is possible to write a full sound buffer */ | ||||||
| static void | static void JACK_WaitDevice(_THIS) | ||||||
| JACK_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (SDL_AtomicGet(&this->enabled)) { |     if (SDL_AtomicGet(&this->enabled)) { | ||||||
|         if (SDL_SemWait(this->hidden->iosem) == -1) { |         if (SDL_SemWait(this->hidden->iosem) == -1) { | ||||||
| @@ -198,17 +185,14 @@ JACK_WaitDevice(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *JACK_GetDeviceBuf(_THIS) | ||||||
| JACK_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return (Uint8 *) this->hidden->iobuffer; |     return (Uint8 *)this->hidden->iobuffer; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int jackProcessCaptureCallback(jack_nframes_t nframes, void *arg) | ||||||
| static int |  | ||||||
| jackProcessCaptureCallback(jack_nframes_t nframes, void *arg) |  | ||||||
| { | { | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) arg; |     SDL_AudioDevice *this = (SDL_AudioDevice *)arg; | ||||||
|     if (SDL_AtomicGet(&this->enabled)) { |     if (SDL_AtomicGet(&this->enabled)) { | ||||||
|         jack_port_t **ports = this->hidden->sdlports; |         jack_port_t **ports = this->hidden->sdlports; | ||||||
|         const int total_channels = this->spec.channels; |         const int total_channels = this->spec.channels; | ||||||
| @@ -216,9 +200,9 @@ jackProcessCaptureCallback(jack_nframes_t nframes, void *arg) | |||||||
|         int channelsi; |         int channelsi; | ||||||
|  |  | ||||||
|         for (channelsi = 0; channelsi < total_channels; channelsi++) { |         for (channelsi = 0; channelsi < total_channels; channelsi++) { | ||||||
|             const float *src = (const float *) JACK_jack_port_get_buffer(ports[channelsi], nframes); |             const float *src = (const float *)JACK_jack_port_get_buffer(ports[channelsi], nframes); | ||||||
|             if (src) { |             if (src) { | ||||||
|                 float *dst = ((float *) this->hidden->iobuffer) + channelsi; |                 float *dst = ((float *)this->hidden->iobuffer) + channelsi; | ||||||
|                 int framesi; |                 int framesi; | ||||||
|                 for (framesi = 0; framesi < total_frames; framesi++) { |                 for (framesi = 0; framesi < total_frames; framesi++) { | ||||||
|                     *dst = *(src++); |                     *dst = *(src++); | ||||||
| @@ -228,14 +212,13 @@ jackProcessCaptureCallback(jack_nframes_t nframes, void *arg) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_SemPost(this->hidden->iosem);  /* tell SDL thread we're done; new buffer is ready! */ |     SDL_SemPost(this->hidden->iosem); /* tell SDL thread we're done; new buffer is ready! */ | ||||||
|     return 0;  /* success */ |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int JACK_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| JACK_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     SDL_assert(buflen == this->spec.size);  /* we always fill a full buffer. */ |     SDL_assert(buflen == this->spec.size); /* we always fill a full buffer. */ | ||||||
|  |  | ||||||
|     /* Wait for JACK to fill the iobuffer */ |     /* Wait for JACK to fill the iobuffer */ | ||||||
|     if (SDL_SemWait(this->hidden->iosem) == -1) { |     if (SDL_SemWait(this->hidden->iosem) == -1) { | ||||||
| @@ -246,15 +229,12 @@ JACK_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     return buflen; |     return buflen; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void JACK_FlushCapture(_THIS) | ||||||
| JACK_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     SDL_SemWait(this->hidden->iosem); |     SDL_SemWait(this->hidden->iosem); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void JACK_CloseDevice(_THIS) | ||||||
| static void |  | ||||||
| JACK_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (this->hidden->client) { |     if (this->hidden->client) { | ||||||
|         JACK_jack_deactivate(this->hidden->client); |         JACK_jack_deactivate(this->hidden->client); | ||||||
| @@ -279,8 +259,7 @@ JACK_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int JACK_OpenDevice(_THIS, const char *devname) | ||||||
| JACK_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     /* Note that JACK uses "output" for capture devices (they output audio |     /* Note that JACK uses "output" for capture devices (they output audio | ||||||
|         data to us) and "input" for playback (we input audio data to them). |         data to us) and "input" for playback (we input audio data to them). | ||||||
| @@ -300,7 +279,7 @@ JACK_OpenDevice(_THIS, const char *devname) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     /* Initialize all variables that we clean on shutdown */ |     /* Initialize all variables that we clean on shutdown */ | ||||||
|     this->hidden = (struct SDL_PrivateAudioData *) SDL_calloc(1, sizeof (*this->hidden)); |     this->hidden = (struct SDL_PrivateAudioData *)SDL_calloc(1, sizeof(*this->hidden)); | ||||||
|     if (this->hidden == NULL) { |     if (this->hidden == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -328,7 +307,7 @@ JACK_OpenDevice(_THIS, const char *devname) | |||||||
|         const char *type = JACK_jack_port_type(dport); |         const char *type = JACK_jack_port_type(dport); | ||||||
|         const int len = SDL_strlen(type); |         const int len = SDL_strlen(type); | ||||||
|         /* See if type ends with "audio" */ |         /* See if type ends with "audio" */ | ||||||
|         if (len >= 5 && !SDL_memcmp(type+len-5, "audio", 5)) { |         if (len >= 5 && !SDL_memcmp(type + len - 5, "audio", 5)) { | ||||||
|             audio_ports[channels++] = i; |             audio_ports[channels++] = i; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -336,7 +315,6 @@ JACK_OpenDevice(_THIS, const char *devname) | |||||||
|         return SDL_SetError("No physical JACK ports available"); |         return SDL_SetError("No physical JACK ports available"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /* !!! FIXME: docs say about buffer size: "This size may change, clients that depend on it must register a bufsize_callback so they will be notified if it does." */ |     /* !!! FIXME: docs say about buffer size: "This size may change, clients that depend on it must register a bufsize_callback so they will be notified if it does." */ | ||||||
|  |  | ||||||
|     /* Jack pretty much demands what it wants. */ |     /* Jack pretty much demands what it wants. */ | ||||||
| @@ -349,23 +327,23 @@ JACK_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     this->hidden->iosem = SDL_CreateSemaphore(0); |     this->hidden->iosem = SDL_CreateSemaphore(0); | ||||||
|     if (!this->hidden->iosem) { |     if (!this->hidden->iosem) { | ||||||
|         return -1;  /* error was set by SDL_CreateSemaphore */ |         return -1; /* error was set by SDL_CreateSemaphore */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->hidden->iobuffer = (float *) SDL_calloc(1, this->spec.size); |     this->hidden->iobuffer = (float *)SDL_calloc(1, this->spec.size); | ||||||
|     if (!this->hidden->iobuffer) { |     if (!this->hidden->iobuffer) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Build SDL's ports, which we will connect to the device ports. */ |     /* Build SDL's ports, which we will connect to the device ports. */ | ||||||
|     this->hidden->sdlports = (jack_port_t **) SDL_calloc(channels, sizeof (jack_port_t *)); |     this->hidden->sdlports = (jack_port_t **)SDL_calloc(channels, sizeof(jack_port_t *)); | ||||||
|     if (this->hidden->sdlports == NULL) { |     if (this->hidden->sdlports == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (i = 0; i < channels; i++) { |     for (i = 0; i < channels; i++) { | ||||||
|         char portname[32]; |         char portname[32]; | ||||||
|         SDL_snprintf(portname, sizeof (portname), "sdl_jack_%s_%d", sdlportstr, i); |         SDL_snprintf(portname, sizeof(portname), "sdl_jack_%s_%d", sdlportstr, i); | ||||||
|         this->hidden->sdlports[i] = JACK_jack_port_register(client, portname, JACK_DEFAULT_AUDIO_TYPE, sdlportflags, 0); |         this->hidden->sdlports[i] = JACK_jack_port_register(client, portname, JACK_DEFAULT_AUDIO_TYPE, sdlportflags, 0); | ||||||
|         if (this->hidden->sdlports[i] == NULL) { |         if (this->hidden->sdlports[i] == NULL) { | ||||||
|             return SDL_SetError("jack_port_register failed"); |             return SDL_SetError("jack_port_register failed"); | ||||||
| @@ -400,14 +378,12 @@ JACK_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void JACK_Deinitialize(void) | ||||||
| JACK_Deinitialize(void) |  | ||||||
| { | { | ||||||
|     UnloadJackLibrary(); |     UnloadJackLibrary(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool JACK_Init(SDL_AudioDriverImpl *impl) | ||||||
| JACK_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     if (LoadJackLibrary() < 0) { |     if (LoadJackLibrary() < 0) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -434,7 +410,7 @@ JACK_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; |     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; | ||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap JACK_bootstrap = { | AudioBootStrap JACK_bootstrap = { | ||||||
|   | |||||||
| @@ -38,32 +38,27 @@ static SDL_AudioDevice *audio_device; | |||||||
| static void FreePrivateData(_THIS); | static void FreePrivateData(_THIS); | ||||||
| static int FindAudioFormat(_THIS); | static int FindAudioFormat(_THIS); | ||||||
|  |  | ||||||
| static SDL_INLINE void | static SDL_INLINE void contextLock(_THIS) | ||||||
| contextLock(_THIS) |  | ||||||
| { | { | ||||||
|     LightLock_Lock(&this->hidden->lock); |     LightLock_Lock(&this->hidden->lock); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_INLINE void | static SDL_INLINE void contextUnlock(_THIS) | ||||||
| contextUnlock(_THIS) |  | ||||||
| { | { | ||||||
|     LightLock_Unlock(&this->hidden->lock); |     LightLock_Unlock(&this->hidden->lock); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void N3DSAUD_LockAudio(_THIS) | ||||||
| N3DSAUD_LockAudio(_THIS) |  | ||||||
| { | { | ||||||
|     contextLock(this); |     contextLock(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void N3DSAUD_UnlockAudio(_THIS) | ||||||
| N3DSAUD_UnlockAudio(_THIS) |  | ||||||
| { | { | ||||||
|     contextUnlock(this); |     contextUnlock(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void N3DSAUD_DspHook(DSP_HookType hook) | ||||||
| N3DSAUD_DspHook(DSP_HookType hook) |  | ||||||
| { | { | ||||||
|     if (hook == DSPHOOK_ONCANCEL) { |     if (hook == DSPHOOK_ONCANCEL) { | ||||||
|         contextLock(audio_device); |         contextLock(audio_device); | ||||||
| @@ -74,12 +69,11 @@ N3DSAUD_DspHook(DSP_HookType hook) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void AudioFrameFinished(void *device) | ||||||
| AudioFrameFinished(void *device) |  | ||||||
| { | { | ||||||
|     bool shouldBroadcast = false; |     bool shouldBroadcast = false; | ||||||
|     unsigned i; |     unsigned i; | ||||||
|     SDL_AudioDevice *this = (SDL_AudioDevice *) device; |     SDL_AudioDevice *this = (SDL_AudioDevice *)device; | ||||||
|  |  | ||||||
|     contextLock(this); |     contextLock(this); | ||||||
|  |  | ||||||
| @@ -97,13 +91,12 @@ AudioFrameFinished(void *device) | |||||||
|     contextUnlock(this); |     contextUnlock(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int N3DSAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| N3DSAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     Result ndsp_init_res; |     Result ndsp_init_res; | ||||||
|     Uint8 *data_vaddr; |     Uint8 *data_vaddr; | ||||||
|     float mix[12]; |     float mix[12]; | ||||||
|     this->hidden = (struct SDL_PrivateAudioData *) SDL_calloc(1, sizeof *this->hidden); |     this->hidden = (struct SDL_PrivateAudioData *)SDL_calloc(1, sizeof *this->hidden); | ||||||
|  |  | ||||||
|     if (this->hidden == NULL) { |     if (this->hidden == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
| @@ -142,14 +135,14 @@ N3DSAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->hidden->mixlen = this->spec.size; |     this->hidden->mixlen = this->spec.size; | ||||||
|     this->hidden->mixbuf = (Uint8 *) SDL_malloc(this->spec.size); |     this->hidden->mixbuf = (Uint8 *)SDL_malloc(this->spec.size); | ||||||
|     if (this->hidden->mixbuf == NULL) { |     if (this->hidden->mixbuf == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_memset(this->hidden->mixbuf, this->spec.silence, this->spec.size); |     SDL_memset(this->hidden->mixbuf, this->spec.silence, this->spec.size); | ||||||
|  |  | ||||||
|     data_vaddr = (Uint8 *) linearAlloc(this->hidden->mixlen * NUM_BUFFERS); |     data_vaddr = (Uint8 *)linearAlloc(this->hidden->mixlen * NUM_BUFFERS); | ||||||
|     if (data_vaddr == NULL) { |     if (data_vaddr == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -188,8 +181,7 @@ N3DSAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int N3DSAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| N3DSAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     /* Delay to make this sort of simulate real audio input. */ |     /* Delay to make this sort of simulate real audio input. */ | ||||||
|     SDL_Delay((this->spec.samples * 1000) / this->spec.freq); |     SDL_Delay((this->spec.samples * 1000) / this->spec.freq); | ||||||
| @@ -199,8 +191,7 @@ N3DSAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     return buflen; |     return buflen; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void N3DSAUDIO_PlayDevice(_THIS) | ||||||
| N3DSAUDIO_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     size_t nextbuf; |     size_t nextbuf; | ||||||
|     size_t sampleLen; |     size_t sampleLen; | ||||||
| @@ -219,15 +210,14 @@ N3DSAUDIO_PlayDevice(_THIS) | |||||||
|  |  | ||||||
|     contextUnlock(this); |     contextUnlock(this); | ||||||
|  |  | ||||||
|     memcpy((void *) this->hidden->waveBuf[nextbuf].data_vaddr, |     memcpy((void *)this->hidden->waveBuf[nextbuf].data_vaddr, | ||||||
|            this->hidden->mixbuf, sampleLen); |            this->hidden->mixbuf, sampleLen); | ||||||
|     DSP_FlushDataCache(this->hidden->waveBuf[nextbuf].data_vaddr, sampleLen); |     DSP_FlushDataCache(this->hidden->waveBuf[nextbuf].data_vaddr, sampleLen); | ||||||
|  |  | ||||||
|     ndspChnWaveBufAdd(0, &this->hidden->waveBuf[nextbuf]); |     ndspChnWaveBufAdd(0, &this->hidden->waveBuf[nextbuf]); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void N3DSAUDIO_WaitDevice(_THIS) | ||||||
| N3DSAUDIO_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
|     contextLock(this); |     contextLock(this); | ||||||
|     while (!this->hidden->isCancelled && |     while (!this->hidden->isCancelled && | ||||||
| @@ -237,14 +227,12 @@ N3DSAUDIO_WaitDevice(_THIS) | |||||||
|     contextUnlock(this); |     contextUnlock(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *N3DSAUDIO_GetDeviceBuf(_THIS) | ||||||
| N3DSAUDIO_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return this->hidden->mixbuf; |     return this->hidden->mixbuf; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void N3DSAUDIO_CloseDevice(_THIS) | ||||||
| N3DSAUDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     contextLock(this); |     contextLock(this); | ||||||
|  |  | ||||||
| @@ -264,8 +252,7 @@ N3DSAUDIO_CloseDevice(_THIS) | |||||||
|     FreePrivateData(this); |     FreePrivateData(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void N3DSAUDIO_ThreadInit(_THIS) | ||||||
| N3DSAUDIO_ThreadInit(_THIS) |  | ||||||
| { | { | ||||||
|     s32 current_priority; |     s32 current_priority; | ||||||
|     svcGetThreadPriority(¤t_priority, CUR_THREAD_HANDLE); |     svcGetThreadPriority(¤t_priority, CUR_THREAD_HANDLE); | ||||||
| @@ -275,8 +262,7 @@ N3DSAUDIO_ThreadInit(_THIS) | |||||||
|     svcSetThreadPriority(CUR_THREAD_HANDLE, current_priority); |     svcSetThreadPriority(CUR_THREAD_HANDLE, current_priority); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool N3DSAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| N3DSAUDIO_Init(SDL_AudioDriverImpl *impl) |  | ||||||
| { | { | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->OpenDevice = N3DSAUDIO_OpenDevice; |     impl->OpenDevice = N3DSAUDIO_OpenDevice; | ||||||
| @@ -306,15 +292,14 @@ AudioBootStrap N3DSAUDIO_bootstrap = { | |||||||
| /** | /** | ||||||
|  * Cleans up all allocated memory, safe to call with null pointers |  * Cleans up all allocated memory, safe to call with null pointers | ||||||
|  */ |  */ | ||||||
| static void | static void FreePrivateData(_THIS) | ||||||
| FreePrivateData(_THIS) |  | ||||||
| { | { | ||||||
|     if (!this->hidden) { |     if (!this->hidden) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (this->hidden->waveBuf[0].data_vaddr) { |     if (this->hidden->waveBuf[0].data_vaddr) { | ||||||
|         linearFree((void *) this->hidden->waveBuf[0].data_vaddr); |         linearFree((void *)this->hidden->waveBuf[0].data_vaddr); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (this->hidden->mixbuf) { |     if (this->hidden->mixbuf) { | ||||||
| @@ -326,8 +311,7 @@ FreePrivateData(_THIS) | |||||||
|     this->hidden = NULL; |     this->hidden = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int FindAudioFormat(_THIS) | ||||||
| FindAudioFormat(_THIS) |  | ||||||
| { | { | ||||||
|     SDL_bool found_valid_format = SDL_FALSE; |     SDL_bool found_valid_format = SDL_FALSE; | ||||||
|     Uint16 test_format = SDL_FirstAudioFormat(this->spec.format); |     Uint16 test_format = SDL_FirstAudioFormat(this->spec.format); | ||||||
|   | |||||||
| @@ -45,15 +45,12 @@ | |||||||
|  |  | ||||||
| /* #define DEBUG_AUDIO */ | /* #define DEBUG_AUDIO */ | ||||||
|  |  | ||||||
| static void | static void NETBSDAUDIO_DetectDevices(void) | ||||||
| NETBSDAUDIO_DetectDevices(void) |  | ||||||
| { | { | ||||||
|     SDL_EnumUnixAudioDevices(0, NULL); |     SDL_EnumUnixAudioDevices(0, NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void NETBSDAUDIO_Status(_THIS) | ||||||
| static void |  | ||||||
| NETBSDAUDIO_Status(_THIS) |  | ||||||
| { | { | ||||||
| #ifdef DEBUG_AUDIO | #ifdef DEBUG_AUDIO | ||||||
|     /* *INDENT-OFF* */ /* clang-format off */ |     /* *INDENT-OFF* */ /* clang-format off */ | ||||||
| @@ -119,12 +116,11 @@ NETBSDAUDIO_Status(_THIS) | |||||||
|             this->spec.format, |             this->spec.format, | ||||||
|             this->spec.size); |             this->spec.size); | ||||||
|     /* *INDENT-ON* */ /* clang-format on */ |     /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
| #endif /* DEBUG_AUDIO */ | #endif /* DEBUG_AUDIO */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void NETBSDAUDIO_PlayDevice(_THIS) | ||||||
| static void |  | ||||||
| NETBSDAUDIO_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = this->hidden; |     struct SDL_PrivateAudioData *h = this->hidden; | ||||||
|     int written; |     int written; | ||||||
| @@ -143,17 +139,14 @@ NETBSDAUDIO_PlayDevice(_THIS) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *NETBSDAUDIO_GetDeviceBuf(_THIS) | ||||||
| NETBSDAUDIO_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return this->hidden->mixbuf; |     return this->hidden->mixbuf; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int NETBSDAUDIO_CaptureFromDevice(_THIS, void *_buffer, int buflen) | ||||||
| static int |  | ||||||
| NETBSDAUDIO_CaptureFromDevice(_THIS, void *_buffer, int buflen) |  | ||||||
| { | { | ||||||
|     Uint8 *buffer = (Uint8 *) _buffer; |     Uint8 *buffer = (Uint8 *)_buffer; | ||||||
|     int br; |     int br; | ||||||
|  |  | ||||||
|     br = read(this->hidden->audio_fd, buffer, buflen); |     br = read(this->hidden->audio_fd, buffer, buflen); | ||||||
| @@ -169,30 +162,28 @@ NETBSDAUDIO_CaptureFromDevice(_THIS, void *_buffer, int buflen) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void NETBSDAUDIO_FlushCapture(_THIS) | ||||||
| NETBSDAUDIO_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     audio_info_t info; |     audio_info_t info; | ||||||
|     size_t remain; |     size_t remain; | ||||||
|     Uint8 buf[512]; |     Uint8 buf[512]; | ||||||
|  |  | ||||||
|     if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) { |     if (ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info) < 0) { | ||||||
|         return;  /* oh well. */ |         return; /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     remain = (size_t) (info.record.samples * (SDL_AUDIO_BITSIZE(this->spec.format) / 8)); |     remain = (size_t)(info.record.samples * (SDL_AUDIO_BITSIZE(this->spec.format) / 8)); | ||||||
|     while (remain > 0) { |     while (remain > 0) { | ||||||
|         const size_t len = SDL_min(sizeof (buf), remain); |         const size_t len = SDL_min(sizeof(buf), remain); | ||||||
|         const int br = read(this->hidden->audio_fd, buf, len); |         const int br = read(this->hidden->audio_fd, buf, len); | ||||||
|         if (br <= 0) { |         if (br <= 0) { | ||||||
|             return;  /* oh well. */ |             return; /* oh well. */ | ||||||
|         } |         } | ||||||
|         remain -= br; |         remain -= br; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void NETBSDAUDIO_CloseDevice(_THIS) | ||||||
| NETBSDAUDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (this->hidden->audio_fd >= 0) { |     if (this->hidden->audio_fd >= 0) { | ||||||
|         close(this->hidden->audio_fd); |         close(this->hidden->audio_fd); | ||||||
| @@ -201,8 +192,7 @@ NETBSDAUDIO_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int NETBSDAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| NETBSDAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     SDL_bool iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
| @@ -241,8 +231,7 @@ NETBSDAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|          * Use the device's native sample rate so the kernel doesn't have to |          * Use the device's native sample rate so the kernel doesn't have to | ||||||
|          * resample. |          * resample. | ||||||
|          */ |          */ | ||||||
|         this->spec.freq = iscapture ? |         this->spec.freq = iscapture ? hwinfo.record.sample_rate : hwinfo.play.sample_rate; | ||||||
|             hwinfo.record.sample_rate : hwinfo.play.sample_rate; |  | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -307,7 +296,7 @@ NETBSDAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     if (!iscapture) { |     if (!iscapture) { | ||||||
|         /* Allocate mixing buffer */ |         /* Allocate mixing buffer */ | ||||||
|         this->hidden->mixlen = this->spec.size; |         this->hidden->mixlen = this->spec.size; | ||||||
|         this->hidden->mixbuf = (Uint8 *) SDL_malloc(this->hidden->mixlen); |         this->hidden->mixbuf = (Uint8 *)SDL_malloc(this->hidden->mixlen); | ||||||
|         if (this->hidden->mixbuf == NULL) { |         if (this->hidden->mixbuf == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -320,8 +309,7 @@ NETBSDAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool NETBSDAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| NETBSDAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->DetectDevices = NETBSDAUDIO_DetectDevices; |     impl->DetectDevices = NETBSDAUDIO_DetectDevices; | ||||||
| @@ -335,10 +323,9 @@ NETBSDAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->AllowsArbitraryDeviceNames = SDL_TRUE; |     impl->AllowsArbitraryDeviceNames = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| AudioBootStrap NETBSDAUDIO_bootstrap = { | AudioBootStrap NETBSDAUDIO_bootstrap = { | ||||||
|     "netbsd", "NetBSD audio", NETBSDAUDIO_Init, SDL_FALSE |     "netbsd", "NetBSD audio", NETBSDAUDIO_Init, SDL_FALSE | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ | |||||||
|  |  | ||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
| @@ -41,7 +41,7 @@ struct SDL_PrivateAudioData | |||||||
|     float next_frame; |     float next_frame; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #define FUDGE_TICKS 10      /* The scheduler overhead ticks per frame */ | #define FUDGE_TICKS 10 /* The scheduler overhead ticks per frame */ | ||||||
|  |  | ||||||
| #endif /* SDL_netbsdaudio_h_ */ | #endif /* SDL_netbsdaudio_h_ */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -38,9 +38,9 @@ | |||||||
| #include <android/log.h> | #include <android/log.h> | ||||||
|  |  | ||||||
| #if 0 | #if 0 | ||||||
| #define LOG_TAG "SDL_openslES" | #define LOG_TAG   "SDL_openslES" | ||||||
| #define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) | #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) | ||||||
| #define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) | #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) | ||||||
| //#define LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__) | //#define LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__) | ||||||
| #define LOGV(...) | #define LOGV(...) | ||||||
| #else | #else | ||||||
| @@ -70,9 +70,9 @@ | |||||||
| #define SL_SPEAKER_TOP_BACK_RIGHT        ((SLuint32) 0x00020000) | #define SL_SPEAKER_TOP_BACK_RIGHT        ((SLuint32) 0x00020000) | ||||||
| */ | */ | ||||||
| #define SL_ANDROID_SPEAKER_STEREO (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT) | #define SL_ANDROID_SPEAKER_STEREO (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT) | ||||||
| #define SL_ANDROID_SPEAKER_QUAD (SL_ANDROID_SPEAKER_STEREO | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT) | #define SL_ANDROID_SPEAKER_QUAD   (SL_ANDROID_SPEAKER_STEREO | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT) | ||||||
| #define SL_ANDROID_SPEAKER_5DOT1 (SL_ANDROID_SPEAKER_QUAD | SL_SPEAKER_FRONT_CENTER  | SL_SPEAKER_LOW_FREQUENCY) | #define SL_ANDROID_SPEAKER_5DOT1  (SL_ANDROID_SPEAKER_QUAD | SL_SPEAKER_FRONT_CENTER | SL_SPEAKER_LOW_FREQUENCY) | ||||||
| #define SL_ANDROID_SPEAKER_7DOT1 (SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_SIDE_LEFT | SL_SPEAKER_SIDE_RIGHT) | #define SL_ANDROID_SPEAKER_7DOT1  (SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_SIDE_LEFT | SL_SPEAKER_SIDE_RIGHT) | ||||||
|  |  | ||||||
| /* engine interfaces */ | /* engine interfaces */ | ||||||
| static SLObjectItf engineObject = NULL; | static SLObjectItf engineObject = NULL; | ||||||
| @@ -98,8 +98,8 @@ static SLAndroidSimpleBufferQueueItf recorderBufferQueue = NULL; | |||||||
| static const char *sldevaudiorecorderstr = "SLES Audio Recorder"; | static const char *sldevaudiorecorderstr = "SLES Audio Recorder"; | ||||||
| static const char *sldevaudioplayerstr   = "SLES Audio Player"; | static const char *sldevaudioplayerstr   = "SLES Audio Player"; | ||||||
|  |  | ||||||
| #define  SLES_DEV_AUDIO_RECORDER  sldevaudiorecorderstr | #define SLES_DEV_AUDIO_RECORDER sldevaudiorecorderstr | ||||||
| #define  SLES_DEV_AUDIO_PLAYER  sldevaudioplayerstr | #define SLES_DEV_AUDIO_PLAYER   sldevaudioplayerstr | ||||||
| static void openslES_DetectDevices( int iscapture ) | static void openslES_DetectDevices( int iscapture ) | ||||||
| { | { | ||||||
|     LOGI( "openSLES_DetectDevices()" ); |     LOGI( "openSLES_DetectDevices()" ); | ||||||
| @@ -128,8 +128,7 @@ static void openslES_DestroyEngine(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int openslES_CreateEngine(void) | ||||||
| openslES_CreateEngine(void) |  | ||||||
| { | { | ||||||
|     const SLInterfaceID ids[1] = { SL_IID_VOLUME }; |     const SLInterfaceID ids[1] = { SL_IID_VOLUME }; | ||||||
|     const SLboolean req[1] = { SL_BOOLEAN_FALSE }; |     const SLboolean req[1] = { SL_BOOLEAN_FALSE }; | ||||||
| @@ -183,17 +182,15 @@ error: | |||||||
| } | } | ||||||
|  |  | ||||||
| /* this callback handler is called every time a buffer finishes recording */ | /* this callback handler is called every time a buffer finishes recording */ | ||||||
| static void | static void bqRecorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context) | ||||||
| bqRecorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = (struct SDL_PrivateAudioData *) context; |     struct SDL_PrivateAudioData *audiodata = (struct SDL_PrivateAudioData *)context; | ||||||
|  |  | ||||||
|     LOGV("SLES: Recording Callback"); |     LOGV("SLES: Recording Callback"); | ||||||
|     SDL_SemPost(audiodata->playsem); |     SDL_SemPost(audiodata->playsem); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void openslES_DestroyPCMRecorder(_THIS) | ||||||
| openslES_DestroyPCMRecorder(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = this->hidden; |     struct SDL_PrivateAudioData *audiodata = this->hidden; | ||||||
|     SLresult result; |     SLresult result; | ||||||
| @@ -224,8 +221,7 @@ openslES_DestroyPCMRecorder(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int openslES_CreatePCMRecorder(_THIS) | ||||||
| openslES_CreatePCMRecorder(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = this->hidden; |     struct SDL_PrivateAudioData *audiodata = this->hidden; | ||||||
|     SLDataFormat_PCM format_pcm; |     SLDataFormat_PCM format_pcm; | ||||||
| @@ -252,8 +248,8 @@ openslES_CreatePCMRecorder(_THIS) | |||||||
|     SDL_CalculateAudioSpec(&this->spec); |     SDL_CalculateAudioSpec(&this->spec); | ||||||
|  |  | ||||||
|     LOGI("Try to open %u hz %u bit chan %u %s samples %u", |     LOGI("Try to open %u hz %u bit chan %u %s samples %u", | ||||||
|           this->spec.freq, SDL_AUDIO_BITSIZE(this->spec.format), |          this->spec.freq, SDL_AUDIO_BITSIZE(this->spec.format), | ||||||
|           this->spec.channels, (this->spec.format & 0x1000) ? "BE" : "LE", this->spec.samples); |          this->spec.channels, (this->spec.format & 0x1000) ? "BE" : "LE", this->spec.samples); | ||||||
|  |  | ||||||
|     /* configure audio source */ |     /* configure audio source */ | ||||||
|     loc_dev.locatorType = SL_DATALOCATOR_IODEVICE; |     loc_dev.locatorType = SL_DATALOCATOR_IODEVICE; | ||||||
| @@ -267,13 +263,13 @@ openslES_CreatePCMRecorder(_THIS) | |||||||
|     loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; |     loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; | ||||||
|     loc_bufq.numBuffers = NUM_BUFFERS; |     loc_bufq.numBuffers = NUM_BUFFERS; | ||||||
|  |  | ||||||
|     format_pcm.formatType    = SL_DATAFORMAT_PCM; |     format_pcm.formatType = SL_DATAFORMAT_PCM; | ||||||
|     format_pcm.numChannels   = this->spec.channels; |     format_pcm.numChannels = this->spec.channels; | ||||||
|     format_pcm.samplesPerSec = this->spec.freq * 1000;  /* / kilo Hz to milli Hz */ |     format_pcm.samplesPerSec = this->spec.freq * 1000; /* / kilo Hz to milli Hz */ | ||||||
|     format_pcm.bitsPerSample = SDL_AUDIO_BITSIZE(this->spec.format); |     format_pcm.bitsPerSample = SDL_AUDIO_BITSIZE(this->spec.format); | ||||||
|     format_pcm.containerSize = SDL_AUDIO_BITSIZE(this->spec.format); |     format_pcm.containerSize = SDL_AUDIO_BITSIZE(this->spec.format); | ||||||
|     format_pcm.endianness    = SL_BYTEORDER_LITTLEENDIAN; |     format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; | ||||||
|     format_pcm.channelMask   = SL_SPEAKER_FRONT_CENTER; |     format_pcm.channelMask = SL_SPEAKER_FRONT_CENTER; | ||||||
|  |  | ||||||
|     audioSnk.pLocator = &loc_bufq; |     audioSnk.pLocator = &loc_bufq; | ||||||
|     audioSnk.pFormat = &format_pcm; |     audioSnk.pFormat = &format_pcm; | ||||||
| @@ -323,7 +319,7 @@ openslES_CreatePCMRecorder(_THIS) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Create the sound buffers */ |     /* Create the sound buffers */ | ||||||
|     audiodata->mixbuff = (Uint8 *) SDL_malloc(NUM_BUFFERS * this->spec.size); |     audiodata->mixbuff = (Uint8 *)SDL_malloc(NUM_BUFFERS * this->spec.size); | ||||||
|     if (audiodata->mixbuff == NULL) { |     if (audiodata->mixbuff == NULL) { | ||||||
|         LOGE("mixbuffer allocate - out of memory"); |         LOGE("mixbuffer allocate - out of memory"); | ||||||
|         goto failed; |         goto failed; | ||||||
| @@ -363,17 +359,15 @@ failed: | |||||||
| } | } | ||||||
|  |  | ||||||
| /* this callback handler is called every time a buffer finishes playing */ | /* this callback handler is called every time a buffer finishes playing */ | ||||||
| static void | static void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context) | ||||||
| bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = (struct SDL_PrivateAudioData *) context; |     struct SDL_PrivateAudioData *audiodata = (struct SDL_PrivateAudioData *)context; | ||||||
|  |  | ||||||
|     LOGV("SLES: Playback Callback"); |     LOGV("SLES: Playback Callback"); | ||||||
|     SDL_SemPost(audiodata->playsem); |     SDL_SemPost(audiodata->playsem); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void openslES_DestroyPCMPlayer(_THIS) | ||||||
| openslES_DestroyPCMPlayer(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = this->hidden; |     struct SDL_PrivateAudioData *audiodata = this->hidden; | ||||||
|     SLresult result; |     SLresult result; | ||||||
| @@ -405,8 +399,7 @@ openslES_DestroyPCMPlayer(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int openslES_CreatePCMPlayer(_THIS) | ||||||
| openslES_CreatePCMPlayer(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = this->hidden; |     struct SDL_PrivateAudioData *audiodata = this->hidden; | ||||||
|     SLDataLocator_AndroidSimpleBufferQueue loc_bufq; |     SLDataLocator_AndroidSimpleBufferQueue loc_bufq; | ||||||
| @@ -434,7 +427,7 @@ openslES_CreatePCMPlayer(_THIS) | |||||||
|  |  | ||||||
|         if (!test_format) { |         if (!test_format) { | ||||||
|             /* Didn't find a compatible format : */ |             /* Didn't find a compatible format : */ | ||||||
|             LOGI( "No compatible audio format, using signed 16-bit audio" ); |             LOGI("No compatible audio format, using signed 16-bit audio"); | ||||||
|             test_format = AUDIO_S16SYS; |             test_format = AUDIO_S16SYS; | ||||||
|         } |         } | ||||||
|         this->spec.format = test_format; |         this->spec.format = test_format; | ||||||
| @@ -447,16 +440,16 @@ openslES_CreatePCMPlayer(_THIS) | |||||||
|     SDL_CalculateAudioSpec(&this->spec); |     SDL_CalculateAudioSpec(&this->spec); | ||||||
|  |  | ||||||
|     LOGI("Try to open %u hz %s %u bit chan %u %s samples %u", |     LOGI("Try to open %u hz %s %u bit chan %u %s samples %u", | ||||||
|           this->spec.freq, SDL_AUDIO_ISFLOAT(this->spec.format) ? "float" : "pcm", SDL_AUDIO_BITSIZE(this->spec.format), |          this->spec.freq, SDL_AUDIO_ISFLOAT(this->spec.format) ? "float" : "pcm", SDL_AUDIO_BITSIZE(this->spec.format), | ||||||
|           this->spec.channels, (this->spec.format & 0x1000) ? "BE" : "LE", this->spec.samples); |          this->spec.channels, (this->spec.format & 0x1000) ? "BE" : "LE", this->spec.samples); | ||||||
|  |  | ||||||
|     /* configure audio source */ |     /* configure audio source */ | ||||||
|     loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; |     loc_bufq.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; | ||||||
|     loc_bufq.numBuffers = NUM_BUFFERS; |     loc_bufq.numBuffers = NUM_BUFFERS; | ||||||
|  |  | ||||||
|     format_pcm.formatType    = SL_DATAFORMAT_PCM; |     format_pcm.formatType = SL_DATAFORMAT_PCM; | ||||||
|     format_pcm.numChannels   = this->spec.channels; |     format_pcm.numChannels = this->spec.channels; | ||||||
|     format_pcm.samplesPerSec = this->spec.freq * 1000;  /* / kilo Hz to milli Hz */ |     format_pcm.samplesPerSec = this->spec.freq * 1000; /* / kilo Hz to milli Hz */ | ||||||
|     format_pcm.bitsPerSample = SDL_AUDIO_BITSIZE(this->spec.format); |     format_pcm.bitsPerSample = SDL_AUDIO_BITSIZE(this->spec.format); | ||||||
|     format_pcm.containerSize = SDL_AUDIO_BITSIZE(this->spec.format); |     format_pcm.containerSize = SDL_AUDIO_BITSIZE(this->spec.format); | ||||||
|  |  | ||||||
| @@ -466,8 +459,7 @@ openslES_CreatePCMPlayer(_THIS) | |||||||
|         format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; |         format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     switch (this->spec.channels) |     switch (this->spec.channels) { | ||||||
|     { |  | ||||||
|     case 1: |     case 1: | ||||||
|         format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT; |         format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT; | ||||||
|         break; |         break; | ||||||
| @@ -512,7 +504,7 @@ openslES_CreatePCMPlayer(_THIS) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     audioSrc.pLocator = &loc_bufq; |     audioSrc.pLocator = &loc_bufq; | ||||||
|     audioSrc.pFormat = SDL_AUDIO_ISFLOAT(this->spec.format) ? (void*)&format_pcm_ex : (void*)&format_pcm; |     audioSrc.pFormat = SDL_AUDIO_ISFLOAT(this->spec.format) ? (void *)&format_pcm_ex : (void *)&format_pcm; | ||||||
|  |  | ||||||
|     /* configure audio sink */ |     /* configure audio sink */ | ||||||
|     loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; |     loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; | ||||||
| @@ -573,7 +565,7 @@ openslES_CreatePCMPlayer(_THIS) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Create the sound buffers */ |     /* Create the sound buffers */ | ||||||
|     audiodata->mixbuff = (Uint8 *) SDL_malloc(NUM_BUFFERS * this->spec.size); |     audiodata->mixbuff = (Uint8 *)SDL_malloc(NUM_BUFFERS * this->spec.size); | ||||||
|     if (audiodata->mixbuff == NULL) { |     if (audiodata->mixbuff == NULL) { | ||||||
|         LOGE("mixbuffer allocate - out of memory"); |         LOGE("mixbuffer allocate - out of memory"); | ||||||
|         goto failed; |         goto failed; | ||||||
| @@ -596,10 +588,9 @@ failed: | |||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int openslES_OpenDevice(_THIS, const char *devname) | ||||||
| openslES_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     this->hidden = (struct SDL_PrivateAudioData *) SDL_calloc(1, (sizeof *this->hidden)); |     this->hidden = (struct SDL_PrivateAudioData *)SDL_calloc(1, (sizeof *this->hidden)); | ||||||
|     if (this->hidden == NULL) { |     if (this->hidden == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -625,12 +616,10 @@ openslES_OpenDevice(_THIS, const char *devname) | |||||||
|         } else { |         } else { | ||||||
|             return SDL_SetError("Open device failed!"); |             return SDL_SetError("Open device failed!"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void openslES_WaitDevice(_THIS) | ||||||
| openslES_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = this->hidden; |     struct SDL_PrivateAudioData *audiodata = this->hidden; | ||||||
|  |  | ||||||
| @@ -640,8 +629,7 @@ openslES_WaitDevice(_THIS) | |||||||
|     SDL_SemWait(audiodata->playsem); |     SDL_SemWait(audiodata->playsem); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void openslES_PlayDevice(_THIS) | ||||||
| openslES_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = this->hidden; |     struct SDL_PrivateAudioData *audiodata = this->hidden; | ||||||
|     SLresult result; |     SLresult result; | ||||||
| @@ -675,8 +663,7 @@ openslES_PlayDevice(_THIS) | |||||||
| /* */ | /* */ | ||||||
| /* okay.. */ | /* okay.. */ | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *openslES_GetDeviceBuf(_THIS) | ||||||
| openslES_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = this->hidden; |     struct SDL_PrivateAudioData *audiodata = this->hidden; | ||||||
|  |  | ||||||
| @@ -684,8 +671,7 @@ openslES_GetDeviceBuf(_THIS) | |||||||
|     return audiodata->pmixbuff[audiodata->next_buffer]; |     return audiodata->pmixbuff[audiodata->next_buffer]; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int openslES_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| openslES_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *audiodata = this->hidden; |     struct SDL_PrivateAudioData *audiodata = this->hidden; | ||||||
|     SLresult result; |     SLresult result; | ||||||
| @@ -712,8 +698,7 @@ openslES_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     return this->spec.size; |     return this->spec.size; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void openslES_CloseDevice(_THIS) | ||||||
| openslES_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     /* struct SDL_PrivateAudioData *audiodata = this->hidden; */ |     /* struct SDL_PrivateAudioData *audiodata = this->hidden; */ | ||||||
|  |  | ||||||
| @@ -728,8 +713,7 @@ openslES_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool openslES_Init(SDL_AudioDriverImpl *impl) | ||||||
| openslES_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     LOGI("openslES_Init() called"); |     LOGI("openslES_Init() called"); | ||||||
|  |  | ||||||
| @@ -741,13 +725,13 @@ openslES_Init(SDL_AudioDriverImpl * impl) | |||||||
|  |  | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     /* impl->DetectDevices = openslES_DetectDevices; */ |     /* impl->DetectDevices = openslES_DetectDevices; */ | ||||||
|     impl->OpenDevice    = openslES_OpenDevice; |     impl->OpenDevice = openslES_OpenDevice; | ||||||
|     impl->WaitDevice    = openslES_WaitDevice; |     impl->WaitDevice = openslES_WaitDevice; | ||||||
|     impl->PlayDevice    = openslES_PlayDevice; |     impl->PlayDevice = openslES_PlayDevice; | ||||||
|     impl->GetDeviceBuf  = openslES_GetDeviceBuf; |     impl->GetDeviceBuf = openslES_GetDeviceBuf; | ||||||
|     impl->CaptureFromDevice = openslES_CaptureFromDevice; |     impl->CaptureFromDevice = openslES_CaptureFromDevice; | ||||||
|     impl->CloseDevice   = openslES_CloseDevice; |     impl->CloseDevice = openslES_CloseDevice; | ||||||
|     impl->Deinitialize  = openslES_DestroyEngine; |     impl->Deinitialize = openslES_DestroyEngine; | ||||||
|  |  | ||||||
|     /* and the capabilities */ |     /* and the capabilities */ | ||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|   | |||||||
| @@ -26,15 +26,15 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| #define NUM_BUFFERS 2           /* -- Don't lower this! */ | #define NUM_BUFFERS 2 /* -- Don't lower this! */ | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|     Uint8   *mixbuff; |     Uint8 *mixbuff; | ||||||
|     int      next_buffer; |     int next_buffer; | ||||||
|     Uint8   *pmixbuff[NUM_BUFFERS]; |     Uint8 *pmixbuff[NUM_BUFFERS]; | ||||||
|     SDL_sem *playsem; |     SDL_sem *playsem; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -77,7 +77,7 @@ enum PW_READY_FLAGS | |||||||
| { | { | ||||||
|     PW_READY_FLAG_BUFFER_ADDED = 0x1, |     PW_READY_FLAG_BUFFER_ADDED = 0x1, | ||||||
|     PW_READY_FLAG_STREAM_READY = 0x2, |     PW_READY_FLAG_STREAM_READY = 0x2, | ||||||
|     PW_READY_FLAG_ALL_BITS     = 0x3 |     PW_READY_FLAG_ALL_BITS = 0x3 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #define PW_ID_TO_HANDLE(x) (void *)((uintptr_t)x) | #define PW_ID_TO_HANDLE(x) (void *)((uintptr_t)x) | ||||||
| @@ -117,17 +117,16 @@ static struct pw_properties *(*PIPEWIRE_pw_properties_new)(const char *, ...)SPA | |||||||
| static int (*PIPEWIRE_pw_properties_set)(struct pw_properties *, const char *, const char *); | static int (*PIPEWIRE_pw_properties_set)(struct pw_properties *, const char *, const char *); | ||||||
| static int (*PIPEWIRE_pw_properties_setf)(struct pw_properties *, const char *, const char *, ...) SPA_PRINTF_FUNC(3, 4); | static int (*PIPEWIRE_pw_properties_setf)(struct pw_properties *, const char *, const char *, ...) SPA_PRINTF_FUNC(3, 4); | ||||||
|  |  | ||||||
| static int         pipewire_version_major; | static int pipewire_version_major; | ||||||
| static int         pipewire_version_minor; | static int pipewire_version_minor; | ||||||
| static int         pipewire_version_patch; | static int pipewire_version_patch; | ||||||
|  |  | ||||||
| #ifdef SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC | #ifdef SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC | ||||||
|  |  | ||||||
| static const char *pipewire_library = SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC; | static const char *pipewire_library = SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC; | ||||||
| static void       *pipewire_handle  = NULL; | static void *pipewire_handle = NULL; | ||||||
|  |  | ||||||
| static int | static int pipewire_dlsym(const char *fn, void **addr) | ||||||
| pipewire_dlsym(const char *fn, void **addr) |  | ||||||
| { | { | ||||||
|     *addr = SDL_LoadFunction(pipewire_handle, fn); |     *addr = SDL_LoadFunction(pipewire_handle, fn); | ||||||
|     if (*addr == NULL) { |     if (*addr == NULL) { | ||||||
| @@ -143,8 +142,7 @@ pipewire_dlsym(const char *fn, void **addr) | |||||||
|         return -1;                                             \ |         return -1;                                             \ | ||||||
|     } |     } | ||||||
|  |  | ||||||
| static int | static int load_pipewire_library() | ||||||
| load_pipewire_library() |  | ||||||
| { | { | ||||||
|     if ((pipewire_handle = SDL_LoadObject(pipewire_library))) { |     if ((pipewire_handle = SDL_LoadObject(pipewire_library))) { | ||||||
|         return 0; |         return 0; | ||||||
| @@ -153,8 +151,7 @@ load_pipewire_library() | |||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void unload_pipewire_library() | ||||||
| unload_pipewire_library() |  | ||||||
| { | { | ||||||
|     if (pipewire_handle) { |     if (pipewire_handle) { | ||||||
|         SDL_UnloadObject(pipewire_handle); |         SDL_UnloadObject(pipewire_handle); | ||||||
| @@ -166,21 +163,18 @@ unload_pipewire_library() | |||||||
|  |  | ||||||
| #define SDL_PIPEWIRE_SYM(x) PIPEWIRE_##x = x | #define SDL_PIPEWIRE_SYM(x) PIPEWIRE_##x = x | ||||||
|  |  | ||||||
| static int | static int load_pipewire_library() | ||||||
| load_pipewire_library() |  | ||||||
| { | { | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void unload_pipewire_library() | ||||||
| unload_pipewire_library() |  | ||||||
| { /* Nothing to do */ | { /* Nothing to do */ | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif /* SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC */ | #endif /* SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC */ | ||||||
|  |  | ||||||
| static int | static int load_pipewire_syms() | ||||||
| load_pipewire_syms() |  | ||||||
| { | { | ||||||
|     SDL_PIPEWIRE_SYM(pw_get_library_version); |     SDL_PIPEWIRE_SYM(pw_get_library_version); | ||||||
|     SDL_PIPEWIRE_SYM(pw_init); |     SDL_PIPEWIRE_SYM(pw_init); | ||||||
| @@ -222,8 +216,7 @@ pipewire_version_at_least(int major, int minor, int patch) | |||||||
|            (pipewire_version_major > major || pipewire_version_minor > minor || pipewire_version_patch >= patch); |            (pipewire_version_major > major || pipewire_version_minor > minor || pipewire_version_patch >= patch); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int init_pipewire_library() | ||||||
| init_pipewire_library() |  | ||||||
| { | { | ||||||
|     if (!load_pipewire_library()) { |     if (!load_pipewire_library()) { | ||||||
|         if (!load_pipewire_syms()) { |         if (!load_pipewire_syms()) { | ||||||
| @@ -245,8 +238,7 @@ init_pipewire_library() | |||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void deinit_pipewire_library() | ||||||
| deinit_pipewire_library() |  | ||||||
| { | { | ||||||
|     PIPEWIRE_pw_deinit(); |     PIPEWIRE_pw_deinit(); | ||||||
|     unload_pipewire_library(); |     unload_pipewire_library(); | ||||||
| @@ -257,8 +249,8 @@ struct node_object | |||||||
| { | { | ||||||
|     struct spa_list link; |     struct spa_list link; | ||||||
|  |  | ||||||
|     Uint32   id; |     Uint32 id; | ||||||
|     int      seq; |     int seq; | ||||||
|     SDL_bool persist; |     SDL_bool persist; | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
| @@ -271,8 +263,8 @@ struct node_object | |||||||
|     void *userdata; |     void *userdata; | ||||||
|  |  | ||||||
|     struct pw_proxy *proxy; |     struct pw_proxy *proxy; | ||||||
|     struct spa_hook  node_listener; |     struct spa_hook node_listener; | ||||||
|     struct spa_hook  core_listener; |     struct spa_hook core_listener; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* A sink/source node used for stream I/O. */ | /* A sink/source node used for stream I/O. */ | ||||||
| @@ -280,8 +272,8 @@ struct io_node | |||||||
| { | { | ||||||
|     struct spa_list link; |     struct spa_list link; | ||||||
|  |  | ||||||
|     Uint32        id; |     Uint32 id; | ||||||
|     SDL_bool      is_capture; |     SDL_bool is_capture; | ||||||
|     SDL_AudioSpec spec; |     SDL_AudioSpec spec; | ||||||
|  |  | ||||||
|     const char *name; /* Friendly name */ |     const char *name; /* Friendly name */ | ||||||
| @@ -292,26 +284,25 @@ struct io_node | |||||||
|  |  | ||||||
| /* The global hotplug thread and associated objects. */ | /* The global hotplug thread and associated objects. */ | ||||||
| static struct pw_thread_loop *hotplug_loop; | static struct pw_thread_loop *hotplug_loop; | ||||||
| static struct pw_core        *hotplug_core; | static struct pw_core *hotplug_core; | ||||||
| static struct pw_context     *hotplug_context; | static struct pw_context *hotplug_context; | ||||||
| static struct pw_registry    *hotplug_registry; | static struct pw_registry *hotplug_registry; | ||||||
| static struct spa_hook        hotplug_registry_listener; | static struct spa_hook hotplug_registry_listener; | ||||||
| static struct spa_hook        hotplug_core_listener; | static struct spa_hook hotplug_core_listener; | ||||||
| static struct spa_list        hotplug_pending_list; | static struct spa_list hotplug_pending_list; | ||||||
| static struct spa_list        hotplug_io_list; | static struct spa_list hotplug_io_list; | ||||||
| static int                    hotplug_init_seq_val; | static int hotplug_init_seq_val; | ||||||
| static SDL_bool               hotplug_init_complete; | static SDL_bool hotplug_init_complete; | ||||||
| static SDL_bool               hotplug_events_enabled; | static SDL_bool hotplug_events_enabled; | ||||||
|  |  | ||||||
| static char *pipewire_default_sink_id   = NULL; | static char *pipewire_default_sink_id = NULL; | ||||||
| static char *pipewire_default_source_id = NULL; | static char *pipewire_default_source_id = NULL; | ||||||
|  |  | ||||||
| /* The active node list */ | /* The active node list */ | ||||||
| static SDL_bool | static SDL_bool io_list_check_add(struct io_node *node) | ||||||
| io_list_check_add(struct io_node *node) |  | ||||||
| { | { | ||||||
|     struct io_node *n; |     struct io_node *n; | ||||||
|     SDL_bool        ret = SDL_TRUE; |     SDL_bool ret = SDL_TRUE; | ||||||
|  |  | ||||||
|     /* See if the node is already in the list */ |     /* See if the node is already in the list */ | ||||||
|     spa_list_for_each (n, &hotplug_io_list, link) { |     spa_list_for_each (n, &hotplug_io_list, link) { | ||||||
| @@ -333,8 +324,7 @@ dup_found: | |||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void io_list_remove(Uint32 id) | ||||||
| io_list_remove(Uint32 id) |  | ||||||
| { | { | ||||||
|     struct io_node *n, *temp; |     struct io_node *n, *temp; | ||||||
|  |  | ||||||
| @@ -354,8 +344,7 @@ io_list_remove(Uint32 id) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void io_list_sort() | ||||||
| io_list_sort() |  | ||||||
| { | { | ||||||
|     struct io_node *default_sink = NULL, *default_source = NULL; |     struct io_node *default_sink = NULL, *default_source = NULL; | ||||||
|     struct io_node *n, *temp; |     struct io_node *n, *temp; | ||||||
| @@ -380,8 +369,7 @@ io_list_sort() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void io_list_clear() | ||||||
| io_list_clear() |  | ||||||
| { | { | ||||||
|     struct io_node *n, *temp; |     struct io_node *n, *temp; | ||||||
|  |  | ||||||
| @@ -391,7 +379,7 @@ io_list_clear() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static struct io_node* | static struct io_node * | ||||||
| io_list_get_by_id(Uint32 id) | io_list_get_by_id(Uint32 id) | ||||||
| { | { | ||||||
|     struct io_node *n, *temp; |     struct io_node *n, *temp; | ||||||
| @@ -403,7 +391,7 @@ io_list_get_by_id(Uint32 id) | |||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static struct io_node* | static struct io_node * | ||||||
| io_list_get_by_path(char *path) | io_list_get_by_path(char *path) | ||||||
| { | { | ||||||
|     struct io_node *n, *temp; |     struct io_node *n, *temp; | ||||||
| @@ -415,8 +403,7 @@ io_list_get_by_path(char *path) | |||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void node_object_destroy(struct node_object *node) | ||||||
| node_object_destroy(struct node_object *node) |  | ||||||
| { | { | ||||||
|     SDL_assert(node); |     SDL_assert(node); | ||||||
|  |  | ||||||
| @@ -428,15 +415,13 @@ node_object_destroy(struct node_object *node) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* The pending node list */ | /* The pending node list */ | ||||||
| static void | static void pending_list_add(struct node_object *node) | ||||||
| pending_list_add(struct node_object *node) |  | ||||||
| { | { | ||||||
|     SDL_assert(node); |     SDL_assert(node); | ||||||
|     spa_list_append(&hotplug_pending_list, &node->link); |     spa_list_append(&hotplug_pending_list, &node->link); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void pending_list_remove(Uint32 id) | ||||||
| pending_list_remove(Uint32 id) |  | ||||||
| { | { | ||||||
|     struct node_object *node, *temp; |     struct node_object *node, *temp; | ||||||
|  |  | ||||||
| @@ -447,8 +432,7 @@ pending_list_remove(Uint32 id) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void pending_list_clear() | ||||||
| pending_list_clear() |  | ||||||
| { | { | ||||||
|     struct node_object *node, *temp; |     struct node_object *node, *temp; | ||||||
|  |  | ||||||
| @@ -457,10 +441,9 @@ pending_list_clear() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void * | static void *node_object_new(Uint32 id, const char *type, Uint32 version, const void *funcs, const struct pw_core_events *core_events) | ||||||
| node_object_new(Uint32 id, const char *type, Uint32 version, const void *funcs, const struct pw_core_events *core_events) |  | ||||||
| { | { | ||||||
|     struct pw_proxy    *proxy; |     struct pw_proxy *proxy; | ||||||
|     struct node_object *node; |     struct node_object *node; | ||||||
|  |  | ||||||
|     /* Create the proxy object */ |     /* Create the proxy object */ | ||||||
| @@ -473,7 +456,7 @@ node_object_new(Uint32 id, const char *type, Uint32 version, const void *funcs, | |||||||
|     node = PIPEWIRE_pw_proxy_get_user_data(proxy); |     node = PIPEWIRE_pw_proxy_get_user_data(proxy); | ||||||
|     SDL_zerop(node); |     SDL_zerop(node); | ||||||
|  |  | ||||||
|     node->id    = id; |     node->id = id; | ||||||
|     node->proxy = proxy; |     node->proxy = proxy; | ||||||
|  |  | ||||||
|     /* Add the callbacks */ |     /* Add the callbacks */ | ||||||
| @@ -487,8 +470,7 @@ node_object_new(Uint32 id, const char *type, Uint32 version, const void *funcs, | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Core sync points */ | /* Core sync points */ | ||||||
| static void | static void core_events_hotplug_init_callback(void *object, uint32_t id, int seq) | ||||||
| core_events_hotplug_init_callback(void *object, uint32_t id, int seq) |  | ||||||
| { | { | ||||||
|     if (id == PW_ID_CORE && seq == hotplug_init_seq_val) { |     if (id == PW_ID_CORE && seq == hotplug_init_seq_val) { | ||||||
|         /* This core listener is no longer needed. */ |         /* This core listener is no longer needed. */ | ||||||
| @@ -500,11 +482,10 @@ core_events_hotplug_init_callback(void *object, uint32_t id, int seq) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void core_events_interface_callback(void *object, uint32_t id, int seq) | ||||||
| core_events_interface_callback(void *object, uint32_t id, int seq) |  | ||||||
| { | { | ||||||
|     struct node_object *node = object; |     struct node_object *node = object; | ||||||
|     struct io_node     *io   = node->userdata; |     struct io_node *io = node->userdata; | ||||||
|  |  | ||||||
|     if (id == PW_ID_CORE && seq == node->seq) { |     if (id == PW_ID_CORE && seq == node->seq) { | ||||||
|         /* |         /* | ||||||
| @@ -519,8 +500,7 @@ core_events_interface_callback(void *object, uint32_t id, int seq) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void core_events_metadata_callback(void *object, uint32_t id, int seq) | ||||||
| core_events_metadata_callback(void *object, uint32_t id, int seq) |  | ||||||
| { | { | ||||||
|     struct node_object *node = object; |     struct node_object *node = object; | ||||||
|  |  | ||||||
| @@ -530,11 +510,10 @@ core_events_metadata_callback(void *object, uint32_t id, int seq) | |||||||
| } | } | ||||||
|  |  | ||||||
| static const struct pw_core_events hotplug_init_core_events = { PW_VERSION_CORE_EVENTS, .done = core_events_hotplug_init_callback }; | static const struct pw_core_events hotplug_init_core_events = { PW_VERSION_CORE_EVENTS, .done = core_events_hotplug_init_callback }; | ||||||
| static const struct pw_core_events interface_core_events    = { PW_VERSION_CORE_EVENTS, .done = core_events_interface_callback }; | static const struct pw_core_events interface_core_events = { PW_VERSION_CORE_EVENTS, .done = core_events_interface_callback }; | ||||||
| static const struct pw_core_events metadata_core_events     = { PW_VERSION_CORE_EVENTS, .done = core_events_metadata_callback }; | static const struct pw_core_events metadata_core_events = { PW_VERSION_CORE_EVENTS, .done = core_events_metadata_callback }; | ||||||
|  |  | ||||||
| static void | static void hotplug_core_sync(struct node_object *node) | ||||||
| hotplug_core_sync(struct node_object *node) |  | ||||||
| { | { | ||||||
|     /* |     /* | ||||||
|      * Node sync events *must* come before the hotplug init sync events or the initial |      * Node sync events *must* come before the hotplug init sync events or the initial | ||||||
| @@ -550,12 +529,11 @@ hotplug_core_sync(struct node_object *node) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Helpers for retrieving values from params */ | /* Helpers for retrieving values from params */ | ||||||
| static SDL_bool | static SDL_bool get_range_param(const struct spa_pod *param, Uint32 key, int *def, int *min, int *max) | ||||||
| get_range_param(const struct spa_pod *param, Uint32 key, int *def, int *min, int *max) |  | ||||||
| { | { | ||||||
|     const struct spa_pod_prop *prop; |     const struct spa_pod_prop *prop; | ||||||
|     struct spa_pod            *value; |     struct spa_pod *value; | ||||||
|     Uint32                     n_values, choice; |     Uint32 n_values, choice; | ||||||
|  |  | ||||||
|     prop = spa_pod_find_prop(param, NULL, key); |     prop = spa_pod_find_prop(param, NULL, key); | ||||||
|  |  | ||||||
| @@ -584,11 +562,10 @@ get_range_param(const struct spa_pod *param, Uint32 key, int *def, int *min, int | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool get_int_param(const struct spa_pod *param, Uint32 key, int *val) | ||||||
| get_int_param(const struct spa_pod *param, Uint32 key, int *val) |  | ||||||
| { | { | ||||||
|     const struct spa_pod_prop *prop; |     const struct spa_pod_prop *prop; | ||||||
|     Sint32                     v; |     Sint32 v; | ||||||
|  |  | ||||||
|     prop = spa_pod_find_prop(param, NULL, key); |     prop = spa_pod_find_prop(param, NULL, key); | ||||||
|  |  | ||||||
| @@ -604,13 +581,12 @@ get_int_param(const struct spa_pod *param, Uint32 key, int *val) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Interface node callbacks */ | /* Interface node callbacks */ | ||||||
| static void | static void node_event_info(void *object, const struct pw_node_info *info) | ||||||
| node_event_info(void *object, const struct pw_node_info *info) |  | ||||||
| { | { | ||||||
|     struct node_object *node = object; |     struct node_object *node = object; | ||||||
|     struct io_node     *io   = node->userdata; |     struct io_node *io = node->userdata; | ||||||
|     const char         *prop_val; |     const char *prop_val; | ||||||
|     Uint32              i; |     Uint32 i; | ||||||
|  |  | ||||||
|     if (info) { |     if (info) { | ||||||
|         prop_val = spa_dict_lookup(info->props, PW_KEY_AUDIO_CHANNELS); |         prop_val = spa_dict_lookup(info->props, PW_KEY_AUDIO_CHANNELS); | ||||||
| @@ -627,11 +603,10 @@ node_event_info(void *object, const struct pw_node_info *info) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void node_event_param(void *object, int seq, uint32_t id, uint32_t index, uint32_t next, const struct spa_pod *param) | ||||||
| node_event_param(void *object, int seq, uint32_t id, uint32_t index, uint32_t next, const struct spa_pod *param) |  | ||||||
| { | { | ||||||
|     struct node_object *node = object; |     struct node_object *node = object; | ||||||
|     struct io_node     *io   = node->userdata; |     struct io_node *io = node->userdata; | ||||||
|  |  | ||||||
|     /* Get the default frequency */ |     /* Get the default frequency */ | ||||||
|     if (io->spec.freq == 0) { |     if (io->spec.freq == 0) { | ||||||
| @@ -653,8 +628,7 @@ node_event_param(void *object, int seq, uint32_t id, uint32_t index, uint32_t ne | |||||||
| static const struct pw_node_events interface_node_events = { PW_VERSION_NODE_EVENTS, .info = node_event_info, | static const struct pw_node_events interface_node_events = { PW_VERSION_NODE_EVENTS, .info = node_event_info, | ||||||
|                                                              .param = node_event_param }; |                                                              .param = node_event_param }; | ||||||
|  |  | ||||||
| static char* | static char *get_name_from_json(const char *json) | ||||||
| get_name_from_json(const char *json) |  | ||||||
| { | { | ||||||
|     struct spa_json parser[2]; |     struct spa_json parser[2]; | ||||||
|     char key[7]; /* "name" */ |     char key[7]; /* "name" */ | ||||||
| @@ -676,8 +650,7 @@ get_name_from_json(const char *json) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Metadata node callback */ | /* Metadata node callback */ | ||||||
| static int | static int metadata_property(void *object, Uint32 subject, const char *key, const char *type, const char *value) | ||||||
| metadata_property(void *object, Uint32 subject, const char *key, const char *type, const char *value) |  | ||||||
| { | { | ||||||
|     struct node_object *node = object; |     struct node_object *node = object; | ||||||
|  |  | ||||||
| @@ -703,9 +676,8 @@ metadata_property(void *object, Uint32 subject, const char *key, const char *typ | |||||||
| static const struct pw_metadata_events metadata_node_events = { PW_VERSION_METADATA_EVENTS, .property = metadata_property }; | static const struct pw_metadata_events metadata_node_events = { PW_VERSION_METADATA_EVENTS, .property = metadata_property }; | ||||||
|  |  | ||||||
| /* Global registry callbacks */ | /* Global registry callbacks */ | ||||||
| static void | static void registry_event_global_callback(void *object, uint32_t id, uint32_t permissions, const char *type, uint32_t version, | ||||||
| registry_event_global_callback(void *object, uint32_t id, uint32_t permissions, const char *type, uint32_t version, |                                            const struct spa_dict *props) | ||||||
|                                const struct spa_dict *props) |  | ||||||
| { | { | ||||||
|     struct node_object *node; |     struct node_object *node; | ||||||
|  |  | ||||||
| @@ -714,12 +686,12 @@ registry_event_global_callback(void *object, uint32_t id, uint32_t permissions, | |||||||
|         const char *media_class = spa_dict_lookup(props, PW_KEY_MEDIA_CLASS); |         const char *media_class = spa_dict_lookup(props, PW_KEY_MEDIA_CLASS); | ||||||
|  |  | ||||||
|         if (media_class) { |         if (media_class) { | ||||||
|             const char     *node_desc; |             const char *node_desc; | ||||||
|             const char     *node_path; |             const char *node_path; | ||||||
|             struct io_node *io; |             struct io_node *io; | ||||||
|             SDL_bool        is_capture; |             SDL_bool is_capture; | ||||||
|             int             desc_buffer_len; |             int desc_buffer_len; | ||||||
|             int             path_buffer_len; |             int path_buffer_len; | ||||||
|  |  | ||||||
|             /* Just want sink and capture */ |             /* Just want sink and capture */ | ||||||
|             if (!SDL_strcasecmp(media_class, "Audio/Sink")) { |             if (!SDL_strcasecmp(media_class, "Audio/Sink")) { | ||||||
| @@ -751,11 +723,11 @@ registry_event_global_callback(void *object, uint32_t id, uint32_t permissions, | |||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 /* Begin setting the node properties */ |                 /* Begin setting the node properties */ | ||||||
|                 io->id          = id; |                 io->id = id; | ||||||
|                 io->is_capture  = is_capture; |                 io->is_capture = is_capture; | ||||||
|                 io->spec.format = AUDIO_F32; /* Pipewire uses floats internally, other formats require conversion. */ |                 io->spec.format = AUDIO_F32; /* Pipewire uses floats internally, other formats require conversion. */ | ||||||
|                 io->name        = io->buf; |                 io->name = io->buf; | ||||||
|                 io->path        = io->buf + desc_buffer_len; |                 io->path = io->buf + desc_buffer_len; | ||||||
|                 SDL_strlcpy(io->buf, node_desc, desc_buffer_len); |                 SDL_strlcpy(io->buf, node_desc, desc_buffer_len); | ||||||
|                 SDL_strlcpy(io->buf + desc_buffer_len, node_path, path_buffer_len); |                 SDL_strlcpy(io->buf + desc_buffer_len, node_path, path_buffer_len); | ||||||
|  |  | ||||||
| @@ -775,8 +747,7 @@ registry_event_global_callback(void *object, uint32_t id, uint32_t permissions, | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void registry_event_remove_callback(void *object, uint32_t id) | ||||||
| registry_event_remove_callback(void *object, uint32_t id) |  | ||||||
| { | { | ||||||
|     io_list_remove(id); |     io_list_remove(id); | ||||||
|     pending_list_remove(id); |     pending_list_remove(id); | ||||||
| @@ -786,8 +757,7 @@ static const struct pw_registry_events registry_events = { PW_VERSION_REGISTRY_E | |||||||
|                                                            .global_remove = registry_event_remove_callback }; |                                                            .global_remove = registry_event_remove_callback }; | ||||||
|  |  | ||||||
| /* The hotplug thread */ | /* The hotplug thread */ | ||||||
| static int | static int hotplug_loop_init() | ||||||
| hotplug_loop_init() |  | ||||||
| { | { | ||||||
|     int res; |     int res; | ||||||
|  |  | ||||||
| @@ -830,8 +800,7 @@ hotplug_loop_init() | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void hotplug_loop_destroy() | ||||||
| hotplug_loop_destroy() |  | ||||||
| { | { | ||||||
|     if (hotplug_loop) { |     if (hotplug_loop) { | ||||||
|         PIPEWIRE_pw_thread_loop_stop(hotplug_loop); |         PIPEWIRE_pw_thread_loop_stop(hotplug_loop); | ||||||
| @@ -840,7 +809,7 @@ hotplug_loop_destroy() | |||||||
|     pending_list_clear(); |     pending_list_clear(); | ||||||
|     io_list_clear(); |     io_list_clear(); | ||||||
|  |  | ||||||
|     hotplug_init_complete  = SDL_FALSE; |     hotplug_init_complete = SDL_FALSE; | ||||||
|     hotplug_events_enabled = SDL_FALSE; |     hotplug_events_enabled = SDL_FALSE; | ||||||
|  |  | ||||||
|     if (pipewire_default_sink_id != NULL) { |     if (pipewire_default_sink_id != NULL) { | ||||||
| @@ -873,8 +842,7 @@ hotplug_loop_destroy() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void PIPEWIRE_DetectDevices() | ||||||
| PIPEWIRE_DetectDevices() |  | ||||||
| { | { | ||||||
|     struct io_node *io; |     struct io_node *io; | ||||||
|  |  | ||||||
| @@ -916,11 +884,10 @@ static const enum spa_audio_channel PIPEWIRE_channel_map_8[] = { SPA_AUDIO_CHANN | |||||||
|  |  | ||||||
| #define COPY_CHANNEL_MAP(c) SDL_memcpy(info->position, PIPEWIRE_channel_map_##c, sizeof(PIPEWIRE_channel_map_##c)) | #define COPY_CHANNEL_MAP(c) SDL_memcpy(info->position, PIPEWIRE_channel_map_##c, sizeof(PIPEWIRE_channel_map_##c)) | ||||||
|  |  | ||||||
| static void | static void initialize_spa_info(const SDL_AudioSpec *spec, struct spa_audio_info_raw *info) | ||||||
| initialize_spa_info(const SDL_AudioSpec *spec, struct spa_audio_info_raw *info) |  | ||||||
| { | { | ||||||
|     info->channels = spec->channels; |     info->channels = spec->channels; | ||||||
|     info->rate     = spec->freq; |     info->rate = spec->freq; | ||||||
|  |  | ||||||
|     switch (spec->channels) { |     switch (spec->channels) { | ||||||
|     case 1: |     case 1: | ||||||
| @@ -984,14 +951,13 @@ initialize_spa_info(const SDL_AudioSpec *spec, struct spa_audio_info_raw *info) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void output_callback(void *data) | ||||||
| output_callback(void *data) |  | ||||||
| { | { | ||||||
|     struct pw_buffer  *pw_buf; |     struct pw_buffer *pw_buf; | ||||||
|     struct spa_buffer *spa_buf; |     struct spa_buffer *spa_buf; | ||||||
|     Uint8             *dst; |     Uint8 *dst; | ||||||
|  |  | ||||||
|     _THIS                    = (SDL_AudioDevice *)data; |     _THIS = (SDL_AudioDevice *)data; | ||||||
|     struct pw_stream *stream = this->hidden->stream; |     struct pw_stream *stream = this->hidden->stream; | ||||||
|  |  | ||||||
|     /* Shutting down, don't do anything */ |     /* Shutting down, don't do anything */ | ||||||
| @@ -1045,18 +1011,17 @@ output_callback(void *data) | |||||||
|  |  | ||||||
|     spa_buf->datas[0].chunk->offset = 0; |     spa_buf->datas[0].chunk->offset = 0; | ||||||
|     spa_buf->datas[0].chunk->stride = this->hidden->stride; |     spa_buf->datas[0].chunk->stride = this->hidden->stride; | ||||||
|     spa_buf->datas[0].chunk->size   = this->spec.size; |     spa_buf->datas[0].chunk->size = this->spec.size; | ||||||
|  |  | ||||||
|     PIPEWIRE_pw_stream_queue_buffer(stream, pw_buf); |     PIPEWIRE_pw_stream_queue_buffer(stream, pw_buf); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void input_callback(void *data) | ||||||
| input_callback(void *data) |  | ||||||
| { | { | ||||||
|     struct pw_buffer  *pw_buf; |     struct pw_buffer *pw_buf; | ||||||
|     struct spa_buffer *spa_buf; |     struct spa_buffer *spa_buf; | ||||||
|     Uint8             *src; |     Uint8 *src; | ||||||
|     _THIS                    = (SDL_AudioDevice *)data; |     _THIS = (SDL_AudioDevice *)data; | ||||||
|     struct pw_stream *stream = this->hidden->stream; |     struct pw_stream *stream = this->hidden->stream; | ||||||
|  |  | ||||||
|     /* Shutting down, don't do anything */ |     /* Shutting down, don't do anything */ | ||||||
| @@ -1078,7 +1043,7 @@ input_callback(void *data) | |||||||
|     if (!SDL_AtomicGet(&this->paused)) { |     if (!SDL_AtomicGet(&this->paused)) { | ||||||
|         /* Calculate the offset and data size */ |         /* Calculate the offset and data size */ | ||||||
|         const Uint32 offset = SPA_MIN(spa_buf->datas[0].chunk->offset, spa_buf->datas[0].maxsize); |         const Uint32 offset = SPA_MIN(spa_buf->datas[0].chunk->offset, spa_buf->datas[0].maxsize); | ||||||
|         const Uint32 size   = SPA_MIN(spa_buf->datas[0].chunk->size, spa_buf->datas[0].maxsize - offset); |         const Uint32 size = SPA_MIN(spa_buf->datas[0].chunk->size, spa_buf->datas[0].maxsize - offset); | ||||||
|  |  | ||||||
|         src += offset; |         src += offset; | ||||||
|  |  | ||||||
| @@ -1106,8 +1071,7 @@ input_callback(void *data) | |||||||
|     PIPEWIRE_pw_stream_queue_buffer(stream, pw_buf); |     PIPEWIRE_pw_stream_queue_buffer(stream, pw_buf); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void stream_add_buffer_callback(void *data, struct pw_buffer *buffer) | ||||||
| stream_add_buffer_callback(void *data, struct pw_buffer *buffer) |  | ||||||
| { | { | ||||||
|     _THIS = data; |     _THIS = data; | ||||||
|  |  | ||||||
| @@ -1118,7 +1082,7 @@ stream_add_buffer_callback(void *data, struct pw_buffer *buffer) | |||||||
|          */ |          */ | ||||||
|         if (this->spec.size > buffer->buffer->datas[0].maxsize) { |         if (this->spec.size > buffer->buffer->datas[0].maxsize) { | ||||||
|             this->spec.samples = buffer->buffer->datas[0].maxsize / this->hidden->stride; |             this->spec.samples = buffer->buffer->datas[0].maxsize / this->hidden->stride; | ||||||
|             this->spec.size    = buffer->buffer->datas[0].maxsize; |             this->spec.size = buffer->buffer->datas[0].maxsize; | ||||||
|         } |         } | ||||||
|     } else if (this->hidden->buffer == NULL) { |     } else if (this->hidden->buffer == NULL) { | ||||||
|         /* |         /* | ||||||
| @@ -1130,15 +1094,14 @@ stream_add_buffer_callback(void *data, struct pw_buffer *buffer) | |||||||
|          * A packet size of 2 periods should be more than is ever needed. |          * A packet size of 2 periods should be more than is ever needed. | ||||||
|          */ |          */ | ||||||
|         this->hidden->input_buffer_packet_size = SPA_MAX(this->spec.size, buffer->buffer->datas[0].maxsize) * 2; |         this->hidden->input_buffer_packet_size = SPA_MAX(this->spec.size, buffer->buffer->datas[0].maxsize) * 2; | ||||||
|         this->hidden->buffer                   = SDL_NewDataQueue(this->hidden->input_buffer_packet_size, this->hidden->input_buffer_packet_size); |         this->hidden->buffer = SDL_NewDataQueue(this->hidden->input_buffer_packet_size, this->hidden->input_buffer_packet_size); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->hidden->stream_init_status |= PW_READY_FLAG_BUFFER_ADDED; |     this->hidden->stream_init_status |= PW_READY_FLAG_BUFFER_ADDED; | ||||||
|     PIPEWIRE_pw_thread_loop_signal(this->hidden->loop, false); |     PIPEWIRE_pw_thread_loop_signal(this->hidden->loop, false); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void stream_state_changed_callback(void *data, enum pw_stream_state old, enum pw_stream_state state, const char *error) | ||||||
| stream_state_changed_callback(void *data, enum pw_stream_state old, enum pw_stream_state state, const char *error) |  | ||||||
| { | { | ||||||
|     _THIS = data; |     _THIS = data; | ||||||
|  |  | ||||||
| @@ -1153,15 +1116,14 @@ stream_state_changed_callback(void *data, enum pw_stream_state old, enum pw_stre | |||||||
|  |  | ||||||
| static const struct pw_stream_events stream_output_events = { PW_VERSION_STREAM_EVENTS, | static const struct pw_stream_events stream_output_events = { PW_VERSION_STREAM_EVENTS, | ||||||
|                                                               .state_changed = stream_state_changed_callback, |                                                               .state_changed = stream_state_changed_callback, | ||||||
|                                                               .add_buffer    = stream_add_buffer_callback, |                                                               .add_buffer = stream_add_buffer_callback, | ||||||
|                                                               .process       = output_callback }; |                                                               .process = output_callback }; | ||||||
| static const struct pw_stream_events stream_input_events  = { PW_VERSION_STREAM_EVENTS, | static const struct pw_stream_events stream_input_events = { PW_VERSION_STREAM_EVENTS, | ||||||
|                                                               .state_changed = stream_state_changed_callback, |                                                              .state_changed = stream_state_changed_callback, | ||||||
|                                                               .add_buffer    = stream_add_buffer_callback, |                                                              .add_buffer = stream_add_buffer_callback, | ||||||
|                                                               .process       = input_callback }; |                                                              .process = input_callback }; | ||||||
|  |  | ||||||
| static int | static int PIPEWIRE_OpenDevice(_THIS, const char *devname) | ||||||
| PIPEWIRE_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     /* |     /* | ||||||
|      * NOTE: The PW_STREAM_FLAG_RT_PROCESS flag can be set to call the stream |      * NOTE: The PW_STREAM_FLAG_RT_PROCESS flag can be set to call the stream | ||||||
| @@ -1172,17 +1134,17 @@ PIPEWIRE_OpenDevice(_THIS, const char *devname) | |||||||
|      */ |      */ | ||||||
|     static const enum pw_stream_flags STREAM_FLAGS = PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS; |     static const enum pw_stream_flags STREAM_FLAGS = PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS; | ||||||
|  |  | ||||||
|     char                         thread_name[PW_THREAD_NAME_BUFFER_LENGTH]; |     char thread_name[PW_THREAD_NAME_BUFFER_LENGTH]; | ||||||
|     Uint8                        pod_buffer[PW_POD_BUFFER_LENGTH]; |     Uint8 pod_buffer[PW_POD_BUFFER_LENGTH]; | ||||||
|     struct spa_pod_builder       b        = SPA_POD_BUILDER_INIT(pod_buffer, sizeof(pod_buffer)); |     struct spa_pod_builder b = SPA_POD_BUILDER_INIT(pod_buffer, sizeof(pod_buffer)); | ||||||
|     struct spa_audio_info_raw    spa_info = { 0 }; |     struct spa_audio_info_raw spa_info = { 0 }; | ||||||
|     const struct spa_pod        *params   = NULL; |     const struct spa_pod *params = NULL; | ||||||
|     struct SDL_PrivateAudioData *priv; |     struct SDL_PrivateAudioData *priv; | ||||||
|     struct pw_properties        *props; |     struct pw_properties *props; | ||||||
|     const char                  *app_name, *stream_name, *stream_role, *error; |     const char *app_name, *stream_name, *stream_role, *error; | ||||||
|     Uint32                       node_id   = this->handle == NULL ? PW_ID_ANY : PW_HANDLE_TO_ID(this->handle); |     Uint32 node_id = this->handle == NULL ? PW_ID_ANY : PW_HANDLE_TO_ID(this->handle); | ||||||
|     SDL_bool                     iscapture = this->iscapture; |     SDL_bool iscapture = this->iscapture; | ||||||
|     int                          res; |     int res; | ||||||
|  |  | ||||||
|     /* Clamp the period size to sane values */ |     /* Clamp the period size to sane values */ | ||||||
|     const int min_period = PW_MIN_SAMPLES * SPA_MAX(this->spec.freq / PW_BASE_CLOCK_RATE, 1); |     const int min_period = PW_MIN_SAMPLES * SPA_MAX(this->spec.freq / PW_BASE_CLOCK_RATE, 1); | ||||||
| @@ -1226,7 +1188,7 @@ PIPEWIRE_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     if (this->spec.samples < min_period) { |     if (this->spec.samples < min_period) { | ||||||
|         this->spec.samples = min_period; |         this->spec.samples = min_period; | ||||||
|         this->spec.size    = this->spec.samples * priv->stride; |         this->spec.size = this->spec.samples * priv->stride; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_snprintf(thread_name, sizeof(thread_name), "SDLAudio%c%ld", (iscapture) ? 'C' : 'P', (long)this->handle); |     SDL_snprintf(thread_name, sizeof(thread_name), "SDLAudio%c%ld", (iscapture) ? 'C' : 'P', (long)this->handle); | ||||||
| @@ -1344,8 +1306,7 @@ static void PIPEWIRE_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int PIPEWIRE_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| PIPEWIRE_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
|     struct io_node *node; |     struct io_node *node; | ||||||
|     char *target; |     char *target; | ||||||
| @@ -1383,8 +1344,7 @@ failed: | |||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void PIPEWIRE_Deinitialize() | ||||||
| PIPEWIRE_Deinitialize() |  | ||||||
| { | { | ||||||
|     if (pipewire_initialized) { |     if (pipewire_initialized) { | ||||||
|         hotplug_loop_destroy(); |         hotplug_loop_destroy(); | ||||||
| @@ -1393,8 +1353,7 @@ PIPEWIRE_Deinitialize() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool PIPEWIRE_Init(SDL_AudioDriverImpl *impl) | ||||||
| PIPEWIRE_Init(SDL_AudioDriverImpl *impl) |  | ||||||
| { | { | ||||||
|     if (!pipewire_initialized) { |     if (!pipewire_initialized) { | ||||||
|         if (init_pipewire_library() < 0) { |         if (init_pipewire_library() < 0) { | ||||||
| @@ -1410,15 +1369,15 @@ PIPEWIRE_Init(SDL_AudioDriverImpl *impl) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->DetectDevices       = PIPEWIRE_DetectDevices; |     impl->DetectDevices = PIPEWIRE_DetectDevices; | ||||||
|     impl->OpenDevice          = PIPEWIRE_OpenDevice; |     impl->OpenDevice = PIPEWIRE_OpenDevice; | ||||||
|     impl->CloseDevice         = PIPEWIRE_CloseDevice; |     impl->CloseDevice = PIPEWIRE_CloseDevice; | ||||||
|     impl->Deinitialize        = PIPEWIRE_Deinitialize; |     impl->Deinitialize = PIPEWIRE_Deinitialize; | ||||||
|     impl->GetDefaultAudioInfo = PIPEWIRE_GetDefaultAudioInfo; |     impl->GetDefaultAudioInfo = PIPEWIRE_GetDefaultAudioInfo; | ||||||
|  |  | ||||||
|     impl->HasCaptureSupport         = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->ProvidesOwnCallbackThread = SDL_TRUE; |     impl->ProvidesOwnCallbackThread = SDL_TRUE; | ||||||
|     impl->SupportsNonPow2Samples    = SDL_TRUE; |     impl->SupportsNonPow2Samples = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -33,13 +33,13 @@ | |||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|     struct pw_thread_loop *loop; |     struct pw_thread_loop *loop; | ||||||
|     struct pw_stream      *stream; |     struct pw_stream *stream; | ||||||
|     struct pw_context     *context; |     struct pw_context *context; | ||||||
|     struct SDL_DataQueue  *buffer; |     struct SDL_DataQueue *buffer; | ||||||
|  |  | ||||||
|     size_t input_buffer_packet_size; |     size_t input_buffer_packet_size; | ||||||
|     Sint32 stride; /* Bytes-per-frame */ |     Sint32 stride; /* Bytes-per-frame */ | ||||||
|     int    stream_init_status; |     int stream_init_status; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* SDL_pipewire_h_ */ | #endif /* SDL_pipewire_h_ */ | ||||||
|   | |||||||
| @@ -33,10 +33,9 @@ | |||||||
| #include <ps2_audio_driver.h> | #include <ps2_audio_driver.h> | ||||||
|  |  | ||||||
| /* The tag name used by PS2 audio */ | /* The tag name used by PS2 audio */ | ||||||
| #define PS2AUDIO_DRIVER_NAME    "ps2" | #define PS2AUDIO_DRIVER_NAME "ps2" | ||||||
|  |  | ||||||
| static int | static int PS2AUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| PS2AUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     int i, mixlen; |     int i, mixlen; | ||||||
|     struct audsrv_fmt_t format; |     struct audsrv_fmt_t format; | ||||||
| @@ -48,21 +47,20 @@ PS2AUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     } |     } | ||||||
|     SDL_zerop(this->hidden); |     SDL_zerop(this->hidden); | ||||||
|  |  | ||||||
|  |  | ||||||
|     /* These are the native supported audio PS2 configs  */ |     /* These are the native supported audio PS2 configs  */ | ||||||
|     switch (this->spec.freq) { |     switch (this->spec.freq) { | ||||||
|         case 11025: |     case 11025: | ||||||
|         case 12000: |     case 12000: | ||||||
|         case 22050: |     case 22050: | ||||||
|         case 24000: |     case 24000: | ||||||
|         case 32000: |     case 32000: | ||||||
|         case 44100: |     case 44100: | ||||||
|         case 48000: |     case 48000: | ||||||
|             this->spec.freq = this->spec.freq; |         this->spec.freq = this->spec.freq; | ||||||
|             break; |         break; | ||||||
|         default:  |     default: | ||||||
|             this->spec.freq = 48000; |         this->spec.freq = 48000; | ||||||
|             break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this->spec.samples = 512; |     this->spec.samples = 512; | ||||||
| @@ -71,8 +69,8 @@ PS2AUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     SDL_CalculateAudioSpec(&this->spec); |     SDL_CalculateAudioSpec(&this->spec); | ||||||
|  |  | ||||||
|     format.bits     = this->spec.format == AUDIO_S8 ? 8 : 16; |     format.bits = this->spec.format == AUDIO_S8 ? 8 : 16; | ||||||
|     format.freq     = this->spec.freq; |     format.freq = this->spec.freq; | ||||||
|     format.channels = this->spec.channels; |     format.channels = this->spec.channels; | ||||||
|  |  | ||||||
|     this->hidden->channel = audsrv_set_format(&format); |     this->hidden->channel = audsrv_set_format(&format); | ||||||
| @@ -91,7 +89,7 @@ PS2AUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|        be a multiple of 64 bytes.  Our sample count is already a multiple of |        be a multiple of 64 bytes.  Our sample count is already a multiple of | ||||||
|        64, so spec->size should be a multiple of 64 as well. */ |        64, so spec->size should be a multiple of 64 as well. */ | ||||||
|     mixlen = this->spec.size * NUM_BUFFERS; |     mixlen = this->spec.size * NUM_BUFFERS; | ||||||
|     this->hidden->rawbuf = (Uint8 *) memalign(64, mixlen); |     this->hidden->rawbuf = (Uint8 *)memalign(64, mixlen); | ||||||
|     if (this->hidden->rawbuf == NULL) { |     if (this->hidden->rawbuf == NULL) { | ||||||
|         return SDL_SetError("Couldn't allocate mixing buffer"); |         return SDL_SetError("Couldn't allocate mixing buffer"); | ||||||
|     } |     } | ||||||
| @@ -154,7 +152,7 @@ static void PS2AUDIO_Deinitialize(void) | |||||||
|     deinit_audio_driver(); |     deinit_audio_driver(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool PS2AUDIO_Init(SDL_AudioDriverImpl * impl) | static SDL_bool PS2AUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| { | { | ||||||
|     if (init_audio_driver() < 0) { |     if (init_audio_driver() < 0) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -169,7 +167,7 @@ static SDL_bool PS2AUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->ThreadInit = PS2AUDIO_ThreadInit; |     impl->ThreadInit = PS2AUDIO_ThreadInit; | ||||||
|     impl->Deinitialize = PS2AUDIO_Deinitialize; |     impl->Deinitialize = PS2AUDIO_Deinitialize; | ||||||
|     impl->OnlyHasDefaultOutputDevice = SDL_TRUE; |     impl->OnlyHasDefaultOutputDevice = SDL_TRUE; | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap PS2AUDIO_bootstrap = { | AudioBootStrap PS2AUDIO_bootstrap = { | ||||||
|   | |||||||
| @@ -26,20 +26,20 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| #define NUM_BUFFERS 2 | #define NUM_BUFFERS 2 | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|    /* The hardware output channel. */ |     /* The hardware output channel. */ | ||||||
|    int     channel; |     int channel; | ||||||
|    /* The raw allocated mixing buffer. */ |     /* The raw allocated mixing buffer. */ | ||||||
|    Uint8   *rawbuf; |     Uint8 *rawbuf; | ||||||
|    /* Individual mixing buffers. */ |     /* Individual mixing buffers. */ | ||||||
|    Uint8   *mixbufs[NUM_BUFFERS]; |     Uint8 *mixbufs[NUM_BUFFERS]; | ||||||
|    /* Index of the next available mixing buffer. */ |     /* Index of the next available mixing buffer. */ | ||||||
|    int     next_buffer; |     int next_buffer; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* SDL_ps2audio_h_ */ | #endif /* SDL_ps2audio_h_ */ | ||||||
|   | |||||||
| @@ -39,10 +39,9 @@ | |||||||
| #include <pspthreadman.h> | #include <pspthreadman.h> | ||||||
|  |  | ||||||
| /* The tag name used by PSP audio */ | /* The tag name used by PSP audio */ | ||||||
| #define PSPAUDIO_DRIVER_NAME    "psp" | #define PSPAUDIO_DRIVER_NAME "psp" | ||||||
|  |  | ||||||
| static int | static int PSPAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| PSPAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     int format, mixlen, i; |     int format, mixlen, i; | ||||||
|  |  | ||||||
| @@ -64,7 +63,7 @@ PSPAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|         format = PSP_AUDIO_FORMAT_MONO; |         format = PSP_AUDIO_FORMAT_MONO; | ||||||
|     } else { |     } else { | ||||||
|         format = PSP_AUDIO_FORMAT_STEREO; |         format = PSP_AUDIO_FORMAT_STEREO; | ||||||
|         this->spec.channels = 2;  /* we're forcing the hardware to stereo. */ |         this->spec.channels = 2; /* we're forcing the hardware to stereo. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /*  PSP has some limitations with the Audio. It fully supports 44.1KHz (Mono & Stereo), |     /*  PSP has some limitations with the Audio. It fully supports 44.1KHz (Mono & Stereo), | ||||||
| @@ -89,7 +88,7 @@ PSPAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|        be a multiple of 64 bytes.  Our sample count is already a multiple of |        be a multiple of 64 bytes.  Our sample count is already a multiple of | ||||||
|        64, so spec->size should be a multiple of 64 as well. */ |        64, so spec->size should be a multiple of 64 as well. */ | ||||||
|     mixlen = this->spec.size * NUM_BUFFERS; |     mixlen = this->spec.size * NUM_BUFFERS; | ||||||
|     this->hidden->rawbuf = (Uint8 *) memalign(64, mixlen); |     this->hidden->rawbuf = (Uint8 *)memalign(64, mixlen); | ||||||
|     if (this->hidden->rawbuf == NULL) { |     if (this->hidden->rawbuf == NULL) { | ||||||
|         return SDL_SetError("Couldn't allocate mixing buffer"); |         return SDL_SetError("Couldn't allocate mixing buffer"); | ||||||
|     } |     } | ||||||
| @@ -158,8 +157,7 @@ static void PSPAUDIO_ThreadInit(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool PSPAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| PSPAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->OpenDevice = PSPAUDIO_OpenDevice; |     impl->OpenDevice = PSPAUDIO_OpenDevice; | ||||||
| @@ -175,7 +173,7 @@ PSPAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; |     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; | ||||||
|     */ |     */ | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap PSPAUDIO_bootstrap = { | AudioBootStrap PSPAUDIO_bootstrap = { | ||||||
|   | |||||||
| @@ -25,19 +25,20 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| #define NUM_BUFFERS 2 | #define NUM_BUFFERS 2 | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData { | struct SDL_PrivateAudioData | ||||||
|  | { | ||||||
|     /* The hardware output channel. */ |     /* The hardware output channel. */ | ||||||
|     int     channel; |     int channel; | ||||||
|     /* The raw allocated mixing buffer. */ |     /* The raw allocated mixing buffer. */ | ||||||
|     Uint8   *rawbuf; |     Uint8 *rawbuf; | ||||||
|     /* Individual mixing buffers. */ |     /* Individual mixing buffers. */ | ||||||
|     Uint8   *mixbufs[NUM_BUFFERS]; |     Uint8 *mixbufs[NUM_BUFFERS]; | ||||||
|     /* Index of the next available mixing buffer. */ |     /* Index of the next available mixing buffer. */ | ||||||
|     int     next_buffer; |     int next_buffer; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* SDL_pspaudio_h_ */ | #endif /* SDL_pspaudio_h_ */ | ||||||
|   | |||||||
| @@ -49,81 +49,79 @@ | |||||||
| /* should we include monitors in the device list? Set at SDL_Init time */ | /* should we include monitors in the device list? Set at SDL_Init time */ | ||||||
| static SDL_bool include_monitors = SDL_FALSE; | static SDL_bool include_monitors = SDL_FALSE; | ||||||
|  |  | ||||||
|  |  | ||||||
| #if (PA_API_VERSION < 12) | #if (PA_API_VERSION < 12) | ||||||
| /** Return non-zero if the passed state is one of the connected states */ | /** Return non-zero if the passed state is one of the connected states */ | ||||||
| static SDL_INLINE int PA_CONTEXT_IS_GOOD(pa_context_state_t x) { | static SDL_INLINE int PA_CONTEXT_IS_GOOD(pa_context_state_t x) | ||||||
|  | { | ||||||
|     return x == PA_CONTEXT_CONNECTING || x == PA_CONTEXT_AUTHORIZING || x == PA_CONTEXT_SETTING_NAME || x == PA_CONTEXT_READY; |     return x == PA_CONTEXT_CONNECTING || x == PA_CONTEXT_AUTHORIZING || x == PA_CONTEXT_SETTING_NAME || x == PA_CONTEXT_READY; | ||||||
| } | } | ||||||
| /** Return non-zero if the passed state is one of the connected states */ | /** Return non-zero if the passed state is one of the connected states */ | ||||||
| static SDL_INLINE int PA_STREAM_IS_GOOD(pa_stream_state_t x) { | static SDL_INLINE int PA_STREAM_IS_GOOD(pa_stream_state_t x) | ||||||
|  | { | ||||||
|     return x == PA_STREAM_CREATING || x == PA_STREAM_READY; |     return x == PA_STREAM_CREATING || x == PA_STREAM_READY; | ||||||
| } | } | ||||||
| #endif /* pulseaudio <= 0.9.10 */ | #endif /* pulseaudio <= 0.9.10 */ | ||||||
|  |  | ||||||
|  | static const char *(*PULSEAUDIO_pa_get_library_version)(void); | ||||||
| static const char *(*PULSEAUDIO_pa_get_library_version) (void); | static pa_channel_map *(*PULSEAUDIO_pa_channel_map_init_auto)( | ||||||
| static pa_channel_map *(*PULSEAUDIO_pa_channel_map_init_auto) ( |  | ||||||
|     pa_channel_map *, unsigned, pa_channel_map_def_t); |     pa_channel_map *, unsigned, pa_channel_map_def_t); | ||||||
| static const char * (*PULSEAUDIO_pa_strerror) (int); | static const char *(*PULSEAUDIO_pa_strerror)(int); | ||||||
| static pa_mainloop * (*PULSEAUDIO_pa_mainloop_new) (void); | static pa_mainloop *(*PULSEAUDIO_pa_mainloop_new)(void); | ||||||
| static pa_mainloop_api * (*PULSEAUDIO_pa_mainloop_get_api) (pa_mainloop *); | static pa_mainloop_api *(*PULSEAUDIO_pa_mainloop_get_api)(pa_mainloop *); | ||||||
| static int (*PULSEAUDIO_pa_mainloop_iterate) (pa_mainloop *, int, int *); | static int (*PULSEAUDIO_pa_mainloop_iterate)(pa_mainloop *, int, int *); | ||||||
| static int (*PULSEAUDIO_pa_mainloop_run) (pa_mainloop *, int *); | static int (*PULSEAUDIO_pa_mainloop_run)(pa_mainloop *, int *); | ||||||
| static void (*PULSEAUDIO_pa_mainloop_quit) (pa_mainloop *, int); | static void (*PULSEAUDIO_pa_mainloop_quit)(pa_mainloop *, int); | ||||||
| static void (*PULSEAUDIO_pa_mainloop_free) (pa_mainloop *); | static void (*PULSEAUDIO_pa_mainloop_free)(pa_mainloop *); | ||||||
|  |  | ||||||
| static pa_operation_state_t (*PULSEAUDIO_pa_operation_get_state) ( | static pa_operation_state_t (*PULSEAUDIO_pa_operation_get_state)( | ||||||
|     const pa_operation *); |     const pa_operation *); | ||||||
| static void (*PULSEAUDIO_pa_operation_cancel) (pa_operation *); | static void (*PULSEAUDIO_pa_operation_cancel)(pa_operation *); | ||||||
| static void (*PULSEAUDIO_pa_operation_unref) (pa_operation *); | static void (*PULSEAUDIO_pa_operation_unref)(pa_operation *); | ||||||
|  |  | ||||||
| static pa_context * (*PULSEAUDIO_pa_context_new) (pa_mainloop_api *, | static pa_context *(*PULSEAUDIO_pa_context_new)(pa_mainloop_api *, | ||||||
|     const char *); |                                                 const char *); | ||||||
| static int (*PULSEAUDIO_pa_context_connect) (pa_context *, const char *, | static int (*PULSEAUDIO_pa_context_connect)(pa_context *, const char *, | ||||||
|     pa_context_flags_t, const pa_spawn_api *); |                                             pa_context_flags_t, const pa_spawn_api *); | ||||||
| static pa_operation * (*PULSEAUDIO_pa_context_get_sink_info_list) (pa_context *, pa_sink_info_cb_t, void *); | static pa_operation *(*PULSEAUDIO_pa_context_get_sink_info_list)(pa_context *, pa_sink_info_cb_t, void *); | ||||||
| static pa_operation * (*PULSEAUDIO_pa_context_get_source_info_list) (pa_context *, pa_source_info_cb_t, void *); | static pa_operation *(*PULSEAUDIO_pa_context_get_source_info_list)(pa_context *, pa_source_info_cb_t, void *); | ||||||
| static pa_operation * (*PULSEAUDIO_pa_context_get_sink_info_by_index) (pa_context *, uint32_t, pa_sink_info_cb_t, void *); | static pa_operation *(*PULSEAUDIO_pa_context_get_sink_info_by_index)(pa_context *, uint32_t, pa_sink_info_cb_t, void *); | ||||||
| static pa_operation * (*PULSEAUDIO_pa_context_get_source_info_by_index) (pa_context *, uint32_t, pa_source_info_cb_t, void *); | static pa_operation *(*PULSEAUDIO_pa_context_get_source_info_by_index)(pa_context *, uint32_t, pa_source_info_cb_t, void *); | ||||||
| static pa_context_state_t (*PULSEAUDIO_pa_context_get_state) (const pa_context *); | static pa_context_state_t (*PULSEAUDIO_pa_context_get_state)(const pa_context *); | ||||||
| static pa_operation * (*PULSEAUDIO_pa_context_subscribe) (pa_context *, pa_subscription_mask_t, pa_context_success_cb_t, void *); | static pa_operation *(*PULSEAUDIO_pa_context_subscribe)(pa_context *, pa_subscription_mask_t, pa_context_success_cb_t, void *); | ||||||
| static void (*PULSEAUDIO_pa_context_set_subscribe_callback) (pa_context *, pa_context_subscribe_cb_t, void *); | static void (*PULSEAUDIO_pa_context_set_subscribe_callback)(pa_context *, pa_context_subscribe_cb_t, void *); | ||||||
| static void (*PULSEAUDIO_pa_context_disconnect) (pa_context *); | static void (*PULSEAUDIO_pa_context_disconnect)(pa_context *); | ||||||
| static void (*PULSEAUDIO_pa_context_unref) (pa_context *); | static void (*PULSEAUDIO_pa_context_unref)(pa_context *); | ||||||
|  |  | ||||||
| static pa_stream * (*PULSEAUDIO_pa_stream_new) (pa_context *, const char *, | static pa_stream *(*PULSEAUDIO_pa_stream_new)(pa_context *, const char *, | ||||||
|     const pa_sample_spec *, const pa_channel_map *); |                                               const pa_sample_spec *, const pa_channel_map *); | ||||||
| static int (*PULSEAUDIO_pa_stream_connect_playback) (pa_stream *, const char *, | static int (*PULSEAUDIO_pa_stream_connect_playback)(pa_stream *, const char *, | ||||||
|     const pa_buffer_attr *, pa_stream_flags_t, const pa_cvolume *, pa_stream *); |                                                     const pa_buffer_attr *, pa_stream_flags_t, const pa_cvolume *, pa_stream *); | ||||||
| static int (*PULSEAUDIO_pa_stream_connect_record) (pa_stream *, const char *, | static int (*PULSEAUDIO_pa_stream_connect_record)(pa_stream *, const char *, | ||||||
|     const pa_buffer_attr *, pa_stream_flags_t); |                                                   const pa_buffer_attr *, pa_stream_flags_t); | ||||||
| static pa_stream_state_t (*PULSEAUDIO_pa_stream_get_state) (const pa_stream *); | static pa_stream_state_t (*PULSEAUDIO_pa_stream_get_state)(const pa_stream *); | ||||||
| static size_t (*PULSEAUDIO_pa_stream_writable_size) (const pa_stream *); | static size_t (*PULSEAUDIO_pa_stream_writable_size)(const pa_stream *); | ||||||
| static size_t (*PULSEAUDIO_pa_stream_readable_size) (const pa_stream *); | static size_t (*PULSEAUDIO_pa_stream_readable_size)(const pa_stream *); | ||||||
| static int (*PULSEAUDIO_pa_stream_write) (pa_stream *, const void *, size_t, | static int (*PULSEAUDIO_pa_stream_write)(pa_stream *, const void *, size_t, | ||||||
|     pa_free_cb_t, int64_t, pa_seek_mode_t); |                                          pa_free_cb_t, int64_t, pa_seek_mode_t); | ||||||
| static pa_operation * (*PULSEAUDIO_pa_stream_drain) (pa_stream *, | static pa_operation *(*PULSEAUDIO_pa_stream_drain)(pa_stream *, | ||||||
|     pa_stream_success_cb_t, void *); |                                                    pa_stream_success_cb_t, void *); | ||||||
| static int (*PULSEAUDIO_pa_stream_peek) (pa_stream *, const void **, size_t *); | static int (*PULSEAUDIO_pa_stream_peek)(pa_stream *, const void **, size_t *); | ||||||
| static int (*PULSEAUDIO_pa_stream_drop) (pa_stream *); | static int (*PULSEAUDIO_pa_stream_drop)(pa_stream *); | ||||||
| static pa_operation * (*PULSEAUDIO_pa_stream_flush) (pa_stream *, | static pa_operation *(*PULSEAUDIO_pa_stream_flush)(pa_stream *, | ||||||
|     pa_stream_success_cb_t, void *); |                                                    pa_stream_success_cb_t, void *); | ||||||
| static int (*PULSEAUDIO_pa_stream_disconnect) (pa_stream *); | static int (*PULSEAUDIO_pa_stream_disconnect)(pa_stream *); | ||||||
| static void (*PULSEAUDIO_pa_stream_unref) (pa_stream *); | static void (*PULSEAUDIO_pa_stream_unref)(pa_stream *); | ||||||
| static void (*PULSEAUDIO_pa_stream_set_write_callback)(pa_stream *, pa_stream_request_cb_t, void *); | static void (*PULSEAUDIO_pa_stream_set_write_callback)(pa_stream *, pa_stream_request_cb_t, void *); | ||||||
| static pa_operation * (*PULSEAUDIO_pa_context_get_server_info)(pa_context *, pa_server_info_cb_t, void *); | static pa_operation *(*PULSEAUDIO_pa_context_get_server_info)(pa_context *, pa_server_info_cb_t, void *); | ||||||
|  |  | ||||||
| static int load_pulseaudio_syms(void); | static int load_pulseaudio_syms(void); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC | #ifdef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC | ||||||
|  |  | ||||||
| static const char *pulseaudio_library = SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC; | static const char *pulseaudio_library = SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC; | ||||||
| static void *pulseaudio_handle = NULL; | static void *pulseaudio_handle = NULL; | ||||||
|  |  | ||||||
| static int | static int load_pulseaudio_sym(const char *fn, void **addr) | ||||||
| load_pulseaudio_sym(const char *fn, void **addr) |  | ||||||
| { | { | ||||||
|     *addr = SDL_LoadFunction(pulseaudio_handle, fn); |     *addr = SDL_LoadFunction(pulseaudio_handle, fn); | ||||||
|     if (*addr == NULL) { |     if (*addr == NULL) { | ||||||
| @@ -135,11 +133,11 @@ load_pulseaudio_sym(const char *fn, void **addr) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | ||||||
| #define SDL_PULSEAUDIO_SYM(x) \ | #define SDL_PULSEAUDIO_SYM(x)                                       \ | ||||||
|     if (!load_pulseaudio_sym(#x, (void **) (char *) &PULSEAUDIO_##x)) return -1 |     if (!load_pulseaudio_sym(#x, (void **)(char *)&PULSEAUDIO_##x)) \ | ||||||
|  |     return -1 | ||||||
|  |  | ||||||
| static void | static void UnloadPulseAudioLibrary(void) | ||||||
| UnloadPulseAudioLibrary(void) |  | ||||||
| { | { | ||||||
|     if (pulseaudio_handle != NULL) { |     if (pulseaudio_handle != NULL) { | ||||||
|         SDL_UnloadObject(pulseaudio_handle); |         SDL_UnloadObject(pulseaudio_handle); | ||||||
| @@ -147,8 +145,7 @@ UnloadPulseAudioLibrary(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadPulseAudioLibrary(void) | ||||||
| LoadPulseAudioLibrary(void) |  | ||||||
| { | { | ||||||
|     int retval = 0; |     int retval = 0; | ||||||
|     if (pulseaudio_handle == NULL) { |     if (pulseaudio_handle == NULL) { | ||||||
| @@ -170,13 +167,11 @@ LoadPulseAudioLibrary(void) | |||||||
|  |  | ||||||
| #define SDL_PULSEAUDIO_SYM(x) PULSEAUDIO_##x = x | #define SDL_PULSEAUDIO_SYM(x) PULSEAUDIO_##x = x | ||||||
|  |  | ||||||
| static void | static void UnloadPulseAudioLibrary(void) | ||||||
| UnloadPulseAudioLibrary(void) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadPulseAudioLibrary(void) | ||||||
| LoadPulseAudioLibrary(void) |  | ||||||
| { | { | ||||||
|     load_pulseaudio_syms(); |     load_pulseaudio_syms(); | ||||||
|     return 0; |     return 0; | ||||||
| @@ -184,9 +179,7 @@ LoadPulseAudioLibrary(void) | |||||||
|  |  | ||||||
| #endif /* SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC */ | #endif /* SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC */ | ||||||
|  |  | ||||||
|  | static int load_pulseaudio_syms(void) | ||||||
| static int |  | ||||||
| load_pulseaudio_syms(void) |  | ||||||
| { | { | ||||||
|     SDL_PULSEAUDIO_SYM(pa_get_library_version); |     SDL_PULSEAUDIO_SYM(pa_get_library_version); | ||||||
|     SDL_PULSEAUDIO_SYM(pa_mainloop_new); |     SDL_PULSEAUDIO_SYM(pa_mainloop_new); | ||||||
| @@ -229,15 +222,13 @@ load_pulseaudio_syms(void) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_INLINE int | static SDL_INLINE int squashVersion(const int major, const int minor, const int patch) | ||||||
| squashVersion(const int major, const int minor, const int patch) |  | ||||||
| { | { | ||||||
|     return ((major & 0xFF) << 16) | ((minor & 0xFF) << 8) | (patch & 0xFF); |     return ((major & 0xFF) << 16) | ((minor & 0xFF) << 8) | (patch & 0xFF); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Workaround for older pulse: pa_context_new() must have non-NULL appname */ | /* Workaround for older pulse: pa_context_new() must have non-NULL appname */ | ||||||
| static const char * | static const char *getAppName(void) | ||||||
| getAppName(void) |  | ||||||
| { | { | ||||||
|     const char *retval = SDL_GetHint(SDL_HINT_AUDIO_DEVICE_APP_NAME); |     const char *retval = SDL_GetHint(SDL_HINT_AUDIO_DEVICE_APP_NAME); | ||||||
|     if (retval && *retval) { |     if (retval && *retval) { | ||||||
| @@ -248,12 +239,12 @@ getAppName(void) | |||||||
|         return retval; |         return retval; | ||||||
|     } else { |     } else { | ||||||
|         const char *verstr = PULSEAUDIO_pa_get_library_version(); |         const char *verstr = PULSEAUDIO_pa_get_library_version(); | ||||||
|         retval = "SDL Application";  /* the "oh well" default. */ |         retval = "SDL Application"; /* the "oh well" default. */ | ||||||
|         if (verstr != NULL) { |         if (verstr != NULL) { | ||||||
|             int maj, min, patch; |             int maj, min, patch; | ||||||
|             if (SDL_sscanf(verstr, "%d.%d.%d", &maj, &min, &patch) == 3) { |             if (SDL_sscanf(verstr, "%d.%d.%d", &maj, &min, &patch) == 3) { | ||||||
|                 if (squashVersion(maj, min, patch) >= squashVersion(0, 9, 15)) { |                 if (squashVersion(maj, min, patch) >= squashVersion(0, 9, 15)) { | ||||||
|                     retval = NULL;  /* 0.9.15+ handles NULL correctly. */ |                     retval = NULL; /* 0.9.15+ handles NULL correctly. */ | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -261,8 +252,7 @@ getAppName(void) | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WaitForPulseOperation(pa_mainloop *mainloop, pa_operation *o) | ||||||
| WaitForPulseOperation(pa_mainloop *mainloop, pa_operation *o) |  | ||||||
| { | { | ||||||
|     /* This checks for NO errors currently. Either fix that, check results elsewhere, or do things you don't care about. */ |     /* This checks for NO errors currently. Either fix that, check results elsewhere, or do things you don't care about. */ | ||||||
|     if (mainloop && o) { |     if (mainloop && o) { | ||||||
| @@ -274,8 +264,7 @@ WaitForPulseOperation(pa_mainloop *mainloop, pa_operation *o) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void DisconnectFromPulseServer(pa_mainloop *mainloop, pa_context *context) | ||||||
| DisconnectFromPulseServer(pa_mainloop *mainloop, pa_context *context) |  | ||||||
| { | { | ||||||
|     if (context) { |     if (context) { | ||||||
|         PULSEAUDIO_pa_context_disconnect(context); |         PULSEAUDIO_pa_context_disconnect(context); | ||||||
| @@ -286,8 +275,7 @@ DisconnectFromPulseServer(pa_mainloop *mainloop, pa_context *context) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int ConnectToPulseServer_Internal(pa_mainloop **_mainloop, pa_context **_context) | ||||||
| ConnectToPulseServer_Internal(pa_mainloop **_mainloop, pa_context **_context) |  | ||||||
| { | { | ||||||
|     pa_mainloop *mainloop = NULL; |     pa_mainloop *mainloop = NULL; | ||||||
|     pa_context *context = NULL; |     pa_context *context = NULL; | ||||||
| @@ -303,7 +291,7 @@ ConnectToPulseServer_Internal(pa_mainloop **_mainloop, pa_context **_context) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     mainloop_api = PULSEAUDIO_pa_mainloop_get_api(mainloop); |     mainloop_api = PULSEAUDIO_pa_mainloop_get_api(mainloop); | ||||||
|     SDL_assert(mainloop_api);  /* this never fails, right? */ |     SDL_assert(mainloop_api); /* this never fails, right? */ | ||||||
|  |  | ||||||
|     context = PULSEAUDIO_pa_context_new(mainloop_api, getAppName()); |     context = PULSEAUDIO_pa_context_new(mainloop_api, getAppName()); | ||||||
|     if (context == NULL) { |     if (context == NULL) { | ||||||
| @@ -335,11 +323,10 @@ ConnectToPulseServer_Internal(pa_mainloop **_mainloop, pa_context **_context) | |||||||
|     *_context = context; |     *_context = context; | ||||||
|     *_mainloop = mainloop; |     *_mainloop = mainloop; | ||||||
|  |  | ||||||
|     return 0;  /* connected and ready! */ |     return 0; /* connected and ready! */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int ConnectToPulseServer(pa_mainloop **_mainloop, pa_context **_context) | ||||||
| ConnectToPulseServer(pa_mainloop **_mainloop, pa_context **_context) |  | ||||||
| { | { | ||||||
|     const int retval = ConnectToPulseServer_Internal(_mainloop, _context); |     const int retval = ConnectToPulseServer_Internal(_mainloop, _context); | ||||||
|     if (retval < 0) { |     if (retval < 0) { | ||||||
| @@ -348,23 +335,20 @@ ConnectToPulseServer(pa_mainloop **_mainloop, pa_context **_context) | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* This function waits until it is possible to write a full sound buffer */ | /* This function waits until it is possible to write a full sound buffer */ | ||||||
| static void | static void PULSEAUDIO_WaitDevice(_THIS) | ||||||
| PULSEAUDIO_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
|     /* this is a no-op; we wait in PULSEAUDIO_PlayDevice now. */ |     /* this is a no-op; we wait in PULSEAUDIO_PlayDevice now. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static void WriteCallback(pa_stream *p, size_t nbytes, void *userdata) | static void WriteCallback(pa_stream *p, size_t nbytes, void *userdata) | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = (struct SDL_PrivateAudioData *) userdata; |     struct SDL_PrivateAudioData *h = (struct SDL_PrivateAudioData *)userdata; | ||||||
|     /*printf("PULSEAUDIO WRITE CALLBACK! nbytes=%u\n", (unsigned int) nbytes);*/ |     /*printf("PULSEAUDIO WRITE CALLBACK! nbytes=%u\n", (unsigned int) nbytes);*/ | ||||||
|     h->bytes_requested += nbytes; |     h->bytes_requested += nbytes; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void PULSEAUDIO_PlayDevice(_THIS) | ||||||
| PULSEAUDIO_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = this->hidden; |     struct SDL_PrivateAudioData *h = this->hidden; | ||||||
|     int available = h->mixlen; |     int available = h->mixlen; | ||||||
| @@ -399,15 +383,12 @@ PULSEAUDIO_PlayDevice(_THIS) | |||||||
|     /*printf("PULSEAUDIO PLAYDEVICE END! written=%d\n", written);*/ |     /*printf("PULSEAUDIO PLAYDEVICE END! written=%d\n", written);*/ | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *PULSEAUDIO_GetDeviceBuf(_THIS) | ||||||
| PULSEAUDIO_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return this->hidden->mixbuf; |     return this->hidden->mixbuf; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int PULSEAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| static int |  | ||||||
| PULSEAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = this->hidden; |     struct SDL_PrivateAudioData *h = this->hidden; | ||||||
|     const void *data = NULL; |     const void *data = NULL; | ||||||
| @@ -422,40 +403,40 @@ PULSEAUDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|             h->capturelen -= cpy; |             h->capturelen -= cpy; | ||||||
|             if (h->capturelen == 0) { |             if (h->capturelen == 0) { | ||||||
|                 h->capturebuf = NULL; |                 h->capturebuf = NULL; | ||||||
|                 PULSEAUDIO_pa_stream_drop(h->stream);  /* done with this fragment. */ |                 PULSEAUDIO_pa_stream_drop(h->stream); /* done with this fragment. */ | ||||||
|             } |             } | ||||||
|             return cpy;  /* new data, return it. */ |             return cpy; /* new data, return it. */ | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (PULSEAUDIO_pa_context_get_state(h->context) != PA_CONTEXT_READY || |         if (PULSEAUDIO_pa_context_get_state(h->context) != PA_CONTEXT_READY || | ||||||
|             PULSEAUDIO_pa_stream_get_state(h->stream) != PA_STREAM_READY || |             PULSEAUDIO_pa_stream_get_state(h->stream) != PA_STREAM_READY || | ||||||
|             PULSEAUDIO_pa_mainloop_iterate(h->mainloop, 1, NULL) < 0) { |             PULSEAUDIO_pa_mainloop_iterate(h->mainloop, 1, NULL) < 0) { | ||||||
|             SDL_OpenedAudioDeviceDisconnected(this); |             SDL_OpenedAudioDeviceDisconnected(this); | ||||||
|             return -1;  /* uhoh, pulse failed! */ |             return -1; /* uhoh, pulse failed! */ | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (PULSEAUDIO_pa_stream_readable_size(h->stream) == 0) { |         if (PULSEAUDIO_pa_stream_readable_size(h->stream) == 0) { | ||||||
|             continue;  /* no data available yet. */ |             continue; /* no data available yet. */ | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         /* a new fragment is available! */ |         /* a new fragment is available! */ | ||||||
|         PULSEAUDIO_pa_stream_peek(h->stream, &data, &nbytes); |         PULSEAUDIO_pa_stream_peek(h->stream, &data, &nbytes); | ||||||
|         SDL_assert(nbytes > 0); |         SDL_assert(nbytes > 0); | ||||||
|         if (data == NULL) {  /* NULL==buffer had a hole. Ignore that. */ |         /* If data == NULL, then the buffer had a hole, ignore that */ | ||||||
|             PULSEAUDIO_pa_stream_drop(h->stream);  /* drop this fragment. */ |         if (data == NULL) { | ||||||
|  |             PULSEAUDIO_pa_stream_drop(h->stream); /* drop this fragment. */ | ||||||
|         } else { |         } else { | ||||||
|             /* store this fragment's data, start feeding it to SDL. */ |             /* store this fragment's data, start feeding it to SDL. */ | ||||||
|             /*printf("PULSEAUDIO: captured %d new bytes\n", (int) nbytes);*/ |             /*printf("PULSEAUDIO: captured %d new bytes\n", (int) nbytes);*/ | ||||||
|             h->capturebuf = (const Uint8 *) data; |             h->capturebuf = (const Uint8 *)data; | ||||||
|             h->capturelen = nbytes; |             h->capturelen = nbytes; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return -1;  /* not enabled? */ |     return -1; /* not enabled? */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void PULSEAUDIO_FlushCapture(_THIS) | ||||||
| PULSEAUDIO_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = this->hidden; |     struct SDL_PrivateAudioData *h = this->hidden; | ||||||
|     const void *data = NULL; |     const void *data = NULL; | ||||||
| @@ -472,21 +453,20 @@ PULSEAUDIO_FlushCapture(_THIS) | |||||||
|             PULSEAUDIO_pa_stream_get_state(h->stream) != PA_STREAM_READY || |             PULSEAUDIO_pa_stream_get_state(h->stream) != PA_STREAM_READY || | ||||||
|             PULSEAUDIO_pa_mainloop_iterate(h->mainloop, 1, NULL) < 0) { |             PULSEAUDIO_pa_mainloop_iterate(h->mainloop, 1, NULL) < 0) { | ||||||
|             SDL_OpenedAudioDeviceDisconnected(this); |             SDL_OpenedAudioDeviceDisconnected(this); | ||||||
|             return;  /* uhoh, pulse failed! */ |             return; /* uhoh, pulse failed! */ | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (PULSEAUDIO_pa_stream_readable_size(h->stream) == 0) { |         if (PULSEAUDIO_pa_stream_readable_size(h->stream) == 0) { | ||||||
|             break;  /* no data available, so we're done. */ |             break; /* no data available, so we're done. */ | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         /* a new fragment is available! Just dump it. */ |         /* a new fragment is available! Just dump it. */ | ||||||
|         PULSEAUDIO_pa_stream_peek(h->stream, &data, &nbytes); |         PULSEAUDIO_pa_stream_peek(h->stream, &data, &nbytes); | ||||||
|         PULSEAUDIO_pa_stream_drop(h->stream);  /* drop this fragment. */ |         PULSEAUDIO_pa_stream_drop(h->stream); /* drop this fragment. */ | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void PULSEAUDIO_CloseDevice(_THIS) | ||||||
| PULSEAUDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (this->hidden->stream) { |     if (this->hidden->stream) { | ||||||
|         if (this->hidden->capturebuf != NULL) { |         if (this->hidden->capturebuf != NULL) { | ||||||
| @@ -502,48 +482,44 @@ PULSEAUDIO_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SinkDeviceNameCallback(pa_context *c, const pa_sink_info *i, int is_last, void *data) | ||||||
| SinkDeviceNameCallback(pa_context *c, const pa_sink_info *i, int is_last, void *data) |  | ||||||
| { | { | ||||||
|     if (i) { |     if (i) { | ||||||
|         char **devname = (char **) data; |         char **devname = (char **)data; | ||||||
|         *devname = SDL_strdup(i->name); |         *devname = SDL_strdup(i->name); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SourceDeviceNameCallback(pa_context *c, const pa_source_info *i, int is_last, void *data) | ||||||
| SourceDeviceNameCallback(pa_context *c, const pa_source_info *i, int is_last, void *data) |  | ||||||
| { | { | ||||||
|     if (i) { |     if (i) { | ||||||
|         char **devname = (char **) data; |         char **devname = (char **)data; | ||||||
|         *devname = SDL_strdup(i->name); |         *devname = SDL_strdup(i->name); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool FindDeviceName(struct SDL_PrivateAudioData *h, const SDL_bool iscapture, void *handle) | ||||||
| FindDeviceName(struct SDL_PrivateAudioData *h, const SDL_bool iscapture, void *handle) |  | ||||||
| { | { | ||||||
|     const uint32_t idx = ((uint32_t) ((intptr_t) handle)) - 1; |     const uint32_t idx = ((uint32_t)((intptr_t)handle)) - 1; | ||||||
|  |  | ||||||
|     if (handle == NULL) {  /* NULL == default device. */ |     if (handle == NULL) { /* NULL == default device. */ | ||||||
|         return SDL_TRUE; |         return SDL_TRUE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (iscapture) { |     if (iscapture) { | ||||||
|         WaitForPulseOperation(h->mainloop, |         WaitForPulseOperation(h->mainloop, | ||||||
|             PULSEAUDIO_pa_context_get_source_info_by_index(h->context, idx, |                               PULSEAUDIO_pa_context_get_source_info_by_index(h->context, idx, | ||||||
|                 SourceDeviceNameCallback, &h->device_name)); |                                                                              SourceDeviceNameCallback, &h->device_name)); | ||||||
|     } else { |     } else { | ||||||
|         WaitForPulseOperation(h->mainloop, |         WaitForPulseOperation(h->mainloop, | ||||||
|             PULSEAUDIO_pa_context_get_sink_info_by_index(h->context, idx, |                               PULSEAUDIO_pa_context_get_sink_info_by_index(h->context, idx, | ||||||
|                 SinkDeviceNameCallback, &h->device_name)); |                                                                            SinkDeviceNameCallback, &h->device_name)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return h->device_name != NULL; |     return h->device_name != NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int PULSEAUDIO_OpenDevice(_THIS, const char *devname) | ||||||
| PULSEAUDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     struct SDL_PrivateAudioData *h = NULL; |     struct SDL_PrivateAudioData *h = NULL; | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
| @@ -608,7 +584,7 @@ PULSEAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     /* Allocate mixing buffer */ |     /* Allocate mixing buffer */ | ||||||
|     if (!iscapture) { |     if (!iscapture) { | ||||||
|         h->mixlen = this->spec.size; |         h->mixlen = this->spec.size; | ||||||
|         h->mixbuf = (Uint8 *) SDL_malloc(h->mixlen); |         h->mixbuf = (Uint8 *)SDL_malloc(h->mixlen); | ||||||
|         if (h->mixbuf == NULL) { |         if (h->mixbuf == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -644,9 +620,9 @@ PULSEAUDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     h->stream = PULSEAUDIO_pa_stream_new( |     h->stream = PULSEAUDIO_pa_stream_new( | ||||||
|         h->context, |         h->context, | ||||||
|         (name && *name) ? name : "Audio Stream", /* stream description */ |         (name && *name) ? name : "Audio Stream", /* stream description */ | ||||||
|         &paspec,    /* sample format spec */ |         &paspec,                                 /* sample format spec */ | ||||||
|         &pacmap     /* channel map */ |         &pacmap                                  /* channel map */ | ||||||
|         ); |     ); | ||||||
|  |  | ||||||
|     if (h->stream == NULL) { |     if (h->stream == NULL) { | ||||||
|         return SDL_SetError("Could not set up PulseAudio stream"); |         return SDL_SetError("Could not set up PulseAudio stream"); | ||||||
| @@ -696,8 +672,7 @@ static char *default_source_name = NULL; | |||||||
|  |  | ||||||
| /* device handles are device index + 1, cast to void*, so we never pass a NULL. */ | /* device handles are device index + 1, cast to void*, so we never pass a NULL. */ | ||||||
|  |  | ||||||
| static SDL_AudioFormat | static SDL_AudioFormat PulseFormatToSDLFormat(pa_sample_format_t format) | ||||||
| PulseFormatToSDLFormat(pa_sample_format_t format) |  | ||||||
| { | { | ||||||
|     switch (format) { |     switch (format) { | ||||||
|     case PA_SAMPLE_U8: |     case PA_SAMPLE_U8: | ||||||
| @@ -720,11 +695,10 @@ PulseFormatToSDLFormat(pa_sample_format_t format) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* This is called when PulseAudio adds an output ("sink") device. */ | /* This is called when PulseAudio adds an output ("sink") device. */ | ||||||
| static void | static void SinkInfoCallback(pa_context *c, const pa_sink_info *i, int is_last, void *data) | ||||||
| SinkInfoCallback(pa_context *c, const pa_sink_info *i, int is_last, void *data) |  | ||||||
| { | { | ||||||
|     SDL_AudioSpec spec; |     SDL_AudioSpec spec; | ||||||
|     SDL_bool add = (SDL_bool) ((intptr_t) data); |     SDL_bool add = (SDL_bool)((intptr_t)data); | ||||||
|     if (i) { |     if (i) { | ||||||
|         spec.freq = i->sample_spec.rate; |         spec.freq = i->sample_spec.rate; | ||||||
|         spec.channels = i->sample_spec.channels; |         spec.channels = i->sample_spec.channels; | ||||||
| @@ -736,7 +710,7 @@ SinkInfoCallback(pa_context *c, const pa_sink_info *i, int is_last, void *data) | |||||||
|         spec.userdata = NULL; |         spec.userdata = NULL; | ||||||
|  |  | ||||||
|         if (add) { |         if (add) { | ||||||
|             SDL_AddAudioDevice(SDL_FALSE, i->description, &spec, (void *) ((intptr_t) i->index+1)); |             SDL_AddAudioDevice(SDL_FALSE, i->description, &spec, (void *)((intptr_t)i->index + 1)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (default_sink_path != NULL && SDL_strcmp(i->name, default_sink_path) == 0) { |         if (default_sink_path != NULL && SDL_strcmp(i->name, default_sink_path) == 0) { | ||||||
| @@ -749,11 +723,10 @@ SinkInfoCallback(pa_context *c, const pa_sink_info *i, int is_last, void *data) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* This is called when PulseAudio adds a capture ("source") device. */ | /* This is called when PulseAudio adds a capture ("source") device. */ | ||||||
| static void | static void SourceInfoCallback(pa_context *c, const pa_source_info *i, int is_last, void *data) | ||||||
| SourceInfoCallback(pa_context *c, const pa_source_info *i, int is_last, void *data) |  | ||||||
| { | { | ||||||
|     SDL_AudioSpec spec; |     SDL_AudioSpec spec; | ||||||
|     SDL_bool add = (SDL_bool) ((intptr_t) data); |     SDL_bool add = (SDL_bool)((intptr_t)data); | ||||||
|     if (i) { |     if (i) { | ||||||
|         /* Maybe skip "monitor" sources. These are just output from other sinks. */ |         /* Maybe skip "monitor" sources. These are just output from other sinks. */ | ||||||
|         if (include_monitors || (i->monitor_of_sink == PA_INVALID_INDEX)) { |         if (include_monitors || (i->monitor_of_sink == PA_INVALID_INDEX)) { | ||||||
| @@ -767,7 +740,7 @@ SourceInfoCallback(pa_context *c, const pa_source_info *i, int is_last, void *da | |||||||
|             spec.userdata = NULL; |             spec.userdata = NULL; | ||||||
|  |  | ||||||
|             if (add) { |             if (add) { | ||||||
|                 SDL_AddAudioDevice(SDL_TRUE, i->description, &spec, (void *) ((intptr_t) i->index+1)); |                 SDL_AddAudioDevice(SDL_TRUE, i->description, &spec, (void *)((intptr_t)i->index + 1)); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (default_source_path != NULL && SDL_strcmp(i->name, default_source_path) == 0) { |             if (default_source_path != NULL && SDL_strcmp(i->name, default_source_path) == 0) { | ||||||
| @@ -780,8 +753,7 @@ SourceInfoCallback(pa_context *c, const pa_source_info *i, int is_last, void *da | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void ServerInfoCallback(pa_context *c, const pa_server_info *i, void *data) | ||||||
| ServerInfoCallback(pa_context *c, const pa_server_info *i, void *data) |  | ||||||
| { | { | ||||||
|     if (default_sink_path != NULL) { |     if (default_sink_path != NULL) { | ||||||
|         SDL_free(default_sink_path); |         SDL_free(default_sink_path); | ||||||
| @@ -794,14 +766,13 @@ ServerInfoCallback(pa_context *c, const pa_server_info *i, void *data) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* This is called when PulseAudio has a device connected/removed/changed. */ | /* This is called when PulseAudio has a device connected/removed/changed. */ | ||||||
| static void | static void HotplugCallback(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *data) | ||||||
| HotplugCallback(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *data) |  | ||||||
| { | { | ||||||
|     const SDL_bool added = ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW); |     const SDL_bool added = ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW); | ||||||
|     const SDL_bool removed = ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE); |     const SDL_bool removed = ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE); | ||||||
|     const SDL_bool changed = ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE); |     const SDL_bool changed = ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE); | ||||||
|  |  | ||||||
|     if (added || removed || changed) {  /* we only care about add/remove events. */ |     if (added || removed || changed) { /* we only care about add/remove events. */ | ||||||
|         const SDL_bool sink = ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK); |         const SDL_bool sink = ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK); | ||||||
|         const SDL_bool source = ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE); |         const SDL_bool source = ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE); | ||||||
|  |  | ||||||
| @@ -810,45 +781,42 @@ HotplugCallback(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, voi | |||||||
|             if (changed) { |             if (changed) { | ||||||
|                 PULSEAUDIO_pa_context_get_server_info(hotplug_context, ServerInfoCallback, NULL); |                 PULSEAUDIO_pa_context_get_server_info(hotplug_context, ServerInfoCallback, NULL); | ||||||
|             } |             } | ||||||
|             PULSEAUDIO_pa_context_get_sink_info_by_index(hotplug_context, idx, SinkInfoCallback, (void*) ((intptr_t) added)); |             PULSEAUDIO_pa_context_get_sink_info_by_index(hotplug_context, idx, SinkInfoCallback, (void *)((intptr_t)added)); | ||||||
|         } else if ((added || changed) && source) { |         } else if ((added || changed) && source) { | ||||||
|             if (changed) { |             if (changed) { | ||||||
|                 PULSEAUDIO_pa_context_get_server_info(hotplug_context, ServerInfoCallback, NULL); |                 PULSEAUDIO_pa_context_get_server_info(hotplug_context, ServerInfoCallback, NULL); | ||||||
|             } |             } | ||||||
|             PULSEAUDIO_pa_context_get_source_info_by_index(hotplug_context, idx, SourceInfoCallback, (void*) ((intptr_t) added)); |             PULSEAUDIO_pa_context_get_source_info_by_index(hotplug_context, idx, SourceInfoCallback, (void *)((intptr_t)added)); | ||||||
|         } else if (removed && (sink || source)) { |         } else if (removed && (sink || source)) { | ||||||
|             /* removes we can handle just with the device index. */ |             /* removes we can handle just with the device index. */ | ||||||
|             SDL_RemoveAudioDevice(source != 0, (void *) ((intptr_t) idx+1)); |             SDL_RemoveAudioDevice(source != 0, (void *)((intptr_t)idx + 1)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| /* this runs as a thread while the Pulse target is initialized to catch hotplug events. */ | /* this runs as a thread while the Pulse target is initialized to catch hotplug events. */ | ||||||
| static int SDLCALL | static int SDLCALL HotplugThread(void *data) | ||||||
| HotplugThread(void *data) |  | ||||||
| { | { | ||||||
|     pa_operation *o; |     pa_operation *o; | ||||||
|     SDL_SetThreadPriority(SDL_THREAD_PRIORITY_LOW); |     SDL_SetThreadPriority(SDL_THREAD_PRIORITY_LOW); | ||||||
|     PULSEAUDIO_pa_context_set_subscribe_callback(hotplug_context, HotplugCallback, NULL); |     PULSEAUDIO_pa_context_set_subscribe_callback(hotplug_context, HotplugCallback, NULL); | ||||||
|     o = PULSEAUDIO_pa_context_subscribe(hotplug_context, PA_SUBSCRIPTION_MASK_SINK | PA_SUBSCRIPTION_MASK_SOURCE, NULL, NULL); |     o = PULSEAUDIO_pa_context_subscribe(hotplug_context, PA_SUBSCRIPTION_MASK_SINK | PA_SUBSCRIPTION_MASK_SOURCE, NULL, NULL); | ||||||
|     PULSEAUDIO_pa_operation_unref(o);  /* don't wait for it, just do our thing. */ |     PULSEAUDIO_pa_operation_unref(o); /* don't wait for it, just do our thing. */ | ||||||
|     PULSEAUDIO_pa_mainloop_run(hotplug_mainloop, NULL); |     PULSEAUDIO_pa_mainloop_run(hotplug_mainloop, NULL); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void PULSEAUDIO_DetectDevices() | ||||||
| PULSEAUDIO_DetectDevices() |  | ||||||
| { | { | ||||||
|     WaitForPulseOperation(hotplug_mainloop, PULSEAUDIO_pa_context_get_server_info(hotplug_context, ServerInfoCallback, NULL)); |     WaitForPulseOperation(hotplug_mainloop, PULSEAUDIO_pa_context_get_server_info(hotplug_context, ServerInfoCallback, NULL)); | ||||||
|     WaitForPulseOperation(hotplug_mainloop, PULSEAUDIO_pa_context_get_sink_info_list(hotplug_context, SinkInfoCallback, (void*) ((intptr_t) SDL_TRUE))); |     WaitForPulseOperation(hotplug_mainloop, PULSEAUDIO_pa_context_get_sink_info_list(hotplug_context, SinkInfoCallback, (void *)((intptr_t)SDL_TRUE))); | ||||||
|     WaitForPulseOperation(hotplug_mainloop, PULSEAUDIO_pa_context_get_source_info_list(hotplug_context, SourceInfoCallback, (void*) ((intptr_t) SDL_TRUE))); |     WaitForPulseOperation(hotplug_mainloop, PULSEAUDIO_pa_context_get_source_info_list(hotplug_context, SourceInfoCallback, (void *)((intptr_t)SDL_TRUE))); | ||||||
|  |  | ||||||
|     /* ok, we have a sane list, let's set up hotplug notifications now... */ |     /* ok, we have a sane list, let's set up hotplug notifications now... */ | ||||||
|     hotplug_thread = SDL_CreateThreadInternal(HotplugThread, "PulseHotplug", 256 * 1024, NULL); |     hotplug_thread = SDL_CreateThreadInternal(HotplugThread, "PulseHotplug", 256 * 1024, NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int PULSEAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| PULSEAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
|     int numdevices; |     int numdevices; | ||||||
| @@ -879,8 +847,7 @@ PULSEAUDIO_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | |||||||
|     return SDL_SetError("Could not find default PulseAudio device"); |     return SDL_SetError("Could not find default PulseAudio device"); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void PULSEAUDIO_Deinitialize(void) | ||||||
| PULSEAUDIO_Deinitialize(void) |  | ||||||
| { | { | ||||||
|     if (hotplug_thread) { |     if (hotplug_thread) { | ||||||
|         PULSEAUDIO_pa_mainloop_quit(hotplug_mainloop, 0); |         PULSEAUDIO_pa_mainloop_quit(hotplug_mainloop, 0); | ||||||
| @@ -912,8 +879,7 @@ PULSEAUDIO_Deinitialize(void) | |||||||
|     UnloadPulseAudioLibrary(); |     UnloadPulseAudioLibrary(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool PULSEAUDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| PULSEAUDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     if (LoadPulseAudioLibrary() < 0) { |     if (LoadPulseAudioLibrary() < 0) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -941,7 +907,7 @@ PULSEAUDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->SupportsNonPow2Samples = SDL_TRUE; |     impl->SupportsNonPow2Samples = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap PULSEAUDIO_bootstrap = { | AudioBootStrap PULSEAUDIO_bootstrap = { | ||||||
|   | |||||||
| @@ -43,7 +43,7 @@ struct SDL_PrivateAudioData | |||||||
|     Uint8 *mixbuf; |     Uint8 *mixbuf; | ||||||
|     int mixlen; |     int mixlen; | ||||||
|  |  | ||||||
|     int bytes_requested;  /* bytes of data the hardware wants _now_. */ |     int bytes_requested; /* bytes of data the hardware wants _now_. */ | ||||||
|  |  | ||||||
|     const Uint8 *capturebuf; |     const Uint8 *capturebuf; | ||||||
|     int capturelen; |     int capturelen; | ||||||
|   | |||||||
| @@ -52,7 +52,7 @@ | |||||||
| #define SIO_DEVANY "default" | #define SIO_DEVANY "default" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static struct sio_hdl * (*SNDIO_sio_open)(const char *, unsigned int, int); | static struct sio_hdl *(*SNDIO_sio_open)(const char *, unsigned int, int); | ||||||
| static void (*SNDIO_sio_close)(struct sio_hdl *); | static void (*SNDIO_sio_close)(struct sio_hdl *); | ||||||
| static int (*SNDIO_sio_setpar)(struct sio_hdl *, struct sio_par *); | static int (*SNDIO_sio_setpar)(struct sio_hdl *, struct sio_par *); | ||||||
| static int (*SNDIO_sio_getpar)(struct sio_hdl *, struct sio_par *); | static int (*SNDIO_sio_getpar)(struct sio_hdl *, struct sio_par *); | ||||||
| @@ -70,8 +70,7 @@ static void (*SNDIO_sio_initpar)(struct sio_par *); | |||||||
| static const char *sndio_library = SDL_AUDIO_DRIVER_SNDIO_DYNAMIC; | static const char *sndio_library = SDL_AUDIO_DRIVER_SNDIO_DYNAMIC; | ||||||
| static void *sndio_handle = NULL; | static void *sndio_handle = NULL; | ||||||
|  |  | ||||||
| static int | static int load_sndio_sym(const char *fn, void **addr) | ||||||
| load_sndio_sym(const char *fn, void **addr) |  | ||||||
| { | { | ||||||
|     *addr = SDL_LoadFunction(sndio_handle, fn); |     *addr = SDL_LoadFunction(sndio_handle, fn); | ||||||
|     if (*addr == NULL) { |     if (*addr == NULL) { | ||||||
| @@ -83,14 +82,14 @@ load_sndio_sym(const char *fn, void **addr) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | ||||||
| #define SDL_SNDIO_SYM(x) \ | #define SDL_SNDIO_SYM(x)                                  \ | ||||||
|     if (!load_sndio_sym(#x, (void **) (char *) &SNDIO_##x)) return -1 |     if (!load_sndio_sym(#x, (void **)(char *)&SNDIO_##x)) \ | ||||||
|  |     return -1 | ||||||
| #else | #else | ||||||
| #define SDL_SNDIO_SYM(x) SNDIO_##x = x | #define SDL_SNDIO_SYM(x) SNDIO_##x = x | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static int | static int load_sndio_syms(void) | ||||||
| load_sndio_syms(void) |  | ||||||
| { | { | ||||||
|     SDL_SNDIO_SYM(sio_open); |     SDL_SNDIO_SYM(sio_open); | ||||||
|     SDL_SNDIO_SYM(sio_close); |     SDL_SNDIO_SYM(sio_close); | ||||||
| @@ -112,8 +111,7 @@ load_sndio_syms(void) | |||||||
|  |  | ||||||
| #ifdef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC | #ifdef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC | ||||||
|  |  | ||||||
| static void | static void UnloadSNDIOLibrary(void) | ||||||
| UnloadSNDIOLibrary(void) |  | ||||||
| { | { | ||||||
|     if (sndio_handle != NULL) { |     if (sndio_handle != NULL) { | ||||||
|         SDL_UnloadObject(sndio_handle); |         SDL_UnloadObject(sndio_handle); | ||||||
| @@ -121,8 +119,7 @@ UnloadSNDIOLibrary(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadSNDIOLibrary(void) | ||||||
| LoadSNDIOLibrary(void) |  | ||||||
| { | { | ||||||
|     int retval = 0; |     int retval = 0; | ||||||
|     if (sndio_handle == NULL) { |     if (sndio_handle == NULL) { | ||||||
| @@ -142,13 +139,11 @@ LoadSNDIOLibrary(void) | |||||||
|  |  | ||||||
| #else | #else | ||||||
|  |  | ||||||
| static void | static void UnloadSNDIOLibrary(void) | ||||||
| UnloadSNDIOLibrary(void) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadSNDIOLibrary(void) | ||||||
| LoadSNDIOLibrary(void) |  | ||||||
| { | { | ||||||
|     load_sndio_syms(); |     load_sndio_syms(); | ||||||
|     return 0; |     return 0; | ||||||
| @@ -156,24 +151,19 @@ LoadSNDIOLibrary(void) | |||||||
|  |  | ||||||
| #endif /* SDL_AUDIO_DRIVER_SNDIO_DYNAMIC */ | #endif /* SDL_AUDIO_DRIVER_SNDIO_DYNAMIC */ | ||||||
|  |  | ||||||
|  | static void SNDIO_WaitDevice(_THIS) | ||||||
|  |  | ||||||
|  |  | ||||||
| static void |  | ||||||
| SNDIO_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
|     /* no-op; SNDIO_sio_write() blocks if necessary. */ |     /* no-op; SNDIO_sio_write() blocks if necessary. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SNDIO_PlayDevice(_THIS) | ||||||
| SNDIO_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     const int written = SNDIO_sio_write(this->hidden->dev, |     const int written = SNDIO_sio_write(this->hidden->dev, | ||||||
|                                         this->hidden->mixbuf, |                                         this->hidden->mixbuf, | ||||||
|                                         this->hidden->mixlen); |                                         this->hidden->mixlen); | ||||||
|  |  | ||||||
|     /* If we couldn't write, assume fatal error for now */ |     /* If we couldn't write, assume fatal error for now */ | ||||||
|     if ( written == 0 ) { |     if (written == 0) { | ||||||
|         SDL_OpenedAudioDeviceDisconnected(this); |         SDL_OpenedAudioDeviceDisconnected(this); | ||||||
|     } |     } | ||||||
| #ifdef DEBUG_AUDIO | #ifdef DEBUG_AUDIO | ||||||
| @@ -181,8 +171,7 @@ SNDIO_PlayDevice(_THIS) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int SNDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| SNDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     size_t r; |     size_t r; | ||||||
|     int revents; |     int revents; | ||||||
| @@ -191,8 +180,7 @@ SNDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|     /* Emulate a blocking read */ |     /* Emulate a blocking read */ | ||||||
|     r = SNDIO_sio_read(this->hidden->dev, buffer, buflen); |     r = SNDIO_sio_read(this->hidden->dev, buffer, buflen); | ||||||
|     while (r == 0 && !SNDIO_sio_eof(this->hidden->dev)) { |     while (r == 0 && !SNDIO_sio_eof(this->hidden->dev)) { | ||||||
|         if ((nfds = SNDIO_sio_pollfd(this->hidden->dev, this->hidden->pfd, POLLIN)) <= 0 |         if ((nfds = SNDIO_sio_pollfd(this->hidden->dev, this->hidden->pfd, POLLIN)) <= 0 || poll(this->hidden->pfd, nfds, INFTIM) < 0) { | ||||||
|             || poll(this->hidden->pfd, nfds, INFTIM) < 0) { |  | ||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|         revents = SNDIO_sio_revents(this->hidden->dev, this->hidden->pfd); |         revents = SNDIO_sio_revents(this->hidden->dev, this->hidden->pfd); | ||||||
| @@ -203,11 +191,10 @@ SNDIO_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     return (int) r; |     return (int)r; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SNDIO_FlushCapture(_THIS) | ||||||
| SNDIO_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     char buf[512]; |     char buf[512]; | ||||||
|  |  | ||||||
| @@ -216,19 +203,17 @@ SNDIO_FlushCapture(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *SNDIO_GetDeviceBuf(_THIS) | ||||||
| SNDIO_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     return this->hidden->mixbuf; |     return this->hidden->mixbuf; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SNDIO_CloseDevice(_THIS) | ||||||
| SNDIO_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if ( this->hidden->pfd != NULL ) { |     if (this->hidden->pfd != NULL) { | ||||||
|         SDL_free(this->hidden->pfd); |         SDL_free(this->hidden->pfd); | ||||||
|     } |     } | ||||||
|     if ( this->hidden->dev != NULL ) { |     if (this->hidden->dev != NULL) { | ||||||
|         SNDIO_sio_stop(this->hidden->dev); |         SNDIO_sio_stop(this->hidden->dev); | ||||||
|         SNDIO_sio_close(this->hidden->dev); |         SNDIO_sio_close(this->hidden->dev); | ||||||
|     } |     } | ||||||
| @@ -236,8 +221,7 @@ SNDIO_CloseDevice(_THIS) | |||||||
|     SDL_free(this->hidden); |     SDL_free(this->hidden); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int SNDIO_OpenDevice(_THIS, const char *devname) | ||||||
| SNDIO_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
|     struct sio_par par; |     struct sio_par par; | ||||||
| @@ -254,14 +238,14 @@ SNDIO_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     /* Capture devices must be non-blocking for SNDIO_FlushCapture */ |     /* Capture devices must be non-blocking for SNDIO_FlushCapture */ | ||||||
|     if ((this->hidden->dev = |     if ((this->hidden->dev = | ||||||
|         SNDIO_sio_open(devname != NULL ? devname : SIO_DEVANY, |              SNDIO_sio_open(devname != NULL ? devname : SIO_DEVANY, | ||||||
|                        iscapture ? SIO_REC : SIO_PLAY, iscapture)) == NULL) { |                             iscapture ? SIO_REC : SIO_PLAY, iscapture)) == NULL) { | ||||||
|         return SDL_SetError("sio_open() failed"); |         return SDL_SetError("sio_open() failed"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Allocate the pollfd array for capture devices */ |     /* Allocate the pollfd array for capture devices */ | ||||||
|     if (iscapture && (this->hidden->pfd = |     if (iscapture && (this->hidden->pfd = | ||||||
|         SDL_malloc(sizeof(struct pollfd) * SNDIO_sio_nfds(this->hidden->dev))) == NULL) { |                           SDL_malloc(sizeof(struct pollfd) * SNDIO_sio_nfds(this->hidden->dev))) == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -327,7 +311,7 @@ SNDIO_OpenDevice(_THIS, const char *devname) | |||||||
|  |  | ||||||
|     /* Allocate mixing buffer */ |     /* Allocate mixing buffer */ | ||||||
|     this->hidden->mixlen = this->spec.size; |     this->hidden->mixlen = this->spec.size; | ||||||
|     this->hidden->mixbuf = (Uint8 *) SDL_malloc(this->hidden->mixlen); |     this->hidden->mixbuf = (Uint8 *)SDL_malloc(this->hidden->mixlen); | ||||||
|     if (this->hidden->mixbuf == NULL) { |     if (this->hidden->mixbuf == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -341,21 +325,18 @@ SNDIO_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SNDIO_Deinitialize(void) | ||||||
| SNDIO_Deinitialize(void) |  | ||||||
| { | { | ||||||
|     UnloadSNDIOLibrary(); |     UnloadSNDIOLibrary(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SNDIO_DetectDevices(void) | ||||||
| SNDIO_DetectDevices(void) |  | ||||||
| { | { | ||||||
| 	SDL_AddAudioDevice(SDL_FALSE, DEFAULT_OUTPUT_DEVNAME, NULL, (void *) 0x1); |     SDL_AddAudioDevice(SDL_FALSE, DEFAULT_OUTPUT_DEVNAME, NULL, (void *)0x1); | ||||||
| 	SDL_AddAudioDevice(SDL_TRUE, DEFAULT_INPUT_DEVNAME, NULL, (void *) 0x2); |     SDL_AddAudioDevice(SDL_TRUE, DEFAULT_INPUT_DEVNAME, NULL, (void *)0x2); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool SNDIO_Init(SDL_AudioDriverImpl *impl) | ||||||
| SNDIO_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     if (LoadSNDIOLibrary() < 0) { |     if (LoadSNDIOLibrary() < 0) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -375,7 +356,7 @@ SNDIO_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->AllowsArbitraryDeviceNames = SDL_TRUE; |     impl->AllowsArbitraryDeviceNames = SDL_TRUE; | ||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap SNDIO_bootstrap = { | AudioBootStrap SNDIO_bootstrap = { | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData | struct SDL_PrivateAudioData | ||||||
| { | { | ||||||
|   | |||||||
| @@ -39,11 +39,10 @@ | |||||||
| #include <psp2/audioout.h> | #include <psp2/audioout.h> | ||||||
| #include <psp2/audioin.h> | #include <psp2/audioin.h> | ||||||
|  |  | ||||||
| #define SCE_AUDIO_SAMPLE_ALIGN(s)   (((s) + 63) & ~63) | #define SCE_AUDIO_SAMPLE_ALIGN(s) (((s) + 63) & ~63) | ||||||
| #define SCE_AUDIO_MAX_VOLUME    0x8000 | #define SCE_AUDIO_MAX_VOLUME      0x8000 | ||||||
|  |  | ||||||
| static int | static int VITAAUD_OpenCaptureDevice(_THIS) | ||||||
| VITAAUD_OpenCaptureDevice(_THIS) |  | ||||||
| { | { | ||||||
|     this->spec.freq = 16000; |     this->spec.freq = 16000; | ||||||
|     this->spec.samples = 512; |     this->spec.samples = 512; | ||||||
| @@ -51,7 +50,7 @@ VITAAUD_OpenCaptureDevice(_THIS) | |||||||
|  |  | ||||||
|     SDL_CalculateAudioSpec(&this->spec); |     SDL_CalculateAudioSpec(&this->spec); | ||||||
|  |  | ||||||
|     this->hidden->port = sceAudioInOpenPort(SCE_AUDIO_IN_PORT_TYPE_VOICE , 512, 16000, SCE_AUDIO_IN_PARAM_FORMAT_S16_MONO); |     this->hidden->port = sceAudioInOpenPort(SCE_AUDIO_IN_PORT_TYPE_VOICE, 512, 16000, SCE_AUDIO_IN_PARAM_FORMAT_S16_MONO); | ||||||
|  |  | ||||||
|     if (this->hidden->port < 0) { |     if (this->hidden->port < 0) { | ||||||
|         return SDL_SetError("Couldn't open audio in port: %x", this->hidden->port); |         return SDL_SetError("Couldn't open audio in port: %x", this->hidden->port); | ||||||
| @@ -60,11 +59,10 @@ VITAAUD_OpenCaptureDevice(_THIS) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int VITAAUD_OpenDevice(_THIS, const char *devname) | ||||||
| VITAAUD_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     int format, mixlen, i, port = SCE_AUDIO_OUT_PORT_TYPE_MAIN; |     int format, mixlen, i, port = SCE_AUDIO_OUT_PORT_TYPE_MAIN; | ||||||
|     int vols[2] = {SCE_AUDIO_MAX_VOLUME, SCE_AUDIO_MAX_VOLUME}; |     int vols[2] = { SCE_AUDIO_MAX_VOLUME, SCE_AUDIO_MAX_VOLUME }; | ||||||
|     SDL_AudioFormat test_format; |     SDL_AudioFormat test_format; | ||||||
|  |  | ||||||
|     this->hidden = (struct SDL_PrivateAudioData *) |     this->hidden = (struct SDL_PrivateAudioData *) | ||||||
| @@ -99,7 +97,7 @@ VITAAUD_OpenDevice(_THIS, const char *devname) | |||||||
|        be a multiple of 64 bytes.  Our sample count is already a multiple of |        be a multiple of 64 bytes.  Our sample count is already a multiple of | ||||||
|        64, so spec->size should be a multiple of 64 as well. */ |        64, so spec->size should be a multiple of 64 as well. */ | ||||||
|     mixlen = this->spec.size * NUM_BUFFERS; |     mixlen = this->spec.size * NUM_BUFFERS; | ||||||
|     this->hidden->rawbuf = (Uint8 *) memalign(64, mixlen); |     this->hidden->rawbuf = (Uint8 *)memalign(64, mixlen); | ||||||
|     if (this->hidden->rawbuf == NULL) { |     if (this->hidden->rawbuf == NULL) { | ||||||
|         return SDL_SetError("Couldn't allocate mixing buffer"); |         return SDL_SetError("Couldn't allocate mixing buffer"); | ||||||
|     } |     } | ||||||
| @@ -122,7 +120,7 @@ VITAAUD_OpenDevice(_THIS, const char *devname) | |||||||
|         return SDL_SetError("Couldn't open audio out port: %x", this->hidden->port); |         return SDL_SetError("Couldn't open audio out port: %x", this->hidden->port); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     sceAudioOutSetVolume(this->hidden->port, SCE_AUDIO_VOLUME_FLAG_L_CH|SCE_AUDIO_VOLUME_FLAG_R_CH, vols); |     sceAudioOutSetVolume(this->hidden->port, SCE_AUDIO_VOLUME_FLAG_L_CH | SCE_AUDIO_VOLUME_FLAG_R_CH, vols); | ||||||
|  |  | ||||||
|     SDL_memset(this->hidden->rawbuf, 0, mixlen); |     SDL_memset(this->hidden->rawbuf, 0, mixlen); | ||||||
|     for (i = 0; i < NUM_BUFFERS; i++) { |     for (i = 0; i < NUM_BUFFERS; i++) { | ||||||
| @@ -165,7 +163,7 @@ static void VITAAUD_CloseDevice(_THIS) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!this->iscapture && this->hidden->rawbuf != NULL) { |     if (!this->iscapture && this->hidden->rawbuf != NULL) { | ||||||
|         free(this->hidden->rawbuf);         /* this uses memalign(), not SDL_malloc(). */ |         free(this->hidden->rawbuf); /* this uses memalign(), not SDL_malloc(). */ | ||||||
|         this->hidden->rawbuf = NULL; |         this->hidden->rawbuf = NULL; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -194,8 +192,7 @@ static void VITAAUD_ThreadInit(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool VITAAUD_Init(SDL_AudioDriverImpl *impl) | ||||||
| VITAAUD_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     impl->OpenDevice = VITAAUD_OpenDevice; |     impl->OpenDevice = VITAAUD_OpenDevice; | ||||||
| @@ -212,7 +209,7 @@ VITAAUD_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->OnlyHasDefaultOutputDevice = SDL_TRUE; |     impl->OnlyHasDefaultOutputDevice = SDL_TRUE; | ||||||
|     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; |     impl->OnlyHasDefaultCaptureDevice = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap VITAAUD_bootstrap = { | AudioBootStrap VITAAUD_bootstrap = { | ||||||
|   | |||||||
| @@ -25,19 +25,20 @@ | |||||||
| #include "../SDL_sysaudio.h" | #include "../SDL_sysaudio.h" | ||||||
|  |  | ||||||
| /* Hidden "this" pointer for the audio functions */ | /* Hidden "this" pointer for the audio functions */ | ||||||
| #define _THIS   SDL_AudioDevice *this | #define _THIS SDL_AudioDevice *this | ||||||
|  |  | ||||||
| #define NUM_BUFFERS 2 | #define NUM_BUFFERS 2 | ||||||
|  |  | ||||||
| struct SDL_PrivateAudioData { | struct SDL_PrivateAudioData | ||||||
|  | { | ||||||
|     /* The hardware input/output port. */ |     /* The hardware input/output port. */ | ||||||
|     int     port; |     int port; | ||||||
|     /* The raw allocated mixing buffer. */ |     /* The raw allocated mixing buffer. */ | ||||||
|     Uint8   *rawbuf; |     Uint8 *rawbuf; | ||||||
|     /* Individual mixing buffers. */ |     /* Individual mixing buffers. */ | ||||||
|     Uint8   *mixbufs[NUM_BUFFERS]; |     Uint8 *mixbufs[NUM_BUFFERS]; | ||||||
|     /* Index of the next available mixing buffer. */ |     /* Index of the next available mixing buffer. */ | ||||||
|     int     next_buffer; |     int next_buffer; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* _SDL_vitaaudio_h */ | #endif /* _SDL_vitaaudio_h */ | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ | |||||||
|  |  | ||||||
| /* These constants aren't available in older SDKs */ | /* These constants aren't available in older SDKs */ | ||||||
| #ifndef AUDCLNT_STREAMFLAGS_RATEADJUST | #ifndef AUDCLNT_STREAMFLAGS_RATEADJUST | ||||||
| #define AUDCLNT_STREAMFLAGS_RATEADJUST  0x00100000 | #define AUDCLNT_STREAMFLAGS_RATEADJUST 0x00100000 | ||||||
| #endif | #endif | ||||||
| #ifndef AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY | #ifndef AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY | ||||||
| #define AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY 0x08000000 | #define AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY 0x08000000 | ||||||
| @@ -46,17 +46,15 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */ | /* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */ | ||||||
| static const IID SDL_IID_IAudioRenderClient = { 0xf294acfc, 0x3146, 0x4483,{ 0xa7, 0xbf, 0xad, 0xdc, 0xa7, 0xc2, 0x60, 0xe2 } }; | static const IID SDL_IID_IAudioRenderClient = { 0xf294acfc, 0x3146, 0x4483, { 0xa7, 0xbf, 0xad, 0xdc, 0xa7, 0xc2, 0x60, 0xe2 } }; | ||||||
| static const IID SDL_IID_IAudioCaptureClient = { 0xc8adbd64, 0xe71e, 0x48a0,{ 0xa4, 0xde, 0x18, 0x5c, 0x39, 0x5c, 0xd3, 0x17 } }; | static const IID SDL_IID_IAudioCaptureClient = { 0xc8adbd64, 0xe71e, 0x48a0, { 0xa4, 0xde, 0x18, 0x5c, 0x39, 0x5c, 0xd3, 0x17 } }; | ||||||
|  |  | ||||||
| static void | static void WASAPI_DetectDevices(void) | ||||||
| WASAPI_DetectDevices(void) |  | ||||||
| { | { | ||||||
|     WASAPI_EnumerateEndpoints(); |     WASAPI_EnumerateEndpoints(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_INLINE SDL_bool | static SDL_INLINE SDL_bool WasapiFailed(_THIS, const HRESULT err) | ||||||
| WasapiFailed(_THIS, const HRESULT err) |  | ||||||
| { | { | ||||||
|     if (err == S_OK) { |     if (err == S_OK) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -73,39 +71,38 @@ WasapiFailed(_THIS, const HRESULT err) | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int UpdateAudioStream(_THIS, const SDL_AudioSpec *oldspec) | ||||||
| UpdateAudioStream(_THIS, const SDL_AudioSpec *oldspec) |  | ||||||
| { | { | ||||||
|     /* Since WASAPI requires us to handle all audio conversion, and our |     /* Since WASAPI requires us to handle all audio conversion, and our | ||||||
|        device format might have changed, we might have to add/remove/change |        device format might have changed, we might have to add/remove/change | ||||||
|        the audio stream that the higher level uses to convert data, so |        the audio stream that the higher level uses to convert data, so | ||||||
|        SDL keeps firing the callback as if nothing happened here. */ |        SDL keeps firing the callback as if nothing happened here. */ | ||||||
|  |  | ||||||
|     if ( (this->callbackspec.channels == this->spec.channels) && |     if ((this->callbackspec.channels == this->spec.channels) && | ||||||
|          (this->callbackspec.format == this->spec.format) && |         (this->callbackspec.format == this->spec.format) && | ||||||
|          (this->callbackspec.freq == this->spec.freq) && |         (this->callbackspec.freq == this->spec.freq) && | ||||||
|          (this->callbackspec.samples == this->spec.samples) ) { |         (this->callbackspec.samples == this->spec.samples)) { | ||||||
|         /* no need to buffer/convert in an AudioStream! */ |         /* no need to buffer/convert in an AudioStream! */ | ||||||
|         SDL_FreeAudioStream(this->stream); |         SDL_FreeAudioStream(this->stream); | ||||||
|         this->stream = NULL; |         this->stream = NULL; | ||||||
|     } else if ( (oldspec->channels == this->spec.channels) && |     } else if ((oldspec->channels == this->spec.channels) && | ||||||
|          (oldspec->format == this->spec.format) && |                (oldspec->format == this->spec.format) && | ||||||
|          (oldspec->freq == this->spec.freq) ) { |                (oldspec->freq == this->spec.freq)) { | ||||||
|         /* The existing audio stream is okay to keep using. */ |         /* The existing audio stream is okay to keep using. */ | ||||||
|     } else { |     } else { | ||||||
|         /* replace the audiostream for new format */ |         /* replace the audiostream for new format */ | ||||||
|         SDL_FreeAudioStream(this->stream); |         SDL_FreeAudioStream(this->stream); | ||||||
|         if (this->iscapture) { |         if (this->iscapture) { | ||||||
|             this->stream = SDL_NewAudioStream(this->spec.format, |             this->stream = SDL_NewAudioStream(this->spec.format, | ||||||
|                                 this->spec.channels, this->spec.freq, |                                               this->spec.channels, this->spec.freq, | ||||||
|                                 this->callbackspec.format, |                                               this->callbackspec.format, | ||||||
|                                 this->callbackspec.channels, |                                               this->callbackspec.channels, | ||||||
|                                 this->callbackspec.freq); |                                               this->callbackspec.freq); | ||||||
|         } else { |         } else { | ||||||
|             this->stream = SDL_NewAudioStream(this->callbackspec.format, |             this->stream = SDL_NewAudioStream(this->callbackspec.format, | ||||||
|                                 this->callbackspec.channels, |                                               this->callbackspec.channels, | ||||||
|                                 this->callbackspec.freq, this->spec.format, |                                               this->callbackspec.freq, this->spec.format, | ||||||
|                                 this->spec.channels, this->spec.freq); |                                               this->spec.channels, this->spec.freq); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (!this->stream) { |         if (!this->stream) { | ||||||
| @@ -115,7 +112,7 @@ UpdateAudioStream(_THIS, const SDL_AudioSpec *oldspec) | |||||||
|  |  | ||||||
|     /* make sure our scratch buffer can cover the new device spec. */ |     /* make sure our scratch buffer can cover the new device spec. */ | ||||||
|     if (this->spec.size > this->work_buffer_len) { |     if (this->spec.size > this->work_buffer_len) { | ||||||
|         Uint8 *ptr = (Uint8 *) SDL_realloc(this->work_buffer, this->spec.size); |         Uint8 *ptr = (Uint8 *)SDL_realloc(this->work_buffer, this->spec.size); | ||||||
|         if (ptr == NULL) { |         if (ptr == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -126,16 +123,14 @@ UpdateAudioStream(_THIS, const SDL_AudioSpec *oldspec) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static void ReleaseWasapiDevice(_THIS); | static void ReleaseWasapiDevice(_THIS); | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool RecoverWasapiDevice(_THIS) | ||||||
| RecoverWasapiDevice(_THIS) |  | ||||||
| { | { | ||||||
|     ReleaseWasapiDevice(this);  /* dump the lost device's handles. */ |     ReleaseWasapiDevice(this); /* dump the lost device's handles. */ | ||||||
|  |  | ||||||
|     if (this->hidden->default_device_generation) { |     if (this->hidden->default_device_generation) { | ||||||
|         this->hidden->default_device_generation = SDL_AtomicGet(this->iscapture ?  &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration); |         this->hidden->default_device_generation = SDL_AtomicGet(this->iscapture ? &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* this can fail for lots of reasons, but the most likely is we had a |     /* this can fail for lots of reasons, but the most likely is we had a | ||||||
| @@ -150,26 +145,25 @@ RecoverWasapiDevice(_THIS) | |||||||
|  |  | ||||||
|     this->hidden->device_lost = SDL_FALSE; |     this->hidden->device_lost = SDL_FALSE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;  /* okay, carry on with new device details! */ |     return SDL_TRUE; /* okay, carry on with new device details! */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool RecoverWasapiIfLost(_THIS) | ||||||
| RecoverWasapiIfLost(_THIS) |  | ||||||
| { | { | ||||||
|     const int generation = this->hidden->default_device_generation; |     const int generation = this->hidden->default_device_generation; | ||||||
|     SDL_bool lost = this->hidden->device_lost; |     SDL_bool lost = this->hidden->device_lost; | ||||||
|  |  | ||||||
|     if (!SDL_AtomicGet(&this->enabled)) { |     if (!SDL_AtomicGet(&this->enabled)) { | ||||||
|         return SDL_FALSE;  /* already failed. */ |         return SDL_FALSE; /* already failed. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!this->hidden->client) { |     if (!this->hidden->client) { | ||||||
|         return SDL_TRUE;  /* still waiting for activation. */ |         return SDL_TRUE; /* still waiting for activation. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!lost && (generation > 0)) { /* is a default device? */ |     if (!lost && (generation > 0)) { /* is a default device? */ | ||||||
|         const int newgen = SDL_AtomicGet(this->iscapture ? &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration); |         const int newgen = SDL_AtomicGet(this->iscapture ? &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration); | ||||||
|         if (generation != newgen) {  /* the desired default device was changed, jump over to it. */ |         if (generation != newgen) { /* the desired default device was changed, jump over to it. */ | ||||||
|             lost = SDL_TRUE; |             lost = SDL_TRUE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -177,33 +171,30 @@ RecoverWasapiIfLost(_THIS) | |||||||
|     return lost ? RecoverWasapiDevice(this) : SDL_TRUE; |     return lost ? RecoverWasapiDevice(this) : SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint8 * | static Uint8 *WASAPI_GetDeviceBuf(_THIS) | ||||||
| WASAPI_GetDeviceBuf(_THIS) |  | ||||||
| { | { | ||||||
|     /* get an endpoint buffer from WASAPI. */ |     /* get an endpoint buffer from WASAPI. */ | ||||||
|     BYTE *buffer = NULL; |     BYTE *buffer = NULL; | ||||||
|  |  | ||||||
|     while (RecoverWasapiIfLost(this) && this->hidden->render) { |     while (RecoverWasapiIfLost(this) && this->hidden->render) { | ||||||
|         if (!WasapiFailed(this, IAudioRenderClient_GetBuffer(this->hidden->render, this->spec.samples, &buffer))) { |         if (!WasapiFailed(this, IAudioRenderClient_GetBuffer(this->hidden->render, this->spec.samples, &buffer))) { | ||||||
|             return (Uint8 *) buffer; |             return (Uint8 *)buffer; | ||||||
|         } |         } | ||||||
|         SDL_assert(buffer == NULL); |         SDL_assert(buffer == NULL); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return (Uint8 *) buffer; |     return (Uint8 *)buffer; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_PlayDevice(_THIS) | ||||||
| WASAPI_PlayDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (this->hidden->render != NULL) {  /* definitely activated? */ |     if (this->hidden->render != NULL) { /* definitely activated? */ | ||||||
|         /* WasapiFailed() will mark the device for reacquisition or removal elsewhere. */ |         /* WasapiFailed() will mark the device for reacquisition or removal elsewhere. */ | ||||||
|         WasapiFailed(this, IAudioRenderClient_ReleaseBuffer(this->hidden->render, this->spec.samples, 0)); |         WasapiFailed(this, IAudioRenderClient_ReleaseBuffer(this->hidden->render, this->spec.samples, 0)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_WaitDevice(_THIS) | ||||||
| WASAPI_WaitDevice(_THIS) |  | ||||||
| { | { | ||||||
|     while (RecoverWasapiIfLost(this) && this->hidden->client && this->hidden->event) { |     while (RecoverWasapiIfLost(this) && this->hidden->client && this->hidden->event) { | ||||||
|         DWORD waitResult = WaitForSingleObjectEx(this->hidden->event, 200, FALSE); |         DWORD waitResult = WaitForSingleObjectEx(this->hidden->event, 200, FALSE); | ||||||
| @@ -230,8 +221,7 @@ WASAPI_WaitDevice(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int WASAPI_CaptureFromDevice(_THIS, void *buffer, int buflen) | ||||||
| WASAPI_CaptureFromDevice(_THIS, void *buffer, int buflen) |  | ||||||
| { | { | ||||||
|     SDL_AudioStream *stream = this->hidden->capturestream; |     SDL_AudioStream *stream = this->hidden->capturestream; | ||||||
|     const int avail = SDL_AudioStreamAvailable(stream); |     const int avail = SDL_AudioStreamAvailable(stream); | ||||||
| @@ -263,7 +253,7 @@ WASAPI_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|         if ((ret == AUDCLNT_S_BUFFER_EMPTY) || !frames) { |         if ((ret == AUDCLNT_S_BUFFER_EMPTY) || !frames) { | ||||||
|             WASAPI_WaitDevice(this); |             WASAPI_WaitDevice(this); | ||||||
|         } else if (ret == S_OK) { |         } else if (ret == S_OK) { | ||||||
|             const int total = ((int) frames) * this->hidden->framesize; |             const int total = ((int)frames) * this->hidden->framesize; | ||||||
|             const int cpy = SDL_min(buflen, total); |             const int cpy = SDL_min(buflen, total); | ||||||
|             const int leftover = total - cpy; |             const int leftover = total - cpy; | ||||||
|             const SDL_bool silent = (flags & AUDCLNT_BUFFERFLAGS_SILENT) ? SDL_TRUE : SDL_FALSE; |             const SDL_bool silent = (flags & AUDCLNT_BUFFERFLAGS_SILENT) ? SDL_TRUE : SDL_FALSE; | ||||||
| @@ -277,11 +267,11 @@ WASAPI_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|             if (leftover > 0) { |             if (leftover > 0) { | ||||||
|                 ptr += cpy; |                 ptr += cpy; | ||||||
|                 if (silent) { |                 if (silent) { | ||||||
|                     SDL_memset(ptr, this->spec.silence, leftover);  /* I guess this is safe? */ |                     SDL_memset(ptr, this->spec.silence, leftover); /* I guess this is safe? */ | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if (SDL_AudioStreamPut(stream, ptr, leftover) == -1) { |                 if (SDL_AudioStreamPut(stream, ptr, leftover) == -1) { | ||||||
|                     return -1;  /* uhoh, out of memory, etc. Kill device.  :( */ |                     return -1; /* uhoh, out of memory, etc. Kill device.  :( */ | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -292,36 +282,34 @@ WASAPI_CaptureFromDevice(_THIS, void *buffer, int buflen) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return -1;  /* unrecoverable error. */ |     return -1; /* unrecoverable error. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_FlushCapture(_THIS) | ||||||
| WASAPI_FlushCapture(_THIS) |  | ||||||
| { | { | ||||||
|     BYTE *ptr = NULL; |     BYTE *ptr = NULL; | ||||||
|     UINT32 frames = 0; |     UINT32 frames = 0; | ||||||
|     DWORD flags = 0; |     DWORD flags = 0; | ||||||
|  |  | ||||||
|     if (!this->hidden->capture) { |     if (!this->hidden->capture) { | ||||||
|         return;  /* not activated yet? */ |         return; /* not activated yet? */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* just read until we stop getting packets, throwing them away. */ |     /* just read until we stop getting packets, throwing them away. */ | ||||||
|     while (SDL_TRUE) { |     while (SDL_TRUE) { | ||||||
|         const HRESULT ret = IAudioCaptureClient_GetBuffer(this->hidden->capture, &ptr, &frames, &flags, NULL, NULL); |         const HRESULT ret = IAudioCaptureClient_GetBuffer(this->hidden->capture, &ptr, &frames, &flags, NULL, NULL); | ||||||
|         if (ret == AUDCLNT_S_BUFFER_EMPTY) { |         if (ret == AUDCLNT_S_BUFFER_EMPTY) { | ||||||
|             break;  /* no more buffered data; we're done. */ |             break; /* no more buffered data; we're done. */ | ||||||
|         } else if (WasapiFailed(this, ret)) { |         } else if (WasapiFailed(this, ret)) { | ||||||
|             break;  /* failed for some other reason, abort. */ |             break; /* failed for some other reason, abort. */ | ||||||
|         } else if (WasapiFailed(this, IAudioCaptureClient_ReleaseBuffer(this->hidden->capture, frames))) { |         } else if (WasapiFailed(this, IAudioCaptureClient_ReleaseBuffer(this->hidden->capture, frames))) { | ||||||
|             break;  /* something broke. */ |             break; /* something broke. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     SDL_AudioStreamClear(this->hidden->capturestream); |     SDL_AudioStreamClear(this->hidden->capturestream); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void ReleaseWasapiDevice(_THIS) | ||||||
| ReleaseWasapiDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (this->hidden->client) { |     if (this->hidden->client) { | ||||||
|         IAudioClient_Stop(this->hidden->client); |         IAudioClient_Stop(this->hidden->client); | ||||||
| @@ -360,20 +348,17 @@ ReleaseWasapiDevice(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_CloseDevice(_THIS) | ||||||
| WASAPI_CloseDevice(_THIS) |  | ||||||
| { | { | ||||||
|     WASAPI_UnrefDevice(this); |     WASAPI_UnrefDevice(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_RefDevice(_THIS) | ||||||
| WASAPI_RefDevice(_THIS) |  | ||||||
| { | { | ||||||
|     SDL_AtomicIncRef(&this->hidden->refcount); |     SDL_AtomicIncRef(&this->hidden->refcount); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_UnrefDevice(_THIS) | ||||||
| WASAPI_UnrefDevice(_THIS) |  | ||||||
| { | { | ||||||
|     if (!SDL_AtomicDecRef(&this->hidden->refcount)) { |     if (!SDL_AtomicDecRef(&this->hidden->refcount)) { | ||||||
|         return; |         return; | ||||||
| @@ -390,8 +375,7 @@ WASAPI_UnrefDevice(_THIS) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* This is called once a device is activated, possibly asynchronously. */ | /* This is called once a device is activated, possibly asynchronously. */ | ||||||
| int | int WASAPI_PrepDevice(_THIS, const SDL_bool updatestream) | ||||||
| WASAPI_PrepDevice(_THIS, const SDL_bool updatestream) |  | ||||||
| { | { | ||||||
|     /* !!! FIXME: we could request an exclusive mode stream, which is lower latency; |     /* !!! FIXME: we could request an exclusive mode stream, which is lower latency; | ||||||
|        !!!  it will write into the kernel's audio buffer directly instead of |        !!!  it will write into the kernel's audio buffer directly instead of | ||||||
| @@ -406,7 +390,7 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream) | |||||||
|        !!!  do in any case. */ |        !!!  do in any case. */ | ||||||
|     const SDL_AudioSpec oldspec = this->spec; |     const SDL_AudioSpec oldspec = this->spec; | ||||||
|     const AUDCLNT_SHAREMODE sharemode = AUDCLNT_SHAREMODE_SHARED; |     const AUDCLNT_SHAREMODE sharemode = AUDCLNT_SHAREMODE_SHARED; | ||||||
|     UINT32 bufsize = 0;  /* this is in sample frames, not samples, not bytes. */ |     UINT32 bufsize = 0; /* this is in sample frames, not samples, not bytes. */ | ||||||
|     REFERENCE_TIME default_period = 0; |     REFERENCE_TIME default_period = 0; | ||||||
|     IAudioClient *client = this->hidden->client; |     IAudioClient *client = this->hidden->client; | ||||||
|     IAudioRenderClient *render = NULL; |     IAudioRenderClient *render = NULL; | ||||||
| @@ -437,7 +421,7 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream) | |||||||
|     SDL_assert(waveformat != NULL); |     SDL_assert(waveformat != NULL); | ||||||
|     this->hidden->waveformat = waveformat; |     this->hidden->waveformat = waveformat; | ||||||
|  |  | ||||||
|     this->spec.channels = (Uint8) waveformat->nChannels; |     this->spec.channels = (Uint8)waveformat->nChannels; | ||||||
|  |  | ||||||
|     /* Make sure we have a valid format that we can convert to whatever WASAPI wants. */ |     /* Make sure we have a valid format that we can convert to whatever WASAPI wants. */ | ||||||
|     wasapi_format = WaveFormatToSDLFormat(waveformat); |     wasapi_format = WaveFormatToSDLFormat(waveformat); | ||||||
| @@ -504,10 +488,10 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream) | |||||||
|     if (this->iscapture) { |     if (this->iscapture) { | ||||||
|         this->hidden->capturestream = SDL_NewAudioStream(this->spec.format, this->spec.channels, this->spec.freq, this->spec.format, this->spec.channels, this->spec.freq); |         this->hidden->capturestream = SDL_NewAudioStream(this->spec.format, this->spec.channels, this->spec.freq, this->spec.format, this->spec.channels, this->spec.freq); | ||||||
|         if (!this->hidden->capturestream) { |         if (!this->hidden->capturestream) { | ||||||
|             return -1;  /* already set SDL_Error */ |             return -1; /* already set SDL_Error */ | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ret = IAudioClient_GetService(client, &SDL_IID_IAudioCaptureClient, (void**) &capture); |         ret = IAudioClient_GetService(client, &SDL_IID_IAudioCaptureClient, (void **)&capture); | ||||||
|         if (FAILED(ret)) { |         if (FAILED(ret)) { | ||||||
|             return WIN_SetErrorFromHRESULT("WASAPI can't get capture client service", ret); |             return WIN_SetErrorFromHRESULT("WASAPI can't get capture client service", ret); | ||||||
|         } |         } | ||||||
| @@ -519,9 +503,9 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream) | |||||||
|             return WIN_SetErrorFromHRESULT("WASAPI can't start capture", ret); |             return WIN_SetErrorFromHRESULT("WASAPI can't start capture", ret); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         WASAPI_FlushCapture(this);  /* MSDN says you should flush capture endpoint right after startup. */ |         WASAPI_FlushCapture(this); /* MSDN says you should flush capture endpoint right after startup. */ | ||||||
|     } else { |     } else { | ||||||
|         ret = IAudioClient_GetService(client, &SDL_IID_IAudioRenderClient, (void**) &render); |         ret = IAudioClient_GetService(client, &SDL_IID_IAudioRenderClient, (void **)&render); | ||||||
|         if (FAILED(ret)) { |         if (FAILED(ret)) { | ||||||
|             return WIN_SetErrorFromHRESULT("WASAPI can't get render client service", ret); |             return WIN_SetErrorFromHRESULT("WASAPI can't get render client service", ret); | ||||||
|         } |         } | ||||||
| @@ -538,14 +522,12 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream) | |||||||
|         return UpdateAudioStream(this, &oldspec); |         return UpdateAudioStream(this, &oldspec); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0;  /* good to go. */ |     return 0; /* good to go. */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int WASAPI_OpenDevice(_THIS, const char *devname) | ||||||
| static int |  | ||||||
| WASAPI_OpenDevice(_THIS, const char *devname) |  | ||||||
| { | { | ||||||
|     LPCWSTR devid = (LPCWSTR) this->handle; |     LPCWSTR devid = (LPCWSTR)this->handle; | ||||||
|  |  | ||||||
|     /* Initialize all variables that we clean on shutdown */ |     /* Initialize all variables that we clean on shutdown */ | ||||||
|     this->hidden = (struct SDL_PrivateAudioData *) |     this->hidden = (struct SDL_PrivateAudioData *) | ||||||
| @@ -555,9 +537,9 @@ WASAPI_OpenDevice(_THIS, const char *devname) | |||||||
|     } |     } | ||||||
|     SDL_zerop(this->hidden); |     SDL_zerop(this->hidden); | ||||||
|  |  | ||||||
|     WASAPI_RefDevice(this);   /* so CloseDevice() will unref to zero. */ |     WASAPI_RefDevice(this); /* so CloseDevice() will unref to zero. */ | ||||||
|  |  | ||||||
|     if (!devid) {  /* is default device? */ |     if (!devid) { /* is default device? */ | ||||||
|         this->hidden->default_device_generation = SDL_AtomicGet(this->iscapture ? &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration); |         this->hidden->default_device_generation = SDL_AtomicGet(this->iscapture ? &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration); | ||||||
|     } else { |     } else { | ||||||
|         this->hidden->devid = SDL_wcsdup(devid); |         this->hidden->devid = SDL_wcsdup(devid); | ||||||
| @@ -567,7 +549,7 @@ WASAPI_OpenDevice(_THIS, const char *devname) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (WASAPI_ActivateDevice(this, SDL_FALSE) == -1) { |     if (WASAPI_ActivateDevice(this, SDL_FALSE) == -1) { | ||||||
|         return -1;  /* already set error. */ |         return -1; /* already set error. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Ready, but waiting for async device activation. |     /* Ready, but waiting for async device activation. | ||||||
| @@ -581,26 +563,22 @@ WASAPI_OpenDevice(_THIS, const char *devname) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_ThreadInit(_THIS) | ||||||
| WASAPI_ThreadInit(_THIS) |  | ||||||
| { | { | ||||||
|     WASAPI_PlatformThreadInit(this); |     WASAPI_PlatformThreadInit(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_ThreadDeinit(_THIS) | ||||||
| WASAPI_ThreadDeinit(_THIS) |  | ||||||
| { | { | ||||||
|     WASAPI_PlatformThreadDeinit(this); |     WASAPI_PlatformThreadDeinit(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_Deinitialize(void) | ||||||
| WASAPI_Deinitialize(void) |  | ||||||
| { | { | ||||||
|     WASAPI_PlatformDeinit(); |     WASAPI_PlatformDeinit(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool WASAPI_Init(SDL_AudioDriverImpl *impl) | ||||||
| WASAPI_Init(SDL_AudioDriverImpl * impl) |  | ||||||
| { | { | ||||||
|     if (WASAPI_PlatformInit() == -1) { |     if (WASAPI_PlatformInit() == -1) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -622,13 +600,13 @@ WASAPI_Init(SDL_AudioDriverImpl * impl) | |||||||
|     impl->HasCaptureSupport = SDL_TRUE; |     impl->HasCaptureSupport = SDL_TRUE; | ||||||
|     impl->SupportsNonPow2Samples = SDL_TRUE; |     impl->SupportsNonPow2Samples = SDL_TRUE; | ||||||
|  |  | ||||||
|     return SDL_TRUE;   /* this audio target is available. */ |     return SDL_TRUE; /* this audio target is available. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| AudioBootStrap WASAPI_bootstrap = { | AudioBootStrap WASAPI_bootstrap = { | ||||||
|     "wasapi", "WASAPI", WASAPI_Init, SDL_FALSE |     "wasapi", "WASAPI", WASAPI_Init, SDL_FALSE | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif  /* SDL_AUDIO_DRIVER_WASAPI */ | #endif /* SDL_AUDIO_DRIVER_WASAPI */ | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|   | |||||||
| @@ -47,26 +47,24 @@ static pfnAvSetMmThreadCharacteristicsW pAvSetMmThreadCharacteristicsW = NULL; | |||||||
| static pfnAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL; | static pfnAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL; | ||||||
|  |  | ||||||
| /* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */ | /* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */ | ||||||
| static const IID SDL_IID_IAudioClient = { 0x1cb9ad4c, 0xdbfa, 0x4c32,{ 0xb1, 0x78, 0xc2, 0xf5, 0x68, 0xa7, 0x03, 0xb2 } }; | static const IID SDL_IID_IAudioClient = { 0x1cb9ad4c, 0xdbfa, 0x4c32, { 0xb1, 0x78, 0xc2, 0xf5, 0x68, 0xa7, 0x03, 0xb2 } }; | ||||||
|  |  | ||||||
| int | int WASAPI_PlatformInit(void) | ||||||
| WASAPI_PlatformInit(void) |  | ||||||
| { | { | ||||||
|     if (SDL_IMMDevice_Init() < 0) { |     if (SDL_IMMDevice_Init() < 0) { | ||||||
|         return -1; /* This is set by SDL_IMMDevice_Init */ |         return -1; /* This is set by SDL_IMMDevice_Init */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     libavrt = LoadLibrary(TEXT("avrt.dll"));  /* this library is available in Vista and later. No WinXP, so have to LoadLibrary to use it for now! */ |     libavrt = LoadLibrary(TEXT("avrt.dll")); /* this library is available in Vista and later. No WinXP, so have to LoadLibrary to use it for now! */ | ||||||
|     if (libavrt) { |     if (libavrt) { | ||||||
|         pAvSetMmThreadCharacteristicsW = (pfnAvSetMmThreadCharacteristicsW) GetProcAddress(libavrt, "AvSetMmThreadCharacteristicsW"); |         pAvSetMmThreadCharacteristicsW = (pfnAvSetMmThreadCharacteristicsW)GetProcAddress(libavrt, "AvSetMmThreadCharacteristicsW"); | ||||||
|         pAvRevertMmThreadCharacteristics = (pfnAvRevertMmThreadCharacteristics) GetProcAddress(libavrt, "AvRevertMmThreadCharacteristics"); |         pAvRevertMmThreadCharacteristics = (pfnAvRevertMmThreadCharacteristics)GetProcAddress(libavrt, "AvRevertMmThreadCharacteristics"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_PlatformDeinit(void) | ||||||
| WASAPI_PlatformDeinit(void) |  | ||||||
| { | { | ||||||
|     if (libavrt) { |     if (libavrt) { | ||||||
|         FreeLibrary(libavrt); |         FreeLibrary(libavrt); | ||||||
| @@ -79,11 +77,10 @@ WASAPI_PlatformDeinit(void) | |||||||
|     SDL_IMMDevice_Quit(); |     SDL_IMMDevice_Quit(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_PlatformThreadInit(_THIS) | ||||||
| WASAPI_PlatformThreadInit(_THIS) |  | ||||||
| { | { | ||||||
|     /* this thread uses COM. */ |     /* this thread uses COM. */ | ||||||
|     if (SUCCEEDED(WIN_CoInitialize())) {    /* can't report errors, hope it worked! */ |     if (SUCCEEDED(WIN_CoInitialize())) { /* can't report errors, hope it worked! */ | ||||||
|         this->hidden->coinitialized = SDL_TRUE; |         this->hidden->coinitialized = SDL_TRUE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -94,8 +91,7 @@ WASAPI_PlatformThreadInit(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_PlatformThreadDeinit(_THIS) | ||||||
| WASAPI_PlatformThreadDeinit(_THIS) |  | ||||||
| { | { | ||||||
|     /* Set this thread back to normal priority. */ |     /* Set this thread back to normal priority. */ | ||||||
|     if (this->hidden->task && pAvRevertMmThreadCharacteristics) { |     if (this->hidden->task && pAvRevertMmThreadCharacteristics) { | ||||||
| @@ -109,8 +105,7 @@ WASAPI_PlatformThreadDeinit(_THIS) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery) | ||||||
| WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery) |  | ||||||
| { | { | ||||||
|     IMMDevice *device = NULL; |     IMMDevice *device = NULL; | ||||||
|     HRESULT ret; |     HRESULT ret; | ||||||
| @@ -121,7 +116,7 @@ WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* this is not async in standard win32, yay! */ |     /* this is not async in standard win32, yay! */ | ||||||
|     ret = IMMDevice_Activate(device, &SDL_IID_IAudioClient, CLSCTX_ALL, NULL, (void **) &this->hidden->client); |     ret = IMMDevice_Activate(device, &SDL_IID_IAudioClient, CLSCTX_ALL, NULL, (void **)&this->hidden->client); | ||||||
|     IMMDevice_Release(device); |     IMMDevice_Release(device); | ||||||
|  |  | ||||||
|     if (FAILED(ret)) { |     if (FAILED(ret)) { | ||||||
| @@ -130,33 +125,29 @@ WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_assert(this->hidden->client != NULL); |     SDL_assert(this->hidden->client != NULL); | ||||||
|     if (WASAPI_PrepDevice(this, isrecovery) == -1) {   /* not async, fire it right away. */ |     if (WASAPI_PrepDevice(this, isrecovery) == -1) { /* not async, fire it right away. */ | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0;  /* good to go. */ |     return 0; /* good to go. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_EnumerateEndpoints(void) | ||||||
| WASAPI_EnumerateEndpoints(void) |  | ||||||
| { | { | ||||||
|     SDL_IMMDevice_EnumerateEndpoints(SDL_FALSE); |     SDL_IMMDevice_EnumerateEndpoints(SDL_FALSE); | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int WASAPI_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| WASAPI_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
|     return SDL_IMMDevice_GetDefaultAudioInfo(name, spec, iscapture); |     return SDL_IMMDevice_GetDefaultAudioInfo(name, spec, iscapture); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_PlatformDeleteActivationHandler(void *handler) | ||||||
| WASAPI_PlatformDeleteActivationHandler(void *handler) |  | ||||||
| { | { | ||||||
|     /* not asynchronous. */ |     /* not asynchronous. */ | ||||||
|     SDL_assert(!"This function should have only been called on WinRT."); |     SDL_assert(!"This function should have only been called on WinRT."); | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif  /* SDL_AUDIO_DRIVER_WASAPI && !defined(__WINRT__) */ | #endif /* SDL_AUDIO_DRIVER_WASAPI && !defined(__WINRT__) */ | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -53,13 +53,13 @@ using namespace Windows::Media::Devices; | |||||||
| using namespace Windows::Foundation; | using namespace Windows::Foundation; | ||||||
| using namespace Microsoft::WRL; | using namespace Microsoft::WRL; | ||||||
|  |  | ||||||
| static Platform::String^ SDL_PKEY_AudioEngine_DeviceFormat = L"{f19f064d-082c-4e27-bc73-6882a1bb8e4c} 0"; | static Platform::String ^ SDL_PKEY_AudioEngine_DeviceFormat = L"{f19f064d-082c-4e27-bc73-6882a1bb8e4c} 0"; | ||||||
|  |  | ||||||
| static void WASAPI_AddDevice(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTENSIBLE *fmt, LPCWSTR devid); | static void WASAPI_AddDevice(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTENSIBLE *fmt, LPCWSTR devid); | ||||||
| static void WASAPI_RemoveDevice(const SDL_bool iscapture, LPCWSTR devid); | static void WASAPI_RemoveDevice(const SDL_bool iscapture, LPCWSTR devid); | ||||||
| extern "C" { | extern "C" { | ||||||
|     SDL_atomic_t SDL_IMMDevice_DefaultPlaybackGeneration; | SDL_atomic_t SDL_IMMDevice_DefaultPlaybackGeneration; | ||||||
|     SDL_atomic_t SDL_IMMDevice_DefaultCaptureGeneration; | SDL_atomic_t SDL_IMMDevice_DefaultCaptureGeneration; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* This is a list of device id strings we have inflight, so we have consistent pointers to the same device. */ | /* This is a list of device id strings we have inflight, so we have consistent pointers to the same device. */ | ||||||
| @@ -73,20 +73,20 @@ static DevIdList *deviceid_list = NULL; | |||||||
|  |  | ||||||
| class SDL_WasapiDeviceEventHandler | class SDL_WasapiDeviceEventHandler | ||||||
| { | { | ||||||
| public: |   public: | ||||||
|     SDL_WasapiDeviceEventHandler(const SDL_bool _iscapture); |     SDL_WasapiDeviceEventHandler(const SDL_bool _iscapture); | ||||||
|     ~SDL_WasapiDeviceEventHandler(); |     ~SDL_WasapiDeviceEventHandler(); | ||||||
|     void OnDeviceAdded(DeviceWatcher^ sender, DeviceInformation^ args); |     void OnDeviceAdded(DeviceWatcher ^ sender, DeviceInformation ^ args); | ||||||
|     void OnDeviceRemoved(DeviceWatcher^ sender, DeviceInformationUpdate^ args); |     void OnDeviceRemoved(DeviceWatcher ^ sender, DeviceInformationUpdate ^ args); | ||||||
|     void OnDeviceUpdated(DeviceWatcher^ sender, DeviceInformationUpdate^ args); |     void OnDeviceUpdated(DeviceWatcher ^ sender, DeviceInformationUpdate ^ args); | ||||||
|     void OnEnumerationCompleted(DeviceWatcher^ sender, Platform::Object^ args); |     void OnEnumerationCompleted(DeviceWatcher ^ sender, Platform::Object ^ args); | ||||||
|     void OnDefaultRenderDeviceChanged(Platform::Object^ sender, DefaultAudioRenderDeviceChangedEventArgs^ args); |     void OnDefaultRenderDeviceChanged(Platform::Object ^ sender, DefaultAudioRenderDeviceChangedEventArgs ^ args); | ||||||
|     void OnDefaultCaptureDeviceChanged(Platform::Object^ sender, DefaultAudioCaptureDeviceChangedEventArgs^ args); |     void OnDefaultCaptureDeviceChanged(Platform::Object ^ sender, DefaultAudioCaptureDeviceChangedEventArgs ^ args); | ||||||
|     SDL_semaphore* completed; |     SDL_semaphore *completed; | ||||||
|  |  | ||||||
| private: |   private: | ||||||
|     const SDL_bool iscapture; |     const SDL_bool iscapture; | ||||||
|     DeviceWatcher^ watcher; |     DeviceWatcher ^ watcher; | ||||||
|     Windows::Foundation::EventRegistrationToken added_handler; |     Windows::Foundation::EventRegistrationToken added_handler; | ||||||
|     Windows::Foundation::EventRegistrationToken removed_handler; |     Windows::Foundation::EventRegistrationToken removed_handler; | ||||||
|     Windows::Foundation::EventRegistrationToken updated_handler; |     Windows::Foundation::EventRegistrationToken updated_handler; | ||||||
| @@ -95,29 +95,27 @@ private: | |||||||
| }; | }; | ||||||
|  |  | ||||||
| SDL_WasapiDeviceEventHandler::SDL_WasapiDeviceEventHandler(const SDL_bool _iscapture) | SDL_WasapiDeviceEventHandler::SDL_WasapiDeviceEventHandler(const SDL_bool _iscapture) | ||||||
|     : iscapture(_iscapture) |     : iscapture(_iscapture), completed(SDL_CreateSemaphore(0)) | ||||||
|     , completed(SDL_CreateSemaphore(0)) |  | ||||||
| { | { | ||||||
|     if (!completed) |     if (!completed) | ||||||
|         return;  // uhoh. |         return; // uhoh. | ||||||
|  |  | ||||||
|     Platform::String^ selector = _iscapture ? MediaDevice::GetAudioCaptureSelector() : |     Platform::String ^ selector = _iscapture ? MediaDevice::GetAudioCaptureSelector() : MediaDevice::GetAudioRenderSelector(); | ||||||
|                                               MediaDevice::GetAudioRenderSelector(); |     Platform::Collections::Vector<Platform::String ^> properties; | ||||||
|     Platform::Collections::Vector<Platform::String^> properties; |  | ||||||
|     properties.Append(SDL_PKEY_AudioEngine_DeviceFormat); |     properties.Append(SDL_PKEY_AudioEngine_DeviceFormat); | ||||||
|     watcher = DeviceInformation::CreateWatcher(selector, properties.GetView()); |     watcher = DeviceInformation::CreateWatcher(selector, properties.GetView()); | ||||||
|     if (!watcher) |     if (!watcher) | ||||||
|         return;  // uhoh. |         return; // uhoh. | ||||||
|  |  | ||||||
|     // !!! FIXME: this doesn't need a lambda here, I think, if I make SDL_WasapiDeviceEventHandler a proper C++/CX class. --ryan. |     // !!! FIXME: this doesn't need a lambda here, I think, if I make SDL_WasapiDeviceEventHandler a proper C++/CX class. --ryan. | ||||||
|     added_handler = watcher->Added += ref new TypedEventHandler<DeviceWatcher^, DeviceInformation^>([this](DeviceWatcher^ sender, DeviceInformation^ args) { OnDeviceAdded(sender, args); } ); |     added_handler = watcher->Added += ref new TypedEventHandler<DeviceWatcher ^, DeviceInformation ^>([this](DeviceWatcher ^ sender, DeviceInformation ^ args) { OnDeviceAdded(sender, args); }); | ||||||
|     removed_handler = watcher->Removed += ref new TypedEventHandler<DeviceWatcher^, DeviceInformationUpdate^>([this](DeviceWatcher^ sender, DeviceInformationUpdate^ args) { OnDeviceRemoved(sender, args); } ); |     removed_handler = watcher->Removed += ref new TypedEventHandler<DeviceWatcher ^, DeviceInformationUpdate ^>([this](DeviceWatcher ^ sender, DeviceInformationUpdate ^ args) { OnDeviceRemoved(sender, args); }); | ||||||
|     updated_handler = watcher->Updated += ref new TypedEventHandler<DeviceWatcher^, DeviceInformationUpdate^>([this](DeviceWatcher^ sender, DeviceInformationUpdate^ args) { OnDeviceUpdated(sender, args); } ); |     updated_handler = watcher->Updated += ref new TypedEventHandler<DeviceWatcher ^, DeviceInformationUpdate ^>([this](DeviceWatcher ^ sender, DeviceInformationUpdate ^ args) { OnDeviceUpdated(sender, args); }); | ||||||
|     completed_handler = watcher->EnumerationCompleted += ref new TypedEventHandler<DeviceWatcher^, Platform::Object^>([this](DeviceWatcher^ sender, Platform::Object^ args) { OnEnumerationCompleted(sender, args); } ); |     completed_handler = watcher->EnumerationCompleted += ref new TypedEventHandler<DeviceWatcher ^, Platform::Object ^>([this](DeviceWatcher ^ sender, Platform::Object ^ args) { OnEnumerationCompleted(sender, args); }); | ||||||
|     if (iscapture) { |     if (iscapture) { | ||||||
|         default_changed_handler = MediaDevice::DefaultAudioCaptureDeviceChanged += ref new TypedEventHandler<Platform::Object^, DefaultAudioCaptureDeviceChangedEventArgs^>([this](Platform::Object^ sender, DefaultAudioCaptureDeviceChangedEventArgs^ args) { OnDefaultCaptureDeviceChanged(sender, args); } ); |         default_changed_handler = MediaDevice::DefaultAudioCaptureDeviceChanged += ref new TypedEventHandler<Platform::Object ^, DefaultAudioCaptureDeviceChangedEventArgs ^>([this](Platform::Object ^ sender, DefaultAudioCaptureDeviceChangedEventArgs ^ args) { OnDefaultCaptureDeviceChanged(sender, args); }); | ||||||
|     } else { |     } else { | ||||||
|         default_changed_handler = MediaDevice::DefaultAudioRenderDeviceChanged += ref new TypedEventHandler<Platform::Object^, DefaultAudioRenderDeviceChangedEventArgs^>([this](Platform::Object^ sender, DefaultAudioRenderDeviceChangedEventArgs^ args) { OnDefaultRenderDeviceChanged(sender, args); } ); |         default_changed_handler = MediaDevice::DefaultAudioRenderDeviceChanged += ref new TypedEventHandler<Platform::Object ^, DefaultAudioRenderDeviceChangedEventArgs ^>([this](Platform::Object ^ sender, DefaultAudioRenderDeviceChangedEventArgs ^ args) { OnDefaultRenderDeviceChanged(sender, args); }); | ||||||
|     } |     } | ||||||
|     watcher->Start(); |     watcher->Start(); | ||||||
| } | } | ||||||
| @@ -144,17 +142,16 @@ SDL_WasapiDeviceEventHandler::~SDL_WasapiDeviceEventHandler() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_WasapiDeviceEventHandler::OnDeviceAdded(DeviceWatcher ^ sender, DeviceInformation ^ info) | ||||||
| SDL_WasapiDeviceEventHandler::OnDeviceAdded(DeviceWatcher^ sender, DeviceInformation^ info) |  | ||||||
| { | { | ||||||
|     SDL_assert(sender == this->watcher); |     SDL_assert(sender == this->watcher); | ||||||
|     char *utf8dev = WIN_StringToUTF8(info->Name->Data()); |     char *utf8dev = WIN_StringToUTF8(info->Name->Data()); | ||||||
|     if (utf8dev) { |     if (utf8dev) { | ||||||
|         WAVEFORMATEXTENSIBLE fmt; |         WAVEFORMATEXTENSIBLE fmt; | ||||||
|         Platform::Object^ obj = info->Properties->Lookup(SDL_PKEY_AudioEngine_DeviceFormat); |         Platform::Object ^ obj = info->Properties->Lookup(SDL_PKEY_AudioEngine_DeviceFormat); | ||||||
|         if (obj) { |         if (obj) { | ||||||
|             IPropertyValue^ property = (IPropertyValue^) obj; |             IPropertyValue ^ property = (IPropertyValue ^) obj; | ||||||
|             Platform::Array<unsigned char>^ data; |             Platform::Array<unsigned char> ^ data; | ||||||
|             property->GetUInt8Array(&data); |             property->GetUInt8Array(&data); | ||||||
|             SDL_memcpy(&fmt, data->Data, SDL_min(data->Length, sizeof(WAVEFORMATEXTENSIBLE))); |             SDL_memcpy(&fmt, data->Data, SDL_min(data->Length, sizeof(WAVEFORMATEXTENSIBLE))); | ||||||
|         } else { |         } else { | ||||||
| @@ -166,41 +163,35 @@ SDL_WasapiDeviceEventHandler::OnDeviceAdded(DeviceWatcher^ sender, DeviceInforma | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_WasapiDeviceEventHandler::OnDeviceRemoved(DeviceWatcher ^ sender, DeviceInformationUpdate ^ info) | ||||||
| SDL_WasapiDeviceEventHandler::OnDeviceRemoved(DeviceWatcher^ sender, DeviceInformationUpdate^ info) |  | ||||||
| { | { | ||||||
|     SDL_assert(sender == this->watcher); |     SDL_assert(sender == this->watcher); | ||||||
|     WASAPI_RemoveDevice(this->iscapture, info->Id->Data()); |     WASAPI_RemoveDevice(this->iscapture, info->Id->Data()); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_WasapiDeviceEventHandler::OnDeviceUpdated(DeviceWatcher ^ sender, DeviceInformationUpdate ^ args) | ||||||
| SDL_WasapiDeviceEventHandler::OnDeviceUpdated(DeviceWatcher^ sender, DeviceInformationUpdate^ args) |  | ||||||
| { | { | ||||||
|     SDL_assert(sender == this->watcher); |     SDL_assert(sender == this->watcher); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_WasapiDeviceEventHandler::OnEnumerationCompleted(DeviceWatcher ^ sender, Platform::Object ^ args) | ||||||
| SDL_WasapiDeviceEventHandler::OnEnumerationCompleted(DeviceWatcher^ sender, Platform::Object^ args) |  | ||||||
| { | { | ||||||
|     SDL_assert(sender == this->watcher); |     SDL_assert(sender == this->watcher); | ||||||
|     SDL_SemPost(this->completed); |     SDL_SemPost(this->completed); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_WasapiDeviceEventHandler::OnDefaultRenderDeviceChanged(Platform::Object ^ sender, DefaultAudioRenderDeviceChangedEventArgs ^ args) | ||||||
| SDL_WasapiDeviceEventHandler::OnDefaultRenderDeviceChanged(Platform::Object^ sender, DefaultAudioRenderDeviceChangedEventArgs^ args) |  | ||||||
| { | { | ||||||
|     SDL_assert(this->iscapture); |     SDL_assert(this->iscapture); | ||||||
|     SDL_AtomicAdd(&SDL_IMMDevice_DefaultPlaybackGeneration, 1); |     SDL_AtomicAdd(&SDL_IMMDevice_DefaultPlaybackGeneration, 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_WasapiDeviceEventHandler::OnDefaultCaptureDeviceChanged(Platform::Object ^ sender, DefaultAudioCaptureDeviceChangedEventArgs ^ args) | ||||||
| SDL_WasapiDeviceEventHandler::OnDefaultCaptureDeviceChanged(Platform::Object^ sender, DefaultAudioCaptureDeviceChangedEventArgs^ args) |  | ||||||
| { | { | ||||||
|     SDL_assert(!this->iscapture); |     SDL_assert(!this->iscapture); | ||||||
|     SDL_AtomicAdd(&SDL_IMMDevice_DefaultCaptureGeneration, 1); |     SDL_AtomicAdd(&SDL_IMMDevice_DefaultCaptureGeneration, 1); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static SDL_WasapiDeviceEventHandler *playback_device_event_handler; | static SDL_WasapiDeviceEventHandler *playback_device_event_handler; | ||||||
| static SDL_WasapiDeviceEventHandler *capture_device_event_handler; | static SDL_WasapiDeviceEventHandler *capture_device_event_handler; | ||||||
|  |  | ||||||
| @@ -240,10 +231,11 @@ void WASAPI_EnumerateEndpoints(void) | |||||||
|     SDL_SemWait(capture_device_event_handler->completed); |     SDL_SemWait(capture_device_event_handler->completed); | ||||||
| } | } | ||||||
|  |  | ||||||
| struct SDL_WasapiActivationHandler : public RuntimeClass< RuntimeClassFlags< ClassicCom >, FtmBase, IActivateAudioInterfaceCompletionHandler > | struct SDL_WasapiActivationHandler : public RuntimeClass<RuntimeClassFlags<ClassicCom>, FtmBase, IActivateAudioInterfaceCompletionHandler> | ||||||
| { | { | ||||||
|     SDL_WasapiActivationHandler() : device(nullptr) {} |     SDL_WasapiActivationHandler() : device(nullptr) {} | ||||||
|     STDMETHOD(ActivateCompleted)(IActivateAudioInterfaceAsyncOperation *operation); |     STDMETHOD(ActivateCompleted) | ||||||
|  |     (IActivateAudioInterfaceAsyncOperation *operation); | ||||||
|     SDL_AudioDevice *device; |     SDL_AudioDevice *device; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -256,23 +248,20 @@ SDL_WasapiActivationHandler::ActivateCompleted(IActivateAudioInterfaceAsyncOpera | |||||||
|     return S_OK; |     return S_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_PlatformDeleteActivationHandler(void *handler) | ||||||
| WASAPI_PlatformDeleteActivationHandler(void *handler) |  | ||||||
| { | { | ||||||
|     ((SDL_WasapiActivationHandler *) handler)->Release(); |     ((SDL_WasapiActivationHandler *)handler)->Release(); | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int WASAPI_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| WASAPI_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
|     return SDL_Unsupported(); |     return SDL_Unsupported(); | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery) | ||||||
| WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery) |  | ||||||
| { | { | ||||||
|     LPCWSTR devid = _this->hidden->devid; |     LPCWSTR devid = _this->hidden->devid; | ||||||
|     Platform::String^ defdevid; |     Platform::String ^ defdevid; | ||||||
|  |  | ||||||
|     if (devid == nullptr) { |     if (devid == nullptr) { | ||||||
|         defdevid = _this->iscapture ? MediaDevice::GetDefaultAudioCaptureId(AudioDeviceRole::Default) : MediaDevice::GetDefaultAudioRenderId(AudioDeviceRole::Default); |         defdevid = _this->iscapture ? MediaDevice::GetDefaultAudioCaptureId(AudioDeviceRole::Default) : MediaDevice::GetDefaultAudioRenderId(AudioDeviceRole::Default); | ||||||
| @@ -288,11 +277,11 @@ WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery) | |||||||
|         return SDL_SetError("Failed to allocate WASAPI activation handler"); |         return SDL_SetError("Failed to allocate WASAPI activation handler"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     handler.Get()->AddRef();  // we hold a reference after ComPtr destructs on return, causing a Release, and Release ourselves in WASAPI_PlatformDeleteActivationHandler(), etc. |     handler.Get()->AddRef(); // we hold a reference after ComPtr destructs on return, causing a Release, and Release ourselves in WASAPI_PlatformDeleteActivationHandler(), etc. | ||||||
|     handler.Get()->device = _this; |     handler.Get()->device = _this; | ||||||
|     _this->hidden->activation_handler = handler.Get(); |     _this->hidden->activation_handler = handler.Get(); | ||||||
|  |  | ||||||
|     WASAPI_RefDevice(_this);  /* completion handler will unref it. */ |     WASAPI_RefDevice(_this); /* completion handler will unref it. */ | ||||||
|     IActivateAudioInterfaceAsyncOperation *async = nullptr; |     IActivateAudioInterfaceAsyncOperation *async = nullptr; | ||||||
|     const HRESULT ret = ActivateAudioInterfaceAsync(devid, __uuidof(IAudioClient), nullptr, handler.Get(), &async); |     const HRESULT ret = ActivateAudioInterfaceAsync(devid, __uuidof(IAudioClient), nullptr, handler.Get(), &async); | ||||||
|  |  | ||||||
| @@ -339,22 +328,20 @@ WASAPI_ActivateDevice(_THIS, const SDL_bool isrecovery) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_PlatformThreadInit(_THIS) | ||||||
| WASAPI_PlatformThreadInit(_THIS) |  | ||||||
| { | { | ||||||
|     // !!! FIXME: set this thread to "Pro Audio" priority. |     // !!! FIXME: set this thread to "Pro Audio" priority. | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WASAPI_PlatformThreadDeinit(_THIS) | ||||||
| WASAPI_PlatformThreadDeinit(_THIS) |  | ||||||
| { | { | ||||||
|     // !!! FIXME: set this thread to "Pro Audio" priority. |     // !!! FIXME: set this thread to "Pro Audio" priority. | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Everything below was copied from SDL_wasapi.c, before it got moved to SDL_immdevice.c! */ | /* Everything below was copied from SDL_wasapi.c, before it got moved to SDL_immdevice.c! */ | ||||||
|  |  | ||||||
| static const GUID SDL_KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010,{ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | static const GUID SDL_KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | ||||||
| static const GUID SDL_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { 0x00000003, 0x0000, 0x0010,{ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | static const GUID SDL_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | ||||||
|  |  | ||||||
| extern "C" SDL_AudioFormat | extern "C" SDL_AudioFormat | ||||||
| WaveFormatToSDLFormat(WAVEFORMATEX *waveformat) | WaveFormatToSDLFormat(WAVEFORMATEX *waveformat) | ||||||
| @@ -378,8 +365,7 @@ WaveFormatToSDLFormat(WAVEFORMATEX *waveformat) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_RemoveDevice(const SDL_bool iscapture, LPCWSTR devid) | ||||||
| WASAPI_RemoveDevice(const SDL_bool iscapture, LPCWSTR devid) |  | ||||||
| { | { | ||||||
|     DevIdList *i; |     DevIdList *i; | ||||||
|     DevIdList *next; |     DevIdList *next; | ||||||
| @@ -401,8 +387,7 @@ WASAPI_RemoveDevice(const SDL_bool iscapture, LPCWSTR devid) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void WASAPI_AddDevice(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTENSIBLE *fmt, LPCWSTR devid) | ||||||
| WASAPI_AddDevice(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTENSIBLE *fmt, LPCWSTR devid) |  | ||||||
| { | { | ||||||
|     DevIdList *devidlist; |     DevIdList *devidlist; | ||||||
|     SDL_AudioSpec spec; |     SDL_AudioSpec spec; | ||||||
| @@ -412,22 +397,22 @@ WASAPI_AddDevice(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTENS | |||||||
|        phones and tablets, where you might have an internal speaker and a headphone jack and expect both to be |        phones and tablets, where you might have an internal speaker and a headphone jack and expect both to be | ||||||
|        available and switch automatically. (!!! FIXME...?) */ |        available and switch automatically. (!!! FIXME...?) */ | ||||||
|  |  | ||||||
|        /* see if we already have this one. */ |     /* see if we already have this one. */ | ||||||
|     for (devidlist = deviceid_list; devidlist; devidlist = devidlist->next) { |     for (devidlist = deviceid_list; devidlist; devidlist = devidlist->next) { | ||||||
|         if (SDL_wcscmp(devidlist->str, devid) == 0) { |         if (SDL_wcscmp(devidlist->str, devid) == 0) { | ||||||
|             return;  /* we already have this. */ |             return; /* we already have this. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     devidlist = (DevIdList *)SDL_malloc(sizeof(*devidlist)); |     devidlist = (DevIdList *)SDL_malloc(sizeof(*devidlist)); | ||||||
|     if (devidlist == NULL) { |     if (devidlist == NULL) { | ||||||
|         return;  /* oh well. */ |         return; /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     devid = SDL_wcsdup(devid); |     devid = SDL_wcsdup(devid); | ||||||
|     if (!devid) { |     if (!devid) { | ||||||
|         SDL_free(devidlist); |         SDL_free(devidlist); | ||||||
|         return;  /* oh well. */ |         return; /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     devidlist->str = (WCHAR *)devid; |     devidlist->str = (WCHAR *)devid; | ||||||
| @@ -441,6 +426,6 @@ WASAPI_AddDevice(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTENS | |||||||
|     SDL_AddAudioDevice(iscapture, devname, &spec, (void *)devid); |     SDL_AddAudioDevice(iscapture, devname, &spec, (void *)devid); | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif  // SDL_AUDIO_DRIVER_WASAPI && defined(__WINRT__) | #endif // SDL_AUDIO_DRIVER_WASAPI && defined(__WINRT__) | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -46,14 +46,14 @@ extern SDL_bool Android_JNI_GetAccelerometerValues(float values[3]); | |||||||
| extern void Android_JNI_ShowTextInput(SDL_Rect *inputRect); | extern void Android_JNI_ShowTextInput(SDL_Rect *inputRect); | ||||||
| extern void Android_JNI_HideTextInput(void); | extern void Android_JNI_HideTextInput(void); | ||||||
| extern SDL_bool Android_JNI_IsScreenKeyboardShown(void); | extern SDL_bool Android_JNI_IsScreenKeyboardShown(void); | ||||||
| extern ANativeWindow* Android_JNI_GetNativeWindow(void); | extern ANativeWindow *Android_JNI_GetNativeWindow(void); | ||||||
|  |  | ||||||
| extern SDL_DisplayOrientation Android_JNI_GetDisplayOrientation(void); | extern SDL_DisplayOrientation Android_JNI_GetDisplayOrientation(void); | ||||||
| extern int Android_JNI_GetDisplayDPI(float *ddpi, float *xdpi, float *ydpi); | extern int Android_JNI_GetDisplayDPI(float *ddpi, float *xdpi, float *ydpi); | ||||||
|  |  | ||||||
| /* Audio support */ | /* Audio support */ | ||||||
| extern int Android_JNI_OpenAudioDevice(int iscapture, SDL_AudioSpec *spec); | extern int Android_JNI_OpenAudioDevice(int iscapture, SDL_AudioSpec *spec); | ||||||
| extern void* Android_JNI_GetAudioBuffer(void); | extern void *Android_JNI_GetAudioBuffer(void); | ||||||
| extern void Android_JNI_WriteAudioBuffer(void); | extern void Android_JNI_WriteAudioBuffer(void); | ||||||
| extern int Android_JNI_CaptureAudioBuffer(void *buffer, int buflen); | extern int Android_JNI_CaptureAudioBuffer(void *buffer, int buflen); | ||||||
| extern void Android_JNI_FlushCapturedAudio(void); | extern void Android_JNI_FlushCapturedAudio(void); | ||||||
| @@ -77,12 +77,12 @@ int Android_JNI_FileClose(SDL_RWops* ctx); | |||||||
| void Android_JNI_GetManifestEnvironmentVariables(void); | void Android_JNI_GetManifestEnvironmentVariables(void); | ||||||
|  |  | ||||||
| /* Clipboard support */ | /* Clipboard support */ | ||||||
| int Android_JNI_SetClipboardText(const char* text); | int Android_JNI_SetClipboardText(const char *text); | ||||||
| char* Android_JNI_GetClipboardText(void); | char *Android_JNI_GetClipboardText(void); | ||||||
| SDL_bool Android_JNI_HasClipboardText(void); | SDL_bool Android_JNI_HasClipboardText(void); | ||||||
|  |  | ||||||
| /* Power support */ | /* Power support */ | ||||||
| int Android_JNI_GetPowerInfo(int* plugged, int* charged, int* battery, int* seconds, int* percent); | int Android_JNI_GetPowerInfo(int *plugged, int *charged, int *battery, int *seconds, int *percent); | ||||||
|  |  | ||||||
| /* Joystick support */ | /* Joystick support */ | ||||||
| void Android_JNI_PollInputDevices(void); | void Android_JNI_PollInputDevices(void); | ||||||
| @@ -110,7 +110,7 @@ int Android_JNI_GetLocale(char *buf, size_t buflen); | |||||||
| int Android_JNI_SendMessage(int command, int param); | int Android_JNI_SendMessage(int command, int param); | ||||||
|  |  | ||||||
| /* Init */ | /* Init */ | ||||||
| JNIEXPORT void JNICALL SDL_Android_Init(JNIEnv* mEnv, jclass cls); | JNIEXPORT void JNICALL SDL_Android_Init(JNIEnv *mEnv, jclass cls); | ||||||
|  |  | ||||||
| /* MessageBox */ | /* MessageBox */ | ||||||
| #include "SDL_messagebox.h" | #include "SDL_messagebox.h" | ||||||
| @@ -130,7 +130,7 @@ SDL_bool Android_JNI_SetRelativeMouseEnabled(SDL_bool enabled); | |||||||
| SDL_bool Android_JNI_RequestPermission(const char *permission); | SDL_bool Android_JNI_RequestPermission(const char *permission); | ||||||
|  |  | ||||||
| /* Show toast notification */ | /* Show toast notification */ | ||||||
| int Android_JNI_ShowToast(const char* message, int duration, int gravity, int xOffset, int yOffset); | int Android_JNI_ShowToast(const char *message, int duration, int gravity, int xOffset, int yOffset); | ||||||
|  |  | ||||||
| int Android_JNI_OpenURL(const char *url); | int Android_JNI_OpenURL(const char *url); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| #include <sys/kbio.h> | #include <sys/kbio.h> | ||||||
|  |  | ||||||
|  | /* *INDENT-OFF* */ /* clang-format off */ | ||||||
| /* | /* | ||||||
|  * Automatically generated from /usr/share/vt/keymaps/us.acc.kbd. |  * Automatically generated from /usr/share/vt/keymaps/us.acc.kbd. | ||||||
|  * DO NOT EDIT! |  * DO NOT EDIT! | ||||||
| @@ -163,3 +164,4 @@ static accentmap_t accentmap_default_us_acc = { 11, { | |||||||
|     { 0x00 },  |     { 0x00 },  | ||||||
| } }; | } }; | ||||||
|  |  | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|   | |||||||
| @@ -39,7 +39,7 @@ | |||||||
| #include "../../events/SDL_events_c.h" | #include "../../events/SDL_events_c.h" | ||||||
| #include "SDL_evdev_kbd_default_keyaccmap.h" | #include "SDL_evdev_kbd_default_keyaccmap.h" | ||||||
|  |  | ||||||
| typedef void (fn_handler_fn)(SDL_EVDEV_keyboard_state *kbd); | typedef void(fn_handler_fn)(SDL_EVDEV_keyboard_state *kbd); | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Keyboard State |  * Keyboard State | ||||||
| @@ -51,14 +51,14 @@ struct SDL_EVDEV_keyboard_state | |||||||
|     int keyboard_fd; |     int keyboard_fd; | ||||||
|     unsigned long old_kbd_mode; |     unsigned long old_kbd_mode; | ||||||
|     unsigned short **key_maps; |     unsigned short **key_maps; | ||||||
|     keymap_t* key_map; |     keymap_t *key_map; | ||||||
|     keyboard_info_t* kbInfo; |     keyboard_info_t *kbInfo; | ||||||
|     unsigned char shift_down[4];        /* shift state counters.. */ |     unsigned char shift_down[4]; /* shift state counters.. */ | ||||||
|     SDL_bool dead_key_next; |     SDL_bool dead_key_next; | ||||||
|     int npadch;                    /* -1 or number assembled on pad */ |     int npadch; /* -1 or number assembled on pad */ | ||||||
|     accentmap_t *accents; |     accentmap_t *accents; | ||||||
|     unsigned int diacr; |     unsigned int diacr; | ||||||
|     SDL_bool rep;                    /* flag telling character repeat */ |     SDL_bool rep; /* flag telling character repeat */ | ||||||
|     unsigned char lockstate; |     unsigned char lockstate; | ||||||
|     unsigned char ledflagstate; |     unsigned char ledflagstate; | ||||||
|     char shift_state; |     char shift_state; | ||||||
| @@ -71,24 +71,23 @@ static int SDL_EVDEV_kbd_load_keymaps(SDL_EVDEV_keyboard_state *kbd) | |||||||
|     return ioctl(kbd->keyboard_fd, GIO_KEYMAP, kbd->key_map) >= 0; |     return ioctl(kbd->keyboard_fd, GIO_KEYMAP, kbd->key_map) >= 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_EVDEV_keyboard_state * kbd_cleanup_state = NULL; | static SDL_EVDEV_keyboard_state *kbd_cleanup_state = NULL; | ||||||
| static int kbd_cleanup_sigactions_installed = 0; | static int kbd_cleanup_sigactions_installed = 0; | ||||||
| static int kbd_cleanup_atexit_installed = 0; | static int kbd_cleanup_atexit_installed = 0; | ||||||
|  |  | ||||||
| static struct sigaction old_sigaction[NSIG]; | static struct sigaction old_sigaction[NSIG]; | ||||||
|  |  | ||||||
| static int fatal_signals[] = | static int fatal_signals[] = { | ||||||
| { |  | ||||||
|     /* Handlers for SIGTERM and SIGINT are installed in SDL_QuitInit. */ |     /* Handlers for SIGTERM and SIGINT are installed in SDL_QuitInit. */ | ||||||
|     SIGHUP,  SIGQUIT, SIGILL,  SIGABRT, |     SIGHUP, SIGQUIT, SIGILL, SIGABRT, | ||||||
|     SIGFPE,  SIGSEGV, SIGPIPE, SIGBUS, |     SIGFPE, SIGSEGV, SIGPIPE, SIGBUS, | ||||||
|     SIGSYS |     SIGSYS | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static void kbd_cleanup(void) | static void kbd_cleanup(void) | ||||||
| { | { | ||||||
|     struct mouse_info mData; |     struct mouse_info mData; | ||||||
|     SDL_EVDEV_keyboard_state* kbd = kbd_cleanup_state; |     SDL_EVDEV_keyboard_state *kbd = kbd_cleanup_state; | ||||||
|     if (kbd == NULL) { |     if (kbd == NULL) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| @@ -103,18 +102,17 @@ static void kbd_cleanup(void) | |||||||
|     ioctl(kbd->console_fd, CONS_MOUSECTL, &mData); |     ioctl(kbd->console_fd, CONS_MOUSECTL, &mData); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EVDEV_kbd_reraise_signal(int sig) | ||||||
| SDL_EVDEV_kbd_reraise_signal(int sig) |  | ||||||
| { | { | ||||||
|     raise(sig); |     raise(sig); | ||||||
| } | } | ||||||
|  |  | ||||||
| siginfo_t* SDL_EVDEV_kdb_cleanup_siginfo = NULL; | siginfo_t *SDL_EVDEV_kdb_cleanup_siginfo = NULL; | ||||||
| void*      SDL_EVDEV_kdb_cleanup_ucontext = NULL; | void *SDL_EVDEV_kdb_cleanup_ucontext = NULL; | ||||||
|  |  | ||||||
| static void kbd_cleanup_signal_action(int signum, siginfo_t* info, void* ucontext) | static void kbd_cleanup_signal_action(int signum, siginfo_t *info, void *ucontext) | ||||||
| { | { | ||||||
|     struct sigaction* old_action_p = &(old_sigaction[signum]); |     struct sigaction *old_action_p = &(old_sigaction[signum]); | ||||||
|     sigset_t sigset; |     sigset_t sigset; | ||||||
|  |  | ||||||
|     /* Restore original signal handler before going any further. */ |     /* Restore original signal handler before going any further. */ | ||||||
| @@ -148,7 +146,7 @@ static void kbd_unregister_emerg_cleanup() | |||||||
|     kbd_cleanup_sigactions_installed = 0; |     kbd_cleanup_sigactions_installed = 0; | ||||||
|  |  | ||||||
|     for (tabidx = 0; tabidx < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++tabidx) { |     for (tabidx = 0; tabidx < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++tabidx) { | ||||||
|         struct sigaction* old_action_p; |         struct sigaction *old_action_p; | ||||||
|         struct sigaction cur_action; |         struct sigaction cur_action; | ||||||
|         signum = fatal_signals[tabidx]; |         signum = fatal_signals[tabidx]; | ||||||
|         old_action_p = &(old_sigaction[signum]); |         old_action_p = &(old_sigaction[signum]); | ||||||
| @@ -177,7 +175,7 @@ static void kbd_cleanup_atexit(void) | |||||||
|     kbd_unregister_emerg_cleanup(); |     kbd_unregister_emerg_cleanup(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void kbd_register_emerg_cleanup(SDL_EVDEV_keyboard_state * kbd) | static void kbd_register_emerg_cleanup(SDL_EVDEV_keyboard_state *kbd) | ||||||
| { | { | ||||||
|     int tabidx, signum; |     int tabidx, signum; | ||||||
|  |  | ||||||
| @@ -201,7 +199,7 @@ static void kbd_register_emerg_cleanup(SDL_EVDEV_keyboard_state * kbd) | |||||||
|     kbd_cleanup_sigactions_installed = 1; |     kbd_cleanup_sigactions_installed = 1; | ||||||
|  |  | ||||||
|     for (tabidx = 0; tabidx < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++tabidx) { |     for (tabidx = 0; tabidx < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++tabidx) { | ||||||
|         struct sigaction* old_action_p; |         struct sigaction *old_action_p; | ||||||
|         struct sigaction new_action; |         struct sigaction new_action; | ||||||
|         signum = fatal_signals[tabidx]; |         signum = fatal_signals[tabidx]; | ||||||
|         old_action_p = &(old_sigaction[signum]); |         old_action_p = &(old_sigaction[signum]); | ||||||
| @@ -212,7 +210,7 @@ static void kbd_register_emerg_cleanup(SDL_EVDEV_keyboard_state * kbd) | |||||||
|         /* Skip SIGHUP and SIGPIPE if handler is already installed |         /* Skip SIGHUP and SIGPIPE if handler is already installed | ||||||
|          * - assume the handler will do the cleanup |          * - assume the handler will do the cleanup | ||||||
|          */ |          */ | ||||||
|         if ((signum == SIGHUP || signum == SIGPIPE) && (old_action_p->sa_handler != SIG_DFL || (void(*)(int))old_action_p->sa_sigaction != SIG_DFL)) { |         if ((signum == SIGHUP || signum == SIGPIPE) && (old_action_p->sa_handler != SIG_DFL || (void (*)(int))old_action_p->sa_sigaction != SIG_DFL)) { | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -229,7 +227,7 @@ SDL_EVDEV_kbd_init(void) | |||||||
|     SDL_EVDEV_keyboard_state *kbd; |     SDL_EVDEV_keyboard_state *kbd; | ||||||
|     struct mouse_info mData; |     struct mouse_info mData; | ||||||
|     char flag_state; |     char flag_state; | ||||||
|     char* devicePath; |     char *devicePath; | ||||||
|  |  | ||||||
|     SDL_zero(mData); |     SDL_zero(mData); | ||||||
|     mData.operation = MOUSE_HIDE; |     mData.operation = MOUSE_HIDE; | ||||||
| @@ -289,14 +287,14 @@ SDL_EVDEV_kbd_init(void) | |||||||
|                 kbd_register_emerg_cleanup(kbd); |                 kbd_register_emerg_cleanup(kbd); | ||||||
|             } |             } | ||||||
|             SDL_free(devicePath); |             SDL_free(devicePath); | ||||||
|         } else kbd->keyboard_fd = kbd->console_fd; |         } else | ||||||
|  |             kbd->keyboard_fd = kbd->console_fd; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return kbd; |     return kbd; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EVDEV_kbd_quit(SDL_EVDEV_keyboard_state *kbd) | ||||||
| SDL_EVDEV_kbd_quit(SDL_EVDEV_keyboard_state *kbd) |  | ||||||
| { | { | ||||||
|     struct mouse_info mData; |     struct mouse_info mData; | ||||||
|  |  | ||||||
| @@ -330,7 +328,7 @@ SDL_EVDEV_kbd_quit(SDL_EVDEV_keyboard_state *kbd) | |||||||
| static void put_queue(SDL_EVDEV_keyboard_state *kbd, uint c) | static void put_queue(SDL_EVDEV_keyboard_state *kbd, uint c) | ||||||
| { | { | ||||||
|     /* c is already part of a UTF-8 sequence and safe to add as a character */ |     /* c is already part of a UTF-8 sequence and safe to add as a character */ | ||||||
|     if (kbd->text_len < (sizeof(kbd->text)-1)) { |     if (kbd->text_len < (sizeof(kbd->text) - 1)) { | ||||||
|         kbd->text[kbd->text_len++] = (char)c; |         kbd->text[kbd->text_len++] = (char)c; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -381,12 +379,12 @@ static unsigned int handle_diacr(SDL_EVDEV_keyboard_state *kbd, unsigned int ch) | |||||||
|     for (i = 0; i < kbd->accents->n_accs; i++) { |     for (i = 0; i < kbd->accents->n_accs; i++) { | ||||||
|         if (kbd->accents->acc[i].accchar == d) { |         if (kbd->accents->acc[i].accchar == d) { | ||||||
|             for (j = 0; j < NUM_ACCENTCHARS; ++j) { |             for (j = 0; j < NUM_ACCENTCHARS; ++j) { | ||||||
|                     if (kbd->accents->acc[i].map[j][0] == 0) { /* end of table */ |                 if (kbd->accents->acc[i].map[j][0] == 0) { /* end of table */ | ||||||
|                             break; |                     break; | ||||||
|                     }  |                 } | ||||||
|                     if (kbd->accents->acc[i].map[j][0] == ch) { |                 if (kbd->accents->acc[i].map[j][0] == ch) { | ||||||
|                             return kbd->accents->acc[i].map[j][1]; |                     return kbd->accents->acc[i].map[j][1]; | ||||||
|                     } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -471,8 +469,7 @@ static void k_shift(SDL_EVDEV_keyboard_state *kbd, unsigned char value, char up_ | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EVDEV_kbd_keycode(SDL_EVDEV_keyboard_state *kbd, unsigned int keycode, int down) | ||||||
| SDL_EVDEV_kbd_keycode(SDL_EVDEV_keyboard_state *kbd, unsigned int keycode, int down) |  | ||||||
| { | { | ||||||
|     keymap_t key_map; |     keymap_t key_map; | ||||||
|     struct keyent_t keysym; |     struct keyent_t keysym; | ||||||
| @@ -526,7 +523,7 @@ SDL_EVDEV_kbd_keycode(SDL_EVDEV_keyboard_state *kbd, unsigned int keycode, int d | |||||||
|                 k_deadunicode(kbd, kbd->accents->acc[accent_index].accchar, !down); |                 k_deadunicode(kbd, kbd->accents->acc[accent_index].accchar, !down); | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             switch(map_from_key_sym) { |             switch (map_from_key_sym) { | ||||||
|             case ASH: /* alt/meta shift */ |             case ASH: /* alt/meta shift */ | ||||||
|                 k_shift(kbd, 3, down == 0); |                 k_shift(kbd, 3, down == 0); | ||||||
|                 break; |                 break; | ||||||
|   | |||||||
| @@ -39,16 +39,15 @@ PAPPSTATE_REGISTRATION hPLM = {}; | |||||||
| HANDLE plmSuspendComplete = nullptr; | HANDLE plmSuspendComplete = nullptr; | ||||||
|  |  | ||||||
| extern "C" DECLSPEC int | extern "C" DECLSPEC int | ||||||
| SDL_GDKGetTaskQueue(XTaskQueueHandle * outTaskQueue) | SDL_GDKGetTaskQueue(XTaskQueueHandle *outTaskQueue) | ||||||
| { | { | ||||||
|     /* If this is the first call, first create the global task queue. */ |     /* If this is the first call, first create the global task queue. */ | ||||||
|     if (!GDK_GlobalTaskQueue) { |     if (!GDK_GlobalTaskQueue) { | ||||||
|         HRESULT hr; |         HRESULT hr; | ||||||
|  |  | ||||||
|         hr = XTaskQueueCreate(XTaskQueueDispatchMode::ThreadPool, |         hr = XTaskQueueCreate(XTaskQueueDispatchMode::ThreadPool, | ||||||
|             XTaskQueueDispatchMode::Manual, |                               XTaskQueueDispatchMode::Manual, | ||||||
|             &GDK_GlobalTaskQueue |                               &GDK_GlobalTaskQueue); | ||||||
|             ); |  | ||||||
|         if (FAILED(hr)) { |         if (FAILED(hr)) { | ||||||
|             return SDL_SetError("[GDK] Could not create global task queue"); |             return SDL_SetError("[GDK] Could not create global task queue"); | ||||||
|         } |         } | ||||||
| @@ -88,7 +87,7 @@ OutOfMemory(void) | |||||||
|  |  | ||||||
| /* Gets the arguments with GetCommandLine, converts them to argc and argv | /* Gets the arguments with GetCommandLine, converts them to argc and argv | ||||||
|    and calls SDL_main */ |    and calls SDL_main */ | ||||||
| extern "C"  DECLSPEC int | extern "C" DECLSPEC int | ||||||
| SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved) | SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved) | ||||||
| { | { | ||||||
|     LPWSTR *argvw; |     LPWSTR *argvw; | ||||||
| @@ -108,7 +107,7 @@ SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved) | |||||||
|      */ |      */ | ||||||
|  |  | ||||||
|     /* Parse it into argv and argc */ |     /* Parse it into argv and argc */ | ||||||
|     argv = (char **) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (argc + 1) * sizeof(*argv)); |     argv = (char **)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (argc + 1) * sizeof(*argv)); | ||||||
|     if (argv == NULL) { |     if (argv == NULL) { | ||||||
|         return OutOfMemory(); |         return OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -118,8 +117,8 @@ SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved) | |||||||
|         if (arg == NULL) { |         if (arg == NULL) { | ||||||
|             return OutOfMemory(); |             return OutOfMemory(); | ||||||
|         } |         } | ||||||
|         len = (DWORD) SDL_strlen(arg); |         len = (DWORD)SDL_strlen(arg); | ||||||
|         argv[i] = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len + 1); |         argv[i] = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len + 1); | ||||||
|         if (!argv[i]) { |         if (!argv[i]) { | ||||||
|             return OutOfMemory(); |             return OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -154,12 +153,11 @@ SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved) | |||||||
|  |  | ||||||
|         /* Register suspend/resume handling */ |         /* Register suspend/resume handling */ | ||||||
|         plmSuspendComplete = CreateEventEx(nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE); |         plmSuspendComplete = CreateEventEx(nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE); | ||||||
|         if (!plmSuspendComplete ) { |         if (!plmSuspendComplete) { | ||||||
|             SDL_SetError("[GDK] Unable to create plmSuspendComplete event"); |             SDL_SetError("[GDK] Unable to create plmSuspendComplete event"); | ||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|         auto rascn = [](BOOLEAN quiesced, PVOID context) |         auto rascn = [](BOOLEAN quiesced, PVOID context) { | ||||||
|         { |  | ||||||
|             SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "[GDK] in RegisterAppStateChangeNotification handler"); |             SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "[GDK] in RegisterAppStateChangeNotification handler"); | ||||||
|             if (quiesced) { |             if (quiesced) { | ||||||
|                 ResetEvent(plmSuspendComplete); |                 ResetEvent(plmSuspendComplete); | ||||||
| @@ -214,7 +212,8 @@ SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved) | |||||||
| } | } | ||||||
|  |  | ||||||
| extern "C" DECLSPEC void | extern "C" DECLSPEC void | ||||||
| SDL_GDKSuspendComplete() { | SDL_GDKSuspendComplete() | ||||||
|  | { | ||||||
|     if (plmSuspendComplete) { |     if (plmSuspendComplete) { | ||||||
|         SetEvent(plmSuspendComplete); |         SetEvent(plmSuspendComplete); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -34,14 +34,14 @@ static char *inhibit_handle = NULL; | |||||||
| static unsigned int screensaver_cookie = 0; | static unsigned int screensaver_cookie = 0; | ||||||
| static SDL_DBusContext dbus; | static SDL_DBusContext dbus; | ||||||
|  |  | ||||||
| static int | static int LoadDBUSSyms(void) | ||||||
| LoadDBUSSyms(void) |  | ||||||
| { | { | ||||||
|     #define SDL_DBUS_SYM2(x, y) \ | #define SDL_DBUS_SYM2(x, y)                            \ | ||||||
|         if (!(dbus.x = SDL_LoadFunction(dbus_handle, #y))) return -1 |     if (!(dbus.x = SDL_LoadFunction(dbus_handle, #y))) \ | ||||||
|  |     return -1 | ||||||
|  |  | ||||||
|     #define SDL_DBUS_SYM(x) \ | #define SDL_DBUS_SYM(x) \ | ||||||
|         SDL_DBUS_SYM2(x, dbus_##x) |     SDL_DBUS_SYM2(x, dbus_##x) | ||||||
|  |  | ||||||
|     SDL_DBUS_SYM(bus_get_private); |     SDL_DBUS_SYM(bus_get_private); | ||||||
|     SDL_DBUS_SYM(bus_register); |     SDL_DBUS_SYM(bus_register); | ||||||
| @@ -83,14 +83,13 @@ LoadDBUSSyms(void) | |||||||
|     SDL_DBUS_SYM(free_string_array); |     SDL_DBUS_SYM(free_string_array); | ||||||
|     SDL_DBUS_SYM(shutdown); |     SDL_DBUS_SYM(shutdown); | ||||||
|  |  | ||||||
|     #undef SDL_DBUS_SYM | #undef SDL_DBUS_SYM | ||||||
|     #undef SDL_DBUS_SYM2 | #undef SDL_DBUS_SYM2 | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void UnloadDBUSLibrary(void) | ||||||
| UnloadDBUSLibrary(void) |  | ||||||
| { | { | ||||||
|     if (dbus_handle != NULL) { |     if (dbus_handle != NULL) { | ||||||
|         SDL_UnloadObject(dbus_handle); |         SDL_UnloadObject(dbus_handle); | ||||||
| @@ -98,8 +97,7 @@ UnloadDBUSLibrary(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int LoadDBUSLibrary(void) | ||||||
| LoadDBUSLibrary(void) |  | ||||||
| { | { | ||||||
|     int retval = 0; |     int retval = 0; | ||||||
|     if (dbus_handle == NULL) { |     if (dbus_handle == NULL) { | ||||||
| @@ -118,24 +116,22 @@ LoadDBUSLibrary(void) | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static SDL_SpinLock spinlock_dbus_init = 0; | static SDL_SpinLock spinlock_dbus_init = 0; | ||||||
|  |  | ||||||
| /* you must hold spinlock_dbus_init before calling this! */ | /* you must hold spinlock_dbus_init before calling this! */ | ||||||
| static void | static void SDL_DBus_Init_Spinlocked(void) | ||||||
| SDL_DBus_Init_Spinlocked(void) |  | ||||||
| { | { | ||||||
|     static SDL_bool is_dbus_available = SDL_TRUE; |     static SDL_bool is_dbus_available = SDL_TRUE; | ||||||
|     if (!is_dbus_available) { |     if (!is_dbus_available) { | ||||||
|         return;  /* don't keep trying if this fails. */ |         return; /* don't keep trying if this fails. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!dbus.session_conn) { |     if (!dbus.session_conn) { | ||||||
|         DBusError err; |         DBusError err; | ||||||
|  |  | ||||||
|         if (LoadDBUSLibrary() == -1) { |         if (LoadDBUSLibrary() == -1) { | ||||||
|             is_dbus_available = SDL_FALSE;  /* can't load at all? Don't keep trying. */ |             is_dbus_available = SDL_FALSE; /* can't load at all? Don't keep trying. */ | ||||||
|             return;  /* oh well */ |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (!dbus.threads_init_default()) { |         if (!dbus.threads_init_default()) { | ||||||
| @@ -151,7 +147,7 @@ SDL_DBus_Init_Spinlocked(void) | |||||||
|             dbus.error_free(&err); |             dbus.error_free(&err); | ||||||
|             SDL_DBus_Quit(); |             SDL_DBus_Quit(); | ||||||
|             is_dbus_available = SDL_FALSE; |             is_dbus_available = SDL_FALSE; | ||||||
|             return;  /* oh well */ |             return; /* oh well */ | ||||||
|         } |         } | ||||||
|         dbus.connection_set_exit_on_disconnect(dbus.session_conn, 0); |         dbus.connection_set_exit_on_disconnect(dbus.session_conn, 0); | ||||||
|  |  | ||||||
| @@ -165,16 +161,14 @@ SDL_DBus_Init_Spinlocked(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_DBus_Init(void) | ||||||
| SDL_DBus_Init(void) |  | ||||||
| { | { | ||||||
|     SDL_AtomicLock(&spinlock_dbus_init);  /* make sure two threads can't init at same time, since this can happen before SDL_Init. */ |     SDL_AtomicLock(&spinlock_dbus_init); /* make sure two threads can't init at same time, since this can happen before SDL_Init. */ | ||||||
|     SDL_DBus_Init_Spinlocked(); |     SDL_DBus_Init_Spinlocked(); | ||||||
|     SDL_AtomicUnlock(&spinlock_dbus_init); |     SDL_AtomicUnlock(&spinlock_dbus_init); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_DBus_Quit(void) | ||||||
| SDL_DBus_Quit(void) |  | ||||||
| { | { | ||||||
|     if (dbus.system_conn) { |     if (dbus.system_conn) { | ||||||
|         dbus.connection_close(dbus.system_conn); |         dbus.connection_close(dbus.system_conn); | ||||||
| @@ -208,8 +202,7 @@ SDL_DBus_GetContext(void) | |||||||
|     return (dbus_handle && dbus.session_conn) ? &dbus : NULL; |     return (dbus_handle && dbus.session_conn) ? &dbus : NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool SDL_DBus_CallMethodInternal(DBusConnection *conn, const char *node, const char *path, const char *interface, const char *method, va_list ap) | ||||||
| SDL_DBus_CallMethodInternal(DBusConnection *conn, const char *node, const char *path, const char *interface, const char *method, va_list ap) |  | ||||||
| { | { | ||||||
|     SDL_bool retval = SDL_FALSE; |     SDL_bool retval = SDL_FALSE; | ||||||
|  |  | ||||||
| @@ -218,7 +211,7 @@ SDL_DBus_CallMethodInternal(DBusConnection *conn, const char *node, const char * | |||||||
|         if (msg) { |         if (msg) { | ||||||
|             int firstarg; |             int firstarg; | ||||||
|             va_list ap_reply; |             va_list ap_reply; | ||||||
|             va_copy(ap_reply, ap);  /* copy the arg list so we don't compete with D-Bus for it */ |             va_copy(ap_reply, ap); /* copy the arg list so we don't compete with D-Bus for it */ | ||||||
|             firstarg = va_arg(ap, int); |             firstarg = va_arg(ap, int); | ||||||
|             if ((firstarg == DBUS_TYPE_INVALID) || dbus.message_append_args_valist(msg, firstarg, ap)) { |             if ((firstarg == DBUS_TYPE_INVALID) || dbus.message_append_args_valist(msg, firstarg, ap)) { | ||||||
|                 DBusMessage *reply = dbus.connection_send_with_reply_and_block(conn, msg, 300, NULL); |                 DBusMessage *reply = dbus.connection_send_with_reply_and_block(conn, msg, 300, NULL); | ||||||
| @@ -226,9 +219,15 @@ SDL_DBus_CallMethodInternal(DBusConnection *conn, const char *node, const char * | |||||||
|                     /* skip any input args, get to output args. */ |                     /* skip any input args, get to output args. */ | ||||||
|                     while ((firstarg = va_arg(ap_reply, int)) != DBUS_TYPE_INVALID) { |                     while ((firstarg = va_arg(ap_reply, int)) != DBUS_TYPE_INVALID) { | ||||||
|                         /* we assume D-Bus already validated all this. */ |                         /* we assume D-Bus already validated all this. */ | ||||||
|                         { void *dumpptr = va_arg(ap_reply, void*); (void) dumpptr; } |                         { | ||||||
|  |                             void *dumpptr = va_arg(ap_reply, void *); | ||||||
|  |                             (void)dumpptr; | ||||||
|  |                         } | ||||||
|                         if (firstarg == DBUS_TYPE_ARRAY) { |                         if (firstarg == DBUS_TYPE_ARRAY) { | ||||||
|                             { const int dumpint = va_arg(ap_reply, int); (void) dumpint; } |                             { | ||||||
|  |                                 const int dumpint = va_arg(ap_reply, int); | ||||||
|  |                                 (void)dumpint; | ||||||
|  |                             } | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     firstarg = va_arg(ap_reply, int); |                     firstarg = va_arg(ap_reply, int); | ||||||
| @@ -268,8 +267,7 @@ SDL_DBus_CallMethod(const char *node, const char *path, const char *interface, c | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool SDL_DBus_CallVoidMethodInternal(DBusConnection *conn, const char *node, const char *path, const char *interface, const char *method, va_list ap) | ||||||
| SDL_DBus_CallVoidMethodInternal(DBusConnection *conn, const char *node, const char *path, const char *interface, const char *method, va_list ap) |  | ||||||
| { | { | ||||||
|     SDL_bool retval = SDL_FALSE; |     SDL_bool retval = SDL_FALSE; | ||||||
|  |  | ||||||
| @@ -291,8 +289,7 @@ SDL_DBus_CallVoidMethodInternal(DBusConnection *conn, const char *node, const ch | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool SDL_DBus_CallWithBasicReply(DBusConnection *conn, DBusMessage *msg, const int expectedtype, void *result) | ||||||
| SDL_DBus_CallWithBasicReply(DBusConnection *conn, DBusMessage *msg, const int expectedtype, void *result) |  | ||||||
| { | { | ||||||
|     SDL_bool retval = SDL_FALSE; |     SDL_bool retval = SDL_FALSE; | ||||||
|  |  | ||||||
| @@ -363,19 +360,16 @@ SDL_DBus_QueryProperty(const char *node, const char *path, const char *interface | |||||||
|     return SDL_DBus_QueryPropertyOnConnection(dbus.session_conn, node, path, interface, property, expectedtype, result); |     return SDL_DBus_QueryPropertyOnConnection(dbus.session_conn, node, path, interface, property, expectedtype, result); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void SDL_DBus_ScreensaverTickle(void) | ||||||
| void |  | ||||||
| SDL_DBus_ScreensaverTickle(void) |  | ||||||
| { | { | ||||||
|     if (screensaver_cookie == 0 && inhibit_handle == NULL) {  /* no need to tickle if we're inhibiting. */ |     if (screensaver_cookie == 0 && inhibit_handle == NULL) { /* no need to tickle if we're inhibiting. */ | ||||||
|         /* org.gnome.ScreenSaver is the legacy interface, but it'll either do nothing or just be a second harmless tickle on newer systems, so we leave it for now. */ |         /* org.gnome.ScreenSaver is the legacy interface, but it'll either do nothing or just be a second harmless tickle on newer systems, so we leave it for now. */ | ||||||
|         SDL_DBus_CallVoidMethod("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver", "SimulateUserActivity", DBUS_TYPE_INVALID); |         SDL_DBus_CallVoidMethod("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver", "SimulateUserActivity", DBUS_TYPE_INVALID); | ||||||
|         SDL_DBus_CallVoidMethod("org.freedesktop.ScreenSaver", "/org/freedesktop/ScreenSaver", "org.freedesktop.ScreenSaver", "SimulateUserActivity", DBUS_TYPE_INVALID); |         SDL_DBus_CallVoidMethod("org.freedesktop.ScreenSaver", "/org/freedesktop/ScreenSaver", "org.freedesktop.ScreenSaver", "SimulateUserActivity", DBUS_TYPE_INVALID); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool SDL_DBus_AppendDictWithKeyValue(DBusMessageIter *iterInit, const char *key, const char *value) | ||||||
| SDL_DBus_AppendDictWithKeyValue(DBusMessageIter *iterInit, const char *key, const char *value) |  | ||||||
| { | { | ||||||
|     DBusMessageIter iterDict, iterEntry, iterValue; |     DBusMessageIter iterDict, iterEntry, iterValue; | ||||||
|  |  | ||||||
| @@ -399,9 +393,7 @@ SDL_DBus_AppendDictWithKeyValue(DBusMessageIter *iterInit, const char *key, cons | |||||||
|         goto failed; |         goto failed; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!dbus.message_iter_close_container(&iterEntry, &iterValue) |     if (!dbus.message_iter_close_container(&iterEntry, &iterValue) || !dbus.message_iter_close_container(&iterDict, &iterEntry) || !dbus.message_iter_close_container(iterInit, &iterDict)) { | ||||||
|         || !dbus.message_iter_close_container(&iterDict, &iterEntry) |  | ||||||
|         || !dbus.message_iter_close_container(iterInit, &iterDict)) { |  | ||||||
|         goto failed; |         goto failed; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -419,8 +411,7 @@ SDL_DBus_ScreensaverInhibit(SDL_bool inhibit) | |||||||
| { | { | ||||||
|     const char *default_inhibit_reason = "Playing a game"; |     const char *default_inhibit_reason = "Playing a game"; | ||||||
|  |  | ||||||
|     if ( (inhibit && (screensaver_cookie != 0 || inhibit_handle != NULL)) |     if ((inhibit && (screensaver_cookie != 0 || inhibit_handle != NULL)) || (!inhibit && (screensaver_cookie == 0 && inhibit_handle == NULL))) { | ||||||
|         || (!inhibit && (screensaver_cookie == 0 && inhibit_handle == NULL)) ) { |  | ||||||
|         return SDL_TRUE; |         return SDL_TRUE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -434,7 +425,7 @@ SDL_DBus_ScreensaverInhibit(SDL_bool inhibit) | |||||||
|         const char *bus_name = "org.freedesktop.portal.Desktop"; |         const char *bus_name = "org.freedesktop.portal.Desktop"; | ||||||
|         const char *path = "/org/freedesktop/portal/desktop"; |         const char *path = "/org/freedesktop/portal/desktop"; | ||||||
|         const char *interface = "org.freedesktop.portal.Inhibit"; |         const char *interface = "org.freedesktop.portal.Inhibit"; | ||||||
|         const char *window = ""; /* As a future improvement we could gather the X11 XID or Wayland surface identifier */ |         const char *window = "";                    /* As a future improvement we could gather the X11 XID or Wayland surface identifier */ | ||||||
|         static const unsigned int INHIBIT_IDLE = 8; /* Taken from the portal API reference */ |         static const unsigned int INHIBIT_IDLE = 8; /* Taken from the portal API reference */ | ||||||
|         DBusMessageIter iterInit; |         DBusMessageIter iterInit; | ||||||
|  |  | ||||||
| @@ -487,15 +478,15 @@ SDL_DBus_ScreensaverInhibit(SDL_bool inhibit) | |||||||
|             const char *app = SDL_GetHint(SDL_HINT_APP_NAME); |             const char *app = SDL_GetHint(SDL_HINT_APP_NAME); | ||||||
|             const char *reason = SDL_GetHint(SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME); |             const char *reason = SDL_GetHint(SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME); | ||||||
|             if (app == NULL || !app[0]) { |             if (app == NULL || !app[0]) { | ||||||
|                app  = "My SDL application"; |                 app = "My SDL application"; | ||||||
|             } |             } | ||||||
|             if (reason == NULL || !reason[0]) { |             if (reason == NULL || !reason[0]) { | ||||||
|                 reason = default_inhibit_reason; |                 reason = default_inhibit_reason; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (!SDL_DBus_CallMethod(bus_name, path, interface, "Inhibit", |             if (!SDL_DBus_CallMethod(bus_name, path, interface, "Inhibit", | ||||||
|                     DBUS_TYPE_STRING, &app, DBUS_TYPE_STRING, &reason, DBUS_TYPE_INVALID, |                                      DBUS_TYPE_STRING, &app, DBUS_TYPE_STRING, &reason, DBUS_TYPE_INVALID, | ||||||
|                     DBUS_TYPE_UINT32, &screensaver_cookie, DBUS_TYPE_INVALID)) { |                                      DBUS_TYPE_UINT32, &screensaver_cookie, DBUS_TYPE_INVALID)) { | ||||||
|                 return SDL_FALSE; |                 return SDL_FALSE; | ||||||
|             } |             } | ||||||
|             return (screensaver_cookie != 0) ? SDL_TRUE : SDL_FALSE; |             return (screensaver_cookie != 0) ? SDL_TRUE : SDL_FALSE; | ||||||
|   | |||||||
| @@ -29,20 +29,20 @@ | |||||||
| #include "SDL_stdinc.h" | #include "SDL_stdinc.h" | ||||||
| #include <dbus/dbus.h> | #include <dbus/dbus.h> | ||||||
|  |  | ||||||
|  | typedef struct SDL_DBusContext | ||||||
| typedef struct SDL_DBusContext { | { | ||||||
|     DBusConnection *session_conn; |     DBusConnection *session_conn; | ||||||
|     DBusConnection *system_conn; |     DBusConnection *system_conn; | ||||||
|  |  | ||||||
|     DBusConnection *(*bus_get_private)(DBusBusType, DBusError *); |     DBusConnection *(*bus_get_private)(DBusBusType, DBusError *); | ||||||
|     dbus_bool_t (*bus_register)(DBusConnection *, DBusError *); |     dbus_bool_t (*bus_register)(DBusConnection *, DBusError *); | ||||||
|     void (*bus_add_match)(DBusConnection *, const char *, DBusError *); |     void (*bus_add_match)(DBusConnection *, const char *, DBusError *); | ||||||
|     DBusConnection * (*connection_open_private)(const char *, DBusError *); |     DBusConnection *(*connection_open_private)(const char *, DBusError *); | ||||||
|     void (*connection_set_exit_on_disconnect)(DBusConnection *, dbus_bool_t); |     void (*connection_set_exit_on_disconnect)(DBusConnection *, dbus_bool_t); | ||||||
|     dbus_bool_t (*connection_get_is_connected)(DBusConnection *); |     dbus_bool_t (*connection_get_is_connected)(DBusConnection *); | ||||||
|     dbus_bool_t (*connection_add_filter)(DBusConnection *, DBusHandleMessageFunction, void *, DBusFreeFunction); |     dbus_bool_t (*connection_add_filter)(DBusConnection *, DBusHandleMessageFunction, void *, DBusFreeFunction); | ||||||
|     dbus_bool_t (*connection_try_register_object_path)(DBusConnection *, const char *, |     dbus_bool_t (*connection_try_register_object_path)(DBusConnection *, const char *, | ||||||
|         const DBusObjectPathVTable *, void *, DBusError *); |                                                        const DBusObjectPathVTable *, void *, DBusError *); | ||||||
|     dbus_bool_t (*connection_send)(DBusConnection *, DBusMessage *, dbus_uint32_t *); |     dbus_bool_t (*connection_send)(DBusConnection *, DBusMessage *, dbus_uint32_t *); | ||||||
|     DBusMessage *(*connection_send_with_reply_and_block)(DBusConnection *, DBusMessage *, int, DBusError *); |     DBusMessage *(*connection_send_with_reply_and_block)(DBusConnection *, DBusMessage *, int, DBusError *); | ||||||
|     void (*connection_close)(DBusConnection *); |     void (*connection_close)(DBusConnection *); | ||||||
| @@ -79,7 +79,7 @@ typedef struct SDL_DBusContext { | |||||||
|  |  | ||||||
| extern void SDL_DBus_Init(void); | extern void SDL_DBus_Init(void); | ||||||
| extern void SDL_DBus_Quit(void); | extern void SDL_DBus_Quit(void); | ||||||
| extern SDL_DBusContext * SDL_DBus_GetContext(void); | extern SDL_DBusContext *SDL_DBus_GetContext(void); | ||||||
|  |  | ||||||
| /* These use the built-in Session connection. */ | /* These use the built-in Session connection. */ | ||||||
| extern SDL_bool SDL_DBus_CallMethod(const char *node, const char *path, const char *interface, const char *method, ...); | extern SDL_bool SDL_DBus_CallMethod(const char *node, const char *path, const char *interface, const char *method, ...); | ||||||
|   | |||||||
| @@ -51,15 +51,15 @@ | |||||||
| #define SYN_DROPPED 3 | #define SYN_DROPPED 3 | ||||||
| #endif | #endif | ||||||
| #ifndef ABS_MT_SLOT | #ifndef ABS_MT_SLOT | ||||||
| #define ABS_MT_SLOT         0x2f | #define ABS_MT_SLOT        0x2f | ||||||
| #define ABS_MT_POSITION_X   0x35 | #define ABS_MT_POSITION_X  0x35 | ||||||
| #define ABS_MT_POSITION_Y   0x36 | #define ABS_MT_POSITION_Y  0x36 | ||||||
| #define ABS_MT_TRACKING_ID  0x39 | #define ABS_MT_TRACKING_ID 0x39 | ||||||
| #define ABS_MT_PRESSURE     0x3a | #define ABS_MT_PRESSURE    0x3a | ||||||
| #endif | #endif | ||||||
| #ifndef REL_WHEEL_HI_RES | #ifndef REL_WHEEL_HI_RES | ||||||
| #define REL_WHEEL_HI_RES    0x0b | #define REL_WHEEL_HI_RES  0x0b | ||||||
| #define REL_HWHEEL_HI_RES   0x0c | #define REL_HWHEEL_HI_RES 0x0c | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| typedef struct SDL_evdevlist_item | typedef struct SDL_evdevlist_item | ||||||
| @@ -74,8 +74,9 @@ typedef struct SDL_evdevlist_item | |||||||
|        keyboard, touchpad, etc.). Also there's probably some things in here we |        keyboard, touchpad, etc.). Also there's probably some things in here we | ||||||
|        can pull out to the SDL_evdevlist_item i.e. name */ |        can pull out to the SDL_evdevlist_item i.e. name */ | ||||||
|     SDL_bool is_touchscreen; |     SDL_bool is_touchscreen; | ||||||
|     struct { |     struct | ||||||
|         char* name; |     { | ||||||
|  |         char *name; | ||||||
|  |  | ||||||
|         int min_x, max_x, range_x; |         int min_x, max_x, range_x; | ||||||
|         int min_y, max_y, range_y; |         int min_y, max_y, range_y; | ||||||
| @@ -83,8 +84,10 @@ typedef struct SDL_evdevlist_item | |||||||
|  |  | ||||||
|         int max_slots; |         int max_slots; | ||||||
|         int current_slot; |         int current_slot; | ||||||
|         struct { |         struct | ||||||
|             enum { |         { | ||||||
|  |             enum | ||||||
|  |             { | ||||||
|                 EVDEV_TOUCH_SLOTDELTA_NONE = 0, |                 EVDEV_TOUCH_SLOTDELTA_NONE = 0, | ||||||
|                 EVDEV_TOUCH_SLOTDELTA_DOWN, |                 EVDEV_TOUCH_SLOTDELTA_DOWN, | ||||||
|                 EVDEV_TOUCH_SLOTDELTA_UP, |                 EVDEV_TOUCH_SLOTDELTA_UP, | ||||||
| @@ -126,33 +129,30 @@ static int SDL_EVDEV_device_removed(const char *dev_path); | |||||||
| static int SDL_EVDEV_device_added(const char *dev_path, int udev_class); | static int SDL_EVDEV_device_added(const char *dev_path, int udev_class); | ||||||
| #if SDL_USE_LIBUDEV | #if SDL_USE_LIBUDEV | ||||||
| static void SDL_EVDEV_udev_callback(SDL_UDEV_deviceevent udev_type, int udev_class, | static void SDL_EVDEV_udev_callback(SDL_UDEV_deviceevent udev_type, int udev_class, | ||||||
|     const char *dev_path); |                                     const char *dev_path); | ||||||
| #endif /* SDL_USE_LIBUDEV */ | #endif /* SDL_USE_LIBUDEV */ | ||||||
|  |  | ||||||
| static Uint8 EVDEV_MouseButtons[] = { | static Uint8 EVDEV_MouseButtons[] = { | ||||||
|     SDL_BUTTON_LEFT,            /*  BTN_LEFT        0x110 */ |     SDL_BUTTON_LEFT,   /*  BTN_LEFT        0x110 */ | ||||||
|     SDL_BUTTON_RIGHT,           /*  BTN_RIGHT       0x111 */ |     SDL_BUTTON_RIGHT,  /*  BTN_RIGHT       0x111 */ | ||||||
|     SDL_BUTTON_MIDDLE,          /*  BTN_MIDDLE      0x112 */ |     SDL_BUTTON_MIDDLE, /*  BTN_MIDDLE      0x112 */ | ||||||
|     SDL_BUTTON_X1,              /*  BTN_SIDE        0x113 */ |     SDL_BUTTON_X1,     /*  BTN_SIDE        0x113 */ | ||||||
|     SDL_BUTTON_X2,              /*  BTN_EXTRA       0x114 */ |     SDL_BUTTON_X2,     /*  BTN_EXTRA       0x114 */ | ||||||
|     SDL_BUTTON_X2 + 1,          /*  BTN_FORWARD     0x115 */ |     SDL_BUTTON_X2 + 1, /*  BTN_FORWARD     0x115 */ | ||||||
|     SDL_BUTTON_X2 + 2,          /*  BTN_BACK        0x116 */ |     SDL_BUTTON_X2 + 2, /*  BTN_BACK        0x116 */ | ||||||
|     SDL_BUTTON_X2 + 3           /*  BTN_TASK        0x117 */ |     SDL_BUTTON_X2 + 3  /*  BTN_TASK        0x117 */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static int | static int SDL_EVDEV_SetRelativeMouseMode(SDL_bool enabled) | ||||||
| SDL_EVDEV_SetRelativeMouseMode(SDL_bool enabled) |  | ||||||
| { | { | ||||||
|     /* Mice already send relative events through this interface */ |     /* Mice already send relative events through this interface */ | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int SDL_EVDEV_Init(void) | ||||||
| int |  | ||||||
| SDL_EVDEV_Init(void) |  | ||||||
| { | { | ||||||
|     if (_this == NULL) { |     if (_this == NULL) { | ||||||
|         _this = (SDL_EVDEV_PrivateData*)SDL_calloc(1, sizeof(*_this)); |         _this = (SDL_EVDEV_PrivateData *)SDL_calloc(1, sizeof(*_this)); | ||||||
|         if (_this == NULL) { |         if (_this == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -182,14 +182,14 @@ SDL_EVDEV_Init(void) | |||||||
|                where device class is an integer representing the |                where device class is an integer representing the | ||||||
|                SDL_UDEV_deviceclass and path is the full path to |                SDL_UDEV_deviceclass and path is the full path to | ||||||
|                the event device. */ |                the event device. */ | ||||||
|             const char* devices = SDL_getenv("SDL_EVDEV_DEVICES"); |             const char *devices = SDL_getenv("SDL_EVDEV_DEVICES"); | ||||||
|             if (devices) { |             if (devices) { | ||||||
|                 /* Assume this is the old use of the env var and it is not in |                 /* Assume this is the old use of the env var and it is not in | ||||||
|                    ROM. */ |                    ROM. */ | ||||||
|                 char* rest = (char*) devices; |                 char *rest = (char *)devices; | ||||||
|                 char* spec; |                 char *spec; | ||||||
|                 while ((spec = SDL_strtokr(rest, ",", &rest))) { |                 while ((spec = SDL_strtokr(rest, ",", &rest))) { | ||||||
|                     char* endofcls = 0; |                     char *endofcls = 0; | ||||||
|                     long cls = SDL_strtol(spec, &endofcls, 0); |                     long cls = SDL_strtol(spec, &endofcls, 0); | ||||||
|                     if (endofcls) { |                     if (endofcls) { | ||||||
|                         SDL_EVDEV_device_added(endofcls + 1, cls); |                         SDL_EVDEV_device_added(endofcls + 1, cls); | ||||||
| @@ -211,8 +211,7 @@ SDL_EVDEV_Init(void) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EVDEV_Quit(void) | ||||||
| SDL_EVDEV_Quit(void) |  | ||||||
| { | { | ||||||
|     if (_this == NULL) { |     if (_this == NULL) { | ||||||
|         return; |         return; | ||||||
| @@ -244,13 +243,13 @@ SDL_EVDEV_Quit(void) | |||||||
|  |  | ||||||
| #if SDL_USE_LIBUDEV | #if SDL_USE_LIBUDEV | ||||||
| static void SDL_EVDEV_udev_callback(SDL_UDEV_deviceevent udev_event, int udev_class, | static void SDL_EVDEV_udev_callback(SDL_UDEV_deviceevent udev_event, int udev_class, | ||||||
|     const char* dev_path) |                                     const char *dev_path) | ||||||
| { | { | ||||||
|     if (dev_path == NULL) { |     if (dev_path == NULL) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     switch(udev_event) { |     switch (udev_event) { | ||||||
|     case SDL_UDEV_DEVICEADDED: |     case SDL_UDEV_DEVICEADDED: | ||||||
|         if (!(udev_class & (SDL_UDEV_DEVICE_MOUSE | SDL_UDEV_DEVICE_KEYBOARD | SDL_UDEV_DEVICE_TOUCHSCREEN | SDL_UDEV_DEVICE_TOUCHPAD))) { |         if (!(udev_class & (SDL_UDEV_DEVICE_MOUSE | SDL_UDEV_DEVICE_KEYBOARD | SDL_UDEV_DEVICE_TOUCHSCREEN | SDL_UDEV_DEVICE_TOUCHPAD))) { | ||||||
|             return; |             return; | ||||||
| @@ -271,8 +270,7 @@ static void SDL_EVDEV_udev_callback(SDL_UDEV_deviceevent udev_event, int udev_cl | |||||||
| } | } | ||||||
| #endif /* SDL_USE_LIBUDEV */ | #endif /* SDL_USE_LIBUDEV */ | ||||||
|  |  | ||||||
| void  | void SDL_EVDEV_Poll(void) | ||||||
| SDL_EVDEV_Poll(void) |  | ||||||
| { | { | ||||||
|     struct input_event events[32]; |     struct input_event events[32]; | ||||||
|     int i, j, len; |     int i, j, len; | ||||||
| @@ -341,7 +339,7 @@ SDL_EVDEV_Poll(void) | |||||||
|                     SDL_EVDEV_kbd_keycode(_this->kbd, events[i].code, events[i].value); |                     SDL_EVDEV_kbd_keycode(_this->kbd, events[i].code, events[i].value); | ||||||
|                     break; |                     break; | ||||||
|                 case EV_ABS: |                 case EV_ABS: | ||||||
|                     switch(events[i].code) { |                     switch (events[i].code) { | ||||||
|                     case ABS_MT_SLOT: |                     case ABS_MT_SLOT: | ||||||
|                         if (!item->is_touchscreen) { /* FIXME: temp hack */ |                         if (!item->is_touchscreen) { /* FIXME: temp hack */ | ||||||
|                             break; |                             break; | ||||||
| @@ -413,7 +411,7 @@ SDL_EVDEV_Poll(void) | |||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 case EV_REL: |                 case EV_REL: | ||||||
|                     switch(events[i].code) { |                     switch (events[i].code) { | ||||||
|                     case REL_X: |                     case REL_X: | ||||||
|                         if (item->relative_mouse) { |                         if (item->relative_mouse) { | ||||||
|                             item->mouse_x += events[i].value; |                             item->mouse_x += events[i].value; | ||||||
| @@ -468,13 +466,13 @@ SDL_EVDEV_Poll(void) | |||||||
|  |  | ||||||
|                         for (j = 0; j < item->touchscreen_data->max_slots; j++) { |                         for (j = 0; j < item->touchscreen_data->max_slots; j++) { | ||||||
|                             norm_x = (float)(item->touchscreen_data->slots[j].x - item->touchscreen_data->min_x) / |                             norm_x = (float)(item->touchscreen_data->slots[j].x - item->touchscreen_data->min_x) / | ||||||
|                                 (float)item->touchscreen_data->range_x; |                                      (float)item->touchscreen_data->range_x; | ||||||
|                             norm_y = (float)(item->touchscreen_data->slots[j].y - item->touchscreen_data->min_y) / |                             norm_y = (float)(item->touchscreen_data->slots[j].y - item->touchscreen_data->min_y) / | ||||||
|                                 (float)item->touchscreen_data->range_y; |                                      (float)item->touchscreen_data->range_y; | ||||||
|  |  | ||||||
|                             if (item->touchscreen_data->range_pressure > 0) { |                             if (item->touchscreen_data->range_pressure > 0) { | ||||||
|                                 norm_pressure = (float)(item->touchscreen_data->slots[j].pressure - item->touchscreen_data->min_pressure) / |                                 norm_pressure = (float)(item->touchscreen_data->slots[j].pressure - item->touchscreen_data->min_pressure) / | ||||||
|                                     (float)item->touchscreen_data->range_pressure; |                                                 (float)item->touchscreen_data->range_pressure; | ||||||
|                             } else { |                             } else { | ||||||
|                                 /* This touchscreen does not support pressure */ |                                 /* This touchscreen does not support pressure */ | ||||||
|                                 norm_pressure = 1.0f; |                                 norm_pressure = 1.0f; | ||||||
| @@ -483,7 +481,7 @@ SDL_EVDEV_Poll(void) | |||||||
|                             /* FIXME: the touch's window shouldn't be null, but |                             /* FIXME: the touch's window shouldn't be null, but | ||||||
|                              * the coordinate space of touch positions needs to |                              * the coordinate space of touch positions needs to | ||||||
|                              * be window-relative in that case. */ |                              * be window-relative in that case. */ | ||||||
|                             switch(item->touchscreen_data->slots[j].delta) { |                             switch (item->touchscreen_data->slots[j].delta) { | ||||||
|                             case EVDEV_TOUCH_SLOTDELTA_DOWN: |                             case EVDEV_TOUCH_SLOTDELTA_DOWN: | ||||||
|                                 SDL_SendTouch(item->fd, item->touchscreen_data->slots[j].tracking_id, NULL, SDL_TRUE, norm_x, norm_y, norm_pressure); |                                 SDL_SendTouch(item->fd, item->touchscreen_data->slots[j].tracking_id, NULL, SDL_TRUE, norm_x, norm_y, norm_pressure); | ||||||
|                                 item->touchscreen_data->slots[j].delta = EVDEV_TOUCH_SLOTDELTA_NONE; |                                 item->touchscreen_data->slots[j].delta = EVDEV_TOUCH_SLOTDELTA_NONE; | ||||||
| @@ -522,8 +520,7 @@ SDL_EVDEV_Poll(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_Scancode | static SDL_Scancode SDL_EVDEV_translate_keycode(int keycode) | ||||||
| SDL_EVDEV_translate_keycode(int keycode) |  | ||||||
| { | { | ||||||
|     SDL_Scancode scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_LINUX, keycode); |     SDL_Scancode scancode = SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_LINUX, keycode); | ||||||
|  |  | ||||||
| @@ -535,8 +532,9 @@ SDL_EVDEV_translate_keycode(int keycode) | |||||||
|            SDL_Log message about an unknown key. */ |            SDL_Log message about an unknown key. */ | ||||||
|         if (keycode != BTN_TOUCH) { |         if (keycode != BTN_TOUCH) { | ||||||
|             SDL_Log("The key you just pressed is not recognized by SDL. To help " |             SDL_Log("The key you just pressed is not recognized by SDL. To help " | ||||||
|                 "get this fixed, please report this to the SDL forums/mailing list " |                     "get this fixed, please report this to the SDL forums/mailing list " | ||||||
|                 "<https://discourse.libsdl.org/> EVDEV KeyCode %d", keycode); |                     "<https://discourse.libsdl.org/> EVDEV KeyCode %d", | ||||||
|  |                     keycode); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| #endif /* DEBUG_SCANCODES */ | #endif /* DEBUG_SCANCODES */ | ||||||
| @@ -544,8 +542,7 @@ SDL_EVDEV_translate_keycode(int keycode) | |||||||
|     return scancode; |     return scancode; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int SDL_EVDEV_init_touchscreen(SDL_evdevlist_item *item, int udev_class) | ||||||
| SDL_EVDEV_init_touchscreen(SDL_evdevlist_item* item, int udev_class) |  | ||||||
| { | { | ||||||
|     int ret, i; |     int ret, i; | ||||||
|     unsigned long xreq, yreq; |     unsigned long xreq, yreq; | ||||||
| @@ -634,8 +631,8 @@ SDL_EVDEV_init_touchscreen(SDL_evdevlist_item* item, int udev_class) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     ret = SDL_AddTouch(item->fd, /* I guess our fd is unique enough */ |     ret = SDL_AddTouch(item->fd, /* I guess our fd is unique enough */ | ||||||
|         (udev_class & SDL_UDEV_DEVICE_TOUCHPAD) ? SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE : SDL_TOUCH_DEVICE_DIRECT, |                        (udev_class & SDL_UDEV_DEVICE_TOUCHPAD) ? SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE : SDL_TOUCH_DEVICE_DIRECT, | ||||||
|         item->touchscreen_data->name); |                        item->touchscreen_data->name); | ||||||
|     if (ret < 0) { |     if (ret < 0) { | ||||||
|         SDL_free(item->touchscreen_data->slots); |         SDL_free(item->touchscreen_data->slots); | ||||||
|         SDL_free(item->touchscreen_data->name); |         SDL_free(item->touchscreen_data->name); | ||||||
| @@ -646,8 +643,8 @@ SDL_EVDEV_init_touchscreen(SDL_evdevlist_item* item, int udev_class) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_EVDEV_destroy_touchscreen(SDL_evdevlist_item *item) | ||||||
| SDL_EVDEV_destroy_touchscreen(SDL_evdevlist_item* item) { | { | ||||||
|     if (!item->is_touchscreen) { |     if (!item->is_touchscreen) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| @@ -658,8 +655,7 @@ SDL_EVDEV_destroy_touchscreen(SDL_evdevlist_item* item) { | |||||||
|     SDL_free(item->touchscreen_data); |     SDL_free(item->touchscreen_data); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_EVDEV_sync_device(SDL_evdevlist_item *item) | ||||||
| SDL_EVDEV_sync_device(SDL_evdevlist_item *item)  |  | ||||||
| { | { | ||||||
| #ifdef EVIOCGMTSLOTS | #ifdef EVIOCGMTSLOTS | ||||||
|     int i, ret; |     int i, ret; | ||||||
| @@ -672,8 +668,8 @@ SDL_EVDEV_sync_device(SDL_evdevlist_item *item) | |||||||
|      * |      * | ||||||
|      * this is the structure we're trying to emulate |      * this is the structure we're trying to emulate | ||||||
|      */ |      */ | ||||||
|     Uint32* mt_req_code; |     Uint32 *mt_req_code; | ||||||
|     Sint32* mt_req_values; |     Sint32 *mt_req_values; | ||||||
|     size_t mt_req_size; |     size_t mt_req_size; | ||||||
|  |  | ||||||
|     /* TODO: sync devices other than touchscreen */ |     /* TODO: sync devices other than touchscreen */ | ||||||
| @@ -682,14 +678,14 @@ SDL_EVDEV_sync_device(SDL_evdevlist_item *item) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     mt_req_size = sizeof(*mt_req_code) + |     mt_req_size = sizeof(*mt_req_code) + | ||||||
|         sizeof(*mt_req_values) * item->touchscreen_data->max_slots; |                   sizeof(*mt_req_values) * item->touchscreen_data->max_slots; | ||||||
|  |  | ||||||
|     mt_req_code = SDL_calloc(1, mt_req_size); |     mt_req_code = SDL_calloc(1, mt_req_size); | ||||||
|     if (mt_req_code == NULL) { |     if (mt_req_code == NULL) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     mt_req_values = (Sint32*)mt_req_code + 1; |     mt_req_values = (Sint32 *)mt_req_code + 1; | ||||||
|  |  | ||||||
|     *mt_req_code = ABS_MT_TRACKING_ID; |     *mt_req_code = ABS_MT_TRACKING_ID; | ||||||
|     ret = ioctl(item->fd, EVIOCGMTSLOTS(mt_req_size), mt_req_code); |     ret = ioctl(item->fd, EVIOCGMTSLOTS(mt_req_size), mt_req_code); | ||||||
| @@ -712,7 +708,7 @@ SDL_EVDEV_sync_device(SDL_evdevlist_item *item) | |||||||
|             item->touchscreen_data->slots[i].tracking_id = mt_req_values[i]; |             item->touchscreen_data->slots[i].tracking_id = mt_req_values[i]; | ||||||
|             item->touchscreen_data->slots[i].delta = EVDEV_TOUCH_SLOTDELTA_DOWN; |             item->touchscreen_data->slots[i].delta = EVDEV_TOUCH_SLOTDELTA_DOWN; | ||||||
|         } else if (item->touchscreen_data->slots[i].tracking_id >= 0 && |         } else if (item->touchscreen_data->slots[i].tracking_id >= 0 && | ||||||
|             mt_req_values[i] < 0) { |                    mt_req_values[i] < 0) { | ||||||
|             item->touchscreen_data->slots[i].tracking_id = -1; |             item->touchscreen_data->slots[i].tracking_id = -1; | ||||||
|             item->touchscreen_data->slots[i].delta = EVDEV_TOUCH_SLOTDELTA_UP; |             item->touchscreen_data->slots[i].delta = EVDEV_TOUCH_SLOTDELTA_UP; | ||||||
|         } |         } | ||||||
| @@ -784,8 +780,7 @@ SDL_EVDEV_sync_device(SDL_evdevlist_item *item) | |||||||
| #endif /* EVIOCGMTSLOTS */ | #endif /* EVIOCGMTSLOTS */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int SDL_EVDEV_device_added(const char *dev_path, int udev_class) | ||||||
| SDL_EVDEV_device_added(const char *dev_path, int udev_class) |  | ||||||
| { | { | ||||||
|     int ret; |     int ret; | ||||||
|     SDL_evdevlist_item *item; |     SDL_evdevlist_item *item; | ||||||
| @@ -794,11 +789,11 @@ SDL_EVDEV_device_added(const char *dev_path, int udev_class) | |||||||
|     /* Check to make sure it's not already in list. */ |     /* Check to make sure it's not already in list. */ | ||||||
|     for (item = _this->first; item != NULL; item = item->next) { |     for (item = _this->first; item != NULL; item = item->next) { | ||||||
|         if (SDL_strcmp(dev_path, item->path) == 0) { |         if (SDL_strcmp(dev_path, item->path) == 0) { | ||||||
|             return -1;  /* already have this one */ |             return -1; /* already have this one */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     item = (SDL_evdevlist_item *) SDL_calloc(1, sizeof (SDL_evdevlist_item)); |     item = (SDL_evdevlist_item *)SDL_calloc(1, sizeof(SDL_evdevlist_item)); | ||||||
|     if (item == NULL) { |     if (item == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -846,8 +841,7 @@ SDL_EVDEV_device_added(const char *dev_path, int udev_class) | |||||||
|     return _this->num_devices++; |     return _this->num_devices++; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int SDL_EVDEV_device_removed(const char *dev_path) | ||||||
| SDL_EVDEV_device_removed(const char *dev_path) |  | ||||||
| { | { | ||||||
|     SDL_evdevlist_item *item; |     SDL_evdevlist_item *item; | ||||||
|     SDL_evdevlist_item *prev = NULL; |     SDL_evdevlist_item *prev = NULL; | ||||||
| @@ -879,7 +873,6 @@ SDL_EVDEV_device_removed(const char *dev_path) | |||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* SDL_INPUT_LINUXEV */ | #endif /* SDL_INPUT_LINUXEV */ | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ | |||||||
|  |  | ||||||
| #include "SDL_evdev_capabilities.h" | #include "SDL_evdev_capabilities.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| #if HAVE_LINUX_INPUT_H | #if HAVE_LINUX_INPUT_H | ||||||
|  |  | ||||||
| /* missing defines in older Linux kernel headers */ | /* missing defines in older Linux kernel headers */ | ||||||
| @@ -31,10 +30,10 @@ | |||||||
| #define BTN_TRIGGER_HAPPY 0x2c0 | #define BTN_TRIGGER_HAPPY 0x2c0 | ||||||
| #endif | #endif | ||||||
| #ifndef BTN_DPAD_UP | #ifndef BTN_DPAD_UP | ||||||
| #define BTN_DPAD_UP       0x220 | #define BTN_DPAD_UP 0x220 | ||||||
| #endif | #endif | ||||||
| #ifndef KEY_ALS_TOGGLE | #ifndef KEY_ALS_TOGGLE | ||||||
| #define KEY_ALS_TOGGLE    0x230 | #define KEY_ALS_TOGGLE 0x230 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| extern int | extern int | ||||||
| @@ -43,7 +42,8 @@ SDL_EVDEV_GuessDeviceClass(unsigned long bitmask_ev[NBITS(EV_MAX)], | |||||||
|                            unsigned long bitmask_key[NBITS(KEY_MAX)], |                            unsigned long bitmask_key[NBITS(KEY_MAX)], | ||||||
|                            unsigned long bitmask_rel[NBITS(REL_MAX)]) |                            unsigned long bitmask_rel[NBITS(REL_MAX)]) | ||||||
| { | { | ||||||
|     struct range { |     struct range | ||||||
|  |     { | ||||||
|         unsigned start; |         unsigned start; | ||||||
|         unsigned end; |         unsigned end; | ||||||
|     }; |     }; | ||||||
| @@ -114,7 +114,7 @@ SDL_EVDEV_GuessDeviceClass(unsigned long bitmask_ev[NBITS(EV_MAX)], | |||||||
|         unsigned i; |         unsigned i; | ||||||
|         unsigned long found = 0; |         unsigned long found = 0; | ||||||
|  |  | ||||||
|         for (i = 0; i < BTN_MISC/BITS_PER_LONG; ++i) { |         for (i = 0; i < BTN_MISC / BITS_PER_LONG; ++i) { | ||||||
|             found |= bitmask_key[i]; |             found |= bitmask_key[i]; | ||||||
|         } |         } | ||||||
|         /* If there are no keys in the lower block, check the higher blocks */ |         /* If there are no keys in the lower block, check the higher blocks */ | ||||||
|   | |||||||
| @@ -31,21 +31,21 @@ | |||||||
| /* A device can be any combination of these classes */ | /* A device can be any combination of these classes */ | ||||||
| typedef enum | typedef enum | ||||||
| { | { | ||||||
|     SDL_UDEV_DEVICE_UNKNOWN     = 0x0000, |     SDL_UDEV_DEVICE_UNKNOWN = 0x0000, | ||||||
|     SDL_UDEV_DEVICE_MOUSE       = 0x0001, |     SDL_UDEV_DEVICE_MOUSE = 0x0001, | ||||||
|     SDL_UDEV_DEVICE_KEYBOARD    = 0x0002, |     SDL_UDEV_DEVICE_KEYBOARD = 0x0002, | ||||||
|     SDL_UDEV_DEVICE_JOYSTICK    = 0x0004, |     SDL_UDEV_DEVICE_JOYSTICK = 0x0004, | ||||||
|     SDL_UDEV_DEVICE_SOUND       = 0x0008, |     SDL_UDEV_DEVICE_SOUND = 0x0008, | ||||||
|     SDL_UDEV_DEVICE_TOUCHSCREEN = 0x0010, |     SDL_UDEV_DEVICE_TOUCHSCREEN = 0x0010, | ||||||
|     SDL_UDEV_DEVICE_ACCELEROMETER = 0x0020, |     SDL_UDEV_DEVICE_ACCELEROMETER = 0x0020, | ||||||
|     SDL_UDEV_DEVICE_TOUCHPAD    = 0x0040 |     SDL_UDEV_DEVICE_TOUCHPAD = 0x0040 | ||||||
| } SDL_UDEV_deviceclass; | } SDL_UDEV_deviceclass; | ||||||
|  |  | ||||||
| #define BITS_PER_LONG           (sizeof(unsigned long) * 8) | #define BITS_PER_LONG        (sizeof(unsigned long) * 8) | ||||||
| #define NBITS(x)                ((((x)-1)/BITS_PER_LONG)+1) | #define NBITS(x)             ((((x)-1) / BITS_PER_LONG) + 1) | ||||||
| #define EVDEV_OFF(x)            ((x)%BITS_PER_LONG) | #define EVDEV_OFF(x)         ((x) % BITS_PER_LONG) | ||||||
| #define EVDEV_LONG(x)           ((x)/BITS_PER_LONG) | #define EVDEV_LONG(x)        ((x) / BITS_PER_LONG) | ||||||
| #define test_bit(bit, array)    ((array[EVDEV_LONG(bit)] >> EVDEV_OFF(bit)) & 1) | #define test_bit(bit, array) ((array[EVDEV_LONG(bit)] >> EVDEV_OFF(bit)) & 1) | ||||||
|  |  | ||||||
| extern int SDL_EVDEV_GuessDeviceClass(unsigned long bitmask_ev[NBITS(EV_MAX)], | extern int SDL_EVDEV_GuessDeviceClass(unsigned long bitmask_ev[NBITS(EV_MAX)], | ||||||
|                                       unsigned long bitmask_abs[NBITS(ABS_MAX)], |                                       unsigned long bitmask_abs[NBITS(ABS_MAX)], | ||||||
|   | |||||||
| @@ -53,33 +53,31 @@ | |||||||
|  * Handler Tables. |  * Handler Tables. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #define K_HANDLERS\ | #define K_HANDLERS                            \ | ||||||
|     k_self,     k_fn,       k_spec,       k_pad,\ |     k_self, k_fn, k_spec, k_pad,              \ | ||||||
|     k_dead,     k_cons,     k_cur,        k_shift,\ |         k_dead, k_cons, k_cur, k_shift,       \ | ||||||
|     k_meta,     k_ascii,    k_lock,       k_lowercase,\ |         k_meta, k_ascii, k_lock, k_lowercase, \ | ||||||
|     k_slock,    k_dead2,    k_brl,        k_ignore |         k_slock, k_dead2, k_brl, k_ignore | ||||||
|  |  | ||||||
| typedef void (k_handler_fn)(SDL_EVDEV_keyboard_state *kbd, unsigned char value, char up_flag); | typedef void(k_handler_fn)(SDL_EVDEV_keyboard_state *kbd, unsigned char value, char up_flag); | ||||||
| static k_handler_fn K_HANDLERS; | static k_handler_fn K_HANDLERS; | ||||||
| static k_handler_fn *k_handler[16] = { K_HANDLERS }; | static k_handler_fn *k_handler[16] = { K_HANDLERS }; | ||||||
|  |  | ||||||
| typedef void (fn_handler_fn)(SDL_EVDEV_keyboard_state *kbd); | typedef void(fn_handler_fn)(SDL_EVDEV_keyboard_state *kbd); | ||||||
| static void fn_enter(SDL_EVDEV_keyboard_state *kbd); | static void fn_enter(SDL_EVDEV_keyboard_state *kbd); | ||||||
| static void fn_caps_toggle(SDL_EVDEV_keyboard_state *kbd); | static void fn_caps_toggle(SDL_EVDEV_keyboard_state *kbd); | ||||||
| static void fn_caps_on(SDL_EVDEV_keyboard_state *kbd); | static void fn_caps_on(SDL_EVDEV_keyboard_state *kbd); | ||||||
| static void fn_num(SDL_EVDEV_keyboard_state *kbd); | static void fn_num(SDL_EVDEV_keyboard_state *kbd); | ||||||
| static void fn_compose(SDL_EVDEV_keyboard_state *kbd); | static void fn_compose(SDL_EVDEV_keyboard_state *kbd); | ||||||
|  |  | ||||||
| static fn_handler_fn *fn_handler[] = | static fn_handler_fn *fn_handler[] = { | ||||||
| { |     NULL, fn_enter, NULL, NULL, | ||||||
|     NULL,       fn_enter,   NULL,       NULL, |     NULL, NULL, NULL, fn_caps_toggle, | ||||||
|     NULL,       NULL,       NULL,       fn_caps_toggle, |     fn_num, NULL, NULL, NULL, | ||||||
|     fn_num,     NULL,       NULL,       NULL, |     NULL, fn_caps_on, fn_compose, NULL, | ||||||
|     NULL,       fn_caps_on, fn_compose, NULL, |     NULL, NULL, NULL, fn_num | ||||||
|     NULL,       NULL,       NULL,       fn_num |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Keyboard State |  * Keyboard State | ||||||
|  */ |  */ | ||||||
| @@ -89,12 +87,12 @@ struct SDL_EVDEV_keyboard_state | |||||||
|     int console_fd; |     int console_fd; | ||||||
|     int old_kbd_mode; |     int old_kbd_mode; | ||||||
|     unsigned short **key_maps; |     unsigned short **key_maps; | ||||||
|     unsigned char shift_down[NR_SHIFT];        /* shift state counters.. */ |     unsigned char shift_down[NR_SHIFT]; /* shift state counters.. */ | ||||||
|     SDL_bool dead_key_next; |     SDL_bool dead_key_next; | ||||||
|     int npadch;                    /* -1 or number assembled on pad */ |     int npadch; /* -1 or number assembled on pad */ | ||||||
|     struct kbdiacrs *accents; |     struct kbdiacrs *accents; | ||||||
|     unsigned int diacr; |     unsigned int diacr; | ||||||
|     SDL_bool rep;                    /* flag telling character repeat */ |     SDL_bool rep; /* flag telling character repeat */ | ||||||
|     unsigned char lockstate; |     unsigned char lockstate; | ||||||
|     unsigned char slockstate; |     unsigned char slockstate; | ||||||
|     unsigned char ledflagstate; |     unsigned char ledflagstate; | ||||||
| @@ -114,7 +112,7 @@ static void SDL_EVDEV_dump_accents(SDL_EVDEV_keyboard_state *kbd) | |||||||
|     for (i = 0; i < kbd->accents->kb_cnt; ++i) { |     for (i = 0; i < kbd->accents->kb_cnt; ++i) { | ||||||
|         struct kbdiacr *diacr = &kbd->accents->kbdiacr[i]; |         struct kbdiacr *diacr = &kbd->accents->kbdiacr[i]; | ||||||
|         printf("        { 0x%.2x, 0x%.2x, 0x%.2x },\n", |         printf("        { 0x%.2x, 0x%.2x, 0x%.2x },\n", | ||||||
|             diacr->diacr, diacr->base, diacr->result); |                diacr->diacr, diacr->base, diacr->result); | ||||||
|     } |     } | ||||||
|     while (i < 256) { |     while (i < 256) { | ||||||
|         printf("        { 0x00, 0x00, 0x00 },\n"); |         printf("        { 0x00, 0x00, 0x00 },\n"); | ||||||
| @@ -134,7 +132,7 @@ static void SDL_EVDEV_dump_keymap(SDL_EVDEV_keyboard_state *kbd) | |||||||
|         if (kbd->key_maps[i]) { |         if (kbd->key_maps[i]) { | ||||||
|             printf("static unsigned short default_key_map_%d[NR_KEYS] = {", i); |             printf("static unsigned short default_key_map_%d[NR_KEYS] = {", i); | ||||||
|             for (j = 0; j < NR_KEYS; ++j) { |             for (j = 0; j < NR_KEYS; ++j) { | ||||||
|                 if ((j%8) == 0) { |                 if ((j % 8) == 0) { | ||||||
|                     printf("\n    "); |                     printf("\n    "); | ||||||
|                 } |                 } | ||||||
|                 printf("0x%.4x, ", kbd->key_maps[i][j]); |                 printf("0x%.4x, ", kbd->key_maps[i][j]); | ||||||
| @@ -194,23 +192,22 @@ static int SDL_EVDEV_kbd_load_keymaps(SDL_EVDEV_keyboard_state *kbd) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_EVDEV_keyboard_state * kbd_cleanup_state = NULL; | static SDL_EVDEV_keyboard_state *kbd_cleanup_state = NULL; | ||||||
| static int kbd_cleanup_sigactions_installed = 0; | static int kbd_cleanup_sigactions_installed = 0; | ||||||
| static int kbd_cleanup_atexit_installed = 0; | static int kbd_cleanup_atexit_installed = 0; | ||||||
|  |  | ||||||
| static struct sigaction old_sigaction[NSIG]; | static struct sigaction old_sigaction[NSIG]; | ||||||
|  |  | ||||||
| static int fatal_signals[] = | static int fatal_signals[] = { | ||||||
| { |  | ||||||
|     /* Handlers for SIGTERM and SIGINT are installed in SDL_QuitInit. */ |     /* Handlers for SIGTERM and SIGINT are installed in SDL_QuitInit. */ | ||||||
|     SIGHUP,  SIGQUIT, SIGILL,  SIGABRT, |     SIGHUP, SIGQUIT, SIGILL, SIGABRT, | ||||||
|     SIGFPE,  SIGSEGV, SIGPIPE, SIGBUS, |     SIGFPE, SIGSEGV, SIGPIPE, SIGBUS, | ||||||
|     SIGSYS |     SIGSYS | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static void kbd_cleanup(void) | static void kbd_cleanup(void) | ||||||
| { | { | ||||||
|     SDL_EVDEV_keyboard_state* kbd = kbd_cleanup_state; |     SDL_EVDEV_keyboard_state *kbd = kbd_cleanup_state; | ||||||
|     if (kbd == NULL) { |     if (kbd == NULL) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| @@ -219,18 +216,17 @@ static void kbd_cleanup(void) | |||||||
|     ioctl(kbd->console_fd, KDSKBMODE, kbd->old_kbd_mode); |     ioctl(kbd->console_fd, KDSKBMODE, kbd->old_kbd_mode); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_EVDEV_kbd_reraise_signal(int sig) | ||||||
| SDL_EVDEV_kbd_reraise_signal(int sig) |  | ||||||
| { | { | ||||||
|     raise(sig); |     raise(sig); | ||||||
| } | } | ||||||
|  |  | ||||||
| siginfo_t* SDL_EVDEV_kdb_cleanup_siginfo = NULL; | siginfo_t *SDL_EVDEV_kdb_cleanup_siginfo = NULL; | ||||||
| void*      SDL_EVDEV_kdb_cleanup_ucontext = NULL; | void *SDL_EVDEV_kdb_cleanup_ucontext = NULL; | ||||||
|  |  | ||||||
| static void kbd_cleanup_signal_action(int signum, siginfo_t* info, void* ucontext) | static void kbd_cleanup_signal_action(int signum, siginfo_t *info, void *ucontext) | ||||||
| { | { | ||||||
|     struct sigaction* old_action_p = &(old_sigaction[signum]); |     struct sigaction *old_action_p = &(old_sigaction[signum]); | ||||||
|     sigset_t sigset; |     sigset_t sigset; | ||||||
|  |  | ||||||
|     /* Restore original signal handler before going any further. */ |     /* Restore original signal handler before going any further. */ | ||||||
| @@ -264,7 +260,7 @@ static void kbd_unregister_emerg_cleanup() | |||||||
|     kbd_cleanup_sigactions_installed = 0; |     kbd_cleanup_sigactions_installed = 0; | ||||||
|  |  | ||||||
|     for (tabidx = 0; tabidx < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++tabidx) { |     for (tabidx = 0; tabidx < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++tabidx) { | ||||||
|         struct sigaction* old_action_p; |         struct sigaction *old_action_p; | ||||||
|         struct sigaction cur_action; |         struct sigaction cur_action; | ||||||
|         signum = fatal_signals[tabidx]; |         signum = fatal_signals[tabidx]; | ||||||
|         old_action_p = &(old_sigaction[signum]); |         old_action_p = &(old_sigaction[signum]); | ||||||
| @@ -293,7 +289,7 @@ static void kbd_cleanup_atexit(void) | |||||||
|     kbd_unregister_emerg_cleanup(); |     kbd_unregister_emerg_cleanup(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void kbd_register_emerg_cleanup(SDL_EVDEV_keyboard_state * kbd) | static void kbd_register_emerg_cleanup(SDL_EVDEV_keyboard_state *kbd) | ||||||
| { | { | ||||||
|     int tabidx, signum; |     int tabidx, signum; | ||||||
|  |  | ||||||
| @@ -317,7 +313,7 @@ static void kbd_register_emerg_cleanup(SDL_EVDEV_keyboard_state * kbd) | |||||||
|     kbd_cleanup_sigactions_installed = 1; |     kbd_cleanup_sigactions_installed = 1; | ||||||
|  |  | ||||||
|     for (tabidx = 0; tabidx < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++tabidx) { |     for (tabidx = 0; tabidx < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++tabidx) { | ||||||
|         struct sigaction* old_action_p; |         struct sigaction *old_action_p; | ||||||
|         struct sigaction new_action; |         struct sigaction new_action; | ||||||
|         signum = fatal_signals[tabidx]; |         signum = fatal_signals[tabidx]; | ||||||
|         old_action_p = &(old_sigaction[signum]); |         old_action_p = &(old_sigaction[signum]); | ||||||
| @@ -328,7 +324,7 @@ static void kbd_register_emerg_cleanup(SDL_EVDEV_keyboard_state * kbd) | |||||||
|         /* Skip SIGHUP and SIGPIPE if handler is already installed |         /* Skip SIGHUP and SIGPIPE if handler is already installed | ||||||
|          * - assume the handler will do the cleanup |          * - assume the handler will do the cleanup | ||||||
|          */ |          */ | ||||||
|         if ((signum == SIGHUP || signum == SIGPIPE) && (old_action_p->sa_handler != SIG_DFL || (void(*)(int))old_action_p->sa_sigaction != SIG_DFL)) { |         if ((signum == SIGHUP || signum == SIGPIPE) && (old_action_p->sa_handler != SIG_DFL || (void (*)(int))old_action_p->sa_sigaction != SIG_DFL)) { | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -345,7 +341,7 @@ SDL_EVDEV_kbd_init(void) | |||||||
|     SDL_EVDEV_keyboard_state *kbd; |     SDL_EVDEV_keyboard_state *kbd; | ||||||
|     int i; |     int i; | ||||||
|     char flag_state; |     char flag_state; | ||||||
|     char shift_state[ sizeof (long) ] = {TIOCL_GETSHIFTSTATE, 0}; |     char shift_state[sizeof(long)] = { TIOCL_GETSHIFTSTATE, 0 }; | ||||||
|  |  | ||||||
|     kbd = (SDL_EVDEV_keyboard_state *)SDL_calloc(1, sizeof(*kbd)); |     kbd = (SDL_EVDEV_keyboard_state *)SDL_calloc(1, sizeof(*kbd)); | ||||||
|     if (kbd == NULL) { |     if (kbd == NULL) { | ||||||
| @@ -411,8 +407,7 @@ SDL_EVDEV_kbd_init(void) | |||||||
|     return kbd; |     return kbd; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EVDEV_kbd_quit(SDL_EVDEV_keyboard_state *kbd) | ||||||
| SDL_EVDEV_kbd_quit(SDL_EVDEV_keyboard_state *kbd) |  | ||||||
| { | { | ||||||
|     if (kbd == NULL) { |     if (kbd == NULL) { | ||||||
|         return; |         return; | ||||||
| @@ -447,7 +442,7 @@ SDL_EVDEV_kbd_quit(SDL_EVDEV_keyboard_state *kbd) | |||||||
| static void put_queue(SDL_EVDEV_keyboard_state *kbd, uint c) | static void put_queue(SDL_EVDEV_keyboard_state *kbd, uint c) | ||||||
| { | { | ||||||
|     /* c is already part of a UTF-8 sequence and safe to add as a character */ |     /* c is already part of a UTF-8 sequence and safe to add as a character */ | ||||||
|     if (kbd->text_len < (sizeof(kbd->text)-1)) { |     if (kbd->text_len < (sizeof(kbd->text) - 1)) { | ||||||
|         kbd->text[kbd->text_len++] = (char)c; |         kbd->text[kbd->text_len++] = (char)c; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -639,7 +634,7 @@ static void k_deadunicode(SDL_EVDEV_keyboard_state *kbd, unsigned int value, cha | |||||||
|  |  | ||||||
| static void k_dead(SDL_EVDEV_keyboard_state *kbd, unsigned char value, char up_flag) | static void k_dead(SDL_EVDEV_keyboard_state *kbd, unsigned char value, char up_flag) | ||||||
| { | { | ||||||
|     const unsigned char ret_diacr[NR_DEAD] = {'`', '\'', '^', '~', '"', ',' }; |     const unsigned char ret_diacr[NR_DEAD] = { '`', '\'', '^', '~', '"', ',' }; | ||||||
|  |  | ||||||
|     k_deadunicode(kbd, ret_diacr[value], up_flag); |     k_deadunicode(kbd, ret_diacr[value], up_flag); | ||||||
| } | } | ||||||
| @@ -666,7 +661,7 @@ static void k_pad(SDL_EVDEV_keyboard_state *kbd, unsigned char value, char up_fl | |||||||
|     static const char pad_chars[] = "0123456789+-*/\015,.?()#"; |     static const char pad_chars[] = "0123456789+-*/\015,.?()#"; | ||||||
|  |  | ||||||
|     if (up_flag) |     if (up_flag) | ||||||
|         return;        /* no action, if this is a key release */ |         return; /* no action, if this is a key release */ | ||||||
|  |  | ||||||
|     if (!vc_kbd_led(kbd, K_NUMLOCK)) { |     if (!vc_kbd_led(kbd, K_NUMLOCK)) { | ||||||
|         /* unprintable action */ |         /* unprintable action */ | ||||||
| @@ -768,8 +763,7 @@ static void k_brl(SDL_EVDEV_keyboard_state *kbd, unsigned char value, char up_fl | |||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EVDEV_kbd_keycode(SDL_EVDEV_keyboard_state *kbd, unsigned int keycode, int down) | ||||||
| SDL_EVDEV_kbd_keycode(SDL_EVDEV_keyboard_state *kbd, unsigned int keycode, int down) |  | ||||||
| { | { | ||||||
|     unsigned char shift_final; |     unsigned char shift_final; | ||||||
|     unsigned char type; |     unsigned char type; | ||||||
| @@ -841,13 +835,11 @@ SDL_EVDEV_kbd_init(void) | |||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EVDEV_kbd_keycode(SDL_EVDEV_keyboard_state *state, unsigned int keycode, int down) | ||||||
| SDL_EVDEV_kbd_keycode(SDL_EVDEV_keyboard_state *state, unsigned int keycode, int down) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_EVDEV_kbd_quit(SDL_EVDEV_keyboard_state *state) | ||||||
| SDL_EVDEV_kbd_quit(SDL_EVDEV_keyboard_state *state) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,6 +19,8 @@ | |||||||
|   3. This notice may not be removed or altered from any source distribution. |   3. This notice may not be removed or altered from any source distribution. | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  | /* *INDENT-OFF* */ /* clang-format off */ | ||||||
|  |  | ||||||
| static unsigned short default_key_map_0[NR_KEYS] = { | static unsigned short default_key_map_0[NR_KEYS] = { | ||||||
|     0xf200, 0xf01b, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036,  |     0xf200, 0xf01b, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036,  | ||||||
|     0xf037, 0xf038, 0xf039, 0xf030, 0xf02d, 0xf03d, 0xf07f, 0xf009,  |     0xf037, 0xf038, 0xf039, 0xf030, 0xf02d, 0xf03d, 0xf07f, 0xf009,  | ||||||
| @@ -4374,6 +4376,8 @@ static unsigned short default_key_map_127[NR_KEYS] = { | |||||||
| }; | }; | ||||||
| #endif /* INCLUDE_EXTENDED_KEYMAP */ | #endif /* INCLUDE_EXTENDED_KEYMAP */ | ||||||
|  |  | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
| static unsigned short *default_key_maps[MAX_NR_KEYMAPS] = { | static unsigned short *default_key_maps[MAX_NR_KEYMAPS] = { | ||||||
|     default_key_map_0, |     default_key_map_0, | ||||||
|     default_key_map_1, |     default_key_map_1, | ||||||
| @@ -4504,7 +4508,7 @@ static unsigned short *default_key_maps[MAX_NR_KEYMAPS] = { | |||||||
|     default_key_map_125, |     default_key_map_125, | ||||||
|     default_key_map_126, |     default_key_map_126, | ||||||
|     default_key_map_127, |     default_key_map_127, | ||||||
| #else /* !INCLUDE_EXTENDED_KEYMAP */ | #else  /* !INCLUDE_EXTENDED_KEYMAP */ | ||||||
|     NULL, |     NULL, | ||||||
|     NULL, |     NULL, | ||||||
|     NULL, |     NULL, | ||||||
|   | |||||||
| @@ -55,8 +55,7 @@ typedef struct _FcitxClient | |||||||
|  |  | ||||||
| static FcitxClient fcitx_client; | static FcitxClient fcitx_client; | ||||||
|  |  | ||||||
| static char* | static char *GetAppName() | ||||||
| GetAppName() |  | ||||||
| { | { | ||||||
| #if defined(__LINUX__) || defined(__FREEBSD__) | #if defined(__LINUX__) || defined(__FREEBSD__) | ||||||
|     char *spot; |     char *spot; | ||||||
| @@ -86,10 +85,10 @@ GetAppName() | |||||||
|  |  | ||||||
| static size_t | static size_t | ||||||
| Fcitx_GetPreeditString(SDL_DBusContext *dbus, | Fcitx_GetPreeditString(SDL_DBusContext *dbus, | ||||||
|         DBusMessage *msg, |                        DBusMessage *msg, | ||||||
|         char **ret, |                        char **ret, | ||||||
|         Sint32 *start_pos, |                        Sint32 *start_pos, | ||||||
|         Sint32 *end_pos) |                        Sint32 *end_pos) | ||||||
| { | { | ||||||
|     char *text = NULL, *subtext; |     char *text = NULL, *subtext; | ||||||
|     size_t text_bytes = 0; |     size_t text_bytes = 0; | ||||||
| @@ -141,7 +140,7 @@ Fcitx_GetPreeditString(SDL_DBusContext *dbus, | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (text) { |         if (text) { | ||||||
|             char* pivot = text; |             char *pivot = text; | ||||||
|             /* Second pass: join all the sub string */ |             /* Second pass: join all the sub string */ | ||||||
|             dbus->message_iter_recurse(&iter, &array); |             dbus->message_iter_recurse(&iter, &array); | ||||||
|             while (dbus->message_iter_get_arg_type(&array) == DBUS_TYPE_STRUCT) { |             while (dbus->message_iter_get_arg_type(&array) == DBUS_TYPE_STRUCT) { | ||||||
| @@ -167,8 +166,7 @@ Fcitx_GetPreeditString(SDL_DBusContext *dbus, | |||||||
|     return text_bytes; |     return text_bytes; | ||||||
| } | } | ||||||
|  |  | ||||||
| static Sint32 | static Sint32 Fcitx_GetPreeditCursorByte(SDL_DBusContext *dbus, DBusMessage *msg) | ||||||
| Fcitx_GetPreeditCursorByte(SDL_DBusContext *dbus, DBusMessage *msg) |  | ||||||
| { | { | ||||||
|     Sint32 byte = -1; |     Sint32 byte = -1; | ||||||
|     DBusMessageIter iter; |     DBusMessageIter iter; | ||||||
| @@ -186,8 +184,7 @@ Fcitx_GetPreeditCursorByte(SDL_DBusContext *dbus, DBusMessage *msg) | |||||||
|     return byte; |     return byte; | ||||||
| } | } | ||||||
|  |  | ||||||
| static DBusHandlerResult | static DBusHandlerResult DBus_MessageFilter(DBusConnection *conn, DBusMessage *msg, void *data) | ||||||
| DBus_MessageFilter(DBusConnection *conn, DBusMessage *msg, void *data) |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus = (SDL_DBusContext *)data; |     SDL_DBusContext *dbus = (SDL_DBusContext *)data; | ||||||
|  |  | ||||||
| @@ -203,7 +200,7 @@ DBus_MessageFilter(DBusConnection *conn, DBusMessage *msg, void *data) | |||||||
|             size_t text_bytes = SDL_strlen(text), i = 0; |             size_t text_bytes = SDL_strlen(text), i = 0; | ||||||
|  |  | ||||||
|             while (i < text_bytes) { |             while (i < text_bytes) { | ||||||
|                 size_t sz = SDL_utf8strlcpy(buf, text+i, sizeof(buf)); |                 size_t sz = SDL_utf8strlcpy(buf, text + i, sizeof(buf)); | ||||||
|                 SDL_SendKeyboardText(buf); |                 SDL_SendKeyboardText(buf); | ||||||
|  |  | ||||||
|                 i += sz; |                 i += sz; | ||||||
| @@ -250,8 +247,7 @@ DBus_MessageFilter(DBusConnection *conn, DBusMessage *msg, void *data) | |||||||
|     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void FcitxClientICCallMethod(FcitxClient *client, const char *method) | ||||||
| FcitxClientICCallMethod(FcitxClient *client, const char *method) |  | ||||||
| { | { | ||||||
|     if (!client->ic_path) { |     if (!client->ic_path) { | ||||||
|         return; |         return; | ||||||
| @@ -259,11 +255,10 @@ FcitxClientICCallMethod(FcitxClient *client, const char *method) | |||||||
|     SDL_DBus_CallVoidMethod(FCITX_DBUS_SERVICE, client->ic_path, FCITX_IC_DBUS_INTERFACE, method, DBUS_TYPE_INVALID); |     SDL_DBus_CallVoidMethod(FCITX_DBUS_SERVICE, client->ic_path, FCITX_IC_DBUS_INTERFACE, method, DBUS_TYPE_INVALID); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void SDLCALL | static void SDLCALL Fcitx_SetCapabilities(void *data, | ||||||
| Fcitx_SetCapabilities(void *data, |                                           const char *name, | ||||||
|         const char *name, |                                           const char *old_val, | ||||||
|         const char *old_val, |                                           const char *internal_editing) | ||||||
|         const char *internal_editing) |  | ||||||
| { | { | ||||||
|     FcitxClient *client = (FcitxClient *)data; |     FcitxClient *client = (FcitxClient *)data; | ||||||
|     Uint64 caps = 0; |     Uint64 caps = 0; | ||||||
| @@ -279,8 +274,8 @@ Fcitx_SetCapabilities(void *data, | |||||||
|     SDL_DBus_CallVoidMethod(FCITX_DBUS_SERVICE, client->ic_path, FCITX_IC_DBUS_INTERFACE, "SetCapability", DBUS_TYPE_UINT64, &caps, DBUS_TYPE_INVALID); |     SDL_DBus_CallVoidMethod(FCITX_DBUS_SERVICE, client->ic_path, FCITX_IC_DBUS_INTERFACE, "SetCapability", DBUS_TYPE_UINT64, &caps, DBUS_TYPE_INVALID); | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool FcitxCreateInputContext(SDL_DBusContext *dbus, const char *appname, char **ic_path) | ||||||
| FcitxCreateInputContext(SDL_DBusContext* dbus, const char *appname, char **ic_path) { | { | ||||||
|     const char *program = "program"; |     const char *program = "program"; | ||||||
|     SDL_bool retval = SDL_FALSE; |     SDL_bool retval = SDL_FALSE; | ||||||
|     if (dbus->session_conn) { |     if (dbus->session_conn) { | ||||||
| @@ -308,8 +303,7 @@ FcitxCreateInputContext(SDL_DBusContext* dbus, const char *appname, char **ic_pa | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool FcitxClientCreateIC(FcitxClient *client) | ||||||
| FcitxClientCreateIC(FcitxClient *client) |  | ||||||
| { | { | ||||||
|     char *appname = GetAppName(); |     char *appname = GetAppName(); | ||||||
|     char *ic_path = NULL; |     char *ic_path = NULL; | ||||||
| @@ -317,7 +311,7 @@ FcitxClientCreateIC(FcitxClient *client) | |||||||
|  |  | ||||||
|     /* SDL_DBus_CallMethod cannot handle a(ss) type, call dbus function directly */ |     /* SDL_DBus_CallMethod cannot handle a(ss) type, call dbus function directly */ | ||||||
|     if (!FcitxCreateInputContext(dbus, appname, &ic_path)) { |     if (!FcitxCreateInputContext(dbus, appname, &ic_path)) { | ||||||
|         ic_path = NULL;  /* just in case. */ |         ic_path = NULL; /* just in case. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_free(appname); |     SDL_free(appname); | ||||||
| @@ -327,11 +321,11 @@ FcitxClientCreateIC(FcitxClient *client) | |||||||
|         client->ic_path = SDL_strdup(ic_path); |         client->ic_path = SDL_strdup(ic_path); | ||||||
|  |  | ||||||
|         dbus->bus_add_match(dbus->session_conn, |         dbus->bus_add_match(dbus->session_conn, | ||||||
|                 "type='signal', interface='org.fcitx.Fcitx.InputContext1'", |                             "type='signal', interface='org.fcitx.Fcitx.InputContext1'", | ||||||
|                 NULL); |                             NULL); | ||||||
|         dbus->connection_add_filter(dbus->session_conn, |         dbus->connection_add_filter(dbus->session_conn, | ||||||
|                 &DBus_MessageFilter, dbus, |                                     &DBus_MessageFilter, dbus, | ||||||
|                 NULL); |                                     NULL); | ||||||
|         dbus->connection_flush(dbus->session_conn); |         dbus->connection_flush(dbus->session_conn); | ||||||
|  |  | ||||||
|         SDL_AddHintCallback(SDL_HINT_IME_INTERNAL_EDITING, Fcitx_SetCapabilities, client); |         SDL_AddHintCallback(SDL_HINT_IME_INTERNAL_EDITING, Fcitx_SetCapabilities, client); | ||||||
| @@ -341,8 +335,7 @@ FcitxClientCreateIC(FcitxClient *client) | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static Uint32 | static Uint32 Fcitx_ModState(void) | ||||||
| Fcitx_ModState(void) |  | ||||||
| { | { | ||||||
|     Uint32 fcitx_mods = 0; |     Uint32 fcitx_mods = 0; | ||||||
|     SDL_Keymod sdl_mods = SDL_GetModState(); |     SDL_Keymod sdl_mods = SDL_GetModState(); | ||||||
| @@ -388,8 +381,7 @@ SDL_Fcitx_Init() | |||||||
|     return FcitxClientCreateIC(&fcitx_client); |     return FcitxClientCreateIC(&fcitx_client); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_Fcitx_Quit() | ||||||
| SDL_Fcitx_Quit() |  | ||||||
| { | { | ||||||
|     FcitxClientICCallMethod(&fcitx_client, "DestroyIC"); |     FcitxClientICCallMethod(&fcitx_client, "DestroyIC"); | ||||||
|     if (fcitx_client.ic_path) { |     if (fcitx_client.ic_path) { | ||||||
| @@ -398,8 +390,7 @@ SDL_Fcitx_Quit() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_Fcitx_SetFocus(SDL_bool focused) | ||||||
| SDL_Fcitx_SetFocus(SDL_bool focused) |  | ||||||
| { | { | ||||||
|     if (focused) { |     if (focused) { | ||||||
|         FcitxClientICCallMethod(&fcitx_client, "FocusIn"); |         FcitxClientICCallMethod(&fcitx_client, "FocusIn"); | ||||||
| @@ -408,8 +399,7 @@ SDL_Fcitx_SetFocus(SDL_bool focused) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_Fcitx_Reset(void) | ||||||
| SDL_Fcitx_Reset(void) |  | ||||||
| { | { | ||||||
|     FcitxClientICCallMethod(&fcitx_client, "Reset"); |     FcitxClientICCallMethod(&fcitx_client, "Reset"); | ||||||
|     FcitxClientICCallMethod(&fcitx_client, "CloseIC"); |     FcitxClientICCallMethod(&fcitx_client, "CloseIC"); | ||||||
| @@ -428,8 +418,8 @@ SDL_Fcitx_ProcessKeyEvent(Uint32 keysym, Uint32 keycode, Uint8 state) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (SDL_DBus_CallMethod(FCITX_DBUS_SERVICE, fcitx_client.ic_path, FCITX_IC_DBUS_INTERFACE, "ProcessKeyEvent", |     if (SDL_DBus_CallMethod(FCITX_DBUS_SERVICE, fcitx_client.ic_path, FCITX_IC_DBUS_INTERFACE, "ProcessKeyEvent", | ||||||
|             DBUS_TYPE_UINT32, &keysym, DBUS_TYPE_UINT32, &keycode, DBUS_TYPE_UINT32, &mod_state, DBUS_TYPE_BOOLEAN, &is_release, DBUS_TYPE_UINT32, &event_time, DBUS_TYPE_INVALID, |                             DBUS_TYPE_UINT32, &keysym, DBUS_TYPE_UINT32, &keycode, DBUS_TYPE_UINT32, &mod_state, DBUS_TYPE_BOOLEAN, &is_release, DBUS_TYPE_UINT32, &event_time, DBUS_TYPE_INVALID, | ||||||
|             DBUS_TYPE_BOOLEAN, &handled, DBUS_TYPE_INVALID)) { |                             DBUS_TYPE_BOOLEAN, &handled, DBUS_TYPE_INVALID)) { | ||||||
|         if (handled) { |         if (handled) { | ||||||
|             SDL_Fcitx_UpdateTextRect(NULL); |             SDL_Fcitx_UpdateTextRect(NULL); | ||||||
|             return SDL_TRUE; |             return SDL_TRUE; | ||||||
| @@ -439,8 +429,7 @@ SDL_Fcitx_ProcessKeyEvent(Uint32 keysym, Uint32 keycode, Uint8 state) | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_Fcitx_UpdateTextRect(const SDL_Rect *rect) | ||||||
| SDL_Fcitx_UpdateTextRect(const SDL_Rect *rect) |  | ||||||
| { | { | ||||||
|     SDL_Window *focused_win = NULL; |     SDL_Window *focused_win = NULL; | ||||||
|     SDL_SysWMinfo info; |     SDL_SysWMinfo info; | ||||||
| @@ -453,7 +442,7 @@ SDL_Fcitx_UpdateTextRect(const SDL_Rect *rect) | |||||||
|  |  | ||||||
|     focused_win = SDL_GetKeyboardFocus(); |     focused_win = SDL_GetKeyboardFocus(); | ||||||
|     if (focused_win == NULL) { |     if (focused_win == NULL) { | ||||||
|         return ; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_VERSION(&info.version); |     SDL_VERSION(&info.version); | ||||||
| @@ -487,11 +476,10 @@ SDL_Fcitx_UpdateTextRect(const SDL_Rect *rect) | |||||||
|     y += cursor->y; |     y += cursor->y; | ||||||
|  |  | ||||||
|     SDL_DBus_CallVoidMethod(FCITX_DBUS_SERVICE, fcitx_client.ic_path, FCITX_IC_DBUS_INTERFACE, "SetCursorRect", |     SDL_DBus_CallVoidMethod(FCITX_DBUS_SERVICE, fcitx_client.ic_path, FCITX_IC_DBUS_INTERFACE, "SetCursorRect", | ||||||
|         DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_INT32, &cursor->w, DBUS_TYPE_INT32, &cursor->h, DBUS_TYPE_INVALID); |                             DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_INT32, &cursor->w, DBUS_TYPE_INT32, &cursor->h, DBUS_TYPE_INVALID); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_Fcitx_PumpEvents(void) | ||||||
| SDL_Fcitx_PumpEvents(void) |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus = fcitx_client.dbus; |     SDL_DBusContext *dbus = fcitx_client.dbus; | ||||||
|     DBusConnection *conn = dbus->session_conn; |     DBusConnection *conn = dbus->session_conn; | ||||||
|   | |||||||
| @@ -37,14 +37,14 @@ | |||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
|  |  | ||||||
| static const char IBUS_PATH[]            = "/org/freedesktop/IBus"; | static const char IBUS_PATH[] = "/org/freedesktop/IBus"; | ||||||
|  |  | ||||||
| static const char IBUS_SERVICE[]         = "org.freedesktop.IBus"; | static const char IBUS_SERVICE[] = "org.freedesktop.IBus"; | ||||||
| static const char IBUS_INTERFACE[]       = "org.freedesktop.IBus"; | static const char IBUS_INTERFACE[] = "org.freedesktop.IBus"; | ||||||
| static const char IBUS_INPUT_INTERFACE[] = "org.freedesktop.IBus.InputContext"; | static const char IBUS_INPUT_INTERFACE[] = "org.freedesktop.IBus.InputContext"; | ||||||
|  |  | ||||||
| static const char IBUS_PORTAL_SERVICE[]         = "org.freedesktop.portal.IBus"; | static const char IBUS_PORTAL_SERVICE[] = "org.freedesktop.portal.IBus"; | ||||||
| static const char IBUS_PORTAL_INTERFACE[]       = "org.freedesktop.IBus.Portal"; | static const char IBUS_PORTAL_INTERFACE[] = "org.freedesktop.IBus.Portal"; | ||||||
| static const char IBUS_PORTAL_INPUT_INTERFACE[] = "org.freedesktop.IBus.InputContext"; | static const char IBUS_PORTAL_INPUT_INTERFACE[] = "org.freedesktop.IBus.InputContext"; | ||||||
|  |  | ||||||
| static const char *ibus_service = NULL; | static const char *ibus_service = NULL; | ||||||
| @@ -57,9 +57,7 @@ static SDL_bool ibus_is_portal_interface = SDL_FALSE; | |||||||
| static char *ibus_addr_file = NULL; | static char *ibus_addr_file = NULL; | ||||||
| static int inotify_fd = -1, inotify_wd = -1; | static int inotify_fd = -1, inotify_wd = -1; | ||||||
|  |  | ||||||
|  | static Uint32 IBus_ModState(void) | ||||||
| static Uint32 |  | ||||||
| IBus_ModState(void) |  | ||||||
| { | { | ||||||
|     Uint32 ibus_mods = 0; |     Uint32 ibus_mods = 0; | ||||||
|     SDL_Keymod sdl_mods = SDL_GetModState(); |     SDL_Keymod sdl_mods = SDL_GetModState(); | ||||||
| @@ -93,9 +91,8 @@ IBus_ModState(void) | |||||||
|     return ibus_mods; |     return ibus_mods; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool IBus_EnterVariant(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus, | ||||||
| IBus_EnterVariant(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus, |                                   DBusMessageIter *inside, const char *struct_id, size_t id_size) | ||||||
|                   DBusMessageIter *inside, const char * struct_id, size_t id_size) |  | ||||||
| { | { | ||||||
|     DBusMessageIter sub; |     DBusMessageIter sub; | ||||||
|     if (dbus->message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT) { |     if (dbus->message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT) { | ||||||
| @@ -121,9 +118,8 @@ IBus_EnterVariant(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext * | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool IBus_GetDecorationPosition(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus, | ||||||
| IBus_GetDecorationPosition(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus, |                                            Uint32 *start_pos, Uint32 *end_pos) | ||||||
|                            Uint32 *start_pos, Uint32 *end_pos) |  | ||||||
| { | { | ||||||
|     DBusMessageIter sub1, sub2, array; |     DBusMessageIter sub1, sub2, array; | ||||||
|  |  | ||||||
| @@ -186,8 +182,7 @@ IBus_GetDecorationPosition(DBusConnection *conn, DBusMessageIter *iter, SDL_DBus | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static const char * | static const char *IBus_GetVariantText(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus) | ||||||
| IBus_GetVariantText(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus) |  | ||||||
| { | { | ||||||
|     /* The text we need is nested weirdly, use dbus-monitor to see the structure better */ |     /* The text we need is nested weirdly, use dbus-monitor to see the structure better */ | ||||||
|     const char *text = NULL; |     const char *text = NULL; | ||||||
| @@ -208,9 +203,8 @@ IBus_GetVariantText(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext | |||||||
|     return text; |     return text; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool IBus_GetVariantCursorPos(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus, | ||||||
| IBus_GetVariantCursorPos(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus, |                                          Uint32 *pos) | ||||||
|                          Uint32 *pos) |  | ||||||
| { | { | ||||||
|     dbus->message_iter_next(iter); |     dbus->message_iter_next(iter); | ||||||
|  |  | ||||||
| @@ -223,8 +217,7 @@ IBus_GetVariantCursorPos(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusCo | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static DBusHandlerResult | static DBusHandlerResult IBus_MessageHandler(DBusConnection *conn, DBusMessage *msg, void *user_data) | ||||||
| IBus_MessageHandler(DBusConnection *conn, DBusMessage *msg, void *user_data) |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus = (SDL_DBusContext *)user_data; |     SDL_DBusContext *dbus = (SDL_DBusContext *)user_data; | ||||||
|  |  | ||||||
| @@ -240,7 +233,7 @@ IBus_MessageHandler(DBusConnection *conn, DBusMessage *msg, void *user_data) | |||||||
|             size_t text_bytes = SDL_strlen(text), i = 0; |             size_t text_bytes = SDL_strlen(text), i = 0; | ||||||
|  |  | ||||||
|             while (i < text_bytes) { |             while (i < text_bytes) { | ||||||
|                 size_t sz = SDL_utf8strlcpy(buf, text+i, sizeof(buf)); |                 size_t sz = SDL_utf8strlcpy(buf, text + i, sizeof(buf)); | ||||||
|                 SDL_SendKeyboardText(buf); |                 SDL_SendKeyboardText(buf); | ||||||
|  |  | ||||||
|                 i += sz; |                 i += sz; | ||||||
| @@ -283,7 +276,7 @@ IBus_MessageHandler(DBusConnection *conn, DBusMessage *msg, void *user_data) | |||||||
|                 size_t cursor = 0; |                 size_t cursor = 0; | ||||||
|  |  | ||||||
|                 do { |                 do { | ||||||
|                     const size_t sz = SDL_utf8strlcpy(buf, text+i, sizeof(buf)); |                     const size_t sz = SDL_utf8strlcpy(buf, text + i, sizeof(buf)); | ||||||
|                     const size_t chars = SDL_utf8strlen(buf); |                     const size_t chars = SDL_utf8strlen(buf); | ||||||
|  |  | ||||||
|                     SDL_SendEditingText(buf, cursor, chars); |                     SDL_SendEditingText(buf, cursor, chars); | ||||||
| @@ -306,8 +299,7 @@ IBus_MessageHandler(DBusConnection *conn, DBusMessage *msg, void *user_data) | |||||||
|     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | ||||||
| } | } | ||||||
|  |  | ||||||
| static char * | static char *IBus_ReadAddressFromFile(const char *file_path) | ||||||
| IBus_ReadAddressFromFile(const char *file_path) |  | ||||||
| { | { | ||||||
|     char addr_buf[1024]; |     char addr_buf[1024]; | ||||||
|     SDL_bool success = SDL_FALSE; |     SDL_bool success = SDL_FALSE; | ||||||
| @@ -319,7 +311,7 @@ IBus_ReadAddressFromFile(const char *file_path) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     while (fgets(addr_buf, sizeof(addr_buf), addr_file)) { |     while (fgets(addr_buf, sizeof(addr_buf), addr_file)) { | ||||||
|         if (SDL_strncmp(addr_buf, "IBUS_ADDRESS=", sizeof("IBUS_ADDRESS=")-1) == 0) { |         if (SDL_strncmp(addr_buf, "IBUS_ADDRESS=", sizeof("IBUS_ADDRESS=") - 1) == 0) { | ||||||
|             size_t sz = SDL_strlen(addr_buf); |             size_t sz = SDL_strlen(addr_buf); | ||||||
|             if (addr_buf[sz - 1] == '\n') { |             if (addr_buf[sz - 1] == '\n') { | ||||||
|                 addr_buf[sz - 1] = 0; |                 addr_buf[sz - 1] = 0; | ||||||
| @@ -341,8 +333,7 @@ IBus_ReadAddressFromFile(const char *file_path) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static char * | static char *IBus_GetDBusAddressFilename(void) | ||||||
| IBus_GetDBusAddressFilename(void) |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus; |     SDL_DBusContext *dbus; | ||||||
|     const char *disp_env; |     const char *disp_env; | ||||||
| @@ -381,7 +372,7 @@ IBus_GetDBusAddressFilename(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     host = display; |     host = display; | ||||||
|     disp_num   = SDL_strrchr(display, ':'); |     disp_num = SDL_strrchr(display, ':'); | ||||||
|     screen_num = SDL_strrchr(display, '.'); |     screen_num = SDL_strrchr(display, '.'); | ||||||
|  |  | ||||||
|     if (disp_num == NULL) { |     if (disp_num == NULL) { | ||||||
| @@ -423,7 +414,7 @@ IBus_GetDBusAddressFilename(void) | |||||||
|  |  | ||||||
|     SDL_memset(file_path, 0, sizeof(file_path)); |     SDL_memset(file_path, 0, sizeof(file_path)); | ||||||
|     SDL_snprintf(file_path, sizeof(file_path), "%s/ibus/bus/%s-%s-%s", |     SDL_snprintf(file_path, sizeof(file_path), "%s/ibus/bus/%s-%s-%s", | ||||||
|                                                config_dir, key, host, disp_num); |                  config_dir, key, host, disp_num); | ||||||
|     dbus->free(key); |     dbus->free(key); | ||||||
|     SDL_free(display); |     SDL_free(display); | ||||||
|  |  | ||||||
| @@ -432,9 +423,8 @@ IBus_GetDBusAddressFilename(void) | |||||||
|  |  | ||||||
| static SDL_bool IBus_CheckConnection(SDL_DBusContext *dbus); | static SDL_bool IBus_CheckConnection(SDL_DBusContext *dbus); | ||||||
|  |  | ||||||
| static void SDLCALL | static void SDLCALL IBus_SetCapabilities(void *data, const char *name, const char *old_val, | ||||||
| IBus_SetCapabilities(void *data, const char *name, const char *old_val, |                                          const char *internal_editing) | ||||||
|                                                    const char *internal_editing) |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus = SDL_DBus_GetContext(); |     SDL_DBusContext *dbus = SDL_DBus_GetContext(); | ||||||
|  |  | ||||||
| @@ -445,13 +435,11 @@ IBus_SetCapabilities(void *data, const char *name, const char *old_val, | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         SDL_DBus_CallVoidMethodOnConnection(ibus_conn, ibus_service, input_ctx_path, ibus_input_interface, "SetCapabilities", |         SDL_DBus_CallVoidMethodOnConnection(ibus_conn, ibus_service, input_ctx_path, ibus_input_interface, "SetCapabilities", | ||||||
|                                 DBUS_TYPE_UINT32, &caps, DBUS_TYPE_INVALID); |                                             DBUS_TYPE_UINT32, &caps, DBUS_TYPE_INVALID); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static SDL_bool IBus_SetupConnection(SDL_DBusContext *dbus, const char *addr) | ||||||
| static SDL_bool |  | ||||||
| IBus_SetupConnection(SDL_DBusContext *dbus, const char* addr) |  | ||||||
| { | { | ||||||
|     const char *client_name = "SDL2_Application"; |     const char *client_name = "SDL2_Application"; | ||||||
|     const char *path = NULL; |     const char *path = NULL; | ||||||
| @@ -481,7 +469,7 @@ IBus_SetupConnection(SDL_DBusContext *dbus, const char* addr) | |||||||
|         ibus_conn = dbus->connection_open_private(addr, NULL); |         ibus_conn = dbus->connection_open_private(addr, NULL); | ||||||
|  |  | ||||||
|         if (ibus_conn == NULL) { |         if (ibus_conn == NULL) { | ||||||
|             return SDL_FALSE;  /* oh well. */ |             return SDL_FALSE; /* oh well. */ | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         dbus->connection_flush(ibus_conn); |         dbus->connection_flush(ibus_conn); | ||||||
| @@ -500,7 +488,7 @@ IBus_SetupConnection(SDL_DBusContext *dbus, const char* addr) | |||||||
|  |  | ||||||
|     if (result) { |     if (result) { | ||||||
|         char matchstr[128]; |         char matchstr[128]; | ||||||
|         SDL_snprintf(matchstr, sizeof (matchstr), "type='signal',interface='%s'", ibus_input_interface); |         SDL_snprintf(matchstr, sizeof(matchstr), "type='signal',interface='%s'", ibus_input_interface); | ||||||
|         SDL_free(input_ctx_path); |         SDL_free(input_ctx_path); | ||||||
|         input_ctx_path = SDL_strdup(path); |         input_ctx_path = SDL_strdup(path); | ||||||
|         SDL_AddHintCallback(SDL_HINT_IME_INTERNAL_EDITING, IBus_SetCapabilities, NULL); |         SDL_AddHintCallback(SDL_HINT_IME_INTERNAL_EDITING, IBus_SetCapabilities, NULL); | ||||||
| @@ -515,8 +503,7 @@ IBus_SetupConnection(SDL_DBusContext *dbus, const char* addr) | |||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool IBus_CheckConnection(SDL_DBusContext *dbus) | ||||||
| IBus_CheckConnection(SDL_DBusContext *dbus) |  | ||||||
| { | { | ||||||
|     if (dbus == NULL) { |     if (dbus == NULL) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -535,7 +522,7 @@ IBus_CheckConnection(SDL_DBusContext *dbus) | |||||||
|             SDL_bool file_updated = SDL_FALSE; |             SDL_bool file_updated = SDL_FALSE; | ||||||
|  |  | ||||||
|             for (p = buf; p < buf + readsize; /**/) { |             for (p = buf; p < buf + readsize; /**/) { | ||||||
|                 struct inotify_event *event = (struct inotify_event*) p; |                 struct inotify_event *event = (struct inotify_event *)p; | ||||||
|                 if (event->len > 0) { |                 if (event->len > 0) { | ||||||
|                     char *addr_file_no_path = SDL_strrchr(ibus_addr_file, '/'); |                     char *addr_file_no_path = SDL_strrchr(ibus_addr_file, '/'); | ||||||
|                     if (addr_file_no_path == NULL) { |                     if (addr_file_no_path == NULL) { | ||||||
| @@ -621,8 +608,7 @@ SDL_IBus_Init(void) | |||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IBus_Quit(void) | ||||||
| SDL_IBus_Quit(void) |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus; |     SDL_DBusContext *dbus; | ||||||
|  |  | ||||||
| @@ -662,8 +648,7 @@ SDL_IBus_Quit(void) | |||||||
|     SDL_memset(&ibus_cursor_rect, 0, sizeof(ibus_cursor_rect)); |     SDL_memset(&ibus_cursor_rect, 0, sizeof(ibus_cursor_rect)); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void IBus_SimpleMessage(const char *method) | ||||||
| IBus_SimpleMessage(const char *method) |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus = SDL_DBus_GetContext(); |     SDL_DBusContext *dbus = SDL_DBus_GetContext(); | ||||||
|  |  | ||||||
| @@ -672,15 +657,13 @@ IBus_SimpleMessage(const char *method) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IBus_SetFocus(SDL_bool focused) | ||||||
| SDL_IBus_SetFocus(SDL_bool focused) |  | ||||||
| { | { | ||||||
|     const char *method = focused ? "FocusIn" : "FocusOut"; |     const char *method = focused ? "FocusIn" : "FocusOut"; | ||||||
|     IBus_SimpleMessage(method); |     IBus_SimpleMessage(method); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IBus_Reset(void) | ||||||
| SDL_IBus_Reset(void) |  | ||||||
| { | { | ||||||
|     IBus_SimpleMessage("Reset"); |     IBus_SimpleMessage("Reset"); | ||||||
| } | } | ||||||
| @@ -691,7 +674,6 @@ SDL_IBus_ProcessKeyEvent(Uint32 keysym, Uint32 keycode, Uint8 state) | |||||||
|     Uint32 result = 0; |     Uint32 result = 0; | ||||||
|     SDL_DBusContext *dbus = SDL_DBus_GetContext(); |     SDL_DBusContext *dbus = SDL_DBus_GetContext(); | ||||||
|  |  | ||||||
|  |  | ||||||
|     if (IBus_CheckConnection(dbus)) { |     if (IBus_CheckConnection(dbus)) { | ||||||
|         Uint32 mods = IBus_ModState(); |         Uint32 mods = IBus_ModState(); | ||||||
|         Uint32 ibus_keycode = keycode - 8; |         Uint32 ibus_keycode = keycode - 8; | ||||||
| @@ -699,8 +681,8 @@ SDL_IBus_ProcessKeyEvent(Uint32 keysym, Uint32 keycode, Uint8 state) | |||||||
|             mods |= (1 << 30); // IBUS_RELEASE_MASK |             mods |= (1 << 30); // IBUS_RELEASE_MASK | ||||||
|         } |         } | ||||||
|         if (!SDL_DBus_CallMethodOnConnection(ibus_conn, ibus_service, input_ctx_path, ibus_input_interface, "ProcessKeyEvent", |         if (!SDL_DBus_CallMethodOnConnection(ibus_conn, ibus_service, input_ctx_path, ibus_input_interface, "ProcessKeyEvent", | ||||||
|                 DBUS_TYPE_UINT32, &keysym, DBUS_TYPE_UINT32, &ibus_keycode, DBUS_TYPE_UINT32, &mods, DBUS_TYPE_INVALID, |                                              DBUS_TYPE_UINT32, &keysym, DBUS_TYPE_UINT32, &ibus_keycode, DBUS_TYPE_UINT32, &mods, DBUS_TYPE_INVALID, | ||||||
|                 DBUS_TYPE_BOOLEAN, &result, DBUS_TYPE_INVALID)) { |                                              DBUS_TYPE_BOOLEAN, &result, DBUS_TYPE_INVALID)) { | ||||||
|             result = 0; |             result = 0; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -710,8 +692,7 @@ SDL_IBus_ProcessKeyEvent(Uint32 keysym, Uint32 keycode, Uint8 state) | |||||||
|     return result ? SDL_TRUE : SDL_FALSE; |     return result ? SDL_TRUE : SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IBus_UpdateTextRect(const SDL_Rect *rect) | ||||||
| SDL_IBus_UpdateTextRect(const SDL_Rect *rect) |  | ||||||
| { | { | ||||||
|     SDL_Window *focused_win; |     SDL_Window *focused_win; | ||||||
|     SDL_SysWMinfo info; |     SDL_SysWMinfo info; | ||||||
| @@ -754,12 +735,11 @@ SDL_IBus_UpdateTextRect(const SDL_Rect *rect) | |||||||
|  |  | ||||||
|     if (IBus_CheckConnection(dbus)) { |     if (IBus_CheckConnection(dbus)) { | ||||||
|         SDL_DBus_CallVoidMethodOnConnection(ibus_conn, ibus_service, input_ctx_path, ibus_input_interface, "SetCursorLocation", |         SDL_DBus_CallVoidMethodOnConnection(ibus_conn, ibus_service, input_ctx_path, ibus_input_interface, "SetCursorLocation", | ||||||
|                 DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_INT32, &ibus_cursor_rect.w, DBUS_TYPE_INT32, &ibus_cursor_rect.h, DBUS_TYPE_INVALID); |                                             DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_INT32, &ibus_cursor_rect.w, DBUS_TYPE_INT32, &ibus_cursor_rect.h, DBUS_TYPE_INVALID); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IBus_PumpEvents(void) | ||||||
| SDL_IBus_PumpEvents(void) |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus = SDL_DBus_GetContext(); |     SDL_DBusContext *dbus = SDL_DBus_GetContext(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -40,8 +40,7 @@ static _SDL_IME_ProcessKeyEvent SDL_IME_ProcessKeyEvent_Real = NULL; | |||||||
| static _SDL_IME_UpdateTextRect SDL_IME_UpdateTextRect_Real = NULL; | static _SDL_IME_UpdateTextRect SDL_IME_UpdateTextRect_Real = NULL; | ||||||
| static _SDL_IME_PumpEvents SDL_IME_PumpEvents_Real = NULL; | static _SDL_IME_PumpEvents SDL_IME_PumpEvents_Real = NULL; | ||||||
|  |  | ||||||
| static void | static void InitIME() | ||||||
| InitIME() |  | ||||||
| { | { | ||||||
|     static SDL_bool inited = SDL_FALSE; |     static SDL_bool inited = SDL_FALSE; | ||||||
| #ifdef HAVE_FCITX | #ifdef HAVE_FCITX | ||||||
| @@ -107,24 +106,21 @@ SDL_IME_Init(void) | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IME_Quit(void) | ||||||
| SDL_IME_Quit(void) |  | ||||||
| { | { | ||||||
|     if (SDL_IME_Quit_Real) { |     if (SDL_IME_Quit_Real) { | ||||||
|         SDL_IME_Quit_Real(); |         SDL_IME_Quit_Real(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IME_SetFocus(SDL_bool focused) | ||||||
| SDL_IME_SetFocus(SDL_bool focused) |  | ||||||
| { | { | ||||||
|     if (SDL_IME_SetFocus_Real) { |     if (SDL_IME_SetFocus_Real) { | ||||||
|         SDL_IME_SetFocus_Real(focused); |         SDL_IME_SetFocus_Real(focused); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IME_Reset(void) | ||||||
| SDL_IME_Reset(void) |  | ||||||
| { | { | ||||||
|     if (SDL_IME_Reset_Real) { |     if (SDL_IME_Reset_Real) { | ||||||
|         SDL_IME_Reset_Real(); |         SDL_IME_Reset_Real(); | ||||||
| @@ -141,16 +137,14 @@ SDL_IME_ProcessKeyEvent(Uint32 keysym, Uint32 keycode, Uint8 state) | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IME_UpdateTextRect(const SDL_Rect *rect) | ||||||
| SDL_IME_UpdateTextRect(const SDL_Rect *rect) |  | ||||||
| { | { | ||||||
|     if (SDL_IME_UpdateTextRect_Real) { |     if (SDL_IME_UpdateTextRect_Real) { | ||||||
|         SDL_IME_UpdateTextRect_Real(rect); |         SDL_IME_UpdateTextRect_Real(rect); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IME_PumpEvents() | ||||||
| SDL_IME_PumpEvents() |  | ||||||
| { | { | ||||||
|     if (SDL_IME_PumpEvents_Real) { |     if (SDL_IME_PumpEvents_Real) { | ||||||
|         SDL_IME_PumpEvents_Real(); |         SDL_IME_PumpEvents_Real(); | ||||||
|   | |||||||
| @@ -33,9 +33,7 @@ SDL_Sandbox SDL_DetectSandbox(void) | |||||||
|  |  | ||||||
|     /* For Snap, we check multiple variables because they might be set for |     /* For Snap, we check multiple variables because they might be set for | ||||||
|      * unrelated reasons. This is the same thing WebKitGTK does. */ |      * unrelated reasons. This is the same thing WebKitGTK does. */ | ||||||
|     if (SDL_getenv("SNAP") != NULL |     if (SDL_getenv("SNAP") != NULL && SDL_getenv("SNAP_NAME") != NULL && SDL_getenv("SNAP_REVISION") != NULL) { | ||||||
|         && SDL_getenv("SNAP_NAME") != NULL |  | ||||||
|         && SDL_getenv("SNAP_REVISION") != NULL) { |  | ||||||
|         return SDL_SANDBOX_SNAP; |         return SDL_SANDBOX_SNAP; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,16 +48,16 @@ | |||||||
| #include <sched.h> | #include <sched.h> | ||||||
|  |  | ||||||
| /* d-bus queries to org.freedesktop.RealtimeKit1. */ | /* d-bus queries to org.freedesktop.RealtimeKit1. */ | ||||||
| #define RTKIT_DBUS_NODE "org.freedesktop.RealtimeKit1" | #define RTKIT_DBUS_NODE      "org.freedesktop.RealtimeKit1" | ||||||
| #define RTKIT_DBUS_PATH "/org/freedesktop/RealtimeKit1" | #define RTKIT_DBUS_PATH      "/org/freedesktop/RealtimeKit1" | ||||||
| #define RTKIT_DBUS_INTERFACE "org.freedesktop.RealtimeKit1" | #define RTKIT_DBUS_INTERFACE "org.freedesktop.RealtimeKit1" | ||||||
|  |  | ||||||
| /* d-bus queries to the XDG portal interface to RealtimeKit1 */ | /* d-bus queries to the XDG portal interface to RealtimeKit1 */ | ||||||
| #define XDG_PORTAL_DBUS_NODE "org.freedesktop.portal.Desktop" | #define XDG_PORTAL_DBUS_NODE      "org.freedesktop.portal.Desktop" | ||||||
| #define XDG_PORTAL_DBUS_PATH "/org/freedesktop/portal/desktop" | #define XDG_PORTAL_DBUS_PATH      "/org/freedesktop/portal/desktop" | ||||||
| #define XDG_PORTAL_DBUS_INTERFACE "org.freedesktop.portal.Realtime" | #define XDG_PORTAL_DBUS_INTERFACE "org.freedesktop.portal.Realtime" | ||||||
|  |  | ||||||
| static SDL_bool    rtkit_use_session_conn; | static SDL_bool rtkit_use_session_conn; | ||||||
| static const char *rtkit_dbus_node; | static const char *rtkit_dbus_node; | ||||||
| static const char *rtkit_dbus_path; | static const char *rtkit_dbus_path; | ||||||
| static const char *rtkit_dbus_interface; | static const char *rtkit_dbus_interface; | ||||||
| @@ -72,16 +72,14 @@ static Sint64 rtkit_max_rttime_usec = 200000; | |||||||
|  *  - The desktop portal exists and supports the realtime interface. |  *  - The desktop portal exists and supports the realtime interface. | ||||||
|  *  - The realtime interface is new enough to have the required bug fixes applied. |  *  - The realtime interface is new enough to have the required bug fixes applied. | ||||||
|  */ |  */ | ||||||
| static SDL_bool | static SDL_bool realtime_portal_supported(DBusConnection *conn) | ||||||
| realtime_portal_supported(DBusConnection *conn) |  | ||||||
| { | { | ||||||
|     Sint64 res; |     Sint64 res; | ||||||
|     return SDL_DBus_QueryPropertyOnConnection(conn, XDG_PORTAL_DBUS_NODE, XDG_PORTAL_DBUS_PATH, XDG_PORTAL_DBUS_INTERFACE, |     return SDL_DBus_QueryPropertyOnConnection(conn, XDG_PORTAL_DBUS_NODE, XDG_PORTAL_DBUS_PATH, XDG_PORTAL_DBUS_INTERFACE, | ||||||
|                                               "RTTimeUSecMax", DBUS_TYPE_INT64, &res); |                                               "RTTimeUSecMax", DBUS_TYPE_INT64, &res); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void set_rtkit_interface() | ||||||
| set_rtkit_interface() |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus = SDL_DBus_GetContext(); |     SDL_DBusContext *dbus = SDL_DBus_GetContext(); | ||||||
|  |  | ||||||
| @@ -99,8 +97,7 @@ set_rtkit_interface() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static DBusConnection* | static DBusConnection *get_rtkit_dbus_connection() | ||||||
| get_rtkit_dbus_connection() |  | ||||||
| { | { | ||||||
|     SDL_DBusContext *dbus = SDL_DBus_GetContext(); |     SDL_DBusContext *dbus = SDL_DBus_GetContext(); | ||||||
|  |  | ||||||
| @@ -111,8 +108,7 @@ get_rtkit_dbus_connection() | |||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void rtkit_initialize() | ||||||
| rtkit_initialize() |  | ||||||
| { | { | ||||||
|     DBusConnection *dbus_conn; |     DBusConnection *dbus_conn; | ||||||
|  |  | ||||||
| @@ -138,8 +134,7 @@ rtkit_initialize() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool rtkit_initialize_realtime_thread() | ||||||
| rtkit_initialize_realtime_thread() |  | ||||||
| { | { | ||||||
|     // Following is an excerpt from rtkit README that outlines the requirements |     // Following is an excerpt from rtkit README that outlines the requirements | ||||||
|     // a thread must meet before making rtkit requests: |     // a thread must meet before making rtkit requests: | ||||||
| @@ -164,7 +159,7 @@ rtkit_initialize_realtime_thread() | |||||||
|     int err; |     int err; | ||||||
|     struct rlimit rlimit; |     struct rlimit rlimit; | ||||||
|     int nLimit = RLIMIT_RTTIME; |     int nLimit = RLIMIT_RTTIME; | ||||||
|     pid_t nPid = 0; //self |     pid_t nPid = 0; // self | ||||||
|     int nSchedPolicy = sched_getscheduler(nPid) | SCHED_RESET_ON_FORK; |     int nSchedPolicy = sched_getscheduler(nPid) | SCHED_RESET_ON_FORK; | ||||||
|     struct sched_param schedParam; |     struct sched_param schedParam; | ||||||
|  |  | ||||||
| @@ -198,8 +193,7 @@ rtkit_initialize_realtime_thread() | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool rtkit_setpriority_nice(pid_t thread, int nice_level) | ||||||
| rtkit_setpriority_nice(pid_t thread, int nice_level) |  | ||||||
| { | { | ||||||
|     DBusConnection *dbus_conn; |     DBusConnection *dbus_conn; | ||||||
|     Uint64 pid = (Uint64)getpid(); |     Uint64 pid = (Uint64)getpid(); | ||||||
| @@ -222,8 +216,7 @@ rtkit_setpriority_nice(pid_t thread, int nice_level) | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool rtkit_setpriority_realtime(pid_t thread, int rt_priority) | ||||||
| rtkit_setpriority_realtime(pid_t thread, int rt_priority) |  | ||||||
| { | { | ||||||
|     DBusConnection *dbus_conn; |     DBusConnection *dbus_conn; | ||||||
|     Uint64 pid = (Uint64)getpid(); |     Uint64 pid = (Uint64)getpid(); | ||||||
| @@ -261,8 +254,7 @@ rtkit_setpriority_realtime(pid_t thread, int rt_priority) | |||||||
| #endif /* threads */ | #endif /* threads */ | ||||||
|  |  | ||||||
| /* this is a public symbol, so it has to exist even if threads are disabled. */ | /* this is a public symbol, so it has to exist even if threads are disabled. */ | ||||||
| int | int SDL_LinuxSetThreadPriority(Sint64 threadID, int priority) | ||||||
| SDL_LinuxSetThreadPriority(Sint64 threadID, int priority) |  | ||||||
| { | { | ||||||
| #if SDL_THREADS_DISABLED | #if SDL_THREADS_DISABLED | ||||||
|     return SDL_Unsupported(); |     return SDL_Unsupported(); | ||||||
| @@ -294,8 +286,7 @@ SDL_LinuxSetThreadPriority(Sint64 threadID, int priority) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* this is a public symbol, so it has to exist even if threads are disabled. */ | /* this is a public symbol, so it has to exist even if threads are disabled. */ | ||||||
| int | int SDL_LinuxSetThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy) | ||||||
| SDL_LinuxSetThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy) |  | ||||||
| { | { | ||||||
| #if SDL_THREADS_DISABLED | #if SDL_THREADS_DISABLED | ||||||
|     return SDL_Unsupported(); |     return SDL_Unsupported(); | ||||||
| @@ -356,6 +347,6 @@ SDL_LinuxSetThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedP | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif  /* __LINUX__ */ | #endif /* __LINUX__ */ | ||||||
|  |  | ||||||
| /* vi: set ts=4 sw=4 expandtab: */ | /* vi: set ts=4 sw=4 expandtab: */ | ||||||
|   | |||||||
| @@ -49,8 +49,7 @@ static int SDL_UDEV_load_syms(void); | |||||||
| static SDL_bool SDL_UDEV_hotplug_update_available(void); | static SDL_bool SDL_UDEV_hotplug_update_available(void); | ||||||
| static void device_event(SDL_UDEV_deviceevent type, struct udev_device *dev); | static void device_event(SDL_UDEV_deviceevent type, struct udev_device *dev); | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool SDL_UDEV_load_sym(const char *fn, void **addr) | ||||||
| SDL_UDEV_load_sym(const char *fn, void **addr) |  | ||||||
| { | { | ||||||
|     *addr = SDL_LoadFunction(_this->udev_handle, fn); |     *addr = SDL_LoadFunction(_this->udev_handle, fn); | ||||||
|     if (*addr == NULL) { |     if (*addr == NULL) { | ||||||
| @@ -61,12 +60,12 @@ SDL_UDEV_load_sym(const char *fn, void **addr) | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int SDL_UDEV_load_syms(void) | ||||||
| SDL_UDEV_load_syms(void) |  | ||||||
| { | { | ||||||
|     /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | /* cast funcs to char* first, to please GCC's strict aliasing rules. */ | ||||||
|     #define SDL_UDEV_SYM(x) \ | #define SDL_UDEV_SYM(x)                                          \ | ||||||
|         if (!SDL_UDEV_load_sym(#x, (void **) (char *) & _this->syms.x)) return -1 |     if (!SDL_UDEV_load_sym(#x, (void **)(char *)&_this->syms.x)) \ | ||||||
|  |     return -1 | ||||||
|  |  | ||||||
|     SDL_UDEV_SYM(udev_device_get_action); |     SDL_UDEV_SYM(udev_device_get_action); | ||||||
|     SDL_UDEV_SYM(udev_device_get_devnode); |     SDL_UDEV_SYM(udev_device_get_devnode); | ||||||
| @@ -94,13 +93,12 @@ SDL_UDEV_load_syms(void) | |||||||
|     SDL_UDEV_SYM(udev_unref); |     SDL_UDEV_SYM(udev_unref); | ||||||
|     SDL_UDEV_SYM(udev_device_new_from_devnum); |     SDL_UDEV_SYM(udev_device_new_from_devnum); | ||||||
|     SDL_UDEV_SYM(udev_device_get_devnum); |     SDL_UDEV_SYM(udev_device_get_devnum); | ||||||
|     #undef SDL_UDEV_SYM | #undef SDL_UDEV_SYM | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static SDL_bool | static SDL_bool SDL_UDEV_hotplug_update_available(void) | ||||||
| SDL_UDEV_hotplug_update_available(void) |  | ||||||
| { | { | ||||||
|     if (_this->udev_mon != NULL) { |     if (_this->udev_mon != NULL) { | ||||||
|         const int fd = _this->syms.udev_monitor_get_fd(_this->udev_mon); |         const int fd = _this->syms.udev_monitor_get_fd(_this->udev_mon); | ||||||
| @@ -111,14 +109,12 @@ SDL_UDEV_hotplug_update_available(void) | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int SDL_UDEV_Init(void) | ||||||
| int |  | ||||||
| SDL_UDEV_Init(void) |  | ||||||
| { | { | ||||||
|     int retval = 0; |     int retval = 0; | ||||||
|  |  | ||||||
|     if (_this == NULL) { |     if (_this == NULL) { | ||||||
|         _this = (SDL_UDEV_PrivateData *) SDL_calloc(1, sizeof(*_this)); |         _this = (SDL_UDEV_PrivateData *)SDL_calloc(1, sizeof(*_this)); | ||||||
|         if (_this == NULL) { |         if (_this == NULL) { | ||||||
|             return SDL_OutOfMemory(); |             return SDL_OutOfMemory(); | ||||||
|         } |         } | ||||||
| @@ -151,7 +147,6 @@ SDL_UDEV_Init(void) | |||||||
|  |  | ||||||
|         /* Do an initial scan of existing devices */ |         /* Do an initial scan of existing devices */ | ||||||
|         SDL_UDEV_Scan(); |         SDL_UDEV_Scan(); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _this->ref_count += 1; |     _this->ref_count += 1; | ||||||
| @@ -159,8 +154,7 @@ SDL_UDEV_Init(void) | |||||||
|     return retval; |     return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_UDEV_Quit(void) | ||||||
| SDL_UDEV_Quit(void) |  | ||||||
| { | { | ||||||
|     SDL_UDEV_CallbackList *item; |     SDL_UDEV_CallbackList *item; | ||||||
|  |  | ||||||
| @@ -194,8 +188,7 @@ SDL_UDEV_Quit(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_UDEV_Scan(void) | ||||||
| SDL_UDEV_Scan(void) |  | ||||||
| { | { | ||||||
|     struct udev_enumerate *enumerate = NULL; |     struct udev_enumerate *enumerate = NULL; | ||||||
|     struct udev_list_entry *devs = NULL; |     struct udev_list_entry *devs = NULL; | ||||||
| @@ -283,11 +276,7 @@ SDL_UDEV_GetProductInfo(const char *device_path, Uint16 *vendor, Uint16 *product | |||||||
|     return found; |     return found; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void SDL_UDEV_UnloadLibrary(void) | ||||||
|  |  | ||||||
|  |  | ||||||
| void |  | ||||||
| SDL_UDEV_UnloadLibrary(void) |  | ||||||
| { | { | ||||||
|     if (_this == NULL) { |     if (_this == NULL) { | ||||||
|         return; |         return; | ||||||
| @@ -299,8 +288,7 @@ SDL_UDEV_UnloadLibrary(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_UDEV_LoadLibrary(void) | ||||||
| SDL_UDEV_LoadLibrary(void) |  | ||||||
| { | { | ||||||
|     int retval = 0, i; |     int retval = 0, i; | ||||||
|  |  | ||||||
| @@ -327,7 +315,7 @@ SDL_UDEV_LoadLibrary(void) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     if (_this->udev_handle == NULL) { |     if (_this->udev_handle == NULL) { | ||||||
|         for ( i = 0 ; i < SDL_arraysize(SDL_UDEV_LIBS); i++) { |         for (i = 0; i < SDL_arraysize(SDL_UDEV_LIBS); i++) { | ||||||
|             _this->udev_handle = SDL_LoadObject(SDL_UDEV_LIBS[i]); |             _this->udev_handle = SDL_LoadObject(SDL_UDEV_LIBS[i]); | ||||||
|             if (_this->udev_handle != NULL) { |             if (_this->udev_handle != NULL) { | ||||||
|                 retval = SDL_UDEV_load_syms(); |                 retval = SDL_UDEV_load_syms(); | ||||||
| @@ -356,7 +344,7 @@ static void get_caps(struct udev_device *dev, struct udev_device *pdev, const ch | |||||||
|     int i; |     int i; | ||||||
|     unsigned long v; |     unsigned long v; | ||||||
|  |  | ||||||
|     SDL_memset(bitmask, 0, bitmask_len*sizeof(*bitmask)); |     SDL_memset(bitmask, 0, bitmask_len * sizeof(*bitmask)); | ||||||
|     value = _this->syms.udev_device_get_sysattr_value(pdev, attr); |     value = _this->syms.udev_device_get_sysattr_value(pdev, attr); | ||||||
|     if (value == NULL) { |     if (value == NULL) { | ||||||
|         return; |         return; | ||||||
| @@ -365,7 +353,7 @@ static void get_caps(struct udev_device *dev, struct udev_device *pdev, const ch | |||||||
|     SDL_strlcpy(text, value, sizeof(text)); |     SDL_strlcpy(text, value, sizeof(text)); | ||||||
|     i = 0; |     i = 0; | ||||||
|     while ((word = SDL_strrchr(text, ' ')) != NULL) { |     while ((word = SDL_strrchr(text, ' ')) != NULL) { | ||||||
|         v = SDL_strtoul(word+1, NULL, 16); |         v = SDL_strtoul(word + 1, NULL, 16); | ||||||
|         if (i < bitmask_len) { |         if (i < bitmask_len) { | ||||||
|             bitmask[i] = v; |             bitmask[i] = v; | ||||||
|         } |         } | ||||||
| @@ -378,8 +366,7 @@ static void get_caps(struct udev_device *dev, struct udev_device *pdev, const ch | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int guess_device_class(struct udev_device *dev) | ||||||
| guess_device_class(struct udev_device *dev) |  | ||||||
| { | { | ||||||
|     struct udev_device *pdev; |     struct udev_device *pdev; | ||||||
|     unsigned long bitmask_ev[NBITS(EV_MAX)]; |     unsigned long bitmask_ev[NBITS(EV_MAX)]; | ||||||
| @@ -408,8 +395,7 @@ guess_device_class(struct udev_device *dev) | |||||||
|                                       &bitmask_rel[0]); |                                       &bitmask_rel[0]); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void device_event(SDL_UDEV_deviceevent type, struct udev_device *dev) | ||||||
| device_event(SDL_UDEV_deviceevent type, struct udev_device *dev) |  | ||||||
| { | { | ||||||
|     const char *subsystem; |     const char *subsystem; | ||||||
|     const char *val = NULL; |     const char *val = NULL; | ||||||
| @@ -429,23 +415,23 @@ device_event(SDL_UDEV_deviceevent type, struct udev_device *dev) | |||||||
|         /* udev rules reference: http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-input_id.c */ |         /* udev rules reference: http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-input_id.c */ | ||||||
|  |  | ||||||
|         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_JOYSTICK"); |         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_JOYSTICK"); | ||||||
|         if (val != NULL && SDL_strcmp(val, "1") == 0 ) { |         if (val != NULL && SDL_strcmp(val, "1") == 0) { | ||||||
|             devclass |= SDL_UDEV_DEVICE_JOYSTICK; |             devclass |= SDL_UDEV_DEVICE_JOYSTICK; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_ACCELEROMETER"); |         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_ACCELEROMETER"); | ||||||
|         if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE) && |         if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE) && | ||||||
|             val != NULL && SDL_strcmp(val, "1") == 0 ) { |             val != NULL && SDL_strcmp(val, "1") == 0) { | ||||||
|             devclass |= SDL_UDEV_DEVICE_JOYSTICK; |             devclass |= SDL_UDEV_DEVICE_JOYSTICK; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_MOUSE"); |         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_MOUSE"); | ||||||
|         if (val != NULL && SDL_strcmp(val, "1") == 0 ) { |         if (val != NULL && SDL_strcmp(val, "1") == 0) { | ||||||
|             devclass |= SDL_UDEV_DEVICE_MOUSE; |             devclass |= SDL_UDEV_DEVICE_MOUSE; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_TOUCHSCREEN"); |         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_TOUCHSCREEN"); | ||||||
|         if (val != NULL && SDL_strcmp(val, "1") == 0 ) { |         if (val != NULL && SDL_strcmp(val, "1") == 0) { | ||||||
|             devclass |= SDL_UDEV_DEVICE_TOUCHSCREEN; |             devclass |= SDL_UDEV_DEVICE_TOUCHSCREEN; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -456,7 +442,7 @@ device_event(SDL_UDEV_deviceevent type, struct udev_device *dev) | |||||||
|            Ref: http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-input_id.c#n183 |            Ref: http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-input_id.c#n183 | ||||||
|         */ |         */ | ||||||
|         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_KEY"); |         val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_KEY"); | ||||||
|         if (val != NULL && SDL_strcmp(val, "1") == 0 ) { |         if (val != NULL && SDL_strcmp(val, "1") == 0) { | ||||||
|             devclass |= SDL_UDEV_DEVICE_KEYBOARD; |             devclass |= SDL_UDEV_DEVICE_KEYBOARD; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -488,8 +474,7 @@ device_event(SDL_UDEV_deviceevent type, struct udev_device *dev) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_UDEV_Poll(void) | ||||||
| SDL_UDEV_Poll(void) |  | ||||||
| { | { | ||||||
|     struct udev_device *dev = NULL; |     struct udev_device *dev = NULL; | ||||||
|     const char *action = NULL; |     const char *action = NULL; | ||||||
| @@ -517,11 +502,10 @@ SDL_UDEV_Poll(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_UDEV_AddCallback(SDL_UDEV_Callback cb) | ||||||
| SDL_UDEV_AddCallback(SDL_UDEV_Callback cb) |  | ||||||
| { | { | ||||||
|     SDL_UDEV_CallbackList *item; |     SDL_UDEV_CallbackList *item; | ||||||
|     item = (SDL_UDEV_CallbackList *) SDL_calloc(1, sizeof (SDL_UDEV_CallbackList)); |     item = (SDL_UDEV_CallbackList *)SDL_calloc(1, sizeof(SDL_UDEV_CallbackList)); | ||||||
|     if (item == NULL) { |     if (item == NULL) { | ||||||
|         return SDL_OutOfMemory(); |         return SDL_OutOfMemory(); | ||||||
|     } |     } | ||||||
| @@ -538,8 +522,7 @@ SDL_UDEV_AddCallback(SDL_UDEV_Callback cb) | |||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_UDEV_DelCallback(SDL_UDEV_Callback cb) | ||||||
| SDL_UDEV_DelCallback(SDL_UDEV_Callback cb) |  | ||||||
| { | { | ||||||
|     SDL_UDEV_CallbackList *item; |     SDL_UDEV_CallbackList *item; | ||||||
|     SDL_UDEV_CallbackList *prev = NULL; |     SDL_UDEV_CallbackList *prev = NULL; | ||||||
| @@ -578,8 +561,7 @@ SDL_UDEV_GetUdevSyms(void) | |||||||
|     return &_this->syms; |     return &_this->syms; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_UDEV_ReleaseUdevSyms(void) | ||||||
| SDL_UDEV_ReleaseUdevSyms(void) |  | ||||||
| { | { | ||||||
|     SDL_UDEV_Quit(); |     SDL_UDEV_Quit(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -48,12 +48,14 @@ typedef enum | |||||||
|  |  | ||||||
| typedef void (*SDL_UDEV_Callback)(SDL_UDEV_deviceevent udev_type, int udev_class, const char *devpath); | typedef void (*SDL_UDEV_Callback)(SDL_UDEV_deviceevent udev_type, int udev_class, const char *devpath); | ||||||
|  |  | ||||||
| typedef struct SDL_UDEV_CallbackList { | typedef struct SDL_UDEV_CallbackList | ||||||
|  | { | ||||||
|     SDL_UDEV_Callback callback; |     SDL_UDEV_Callback callback; | ||||||
|     struct SDL_UDEV_CallbackList *next; |     struct SDL_UDEV_CallbackList *next; | ||||||
| } SDL_UDEV_CallbackList; | } SDL_UDEV_CallbackList; | ||||||
|  |  | ||||||
| typedef struct SDL_UDEV_Symbols { | typedef struct SDL_UDEV_Symbols | ||||||
|  | { | ||||||
|     const char *(*udev_device_get_action)(struct udev_device *); |     const char *(*udev_device_get_action)(struct udev_device *); | ||||||
|     const char *(*udev_device_get_devnode)(struct udev_device *); |     const char *(*udev_device_get_devnode)(struct udev_device *); | ||||||
|     const char *(*udev_device_get_subsystem)(struct udev_device *); |     const char *(*udev_device_get_subsystem)(struct udev_device *); | ||||||
| @@ -78,8 +80,8 @@ typedef struct SDL_UDEV_Symbols { | |||||||
|     void (*udev_monitor_unref)(struct udev_monitor *); |     void (*udev_monitor_unref)(struct udev_monitor *); | ||||||
|     struct udev *(*udev_new)(void); |     struct udev *(*udev_new)(void); | ||||||
|     void (*udev_unref)(struct udev *); |     void (*udev_unref)(struct udev *); | ||||||
|     struct udev_device * (*udev_device_new_from_devnum)(struct udev *udev, char type, dev_t devnum); |     struct udev_device *(*udev_device_new_from_devnum)(struct udev *udev, char type, dev_t devnum); | ||||||
|     dev_t (*udev_device_get_devnum) (struct udev_device *udev_device); |     dev_t (*udev_device_get_devnum)(struct udev_device *udev_device); | ||||||
| } SDL_UDEV_Symbols; | } SDL_UDEV_Symbols; | ||||||
|  |  | ||||||
| typedef struct SDL_UDEV_PrivateData | typedef struct SDL_UDEV_PrivateData | ||||||
| @@ -107,7 +109,6 @@ extern void SDL_UDEV_DelCallback(SDL_UDEV_Callback cb); | |||||||
| extern const SDL_UDEV_Symbols *SDL_UDEV_GetUdevSyms(void); | extern const SDL_UDEV_Symbols *SDL_UDEV_GetUdevSyms(void); | ||||||
| extern void SDL_UDEV_ReleaseUdevSyms(void); | extern void SDL_UDEV_ReleaseUdevSyms(void); | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* HAVE_LIBUDEV_H && HAVE_LINUX_INPUT_H */ | #endif /* HAVE_LIBUDEV_H && HAVE_LINUX_INPUT_H */ | ||||||
|  |  | ||||||
| #endif /* SDL_udev_h_ */ | #endif /* SDL_udev_h_ */ | ||||||
|   | |||||||
| @@ -19,9 +19,7 @@ | |||||||
|   3. This notice may not be removed or altered from any source distribution. |   3. This notice may not be removed or altered from any source distribution. | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  |  | ||||||
| void SDL_WSCONS_Init(); | void SDL_WSCONS_Init(); | ||||||
| void SDL_WSCONS_Quit(); | void SDL_WSCONS_Quit(); | ||||||
|  |  | ||||||
| void SDL_WSCONS_PumpEvents(); | void SDL_WSCONS_PumpEvents(); | ||||||
|  |  | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -35,18 +35,21 @@ typedef struct SDL_WSCONS_mouse_input_data | |||||||
|     int fd; |     int fd; | ||||||
| } SDL_WSCONS_mouse_input_data; | } SDL_WSCONS_mouse_input_data; | ||||||
|  |  | ||||||
| SDL_WSCONS_mouse_input_data* SDL_WSCONS_Init_Mouse() | SDL_WSCONS_mouse_input_data *SDL_WSCONS_Init_Mouse() | ||||||
| { | { | ||||||
| #ifdef WSMOUSEIO_SETVERSION | #ifdef WSMOUSEIO_SETVERSION | ||||||
|     int version = WSMOUSE_EVENT_VERSION; |     int version = WSMOUSE_EVENT_VERSION; | ||||||
| #endif | #endif | ||||||
|     SDL_WSCONS_mouse_input_data* mouseInputData = SDL_calloc(1, sizeof(SDL_WSCONS_mouse_input_data)); |     SDL_WSCONS_mouse_input_data *mouseInputData = SDL_calloc(1, sizeof(SDL_WSCONS_mouse_input_data)); | ||||||
|  |  | ||||||
|     if (mouseInputData == NULL) { |     if (mouseInputData == NULL) { | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|     mouseInputData->fd = open("/dev/wsmouse",O_RDWR | O_NONBLOCK | O_CLOEXEC); |     mouseInputData->fd = open("/dev/wsmouse", O_RDWR | O_NONBLOCK | O_CLOEXEC); | ||||||
|     if (mouseInputData->fd == -1) {free(mouseInputData); return NULL; } |     if (mouseInputData->fd == -1) { | ||||||
|  |         free(mouseInputData); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
| #ifdef WSMOUSEIO_SETMODE | #ifdef WSMOUSEIO_SETMODE | ||||||
|     ioctl(mouseInputData->fd, WSMOUSEIO_SETMODE, WSMOUSE_COMPAT); |     ioctl(mouseInputData->fd, WSMOUSEIO_SETMODE, WSMOUSE_COMPAT); | ||||||
| #endif | #endif | ||||||
| @@ -56,77 +59,72 @@ SDL_WSCONS_mouse_input_data* SDL_WSCONS_Init_Mouse() | |||||||
|     return mouseInputData; |     return mouseInputData; | ||||||
| } | } | ||||||
|  |  | ||||||
| void updateMouse(SDL_WSCONS_mouse_input_data* inputData) | void updateMouse(SDL_WSCONS_mouse_input_data *inputData) | ||||||
| { | { | ||||||
|     struct wscons_event events[64]; |     struct wscons_event events[64]; | ||||||
|     int type; |     int type; | ||||||
|     int n,i; |     int n, i; | ||||||
|     SDL_Mouse* mouse = SDL_GetMouse(); |     SDL_Mouse *mouse = SDL_GetMouse(); | ||||||
|  |  | ||||||
|     if ((n = read(inputData->fd, events, sizeof(events))) > 0) { |     if ((n = read(inputData->fd, events, sizeof(events))) > 0) { | ||||||
|         n /= sizeof(struct wscons_event); |         n /= sizeof(struct wscons_event); | ||||||
|         for (i = 0; i < n; i++) { |         for (i = 0; i < n; i++) { | ||||||
|             type = events[i].type; |             type = events[i].type; | ||||||
|             switch(type) |             switch (type) { | ||||||
|             { |  | ||||||
|             case WSCONS_EVENT_MOUSE_DOWN: |             case WSCONS_EVENT_MOUSE_DOWN: | ||||||
|                 { |             { | ||||||
|                     switch (events[i].value) |                 switch (events[i].value) { | ||||||
|                     { |                 case 0: /* Left Mouse Button. */ | ||||||
|                     case 0: /* Left Mouse Button. */ |                     SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_LEFT); | ||||||
|                         SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_LEFT); |                     break; | ||||||
|                         break; |                 case 1: /* Middle Mouse Button. */ | ||||||
|                     case 1: /* Middle Mouse Button. */ |                     SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_MIDDLE); | ||||||
|                         SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_MIDDLE); |                     break; | ||||||
|                         break; |                 case 2: /* Right Mouse Button. */ | ||||||
|                     case 2: /* Right Mouse Button. */ |                     SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_RIGHT); | ||||||
|                         SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_RIGHT); |                     break; | ||||||
|                         break; |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|                 break; |             } break; | ||||||
|             case WSCONS_EVENT_MOUSE_UP: |             case WSCONS_EVENT_MOUSE_UP: | ||||||
|                 { |             { | ||||||
|                     switch (events[i].value) |                 switch (events[i].value) { | ||||||
|                     { |                 case 0: /* Left Mouse Button. */ | ||||||
|                     case 0: /* Left Mouse Button. */ |                     SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_LEFT); | ||||||
|                         SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_LEFT); |                     break; | ||||||
|                         break; |                 case 1: /* Middle Mouse Button. */ | ||||||
|                     case 1: /* Middle Mouse Button. */ |                     SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_MIDDLE); | ||||||
|                         SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_MIDDLE); |                     break; | ||||||
|                         break; |                 case 2: /* Right Mouse Button. */ | ||||||
|                     case 2: /* Right Mouse Button. */ |                     SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_RIGHT); | ||||||
|                         SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_RIGHT); |                     break; | ||||||
|                         break; |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|                 break; |             } break; | ||||||
|             case WSCONS_EVENT_MOUSE_DELTA_X: |             case WSCONS_EVENT_MOUSE_DELTA_X: | ||||||
|                 { |             { | ||||||
|                     SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, events[i].value, 0); |                 SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, events[i].value, 0); | ||||||
|                     break; |                 break; | ||||||
|                 } |             } | ||||||
|             case WSCONS_EVENT_MOUSE_DELTA_Y: |             case WSCONS_EVENT_MOUSE_DELTA_Y: | ||||||
|                 { |             { | ||||||
|                     SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, 0, -events[i].value); |                 SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, 0, -events[i].value); | ||||||
|                     break; |                 break; | ||||||
|                 } |             } | ||||||
|             case WSCONS_EVENT_MOUSE_DELTA_W: |             case WSCONS_EVENT_MOUSE_DELTA_W: | ||||||
|                 { |             { | ||||||
|                     SDL_SendMouseWheel(mouse->focus, mouse->mouseID, events[i].value, 0, SDL_MOUSEWHEEL_NORMAL); |                 SDL_SendMouseWheel(mouse->focus, mouse->mouseID, events[i].value, 0, SDL_MOUSEWHEEL_NORMAL); | ||||||
|                     break; |                 break; | ||||||
|                 } |             } | ||||||
|             case WSCONS_EVENT_MOUSE_DELTA_Z: |             case WSCONS_EVENT_MOUSE_DELTA_Z: | ||||||
|                 { |             { | ||||||
|                     SDL_SendMouseWheel(mouse->focus, mouse->mouseID, 0, -events[i].value, SDL_MOUSEWHEEL_NORMAL); |                 SDL_SendMouseWheel(mouse->focus, mouse->mouseID, 0, -events[i].value, SDL_MOUSEWHEEL_NORMAL); | ||||||
|                     break; |                 break; | ||||||
|                 } |             } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_WSCONS_Quit_Mouse(SDL_WSCONS_mouse_input_data* inputData) | void SDL_WSCONS_Quit_Mouse(SDL_WSCONS_mouse_input_data *inputData) | ||||||
| { | { | ||||||
|     if (inputData == NULL) { |     if (inputData == NULL) { | ||||||
|         return; |         return; | ||||||
|   | |||||||
| @@ -32,17 +32,14 @@ | |||||||
| #endif | #endif | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
|  |  | ||||||
|  | int SDL_IOReady(int fd, int flags, int timeoutMS) | ||||||
| int |  | ||||||
| SDL_IOReady(int fd, int flags, int timeoutMS) |  | ||||||
| { | { | ||||||
|     int result; |     int result; | ||||||
|  |  | ||||||
|     SDL_assert(flags & (SDL_IOR_READ | SDL_IOR_WRITE)); |     SDL_assert(flags & (SDL_IOR_READ | SDL_IOR_WRITE)); | ||||||
|  |  | ||||||
|     /* Note: We don't bother to account for elapsed time if we get EINTR */ |     /* Note: We don't bother to account for elapsed time if we get EINTR */ | ||||||
|     do |     do { | ||||||
|     { |  | ||||||
| #ifdef HAVE_POLL | #ifdef HAVE_POLL | ||||||
|         struct pollfd info; |         struct pollfd info; | ||||||
|  |  | ||||||
| @@ -83,7 +80,7 @@ SDL_IOReady(int fd, int flags, int timeoutMS) | |||||||
|         result = select(fd + 1, rfdp, wfdp, NULL, tvp); |         result = select(fd + 1, rfdp, wfdp, NULL, tvp); | ||||||
| #endif /* HAVE_POLL */ | #endif /* HAVE_POLL */ | ||||||
|  |  | ||||||
|     } while ( result < 0 && errno == EINTR && !(flags & SDL_IOR_NO_RETRY)); |     } while (result < 0 && errno == EINTR && !(flags & SDL_IOR_NO_RETRY)); | ||||||
|  |  | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -30,7 +30,7 @@ | |||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
| #define WIN32 | #define WIN32 | ||||||
| #endif | #endif | ||||||
| #undef  WINNT | #undef WINNT | ||||||
|  |  | ||||||
| /* Far pointers don't exist in 32-bit code */ | /* Far pointers don't exist in 32-bit code */ | ||||||
| #ifndef FAR | #ifndef FAR | ||||||
| @@ -39,35 +39,35 @@ | |||||||
|  |  | ||||||
| /* Error codes not yet included in Win32 API header files */ | /* Error codes not yet included in Win32 API header files */ | ||||||
| #ifndef MAKE_HRESULT | #ifndef MAKE_HRESULT | ||||||
| #define MAKE_HRESULT(sev,fac,code) \ | #define MAKE_HRESULT(sev, fac, code) \ | ||||||
|     ((HRESULT)(((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code)))) |     ((HRESULT)(((unsigned long)(sev) << 31) | ((unsigned long)(fac) << 16) | ((unsigned long)(code)))) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef S_OK | #ifndef S_OK | ||||||
| #define S_OK        (HRESULT)0x00000000L | #define S_OK (HRESULT)0x00000000L | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef SUCCEEDED | #ifndef SUCCEEDED | ||||||
| #define SUCCEEDED(x)    ((HRESULT)(x) >= 0) | #define SUCCEEDED(x) ((HRESULT)(x) >= 0) | ||||||
| #endif | #endif | ||||||
| #ifndef FAILED | #ifndef FAILED | ||||||
| #define FAILED(x)   ((HRESULT)(x)<0) | #define FAILED(x) ((HRESULT)(x) < 0) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef E_FAIL | #ifndef E_FAIL | ||||||
| #define E_FAIL      (HRESULT)0x80000008L | #define E_FAIL (HRESULT)0x80000008L | ||||||
| #endif | #endif | ||||||
| #ifndef E_NOINTERFACE | #ifndef E_NOINTERFACE | ||||||
| #define E_NOINTERFACE   (HRESULT)0x80004002L | #define E_NOINTERFACE (HRESULT)0x80004002L | ||||||
| #endif | #endif | ||||||
| #ifndef E_OUTOFMEMORY | #ifndef E_OUTOFMEMORY | ||||||
| #define E_OUTOFMEMORY   (HRESULT)0x8007000EL | #define E_OUTOFMEMORY (HRESULT)0x8007000EL | ||||||
| #endif | #endif | ||||||
| #ifndef E_INVALIDARG | #ifndef E_INVALIDARG | ||||||
| #define E_INVALIDARG    (HRESULT)0x80070057L | #define E_INVALIDARG (HRESULT)0x80070057L | ||||||
| #endif | #endif | ||||||
| #ifndef E_NOTIMPL | #ifndef E_NOTIMPL | ||||||
| #define E_NOTIMPL   (HRESULT)0x80004001L | #define E_NOTIMPL (HRESULT)0x80004001L | ||||||
| #endif | #endif | ||||||
| #ifndef REGDB_E_CLASSNOTREG | #ifndef REGDB_E_CLASSNOTREG | ||||||
| #define REGDB_E_CLASSNOTREG (HRESULT)0x80040154L | #define REGDB_E_CLASSNOTREG (HRESULT)0x80040154L | ||||||
| @@ -75,16 +75,16 @@ | |||||||
|  |  | ||||||
| /* Severity codes */ | /* Severity codes */ | ||||||
| #ifndef SEVERITY_ERROR | #ifndef SEVERITY_ERROR | ||||||
| #define SEVERITY_ERROR  1 | #define SEVERITY_ERROR 1 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Error facility codes */ | /* Error facility codes */ | ||||||
| #ifndef FACILITY_WIN32 | #ifndef FACILITY_WIN32 | ||||||
| #define FACILITY_WIN32  7 | #define FACILITY_WIN32 7 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef FIELD_OFFSET | #ifndef FIELD_OFFSET | ||||||
| #define FIELD_OFFSET(type, field)    ((LONG)&(((type *)0)->field)) | #define FIELD_OFFSET(type, field) ((LONG) & (((type *)0)->field)) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* DirectX headers (if it isn't included, I haven't tested it yet) | /* DirectX headers (if it isn't included, I haven't tested it yet) | ||||||
| @@ -103,7 +103,10 @@ | |||||||
| #ifdef HAVE_DINPUT_H | #ifdef HAVE_DINPUT_H | ||||||
| #include <dinput.h> | #include <dinput.h> | ||||||
| #else | #else | ||||||
| typedef struct { int unused; } DIDEVICEINSTANCE; | typedef struct | ||||||
|  | { | ||||||
|  |     int unused; | ||||||
|  | } DIDEVICEINSTANCE; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* SDL_directx_h_ */ | #endif /* SDL_directx_h_ */ | ||||||
|   | |||||||
| @@ -24,7 +24,6 @@ | |||||||
|  |  | ||||||
| #include "SDL_hid.h" | #include "SDL_hid.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| HidD_GetString_t SDL_HidD_GetManufacturerString; | HidD_GetString_t SDL_HidD_GetManufacturerString; | ||||||
| HidD_GetString_t SDL_HidD_GetProductString; | HidD_GetString_t SDL_HidD_GetProductString; | ||||||
| HidP_GetCaps_t SDL_HidP_GetCaps; | HidP_GetCaps_t SDL_HidP_GetCaps; | ||||||
| @@ -36,14 +35,12 @@ HidP_GetData_t SDL_HidP_GetData; | |||||||
| static HMODULE s_pHIDDLL = 0; | static HMODULE s_pHIDDLL = 0; | ||||||
| static int s_HIDDLLRefCount = 0; | static int s_HIDDLLRefCount = 0; | ||||||
|  |  | ||||||
|  | int WIN_LoadHIDDLL(void) | ||||||
| int |  | ||||||
| WIN_LoadHIDDLL(void) |  | ||||||
| { | { | ||||||
|     if (s_pHIDDLL) { |     if (s_pHIDDLL) { | ||||||
|         SDL_assert(s_HIDDLLRefCount > 0); |         SDL_assert(s_HIDDLLRefCount > 0); | ||||||
|         s_HIDDLLRefCount++; |         s_HIDDLLRefCount++; | ||||||
|         return 0;  /* already loaded */ |         return 0; /* already loaded */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     s_pHIDDLL = LoadLibrary(TEXT("hid.dll")); |     s_pHIDDLL = LoadLibrary(TEXT("hid.dll")); | ||||||
| @@ -71,8 +68,7 @@ WIN_LoadHIDDLL(void) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WIN_UnloadHIDDLL(void) | ||||||
| WIN_UnloadHIDDLL(void) |  | ||||||
| { | { | ||||||
|     if (s_pHIDDLL) { |     if (s_pHIDDLL) { | ||||||
|         SDL_assert(s_HIDDLLRefCount > 0); |         SDL_assert(s_HIDDLLRefCount > 0); | ||||||
|   | |||||||
| @@ -39,155 +39,166 @@ typedef struct _HIDD_ATTRIBUTES | |||||||
|     USHORT VersionNumber; |     USHORT VersionNumber; | ||||||
| } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; | } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; | ||||||
|  |  | ||||||
| typedef enum { | typedef enum | ||||||
|  | { | ||||||
|     HidP_Input = 0, |     HidP_Input = 0, | ||||||
|     HidP_Output = 1, |     HidP_Output = 1, | ||||||
|     HidP_Feature = 2 |     HidP_Feature = 2 | ||||||
| } HIDP_REPORT_TYPE; | } HIDP_REPORT_TYPE; | ||||||
|  |  | ||||||
| typedef struct { | typedef struct | ||||||
|     USAGE   UsagePage; | { | ||||||
|     UCHAR   ReportID; |     USAGE UsagePage; | ||||||
|  |     UCHAR ReportID; | ||||||
|     BOOLEAN IsAlias; |     BOOLEAN IsAlias; | ||||||
|     USHORT  BitField; |     USHORT BitField; | ||||||
|     USHORT  LinkCollection; |     USHORT LinkCollection; | ||||||
|     USAGE   LinkUsage; |     USAGE LinkUsage; | ||||||
|     USAGE   LinkUsagePage; |     USAGE LinkUsagePage; | ||||||
|     BOOLEAN IsRange; |     BOOLEAN IsRange; | ||||||
|     BOOLEAN IsStringRange; |     BOOLEAN IsStringRange; | ||||||
|     BOOLEAN IsDesignatorRange; |     BOOLEAN IsDesignatorRange; | ||||||
|     BOOLEAN IsAbsolute; |     BOOLEAN IsAbsolute; | ||||||
|     ULONG   Reserved[ 10 ]; |     ULONG Reserved[10]; | ||||||
|     union { |     union | ||||||
|         struct { |     { | ||||||
|             USAGE   UsageMin; |         struct | ||||||
|             USAGE   UsageMax; |         { | ||||||
|             USHORT  StringMin; |             USAGE UsageMin; | ||||||
|             USHORT  StringMax; |             USAGE UsageMax; | ||||||
|             USHORT  DesignatorMin; |             USHORT StringMin; | ||||||
|             USHORT  DesignatorMax; |             USHORT StringMax; | ||||||
|             USHORT  DataIndexMin; |             USHORT DesignatorMin; | ||||||
|             USHORT  DataIndexMax; |             USHORT DesignatorMax; | ||||||
|  |             USHORT DataIndexMin; | ||||||
|  |             USHORT DataIndexMax; | ||||||
|         } Range; |         } Range; | ||||||
|         struct { |         struct | ||||||
|             USAGE   Usage; |         { | ||||||
|             USAGE   Reserved1; |             USAGE Usage; | ||||||
|             USHORT  StringIndex; |             USAGE Reserved1; | ||||||
|             USHORT  Reserved2; |             USHORT StringIndex; | ||||||
|             USHORT  DesignatorIndex; |             USHORT Reserved2; | ||||||
|             USHORT  Reserved3; |             USHORT DesignatorIndex; | ||||||
|             USHORT  DataIndex; |             USHORT Reserved3; | ||||||
|             USHORT  Reserved4; |             USHORT DataIndex; | ||||||
|  |             USHORT Reserved4; | ||||||
|         } NotRange; |         } NotRange; | ||||||
|     }; |     }; | ||||||
| } HIDP_BUTTON_CAPS, *PHIDP_BUTTON_CAPS; | } HIDP_BUTTON_CAPS, *PHIDP_BUTTON_CAPS; | ||||||
|  |  | ||||||
| typedef struct { | typedef struct | ||||||
|     USAGE   UsagePage; | { | ||||||
|     UCHAR   ReportID; |     USAGE UsagePage; | ||||||
|  |     UCHAR ReportID; | ||||||
|     BOOLEAN IsAlias; |     BOOLEAN IsAlias; | ||||||
|     USHORT  BitField; |     USHORT BitField; | ||||||
|     USHORT  LinkCollection; |     USHORT LinkCollection; | ||||||
|     USAGE   LinkUsage; |     USAGE LinkUsage; | ||||||
|     USAGE   LinkUsagePage; |     USAGE LinkUsagePage; | ||||||
|     BOOLEAN IsRange; |     BOOLEAN IsRange; | ||||||
|     BOOLEAN IsStringRange; |     BOOLEAN IsStringRange; | ||||||
|     BOOLEAN IsDesignatorRange; |     BOOLEAN IsDesignatorRange; | ||||||
|     BOOLEAN IsAbsolute; |     BOOLEAN IsAbsolute; | ||||||
|     BOOLEAN HasNull; |     BOOLEAN HasNull; | ||||||
|     UCHAR   Reserved; |     UCHAR Reserved; | ||||||
|     USHORT  BitSize; |     USHORT BitSize; | ||||||
|     USHORT  ReportCount; |     USHORT ReportCount; | ||||||
|     USHORT  Reserved2[ 5 ]; |     USHORT Reserved2[5]; | ||||||
|     ULONG   UnitsExp; |     ULONG UnitsExp; | ||||||
|     ULONG   Units; |     ULONG Units; | ||||||
|     LONG    LogicalMin; |     LONG LogicalMin; | ||||||
|     LONG    LogicalMax; |     LONG LogicalMax; | ||||||
|     LONG    PhysicalMin; |     LONG PhysicalMin; | ||||||
|     LONG    PhysicalMax; |     LONG PhysicalMax; | ||||||
|     union { |     union | ||||||
|         struct { |     { | ||||||
|             USAGE   UsageMin; |         struct | ||||||
|             USAGE   UsageMax; |         { | ||||||
|             USHORT  StringMin; |             USAGE UsageMin; | ||||||
|             USHORT  StringMax; |             USAGE UsageMax; | ||||||
|             USHORT  DesignatorMin; |             USHORT StringMin; | ||||||
|             USHORT  DesignatorMax; |             USHORT StringMax; | ||||||
|             USHORT  DataIndexMin; |             USHORT DesignatorMin; | ||||||
|             USHORT  DataIndexMax; |             USHORT DesignatorMax; | ||||||
|  |             USHORT DataIndexMin; | ||||||
|  |             USHORT DataIndexMax; | ||||||
|         } Range; |         } Range; | ||||||
|         struct { |         struct | ||||||
|             USAGE   Usage; |         { | ||||||
|             USAGE   Reserved1; |             USAGE Usage; | ||||||
|             USHORT  StringIndex; |             USAGE Reserved1; | ||||||
|             USHORT  Reserved2; |             USHORT StringIndex; | ||||||
|             USHORT  DesignatorIndex; |             USHORT Reserved2; | ||||||
|             USHORT  Reserved3; |             USHORT DesignatorIndex; | ||||||
|             USHORT  DataIndex; |             USHORT Reserved3; | ||||||
|             USHORT  Reserved4; |             USHORT DataIndex; | ||||||
|  |             USHORT Reserved4; | ||||||
|         } NotRange; |         } NotRange; | ||||||
|     }; |     }; | ||||||
| } HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; | } HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; | ||||||
|  |  | ||||||
| typedef struct { | typedef struct | ||||||
|     USAGE   Usage; | { | ||||||
|     USAGE   UsagePage; |     USAGE Usage; | ||||||
|     USHORT  InputReportByteLength; |     USAGE UsagePage; | ||||||
|     USHORT  OutputReportByteLength; |     USHORT InputReportByteLength; | ||||||
|     USHORT  FeatureReportByteLength; |     USHORT OutputReportByteLength; | ||||||
|     USHORT  Reserved[ 17 ]; |     USHORT FeatureReportByteLength; | ||||||
|     USHORT  NumberLinkCollectionNodes; |     USHORT Reserved[17]; | ||||||
|     USHORT  NumberInputButtonCaps; |     USHORT NumberLinkCollectionNodes; | ||||||
|     USHORT  NumberInputValueCaps; |     USHORT NumberInputButtonCaps; | ||||||
|     USHORT  NumberInputDataIndices; |     USHORT NumberInputValueCaps; | ||||||
|     USHORT  NumberOutputButtonCaps; |     USHORT NumberInputDataIndices; | ||||||
|     USHORT  NumberOutputValueCaps; |     USHORT NumberOutputButtonCaps; | ||||||
|     USHORT  NumberOutputDataIndices; |     USHORT NumberOutputValueCaps; | ||||||
|     USHORT  NumberFeatureButtonCaps; |     USHORT NumberOutputDataIndices; | ||||||
|     USHORT  NumberFeatureValueCaps; |     USHORT NumberFeatureButtonCaps; | ||||||
|     USHORT  NumberFeatureDataIndices; |     USHORT NumberFeatureValueCaps; | ||||||
|  |     USHORT NumberFeatureDataIndices; | ||||||
| } HIDP_CAPS, *PHIDP_CAPS; | } HIDP_CAPS, *PHIDP_CAPS; | ||||||
|  |  | ||||||
| typedef struct { | typedef struct | ||||||
|     USHORT  DataIndex; | { | ||||||
|     USHORT  Reserved; |     USHORT DataIndex; | ||||||
|     union { |     USHORT Reserved; | ||||||
|         ULONG   RawValue; |     union | ||||||
|  |     { | ||||||
|  |         ULONG RawValue; | ||||||
|         BOOLEAN On; |         BOOLEAN On; | ||||||
|     }; |     }; | ||||||
| } HIDP_DATA, *PHIDP_DATA; | } HIDP_DATA, *PHIDP_DATA; | ||||||
|  |  | ||||||
| #define HIDP_ERROR_CODES( p1, p2 ) ((NTSTATUS)(((p1) << 28) | (0x11 << 16) | (p2))) | #define HIDP_ERROR_CODES(p1, p2)            ((NTSTATUS)(((p1) << 28) | (0x11 << 16) | (p2))) | ||||||
| #define HIDP_STATUS_SUCCESS                 HIDP_ERROR_CODES( 0x0, 0x0000 ) | #define HIDP_STATUS_SUCCESS                 HIDP_ERROR_CODES(0x0, 0x0000) | ||||||
| #define HIDP_STATUS_NULL                    HIDP_ERROR_CODES( 0x8, 0x0001 ) | #define HIDP_STATUS_NULL                    HIDP_ERROR_CODES(0x8, 0x0001) | ||||||
| #define HIDP_STATUS_INVALID_PREPARSED_DATA  HIDP_ERROR_CODES( 0xC, 0x0001 ) | #define HIDP_STATUS_INVALID_PREPARSED_DATA  HIDP_ERROR_CODES(0xC, 0x0001) | ||||||
| #define HIDP_STATUS_INVALID_REPORT_TYPE     HIDP_ERROR_CODES( 0xC, 0x0002 ) | #define HIDP_STATUS_INVALID_REPORT_TYPE     HIDP_ERROR_CODES(0xC, 0x0002) | ||||||
| #define HIDP_STATUS_INVALID_REPORT_LENGTH   HIDP_ERROR_CODES( 0xC, 0x0003 ) | #define HIDP_STATUS_INVALID_REPORT_LENGTH   HIDP_ERROR_CODES(0xC, 0x0003) | ||||||
| #define HIDP_STATUS_USAGE_NOT_FOUND         HIDP_ERROR_CODES( 0xC, 0x0004 ) | #define HIDP_STATUS_USAGE_NOT_FOUND         HIDP_ERROR_CODES(0xC, 0x0004) | ||||||
| #define HIDP_STATUS_VALUE_OUT_OF_RANGE      HIDP_ERROR_CODES( 0xC, 0x0005 ) | #define HIDP_STATUS_VALUE_OUT_OF_RANGE      HIDP_ERROR_CODES(0xC, 0x0005) | ||||||
| #define HIDP_STATUS_BAD_LOG_PHY_VALUES      HIDP_ERROR_CODES( 0xC, 0x0006 ) | #define HIDP_STATUS_BAD_LOG_PHY_VALUES      HIDP_ERROR_CODES(0xC, 0x0006) | ||||||
| #define HIDP_STATUS_BUFFER_TOO_SMALL        HIDP_ERROR_CODES( 0xC, 0x0007 ) | #define HIDP_STATUS_BUFFER_TOO_SMALL        HIDP_ERROR_CODES(0xC, 0x0007) | ||||||
| #define HIDP_STATUS_INTERNAL_ERROR          HIDP_ERROR_CODES( 0xC, 0x0008 ) | #define HIDP_STATUS_INTERNAL_ERROR          HIDP_ERROR_CODES(0xC, 0x0008) | ||||||
| #define HIDP_STATUS_I8042_TRANS_UNKNOWN     HIDP_ERROR_CODES( 0xC, 0x0009 ) | #define HIDP_STATUS_I8042_TRANS_UNKNOWN     HIDP_ERROR_CODES(0xC, 0x0009) | ||||||
| #define HIDP_STATUS_INCOMPATIBLE_REPORT_ID  HIDP_ERROR_CODES( 0xC, 0x000A ) | #define HIDP_STATUS_INCOMPATIBLE_REPORT_ID  HIDP_ERROR_CODES(0xC, 0x000A) | ||||||
| #define HIDP_STATUS_NOT_VALUE_ARRAY         HIDP_ERROR_CODES( 0xC, 0x000B ) | #define HIDP_STATUS_NOT_VALUE_ARRAY         HIDP_ERROR_CODES(0xC, 0x000B) | ||||||
| #define HIDP_STATUS_IS_VALUE_ARRAY          HIDP_ERROR_CODES( 0xC, 0x000C ) | #define HIDP_STATUS_IS_VALUE_ARRAY          HIDP_ERROR_CODES(0xC, 0x000C) | ||||||
| #define HIDP_STATUS_DATA_INDEX_NOT_FOUND    HIDP_ERROR_CODES( 0xC, 0x000D ) | #define HIDP_STATUS_DATA_INDEX_NOT_FOUND    HIDP_ERROR_CODES(0xC, 0x000D) | ||||||
| #define HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE HIDP_ERROR_CODES( 0xC, 0x000E ) | #define HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE HIDP_ERROR_CODES(0xC, 0x000E) | ||||||
| #define HIDP_STATUS_BUTTON_NOT_PRESSED      HIDP_ERROR_CODES( 0xC, 0x000F ) | #define HIDP_STATUS_BUTTON_NOT_PRESSED      HIDP_ERROR_CODES(0xC, 0x000F) | ||||||
| #define HIDP_STATUS_REPORT_DOES_NOT_EXIST   HIDP_ERROR_CODES( 0xC, 0x0010 ) | #define HIDP_STATUS_REPORT_DOES_NOT_EXIST   HIDP_ERROR_CODES(0xC, 0x0010) | ||||||
| #define HIDP_STATUS_NOT_IMPLEMENTED         HIDP_ERROR_CODES( 0xC, 0x0020 ) | #define HIDP_STATUS_NOT_IMPLEMENTED         HIDP_ERROR_CODES(0xC, 0x0020) | ||||||
|  |  | ||||||
|  |  | ||||||
| extern int WIN_LoadHIDDLL(void); | extern int WIN_LoadHIDDLL(void); | ||||||
| extern void WIN_UnloadHIDDLL(void); | extern void WIN_UnloadHIDDLL(void); | ||||||
|  |  | ||||||
| typedef BOOLEAN (WINAPI *HidD_GetString_t)(HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength); | typedef BOOLEAN(WINAPI *HidD_GetString_t)(HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength); | ||||||
| typedef NTSTATUS (WINAPI *HidP_GetCaps_t)(PHIDP_PREPARSED_DATA PreparsedData, PHIDP_CAPS Capabilities); | typedef NTSTATUS(WINAPI *HidP_GetCaps_t)(PHIDP_PREPARSED_DATA PreparsedData, PHIDP_CAPS Capabilities); | ||||||
| typedef NTSTATUS (WINAPI *HidP_GetButtonCaps_t)(HIDP_REPORT_TYPE ReportType, PHIDP_BUTTON_CAPS ButtonCaps, PUSHORT ButtonCapsLength, PHIDP_PREPARSED_DATA PreparsedData); | typedef NTSTATUS(WINAPI *HidP_GetButtonCaps_t)(HIDP_REPORT_TYPE ReportType, PHIDP_BUTTON_CAPS ButtonCaps, PUSHORT ButtonCapsLength, PHIDP_PREPARSED_DATA PreparsedData); | ||||||
| typedef NTSTATUS (WINAPI *HidP_GetValueCaps_t)(HIDP_REPORT_TYPE ReportType, PHIDP_VALUE_CAPS ValueCaps, PUSHORT ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData); | typedef NTSTATUS(WINAPI *HidP_GetValueCaps_t)(HIDP_REPORT_TYPE ReportType, PHIDP_VALUE_CAPS ValueCaps, PUSHORT ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData); | ||||||
| typedef ULONG (WINAPI *HidP_MaxDataListLength_t)(HIDP_REPORT_TYPE ReportType, PHIDP_PREPARSED_DATA PreparsedData); | typedef ULONG(WINAPI *HidP_MaxDataListLength_t)(HIDP_REPORT_TYPE ReportType, PHIDP_PREPARSED_DATA PreparsedData); | ||||||
| typedef NTSTATUS (WINAPI *HidP_GetData_t)(HIDP_REPORT_TYPE ReportType, PHIDP_DATA DataList, PULONG DataLength, PHIDP_PREPARSED_DATA PreparsedData, PCHAR Report, ULONG ReportLength); | typedef NTSTATUS(WINAPI *HidP_GetData_t)(HIDP_REPORT_TYPE ReportType, PHIDP_DATA DataList, PULONG DataLength, PHIDP_PREPARSED_DATA PreparsedData, PCHAR Report, ULONG ReportLength); | ||||||
|  |  | ||||||
| extern HidD_GetString_t SDL_HidD_GetManufacturerString; | extern HidD_GetString_t SDL_HidD_GetManufacturerString; | ||||||
| extern HidD_GetString_t SDL_HidD_GetProductString; | extern HidD_GetString_t SDL_HidD_GetProductString; | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ | |||||||
| #include "../../audio/SDL_sysaudio.h" | #include "../../audio/SDL_sysaudio.h" | ||||||
| #include <objbase.h> /* For CLSIDFromString */ | #include <objbase.h> /* For CLSIDFromString */ | ||||||
|  |  | ||||||
| static const ERole SDL_IMMDevice_role = eConsole;  /* !!! FIXME: should this be eMultimedia? Should be a hint? */ | static const ERole SDL_IMMDevice_role = eConsole; /* !!! FIXME: should this be eMultimedia? Should be a hint? */ | ||||||
|  |  | ||||||
| /* This is global to the WASAPI target, to handle hotplug and default device lookup. */ | /* This is global to the WASAPI target, to handle hotplug and default device lookup. */ | ||||||
| static IMMDeviceEnumerator *enumerator = NULL; | static IMMDeviceEnumerator *enumerator = NULL; | ||||||
| @@ -39,6 +39,7 @@ static IMMDeviceEnumerator *enumerator = NULL; | |||||||
| #define PropVariantInit(p) SDL_zerop(p) | #define PropVariantInit(p) SDL_zerop(p) | ||||||
|  |  | ||||||
| /* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */ | /* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */ | ||||||
|  | /* *INDENT-OFF* */ /* clang-format off */ | ||||||
| static const CLSID SDL_CLSID_MMDeviceEnumerator = { 0xbcde0395, 0xe52f, 0x467c,{ 0x8e, 0x3d, 0xc4, 0x57, 0x92, 0x91, 0x69, 0x2e } }; | static const CLSID SDL_CLSID_MMDeviceEnumerator = { 0xbcde0395, 0xe52f, 0x467c,{ 0x8e, 0x3d, 0xc4, 0x57, 0x92, 0x91, 0x69, 0x2e } }; | ||||||
| static const IID SDL_IID_IMMDeviceEnumerator = { 0xa95664d2, 0x9614, 0x4f35,{ 0xa7, 0x46, 0xde, 0x8d, 0xb6, 0x36, 0x17, 0xe6 } }; | static const IID SDL_IID_IMMDeviceEnumerator = { 0xa95664d2, 0x9614, 0x4f35,{ 0xa7, 0x46, 0xde, 0x8d, 0xb6, 0x36, 0x17, 0xe6 } }; | ||||||
| static const IID SDL_IID_IMMNotificationClient = { 0x7991eec9, 0x7e89, 0x4d85,{ 0x83, 0x90, 0x6c, 0x70, 0x3c, 0xec, 0x60, 0xc0 } }; | static const IID SDL_IID_IMMNotificationClient = { 0x7991eec9, 0x7e89, 0x4d85,{ 0x83, 0x90, 0x6c, 0x70, 0x3c, 0xec, 0x60, 0xc0 } }; | ||||||
| @@ -48,13 +49,13 @@ static const PROPERTYKEY SDL_PKEY_AudioEngine_DeviceFormat = { { 0xf19f064d, 0x8 | |||||||
| static const PROPERTYKEY SDL_PKEY_AudioEndpoint_GUID = { { 0x1da5d803, 0xd492, 0x4edd,{ 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, } }, 4 }; | static const PROPERTYKEY SDL_PKEY_AudioEndpoint_GUID = { { 0x1da5d803, 0xd492, 0x4edd,{ 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e, } }, 4 }; | ||||||
| static const GUID SDL_KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010,{ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | static const GUID SDL_KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010,{ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | ||||||
| static const GUID SDL_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { 0x00000003, 0x0000, 0x0010,{ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | static const GUID SDL_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = { 0x00000003, 0x0000, 0x0010,{ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; | ||||||
|  | /* *INDENT-ON* */ /* clang-format on */ | ||||||
|  |  | ||||||
| /* these increment as default devices change. Opened default devices pick up changes in their threads. */ | /* these increment as default devices change. Opened default devices pick up changes in their threads. */ | ||||||
| SDL_atomic_t SDL_IMMDevice_DefaultPlaybackGeneration; | SDL_atomic_t SDL_IMMDevice_DefaultPlaybackGeneration; | ||||||
| SDL_atomic_t SDL_IMMDevice_DefaultCaptureGeneration; | SDL_atomic_t SDL_IMMDevice_DefaultCaptureGeneration; | ||||||
|  |  | ||||||
| static void | static void GetMMDeviceInfo(IMMDevice *device, char **utf8dev, WAVEFORMATEXTENSIBLE *fmt, GUID *guid) | ||||||
| GetMMDeviceInfo(IMMDevice *device, char **utf8dev, WAVEFORMATEXTENSIBLE *fmt, GUID *guid) |  | ||||||
| { | { | ||||||
|     /* PKEY_Device_FriendlyName gives you "Speakers (SoundBlaster Pro)" which drives me nuts. I'd rather it be |     /* PKEY_Device_FriendlyName gives you "Speakers (SoundBlaster Pro)" which drives me nuts. I'd rather it be | ||||||
|        "SoundBlaster Pro (Speakers)" but I guess that's developers vs users. Windows uses the FriendlyName in |        "SoundBlaster Pro (Speakers)" but I guess that's developers vs users. Windows uses the FriendlyName in | ||||||
| @@ -91,8 +92,7 @@ typedef struct DevIdList | |||||||
|  |  | ||||||
| static DevIdList *deviceid_list = NULL; | static DevIdList *deviceid_list = NULL; | ||||||
|  |  | ||||||
| static void | static void SDL_IMMDevice_Remove(const SDL_bool iscapture, LPCWSTR devid, SDL_bool useguid) | ||||||
| SDL_IMMDevice_Remove(const SDL_bool iscapture, LPCWSTR devid, SDL_bool useguid) |  | ||||||
| { | { | ||||||
|     DevIdList *i; |     DevIdList *i; | ||||||
|     DevIdList *next; |     DevIdList *next; | ||||||
| @@ -105,7 +105,7 @@ SDL_IMMDevice_Remove(const SDL_bool iscapture, LPCWSTR devid, SDL_bool useguid) | |||||||
|             } else { |             } else { | ||||||
|                 deviceid_list = next; |                 deviceid_list = next; | ||||||
|             } |             } | ||||||
|             SDL_RemoveAudioDevice(iscapture, useguid ? ((void *) i->guid) : ((void *) i->str)); |             SDL_RemoveAudioDevice(iscapture, useguid ? ((void *)i->guid) : ((void *)i->str)); | ||||||
|             SDL_free(i->str); |             SDL_free(i->str); | ||||||
|             SDL_free(i); |             SDL_free(i); | ||||||
|         } else { |         } else { | ||||||
| @@ -114,8 +114,7 @@ SDL_IMMDevice_Remove(const SDL_bool iscapture, LPCWSTR devid, SDL_bool useguid) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void SDL_IMMDevice_Add(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTENSIBLE *fmt, LPCWSTR devid, GUID *dsoundguid, SDL_bool useguid) | ||||||
| SDL_IMMDevice_Add(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTENSIBLE *fmt, LPCWSTR devid, GUID *dsoundguid, SDL_bool useguid) |  | ||||||
| { | { | ||||||
|     DevIdList *devidlist; |     DevIdList *devidlist; | ||||||
|     SDL_AudioSpec spec; |     SDL_AudioSpec spec; | ||||||
| @@ -128,22 +127,22 @@ SDL_IMMDevice_Add(const SDL_bool iscapture, const char *devname, WAVEFORMATEXTEN | |||||||
|        phones and tablets, where you might have an internal speaker and a headphone jack and expect both to be |        phones and tablets, where you might have an internal speaker and a headphone jack and expect both to be | ||||||
|        available and switch automatically. (!!! FIXME...?) */ |        available and switch automatically. (!!! FIXME...?) */ | ||||||
|  |  | ||||||
|        /* see if we already have this one. */ |     /* see if we already have this one. */ | ||||||
|     for (devidlist = deviceid_list; devidlist; devidlist = devidlist->next) { |     for (devidlist = deviceid_list; devidlist; devidlist = devidlist->next) { | ||||||
|         if (SDL_wcscmp(devidlist->str, devid) == 0) { |         if (SDL_wcscmp(devidlist->str, devid) == 0) { | ||||||
|             return;  /* we already have this. */ |             return; /* we already have this. */ | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     devidlist = (DevIdList *)SDL_malloc(sizeof(*devidlist)); |     devidlist = (DevIdList *)SDL_malloc(sizeof(*devidlist)); | ||||||
|     if (devidlist == NULL) { |     if (devidlist == NULL) { | ||||||
|         return;  /* oh well. */ |         return; /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     devidcopy = SDL_wcsdup(devid); |     devidcopy = SDL_wcsdup(devid); | ||||||
|     if (!devidcopy) { |     if (!devidcopy) { | ||||||
|         SDL_free(devidlist); |         SDL_free(devidlist); | ||||||
|         return;  /* oh well. */ |         return; /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (useguid) { |     if (useguid) { | ||||||
| @@ -185,8 +184,7 @@ typedef struct SDLMMNotificationClient | |||||||
|     SDL_bool useguid; |     SDL_bool useguid; | ||||||
| } SDLMMNotificationClient; | } SDLMMNotificationClient; | ||||||
|  |  | ||||||
| static HRESULT STDMETHODCALLTYPE | static HRESULT STDMETHODCALLTYPE SDLMMNotificationClient_QueryInterface(IMMNotificationClient *this, REFIID iid, void **ppv) | ||||||
| SDLMMNotificationClient_QueryInterface(IMMNotificationClient *this, REFIID iid, void **ppv) |  | ||||||
| { | { | ||||||
|     if ((WIN_IsEqualIID(iid, &IID_IUnknown)) || (WIN_IsEqualIID(iid, &SDL_IID_IMMNotificationClient))) { |     if ((WIN_IsEqualIID(iid, &IID_IUnknown)) || (WIN_IsEqualIID(iid, &SDL_IID_IMMNotificationClient))) { | ||||||
|         *ppv = this; |         *ppv = this; | ||||||
| @@ -198,32 +196,29 @@ SDLMMNotificationClient_QueryInterface(IMMNotificationClient *this, REFIID iid, | |||||||
|     return E_NOINTERFACE; |     return E_NOINTERFACE; | ||||||
| } | } | ||||||
|  |  | ||||||
| static ULONG STDMETHODCALLTYPE | static ULONG STDMETHODCALLTYPE SDLMMNotificationClient_AddRef(IMMNotificationClient *ithis) | ||||||
| SDLMMNotificationClient_AddRef(IMMNotificationClient *ithis) |  | ||||||
| { | { | ||||||
|     SDLMMNotificationClient *this = (SDLMMNotificationClient *)ithis; |     SDLMMNotificationClient *this = (SDLMMNotificationClient *)ithis; | ||||||
|     return (ULONG)(SDL_AtomicIncRef(&this->refcount) + 1); |     return (ULONG)(SDL_AtomicIncRef(&this->refcount) + 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| static ULONG STDMETHODCALLTYPE | static ULONG STDMETHODCALLTYPE SDLMMNotificationClient_Release(IMMNotificationClient *ithis) | ||||||
| SDLMMNotificationClient_Release(IMMNotificationClient *ithis) |  | ||||||
| { | { | ||||||
|     /* this is a static object; we don't ever free it. */ |     /* this is a static object; we don't ever free it. */ | ||||||
|     SDLMMNotificationClient *this = (SDLMMNotificationClient *)ithis; |     SDLMMNotificationClient *this = (SDLMMNotificationClient *)ithis; | ||||||
|     const ULONG retval = SDL_AtomicDecRef(&this->refcount); |     const ULONG retval = SDL_AtomicDecRef(&this->refcount); | ||||||
|     if (retval == 0) { |     if (retval == 0) { | ||||||
|         SDL_AtomicSet(&this->refcount, 0);  /* uhh... */ |         SDL_AtomicSet(&this->refcount, 0); /* uhh... */ | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|     return retval - 1; |     return retval - 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* These are the entry points called when WASAPI device endpoints change. */ | /* These are the entry points called when WASAPI device endpoints change. */ | ||||||
| static HRESULT STDMETHODCALLTYPE | static HRESULT STDMETHODCALLTYPE SDLMMNotificationClient_OnDefaultDeviceChanged(IMMNotificationClient *ithis, EDataFlow flow, ERole role, LPCWSTR pwstrDeviceId) | ||||||
| SDLMMNotificationClient_OnDefaultDeviceChanged(IMMNotificationClient *ithis, EDataFlow flow, ERole role, LPCWSTR pwstrDeviceId) |  | ||||||
| { | { | ||||||
|     if (role != SDL_IMMDevice_role) { |     if (role != SDL_IMMDevice_role) { | ||||||
|         return S_OK;  /* ignore it. */ |         return S_OK; /* ignore it. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Increment the "generation," so opened devices will pick this up in their threads. */ |     /* Increment the "generation," so opened devices will pick this up in their threads. */ | ||||||
| @@ -249,8 +244,7 @@ SDLMMNotificationClient_OnDefaultDeviceChanged(IMMNotificationClient *ithis, EDa | |||||||
|     return S_OK; |     return S_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
| static HRESULT STDMETHODCALLTYPE | static HRESULT STDMETHODCALLTYPE SDLMMNotificationClient_OnDeviceAdded(IMMNotificationClient *ithis, LPCWSTR pwstrDeviceId) | ||||||
| SDLMMNotificationClient_OnDeviceAdded(IMMNotificationClient *ithis, LPCWSTR pwstrDeviceId) |  | ||||||
| { | { | ||||||
|     /* we ignore this; devices added here then progress to ACTIVE, if appropriate, in |     /* we ignore this; devices added here then progress to ACTIVE, if appropriate, in | ||||||
|        OnDeviceStateChange, making that a better place to deal with device adds. More |        OnDeviceStateChange, making that a better place to deal with device adds. More | ||||||
| @@ -260,15 +254,13 @@ SDLMMNotificationClient_OnDeviceAdded(IMMNotificationClient *ithis, LPCWSTR pwst | |||||||
|     return S_OK; |     return S_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
| static HRESULT STDMETHODCALLTYPE | static HRESULT STDMETHODCALLTYPE SDLMMNotificationClient_OnDeviceRemoved(IMMNotificationClient *ithis, LPCWSTR pwstrDeviceId) | ||||||
| SDLMMNotificationClient_OnDeviceRemoved(IMMNotificationClient *ithis, LPCWSTR pwstrDeviceId) |  | ||||||
| { | { | ||||||
|     /* See notes in OnDeviceAdded handler about why we ignore this. */ |     /* See notes in OnDeviceAdded handler about why we ignore this. */ | ||||||
|     return S_OK; |     return S_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
| static HRESULT STDMETHODCALLTYPE | static HRESULT STDMETHODCALLTYPE SDLMMNotificationClient_OnDeviceStateChanged(IMMNotificationClient *ithis, LPCWSTR pwstrDeviceId, DWORD dwNewState) | ||||||
| SDLMMNotificationClient_OnDeviceStateChanged(IMMNotificationClient *ithis, LPCWSTR pwstrDeviceId, DWORD dwNewState) |  | ||||||
| { | { | ||||||
|     IMMDevice *device = NULL; |     IMMDevice *device = NULL; | ||||||
|  |  | ||||||
| @@ -278,7 +270,7 @@ SDLMMNotificationClient_OnDeviceStateChanged(IMMNotificationClient *ithis, LPCWS | |||||||
|             EDataFlow flow; |             EDataFlow flow; | ||||||
|             if (SUCCEEDED(IMMEndpoint_GetDataFlow(endpoint, &flow))) { |             if (SUCCEEDED(IMMEndpoint_GetDataFlow(endpoint, &flow))) { | ||||||
|                 const SDL_bool iscapture = (flow == eCapture); |                 const SDL_bool iscapture = (flow == eCapture); | ||||||
|                 const SDLMMNotificationClient *client = (SDLMMNotificationClient*) ithis; |                 const SDLMMNotificationClient *client = (SDLMMNotificationClient *)ithis; | ||||||
|                 if (dwNewState == DEVICE_STATE_ACTIVE) { |                 if (dwNewState == DEVICE_STATE_ACTIVE) { | ||||||
|                     char *utf8dev; |                     char *utf8dev; | ||||||
|                     WAVEFORMATEXTENSIBLE fmt; |                     WAVEFORMATEXTENSIBLE fmt; | ||||||
| @@ -300,10 +292,9 @@ SDLMMNotificationClient_OnDeviceStateChanged(IMMNotificationClient *ithis, LPCWS | |||||||
|     return S_OK; |     return S_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
| static HRESULT STDMETHODCALLTYPE | static HRESULT STDMETHODCALLTYPE SDLMMNotificationClient_OnPropertyValueChanged(IMMNotificationClient *this, LPCWSTR pwstrDeviceId, const PROPERTYKEY key) | ||||||
| SDLMMNotificationClient_OnPropertyValueChanged(IMMNotificationClient *this, LPCWSTR pwstrDeviceId, const PROPERTYKEY key) |  | ||||||
| { | { | ||||||
|     return S_OK;  /* we don't care about these. */ |     return S_OK; /* we don't care about these. */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static const IMMNotificationClientVtbl notification_client_vtbl = { | static const IMMNotificationClientVtbl notification_client_vtbl = { | ||||||
| @@ -319,8 +310,7 @@ static const IMMNotificationClientVtbl notification_client_vtbl = { | |||||||
|  |  | ||||||
| static SDLMMNotificationClient notification_client = { ¬ification_client_vtbl, { 1 } }; | static SDLMMNotificationClient notification_client = { ¬ification_client_vtbl, { 1 } }; | ||||||
|  |  | ||||||
| int | int SDL_IMMDevice_Init(void) | ||||||
| SDL_IMMDevice_Init(void) |  | ||||||
| { | { | ||||||
|     HRESULT ret; |     HRESULT ret; | ||||||
|  |  | ||||||
| @@ -344,8 +334,7 @@ SDL_IMMDevice_Init(void) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IMMDevice_Quit(void) | ||||||
| SDL_IMMDevice_Quit(void) |  | ||||||
| { | { | ||||||
|     DevIdList *devidlist; |     DevIdList *devidlist; | ||||||
|     DevIdList *next; |     DevIdList *next; | ||||||
| @@ -366,8 +355,7 @@ SDL_IMMDevice_Quit(void) | |||||||
|     deviceid_list = NULL; |     deviceid_list = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_IMMDevice_Get(LPCWSTR devid, IMMDevice **device, SDL_bool iscapture) | ||||||
| SDL_IMMDevice_Get(LPCWSTR devid, IMMDevice **device, SDL_bool iscapture) |  | ||||||
| { | { | ||||||
|     HRESULT ret; |     HRESULT ret; | ||||||
|  |  | ||||||
| @@ -422,8 +410,7 @@ static int SDLCALL sort_endpoints(const void *_a, const void *_b) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void EnumerateEndpointsForFlow(const SDL_bool iscapture) | ||||||
| EnumerateEndpointsForFlow(const SDL_bool iscapture) |  | ||||||
| { | { | ||||||
|     IMMDeviceCollection *collection = NULL; |     IMMDeviceCollection *collection = NULL; | ||||||
|     EndpointItem *items; |     EndpointItem *items; | ||||||
| @@ -443,7 +430,7 @@ EnumerateEndpointsForFlow(const SDL_bool iscapture) | |||||||
|  |  | ||||||
|     items = (EndpointItem *)SDL_calloc(total, sizeof(EndpointItem)); |     items = (EndpointItem *)SDL_calloc(total, sizeof(EndpointItem)); | ||||||
|     if (items == NULL) { |     if (items == NULL) { | ||||||
|         return;  /* oh well. */ |         return; /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (i = 0; i < total; i++) { |     for (i = 0; i < total; i++) { | ||||||
| @@ -474,20 +461,18 @@ EnumerateEndpointsForFlow(const SDL_bool iscapture) | |||||||
|     IMMDeviceCollection_Release(collection); |     IMMDeviceCollection_Release(collection); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_IMMDevice_EnumerateEndpoints(SDL_bool useguid) | ||||||
| SDL_IMMDevice_EnumerateEndpoints(SDL_bool useguid) |  | ||||||
| { | { | ||||||
|     notification_client.useguid = useguid; |     notification_client.useguid = useguid; | ||||||
|  |  | ||||||
|     EnumerateEndpointsForFlow(SDL_FALSE);  /* playback */ |     EnumerateEndpointsForFlow(SDL_FALSE); /* playback */ | ||||||
|     EnumerateEndpointsForFlow(SDL_TRUE);  /* capture */ |     EnumerateEndpointsForFlow(SDL_TRUE);  /* capture */ | ||||||
|  |  | ||||||
|     /* if this fails, we just won't get hotplug events. Carry on anyhow. */ |     /* if this fails, we just won't get hotplug events. Carry on anyhow. */ | ||||||
|     IMMDeviceEnumerator_RegisterEndpointNotificationCallback(enumerator, (IMMNotificationClient *)¬ification_client); |     IMMDeviceEnumerator_RegisterEndpointNotificationCallback(enumerator, (IMMNotificationClient *)¬ification_client); | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int SDL_IMMDevice_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) | ||||||
| SDL_IMMDevice_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture) |  | ||||||
| { | { | ||||||
|     WAVEFORMATEXTENSIBLE fmt; |     WAVEFORMATEXTENSIBLE fmt; | ||||||
|     IMMDevice *device = NULL; |     IMMDevice *device = NULL; | ||||||
| @@ -516,7 +501,7 @@ SDL_IMMDevice_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscaptur | |||||||
|     SDL_zerop(spec); |     SDL_zerop(spec); | ||||||
|     spec->channels = (Uint8)fmt.Format.nChannels; |     spec->channels = (Uint8)fmt.Format.nChannels; | ||||||
|     spec->freq = fmt.Format.nSamplesPerSec; |     spec->freq = fmt.Format.nSamplesPerSec; | ||||||
|     spec->format = WaveFormatToSDLFormat((WAVEFORMATEX *) &fmt); |     spec->format = WaveFormatToSDLFormat((WAVEFORMATEX *)&fmt); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,40 +26,39 @@ | |||||||
| #include "SDL_error.h" | #include "SDL_error.h" | ||||||
| #include "SDL_system.h" | #include "SDL_system.h" | ||||||
|  |  | ||||||
| #include <objbase.h>    /* for CoInitialize/CoUninitialize (Win32 only) */ | #include <objbase.h> /* for CoInitialize/CoUninitialize (Win32 only) */ | ||||||
| #if defined(HAVE_ROAPI_H) | #if defined(HAVE_ROAPI_H) | ||||||
| #include <roapi.h>      /* For RoInitialize/RoUninitialize (Win32 only) */ | #include <roapi.h> /* For RoInitialize/RoUninitialize (Win32 only) */ | ||||||
| #else | #else | ||||||
| typedef enum RO_INIT_TYPE { | typedef enum RO_INIT_TYPE | ||||||
|   RO_INIT_SINGLETHREADED = 0, | { | ||||||
|   RO_INIT_MULTITHREADED  = 1 |     RO_INIT_SINGLETHREADED = 0, | ||||||
|  |     RO_INIT_MULTITHREADED = 1 | ||||||
| } RO_INIT_TYPE; | } RO_INIT_TYPE; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef _WIN32_WINNT_VISTA | #ifndef _WIN32_WINNT_VISTA | ||||||
| #define _WIN32_WINNT_VISTA  0x0600 | #define _WIN32_WINNT_VISTA 0x0600 | ||||||
| #endif | #endif | ||||||
| #ifndef _WIN32_WINNT_WIN7 | #ifndef _WIN32_WINNT_WIN7 | ||||||
| #define _WIN32_WINNT_WIN7   0x0601 | #define _WIN32_WINNT_WIN7 0x0601 | ||||||
| #endif | #endif | ||||||
| #ifndef _WIN32_WINNT_WIN8 | #ifndef _WIN32_WINNT_WIN8 | ||||||
| #define _WIN32_WINNT_WIN8   0x0602 | #define _WIN32_WINNT_WIN8 0x0602 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef LOAD_LIBRARY_SEARCH_SYSTEM32 | #ifndef LOAD_LIBRARY_SEARCH_SYSTEM32 | ||||||
| #define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 | #define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Sets an error message based on an HRESULT */ | /* Sets an error message based on an HRESULT */ | ||||||
| int | int WIN_SetErrorFromHRESULT(const char *prefix, HRESULT hr) | ||||||
| WIN_SetErrorFromHRESULT(const char *prefix, HRESULT hr) |  | ||||||
| { | { | ||||||
|     TCHAR buffer[1024]; |     TCHAR buffer[1024]; | ||||||
|     char *message; |     char *message; | ||||||
|     TCHAR *p = buffer; |     TCHAR *p = buffer; | ||||||
|     DWORD c = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, 0, |     DWORD c = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, 0, | ||||||
|                   buffer, SDL_arraysize(buffer), NULL); |                             buffer, SDL_arraysize(buffer), NULL); | ||||||
|     buffer[c] = 0; |     buffer[c] = 0; | ||||||
|     /* kill CR/LF that FormatMessage() sticks at the end */ |     /* kill CR/LF that FormatMessage() sticks at the end */ | ||||||
|     while (*p) { |     while (*p) { | ||||||
| @@ -76,8 +75,7 @@ WIN_SetErrorFromHRESULT(const char *prefix, HRESULT hr) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* Sets an error message based on GetLastError() */ | /* Sets an error message based on GetLastError() */ | ||||||
| int | int WIN_SetError(const char *prefix) | ||||||
| WIN_SetError(const char *prefix) |  | ||||||
| { | { | ||||||
|     return WIN_SetErrorFromHRESULT(prefix, GetLastError()); |     return WIN_SetErrorFromHRESULT(prefix, GetLastError()); | ||||||
| } | } | ||||||
| @@ -116,8 +114,7 @@ WIN_CoInitialize(void) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WIN_CoUninitialize(void) | ||||||
| WIN_CoUninitialize(void) |  | ||||||
| { | { | ||||||
| #ifndef __WINRT__ | #ifndef __WINRT__ | ||||||
|     CoUninitialize(); |     CoUninitialize(); | ||||||
| @@ -132,8 +129,8 @@ WIN_LoadComBaseFunction(const char *name) | |||||||
|     static HMODULE s_hComBase; |     static HMODULE s_hComBase; | ||||||
|  |  | ||||||
|     if (!s_bLoaded) { |     if (!s_bLoaded) { | ||||||
|        s_hComBase = LoadLibraryEx(TEXT("combase.dll"), NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); |         s_hComBase = LoadLibraryEx(TEXT("combase.dll"), NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); | ||||||
|        s_bLoaded = SDL_TRUE; |         s_bLoaded = SDL_TRUE; | ||||||
|     } |     } | ||||||
|     if (s_hComBase) { |     if (s_hComBase) { | ||||||
|         return GetProcAddress(s_hComBase, name); |         return GetProcAddress(s_hComBase, name); | ||||||
| @@ -149,7 +146,7 @@ WIN_RoInitialize(void) | |||||||
| #ifdef __WINRT__ | #ifdef __WINRT__ | ||||||
|     return S_OK; |     return S_OK; | ||||||
| #else | #else | ||||||
|     typedef HRESULT (WINAPI *RoInitialize_t)(RO_INIT_TYPE initType); |     typedef HRESULT(WINAPI * RoInitialize_t)(RO_INIT_TYPE initType); | ||||||
|     RoInitialize_t RoInitializeFunc = (RoInitialize_t)WIN_LoadComBaseFunction("RoInitialize"); |     RoInitialize_t RoInitializeFunc = (RoInitialize_t)WIN_LoadComBaseFunction("RoInitialize"); | ||||||
|     if (RoInitializeFunc) { |     if (RoInitializeFunc) { | ||||||
|         /* RO_INIT_SINGLETHREADED is equivalent to COINIT_APARTMENTTHREADED */ |         /* RO_INIT_SINGLETHREADED is equivalent to COINIT_APARTMENTTHREADED */ | ||||||
| @@ -171,11 +168,10 @@ WIN_RoInitialize(void) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WIN_RoUninitialize(void) | ||||||
| WIN_RoUninitialize(void) |  | ||||||
| { | { | ||||||
| #ifndef __WINRT__ | #ifndef __WINRT__ | ||||||
|     typedef void (WINAPI *RoUninitialize_t)(void); |     typedef void(WINAPI * RoUninitialize_t)(void); | ||||||
|     RoUninitialize_t RoUninitializeFunc = (RoUninitialize_t)WIN_LoadComBaseFunction("RoUninitialize"); |     RoUninitialize_t RoUninitializeFunc = (RoUninitialize_t)WIN_LoadComBaseFunction("RoUninitialize"); | ||||||
|     if (RoUninitializeFunc) { |     if (RoUninitializeFunc) { | ||||||
|         RoUninitializeFunc(); |         RoUninitializeFunc(); | ||||||
| @@ -184,16 +180,15 @@ WIN_RoUninitialize(void) | |||||||
| } | } | ||||||
|  |  | ||||||
| #if !defined(__WINRT__) && !defined(__XBOXONE__) && !defined(__XBOXSERIES__) | #if !defined(__WINRT__) && !defined(__XBOXONE__) && !defined(__XBOXSERIES__) | ||||||
| static BOOL | static BOOL IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor) | ||||||
| IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor) |  | ||||||
| { | { | ||||||
|     OSVERSIONINFOEXW osvi; |     OSVERSIONINFOEXW osvi; | ||||||
|     DWORDLONG const dwlConditionMask = VerSetConditionMask( |     DWORDLONG const dwlConditionMask = VerSetConditionMask( | ||||||
|         VerSetConditionMask( |         VerSetConditionMask( | ||||||
|         VerSetConditionMask( |             VerSetConditionMask( | ||||||
|         0, VER_MAJORVERSION, VER_GREATER_EQUAL ), |                 0, VER_MAJORVERSION, VER_GREATER_EQUAL), | ||||||
|         VER_MINORVERSION, VER_GREATER_EQUAL ), |             VER_MINORVERSION, VER_GREATER_EQUAL), | ||||||
|         VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL ); |         VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); | ||||||
|  |  | ||||||
|     SDL_zero(osvi); |     SDL_zero(osvi); | ||||||
|     osvi.dwOSVersionInfoSize = sizeof(osvi); |     osvi.dwOSVersionInfoSize = sizeof(osvi); | ||||||
| @@ -257,7 +252,7 @@ char * | |||||||
| WIN_LookupAudioDeviceName(const WCHAR *name, const GUID *guid) | WIN_LookupAudioDeviceName(const WCHAR *name, const GUID *guid) | ||||||
| { | { | ||||||
| #if defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__) | #if defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__) | ||||||
|     return WIN_StringToUTF8(name);  /* No registry access on WinRT/UWP and Xbox, go with what we've got. */ |     return WIN_StringToUTF8(name); /* No registry access on WinRT/UWP and Xbox, go with what we've got. */ | ||||||
| #else | #else | ||||||
|     static const GUID nullguid = { 0 }; |     static const GUID nullguid = { 0 }; | ||||||
|     const unsigned char *ptr; |     const unsigned char *ptr; | ||||||
| @@ -269,42 +264,42 @@ WIN_LookupAudioDeviceName(const WCHAR *name, const GUID *guid) | |||||||
|     char *retval = NULL; |     char *retval = NULL; | ||||||
|  |  | ||||||
|     if (WIN_IsEqualGUID(guid, &nullguid)) { |     if (WIN_IsEqualGUID(guid, &nullguid)) { | ||||||
|         return WIN_StringToUTF8(name);  /* No GUID, go with what we've got. */ |         return WIN_StringToUTF8(name); /* No GUID, go with what we've got. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ptr = (const unsigned char *) guid; |     ptr = (const unsigned char *)guid; | ||||||
|     SDL_snprintf(keystr, sizeof (keystr), |     SDL_snprintf(keystr, sizeof(keystr), | ||||||
|         "System\\CurrentControlSet\\Control\\MediaCategories\\{%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}", |                  "System\\CurrentControlSet\\Control\\MediaCategories\\{%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}", | ||||||
|         ptr[3], ptr[2], ptr[1], ptr[0], ptr[5], ptr[4], ptr[7], ptr[6], |                  ptr[3], ptr[2], ptr[1], ptr[0], ptr[5], ptr[4], ptr[7], ptr[6], | ||||||
|         ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15]); |                  ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15]); | ||||||
|  |  | ||||||
|     strw = WIN_UTF8ToString(keystr); |     strw = WIN_UTF8ToString(keystr); | ||||||
|     rc = (RegOpenKeyExW(HKEY_LOCAL_MACHINE, strw, 0, KEY_QUERY_VALUE, &hkey) == ERROR_SUCCESS); |     rc = (RegOpenKeyExW(HKEY_LOCAL_MACHINE, strw, 0, KEY_QUERY_VALUE, &hkey) == ERROR_SUCCESS); | ||||||
|     SDL_free(strw); |     SDL_free(strw); | ||||||
|     if (!rc) { |     if (!rc) { | ||||||
|         return WIN_StringToUTF8(name);  /* oh well. */ |         return WIN_StringToUTF8(name); /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     rc = (RegQueryValueExW(hkey, L"Name", NULL, NULL, NULL, &len) == ERROR_SUCCESS); |     rc = (RegQueryValueExW(hkey, L"Name", NULL, NULL, NULL, &len) == ERROR_SUCCESS); | ||||||
|     if (!rc) { |     if (!rc) { | ||||||
|         RegCloseKey(hkey); |         RegCloseKey(hkey); | ||||||
|         return WIN_StringToUTF8(name);  /* oh well. */ |         return WIN_StringToUTF8(name); /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     strw = (WCHAR *) SDL_malloc(len + sizeof (WCHAR)); |     strw = (WCHAR *)SDL_malloc(len + sizeof(WCHAR)); | ||||||
|     if (strw == NULL) { |     if (strw == NULL) { | ||||||
|         RegCloseKey(hkey); |         RegCloseKey(hkey); | ||||||
|         return WIN_StringToUTF8(name);  /* oh well. */ |         return WIN_StringToUTF8(name); /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     rc = (RegQueryValueExW(hkey, L"Name", NULL, NULL, (LPBYTE) strw, &len) == ERROR_SUCCESS); |     rc = (RegQueryValueExW(hkey, L"Name", NULL, NULL, (LPBYTE)strw, &len) == ERROR_SUCCESS); | ||||||
|     RegCloseKey(hkey); |     RegCloseKey(hkey); | ||||||
|     if (!rc) { |     if (!rc) { | ||||||
|         SDL_free(strw); |         SDL_free(strw); | ||||||
|         return WIN_StringToUTF8(name);  /* oh well. */ |         return WIN_StringToUTF8(name); /* oh well. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     strw[len / 2] = 0;  /* make sure it's null-terminated. */ |     strw[len / 2] = 0; /* make sure it's null-terminated. */ | ||||||
|  |  | ||||||
|     retval = WIN_StringToUTF8(strw); |     retval = WIN_StringToUTF8(strw); | ||||||
|     SDL_free(strw); |     SDL_free(strw); | ||||||
| @@ -312,20 +307,17 @@ WIN_LookupAudioDeviceName(const WCHAR *name, const GUID *guid) | |||||||
| #endif /* if __WINRT__ / else */ | #endif /* if __WINRT__ / else */ | ||||||
| } | } | ||||||
|  |  | ||||||
| BOOL | BOOL WIN_IsEqualGUID(const GUID *a, const GUID *b) | ||||||
| WIN_IsEqualGUID(const GUID * a, const GUID * b) |  | ||||||
| { | { | ||||||
|     return SDL_memcmp(a, b, sizeof(*a)) == 0; |     return SDL_memcmp(a, b, sizeof(*a)) == 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| BOOL | BOOL WIN_IsEqualIID(REFIID a, REFIID b) | ||||||
| WIN_IsEqualIID(REFIID a, REFIID b) |  | ||||||
| { | { | ||||||
|     return SDL_memcmp(a, b, sizeof(*a)) == 0; |     return SDL_memcmp(a, b, sizeof(*a)) == 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WIN_RECTToRect(const RECT *winrect, SDL_Rect *sdlrect) | ||||||
| WIN_RECTToRect(const RECT *winrect, SDL_Rect *sdlrect) |  | ||||||
| { | { | ||||||
|     sdlrect->x = winrect->left; |     sdlrect->x = winrect->left; | ||||||
|     sdlrect->w = (winrect->right - winrect->left) + 1; |     sdlrect->w = (winrect->right - winrect->left) + 1; | ||||||
| @@ -333,8 +325,7 @@ WIN_RECTToRect(const RECT *winrect, SDL_Rect *sdlrect) | |||||||
|     sdlrect->h = (winrect->bottom - winrect->top) + 1; |     sdlrect->h = (winrect->bottom - winrect->top) + 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WIN_RectToRECT(const SDL_Rect *sdlrect, RECT *winrect) | ||||||
| WIN_RectToRECT(const SDL_Rect *sdlrect, RECT *winrect) |  | ||||||
| { | { | ||||||
|     winrect->left = sdlrect->x; |     winrect->left = sdlrect->x; | ||||||
|     winrect->right = sdlrect->x + sdlrect->w - 1; |     winrect->right = sdlrect->x + sdlrect->w - 1; | ||||||
| @@ -344,24 +335,21 @@ WIN_RectToRECT(const SDL_Rect *sdlrect, RECT *winrect) | |||||||
|  |  | ||||||
| #endif /* defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) */ | #endif /* defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__) */ | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Public APIs |  * Public APIs | ||||||
|  */ |  */ | ||||||
| #if !defined(SDL_VIDEO_DRIVER_WINDOWS) | #if !defined(SDL_VIDEO_DRIVER_WINDOWS) | ||||||
|  |  | ||||||
| #if defined(__WIN32__) || defined(__GDK__) | #if defined(__WIN32__) || defined(__GDK__) | ||||||
| int | int SDL_RegisterApp(const char *name, Uint32 style, void *hInst) | ||||||
| SDL_RegisterApp(const char *name, Uint32 style, void *hInst) |  | ||||||
| { | { | ||||||
|     (void) name; |     (void)name; | ||||||
|     (void) style; |     (void)style; | ||||||
|     (void) hInst; |     (void)hInst; | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void SDL_UnregisterApp(void) | ||||||
| SDL_UnregisterApp(void) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -371,17 +359,16 @@ void SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata) | |||||||
| #endif /* __WIN32__ || __GDK__ */ | #endif /* __WIN32__ || __GDK__ */ | ||||||
|  |  | ||||||
| #if defined(__WIN32__) || defined(__WINGDK__) | #if defined(__WIN32__) || defined(__WINGDK__) | ||||||
| int | int SDL_Direct3D9GetAdapterIndex(int displayIndex) | ||||||
| SDL_Direct3D9GetAdapterIndex(int displayIndex) |  | ||||||
| { | { | ||||||
|     (void) displayIndex; |     (void)displayIndex; | ||||||
|     return 0; /* D3DADAPTER_DEFAULT */ |     return 0; /* D3DADAPTER_DEFAULT */ | ||||||
| } | } | ||||||
|  |  | ||||||
| SDL_bool | SDL_bool | ||||||
| SDL_DXGIGetOutputInfo(int displayIndex, int *adapterIndex, int *outputIndex) | SDL_DXGIGetOutputInfo(int displayIndex, int *adapterIndex, int *outputIndex) | ||||||
| { | { | ||||||
|     (void) displayIndex; |     (void)displayIndex; | ||||||
|     if (adapterIndex) { |     if (adapterIndex) { | ||||||
|         *adapterIndex = -1; |         *adapterIndex = -1; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -37,13 +37,13 @@ | |||||||
| #undef WINVER | #undef WINVER | ||||||
| #undef _WIN32_WINNT | #undef _WIN32_WINNT | ||||||
| #if defined(SDL_VIDEO_RENDER_D3D12) | #if defined(SDL_VIDEO_RENDER_D3D12) | ||||||
| #define _WIN32_WINNT  0xA00   /* For D3D12, 0xA00 is required */ | #define _WIN32_WINNT 0xA00 /* For D3D12, 0xA00 is required */ | ||||||
| #elif defined(HAVE_SHELLSCALINGAPI_H) | #elif defined(HAVE_SHELLSCALINGAPI_H) | ||||||
| #define _WIN32_WINNT  0x603   /* For DPI support */ | #define _WIN32_WINNT 0x603 /* For DPI support */ | ||||||
| #else | #else | ||||||
| #define _WIN32_WINNT  0x501   /* Need 0x410 for AlphaBlend() and 0x500 for EnumDisplayDevices(), 0x501 for raw input */ | #define _WIN32_WINNT 0x501 /* Need 0x410 for AlphaBlend() and 0x500 for EnumDisplayDevices(), 0x501 for raw input */ | ||||||
| #endif | #endif | ||||||
| #define WINVER        _WIN32_WINNT | #define WINVER _WIN32_WINNT | ||||||
|  |  | ||||||
| #elif defined(__WINGDK__) | #elif defined(__WINGDK__) | ||||||
| #ifndef WIN32_LEAN_AND_MEAN | #ifndef WIN32_LEAN_AND_MEAN | ||||||
| @@ -57,8 +57,8 @@ | |||||||
| #endif | #endif | ||||||
| #undef WINVER | #undef WINVER | ||||||
| #undef _WIN32_WINNT | #undef _WIN32_WINNT | ||||||
| #define _WIN32_WINNT  0xA00 | #define _WIN32_WINNT 0xA00 | ||||||
| #define WINVER        _WIN32_WINNT | #define WINVER       _WIN32_WINNT | ||||||
|  |  | ||||||
| #elif defined(__XBOXONE__) || defined(__XBOXSERIES__) | #elif defined(__XBOXONE__) || defined(__XBOXSERIES__) | ||||||
| #ifndef WIN32_LEAN_AND_MEAN | #ifndef WIN32_LEAN_AND_MEAN | ||||||
| @@ -77,7 +77,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <windows.h> | #include <windows.h> | ||||||
| #include <basetyps.h>   /* for REFIID with broken mingw.org headers */ | #include <basetyps.h> /* for REFIID with broken mingw.org headers */ | ||||||
|  |  | ||||||
| /* Older Visual C++ headers don't have the Win64-compatible typedefs... */ | /* Older Visual C++ headers don't have the Win64-compatible typedefs... */ | ||||||
| #if defined(_MSC_VER) && (_MSC_VER <= 1200) | #if defined(_MSC_VER) && (_MSC_VER <= 1200) | ||||||
| @@ -92,21 +92,21 @@ | |||||||
| #include "SDL_rect.h" | #include "SDL_rect.h" | ||||||
|  |  | ||||||
| /* Routines to convert from UTF8 to native Windows text */ | /* Routines to convert from UTF8 to native Windows text */ | ||||||
| #define WIN_StringToUTF8W(S) SDL_iconv_string("UTF-8", "UTF-16LE", (const char *)(S), (SDL_wcslen(S)+1)*sizeof(WCHAR)) | #define WIN_StringToUTF8W(S) SDL_iconv_string("UTF-8", "UTF-16LE", (const char *)(S), (SDL_wcslen(S) + 1) * sizeof(WCHAR)) | ||||||
| #define WIN_UTF8ToStringW(S) (WCHAR *)SDL_iconv_string("UTF-16LE", "UTF-8", (const char *)(S), SDL_strlen(S)+1) | #define WIN_UTF8ToStringW(S) (WCHAR *)SDL_iconv_string("UTF-16LE", "UTF-8", (const char *)(S), SDL_strlen(S) + 1) | ||||||
| /* !!! FIXME: UTF8ToString() can just be a SDL_strdup() here. */ | /* !!! FIXME: UTF8ToString() can just be a SDL_strdup() here. */ | ||||||
| #define WIN_StringToUTF8A(S) SDL_iconv_string("UTF-8", "ASCII", (const char *)(S), (SDL_strlen(S)+1)) | #define WIN_StringToUTF8A(S) SDL_iconv_string("UTF-8", "ASCII", (const char *)(S), (SDL_strlen(S) + 1)) | ||||||
| #define WIN_UTF8ToStringA(S) SDL_iconv_string("ASCII", "UTF-8", (const char *)(S), SDL_strlen(S)+1) | #define WIN_UTF8ToStringA(S) SDL_iconv_string("ASCII", "UTF-8", (const char *)(S), SDL_strlen(S) + 1) | ||||||
| #if UNICODE | #if UNICODE | ||||||
| #define WIN_StringToUTF8 WIN_StringToUTF8W | #define WIN_StringToUTF8 WIN_StringToUTF8W | ||||||
| #define WIN_UTF8ToString WIN_UTF8ToStringW | #define WIN_UTF8ToString WIN_UTF8ToStringW | ||||||
| #define SDL_tcslen SDL_wcslen | #define SDL_tcslen       SDL_wcslen | ||||||
| #define SDL_tcsstr SDL_wcsstr | #define SDL_tcsstr       SDL_wcsstr | ||||||
| #else | #else | ||||||
| #define WIN_StringToUTF8 WIN_StringToUTF8A | #define WIN_StringToUTF8 WIN_StringToUTF8A | ||||||
| #define WIN_UTF8ToString WIN_UTF8ToStringA | #define WIN_UTF8ToString WIN_UTF8ToStringA | ||||||
| #define SDL_tcslen SDL_strlen | #define SDL_tcslen       SDL_strlen | ||||||
| #define SDL_tcsstr SDL_strstr | #define SDL_tcsstr       SDL_strstr | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Set up for C function definitions, even when using C++ */ | /* Set up for C function definitions, even when using C++ */ | ||||||
| @@ -146,7 +146,7 @@ extern BOOL WIN_IsWindows8OrGreater(void); | |||||||
| extern char *WIN_LookupAudioDeviceName(const WCHAR *name, const GUID *guid); | extern char *WIN_LookupAudioDeviceName(const WCHAR *name, const GUID *guid); | ||||||
|  |  | ||||||
| /* Checks to see if two GUID are the same. */ | /* Checks to see if two GUID are the same. */ | ||||||
| extern BOOL WIN_IsEqualGUID(const GUID * a, const GUID * b); | extern BOOL WIN_IsEqualGUID(const GUID *a, const GUID *b); | ||||||
| extern BOOL WIN_IsEqualIID(REFIID a, REFIID b); | extern BOOL WIN_IsEqualIID(REFIID a, REFIID b); | ||||||
|  |  | ||||||
| /* Convert between SDL_rect and RECT */ | /* Convert between SDL_rect and RECT */ | ||||||
|   | |||||||
| @@ -36,11 +36,9 @@ DWORD SDL_XInputVersion = 0; | |||||||
| static HANDLE s_pXInputDLL = 0; | static HANDLE s_pXInputDLL = 0; | ||||||
| static int s_XInputDLLRefCount = 0; | static int s_XInputDLLRefCount = 0; | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__) | #if defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__) | ||||||
|  |  | ||||||
| int | int WIN_LoadXInputDLL(void) | ||||||
| WIN_LoadXInputDLL(void) |  | ||||||
| { | { | ||||||
|     /* Getting handles to system dlls (via LoadLibrary and its variants) is not |     /* Getting handles to system dlls (via LoadLibrary and its variants) is not | ||||||
|      * supported on WinRT, thus, pointers to XInput's functions can't be |      * supported on WinRT, thus, pointers to XInput's functions can't be | ||||||
| @@ -65,22 +63,20 @@ WIN_LoadXInputDLL(void) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WIN_UnloadXInputDLL(void) | ||||||
| WIN_UnloadXInputDLL(void) |  | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| #else /* !(defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__)) */ | #else /* !(defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__)) */ | ||||||
|  |  | ||||||
| int | int WIN_LoadXInputDLL(void) | ||||||
| WIN_LoadXInputDLL(void) |  | ||||||
| { | { | ||||||
|     DWORD version = 0; |     DWORD version = 0; | ||||||
|  |  | ||||||
|     if (s_pXInputDLL) { |     if (s_pXInputDLL) { | ||||||
|         SDL_assert(s_XInputDLLRefCount > 0); |         SDL_assert(s_XInputDLLRefCount > 0); | ||||||
|         s_XInputDLLRefCount++; |         s_XInputDLLRefCount++; | ||||||
|         return 0;  /* already loaded */ |         return 0; /* already loaded */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* NOTE: Don't load XinputUap.dll |     /* NOTE: Don't load XinputUap.dll | ||||||
| @@ -88,10 +84,10 @@ WIN_LoadXInputDLL(void) | |||||||
|      * limitations of that API (no devices at startup, no background input, etc.) |      * limitations of that API (no devices at startup, no background input, etc.) | ||||||
|      */ |      */ | ||||||
|     version = (1 << 16) | 4; |     version = (1 << 16) | 4; | ||||||
|     s_pXInputDLL = LoadLibrary(TEXT("XInput1_4.dll"));  /* 1.4 Ships with Windows 8. */ |     s_pXInputDLL = LoadLibrary(TEXT("XInput1_4.dll")); /* 1.4 Ships with Windows 8. */ | ||||||
|     if (!s_pXInputDLL) { |     if (!s_pXInputDLL) { | ||||||
|         version = (1 << 16) | 3; |         version = (1 << 16) | 3; | ||||||
|         s_pXInputDLL = LoadLibrary(TEXT("XInput1_3.dll"));  /* 1.3 can be installed as a redistributable component. */ |         s_pXInputDLL = LoadLibrary(TEXT("XInput1_3.dll")); /* 1.3 can be installed as a redistributable component. */ | ||||||
|     } |     } | ||||||
|     if (!s_pXInputDLL) { |     if (!s_pXInputDLL) { | ||||||
|         s_pXInputDLL = LoadLibrary(TEXT("bin\\XInput1_3.dll")); |         s_pXInputDLL = LoadLibrary(TEXT("bin\\XInput1_3.dll")); | ||||||
| @@ -115,7 +111,7 @@ WIN_LoadXInputDLL(void) | |||||||
|     } |     } | ||||||
|     SDL_XInputSetState = (XInputSetState_t)GetProcAddress((HMODULE)s_pXInputDLL, "XInputSetState"); |     SDL_XInputSetState = (XInputSetState_t)GetProcAddress((HMODULE)s_pXInputDLL, "XInputSetState"); | ||||||
|     SDL_XInputGetCapabilities = (XInputGetCapabilities_t)GetProcAddress((HMODULE)s_pXInputDLL, "XInputGetCapabilities"); |     SDL_XInputGetCapabilities = (XInputGetCapabilities_t)GetProcAddress((HMODULE)s_pXInputDLL, "XInputGetCapabilities"); | ||||||
|     SDL_XInputGetBatteryInformation = (XInputGetBatteryInformation_t)GetProcAddress( (HMODULE)s_pXInputDLL, "XInputGetBatteryInformation" ); |     SDL_XInputGetBatteryInformation = (XInputGetBatteryInformation_t)GetProcAddress((HMODULE)s_pXInputDLL, "XInputGetBatteryInformation"); | ||||||
|     if (SDL_XInputGetState == NULL || SDL_XInputSetState == NULL || SDL_XInputGetCapabilities == NULL) { |     if (SDL_XInputGetState == NULL || SDL_XInputSetState == NULL || SDL_XInputGetCapabilities == NULL) { | ||||||
|         WIN_UnloadXInputDLL(); |         WIN_UnloadXInputDLL(); | ||||||
|         return -1; |         return -1; | ||||||
| @@ -124,8 +120,7 @@ WIN_LoadXInputDLL(void) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void WIN_UnloadXInputDLL(void) | ||||||
| WIN_UnloadXInputDLL(void) |  | ||||||
| { | { | ||||||
|     if (s_pXInputDLL) { |     if (s_pXInputDLL) { | ||||||
|         SDL_assert(s_XInputDLLRefCount > 0); |         SDL_assert(s_XInputDLLRefCount > 0); | ||||||
|   | |||||||
| @@ -39,7 +39,7 @@ using namespace XInputOnGameInput; | |||||||
| #define XUSER_MAX_COUNT 4 | #define XUSER_MAX_COUNT 4 | ||||||
| #endif | #endif | ||||||
| #ifndef XUSER_INDEX_ANY | #ifndef XUSER_INDEX_ANY | ||||||
| #define XUSER_INDEX_ANY     0x000000FF | #define XUSER_INDEX_ANY 0x000000FF | ||||||
| #endif | #endif | ||||||
| #ifndef XINPUT_CAPS_FFB_SUPPORTED | #ifndef XINPUT_CAPS_FFB_SUPPORTED | ||||||
| #define XINPUT_CAPS_FFB_SUPPORTED 0x0001 | #define XINPUT_CAPS_FFB_SUPPORTED 0x0001 | ||||||
| @@ -131,29 +131,29 @@ using namespace XInputOnGameInput; | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef BATTERY_DEVTYPE_GAMEPAD | #ifndef BATTERY_DEVTYPE_GAMEPAD | ||||||
| #define BATTERY_DEVTYPE_GAMEPAD         0x00 | #define BATTERY_DEVTYPE_GAMEPAD 0x00 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef BATTERY_TYPE_DISCONNECTED | #ifndef BATTERY_TYPE_DISCONNECTED | ||||||
| #define BATTERY_TYPE_DISCONNECTED       0x00 | #define BATTERY_TYPE_DISCONNECTED 0x00 | ||||||
| #endif | #endif | ||||||
| #ifndef BATTERY_TYPE_WIRED | #ifndef BATTERY_TYPE_WIRED | ||||||
| #define BATTERY_TYPE_WIRED              0x01 | #define BATTERY_TYPE_WIRED 0x01 | ||||||
| #endif | #endif | ||||||
| #ifndef BATTERY_TYPE_UNKNOWN | #ifndef BATTERY_TYPE_UNKNOWN | ||||||
| #define BATTERY_TYPE_UNKNOWN            0xFF | #define BATTERY_TYPE_UNKNOWN 0xFF | ||||||
| #endif | #endif | ||||||
| #ifndef BATTERY_LEVEL_EMPTY | #ifndef BATTERY_LEVEL_EMPTY | ||||||
| #define BATTERY_LEVEL_EMPTY             0x00 | #define BATTERY_LEVEL_EMPTY 0x00 | ||||||
| #endif | #endif | ||||||
| #ifndef BATTERY_LEVEL_LOW | #ifndef BATTERY_LEVEL_LOW | ||||||
| #define BATTERY_LEVEL_LOW               0x01 | #define BATTERY_LEVEL_LOW 0x01 | ||||||
| #endif | #endif | ||||||
| #ifndef BATTERY_LEVEL_MEDIUM | #ifndef BATTERY_LEVEL_MEDIUM | ||||||
| #define BATTERY_LEVEL_MEDIUM            0x02 | #define BATTERY_LEVEL_MEDIUM 0x02 | ||||||
| #endif | #endif | ||||||
| #ifndef BATTERY_LEVEL_FULL | #ifndef BATTERY_LEVEL_FULL | ||||||
| #define BATTERY_LEVEL_FULL              0x03 | #define BATTERY_LEVEL_FULL 0x03 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Set up for C function definitions, even when using C++ */ | /* Set up for C function definitions, even when using C++ */ | ||||||
| @@ -222,31 +222,26 @@ typedef struct | |||||||
| #endif /* HAVE_XINPUT_H */ | #endif /* HAVE_XINPUT_H */ | ||||||
|  |  | ||||||
| /* Forward decl's for XInput API's we load dynamically and use if available */ | /* Forward decl's for XInput API's we load dynamically and use if available */ | ||||||
| typedef DWORD (WINAPI *XInputGetState_t) | typedef DWORD(WINAPI *XInputGetState_t)( | ||||||
|     ( |     DWORD dwUserIndex,      /* [in] Index of the gamer associated with the device */ | ||||||
|     DWORD         dwUserIndex,  /* [in] Index of the gamer associated with the device */ |     XINPUT_STATE_EX *pState /* [out] Receives the current state */ | ||||||
|     XINPUT_STATE_EX* pState     /* [out] Receives the current state */ | ); | ||||||
|     ); |  | ||||||
|  |  | ||||||
| typedef DWORD (WINAPI *XInputSetState_t) | typedef DWORD(WINAPI *XInputSetState_t)( | ||||||
|     ( |     DWORD dwUserIndex,           /* [in] Index of the gamer associated with the device */ | ||||||
|     DWORD             dwUserIndex,  /* [in] Index of the gamer associated with the device */ |     XINPUT_VIBRATION *pVibration /* [in, out] The vibration information to send to the controller */ | ||||||
|     XINPUT_VIBRATION* pVibration    /* [in, out] The vibration information to send to the controller */ | ); | ||||||
|     ); |  | ||||||
|  |  | ||||||
| typedef DWORD (WINAPI *XInputGetCapabilities_t) | typedef DWORD(WINAPI *XInputGetCapabilities_t)( | ||||||
|     ( |     DWORD dwUserIndex,                 /* [in] Index of the gamer associated with the device */ | ||||||
|     DWORD                dwUserIndex,   /* [in] Index of the gamer associated with the device */ |     DWORD dwFlags,                     /* [in] Input flags that identify the device type */ | ||||||
|     DWORD                dwFlags,       /* [in] Input flags that identify the device type */ |     XINPUT_CAPABILITIES *pCapabilities /* [out] Receives the capabilities */ | ||||||
|     XINPUT_CAPABILITIES* pCapabilities  /* [out] Receives the capabilities */ | ); | ||||||
|     ); |  | ||||||
|  |  | ||||||
| typedef DWORD (WINAPI *XInputGetBatteryInformation_t) | typedef DWORD(WINAPI *XInputGetBatteryInformation_t)( | ||||||
|     ( |     DWORD dwUserIndex, | ||||||
|     DWORD                         dwUserIndex, |     BYTE devType, | ||||||
|     BYTE                          devType, |     XINPUT_BATTERY_INFORMATION_EX *pBatteryInformation); | ||||||
|     XINPUT_BATTERY_INFORMATION_EX *pBatteryInformation |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
| extern int WIN_LoadXInputDLL(void); | extern int WIN_LoadXInputDLL(void); | ||||||
| extern void WIN_UnloadXInputDLL(void); | extern void WIN_UnloadXInputDLL(void); | ||||||
| @@ -255,17 +250,17 @@ extern XInputGetState_t SDL_XInputGetState; | |||||||
| extern XInputSetState_t SDL_XInputSetState; | extern XInputSetState_t SDL_XInputSetState; | ||||||
| extern XInputGetCapabilities_t SDL_XInputGetCapabilities; | extern XInputGetCapabilities_t SDL_XInputGetCapabilities; | ||||||
| extern XInputGetBatteryInformation_t SDL_XInputGetBatteryInformation; | extern XInputGetBatteryInformation_t SDL_XInputGetBatteryInformation; | ||||||
| extern DWORD SDL_XInputVersion;  /* ((major << 16) & 0xFF00) | (minor & 0xFF) */ | extern DWORD SDL_XInputVersion; /* ((major << 16) & 0xFF00) | (minor & 0xFF) */ | ||||||
|  |  | ||||||
| /* Ends C function definitions when using C++ */ | /* Ends C function definitions when using C++ */ | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #define XINPUTGETSTATE          SDL_XInputGetState | #define XINPUTGETSTATE              SDL_XInputGetState | ||||||
| #define XINPUTSETSTATE          SDL_XInputSetState | #define XINPUTSETSTATE              SDL_XInputSetState | ||||||
| #define XINPUTGETCAPABILITIES   SDL_XInputGetCapabilities | #define XINPUTGETCAPABILITIES       SDL_XInputGetCapabilities | ||||||
| #define XINPUTGETBATTERYINFORMATION   SDL_XInputGetBatteryInformation | #define XINPUTGETBATTERYINFORMATION SDL_XInputGetBatteryInformation | ||||||
|  |  | ||||||
| #endif /* SDL_xinput_h_ */ | #endif /* SDL_xinput_h_ */ | ||||||
|  |  | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Sam Lantinga
					Sam Lantinga