From efa2d0581d0e6de9b6e61700083e7b6d7263580a Mon Sep 17 00:00:00 2001 From: Gabriel Jacobo Date: Sun, 8 Jun 2014 18:18:13 -0300 Subject: [PATCH] Fixes audio for Native Client, and other fixes... - SDL_NaClMount, SDL_NaClUmount - Default mounting of https at / in SDL's main function - More documentation in README-nacl.txt --- README-nacl.txt | 17 +++++++- configure | 12 +++++- configure.in | 10 ++++- include/SDL_config.h.in | 1 + include/SDL_system.h | 16 +++++++ src/audio/nacl/SDL_naclaudio.c | 28 ++++++++---- src/filesystem/nacl/SDL_sysfilesytem.c | 59 ++++++++++++++++++++++++++ src/main/nacl/SDL_nacl_main.c | 13 ++++++ test/nacl/Makefile | 4 +- test/testmultiaudio.c | 10 ----- test/testrendercopyex.c | 10 ----- 11 files changed, 147 insertions(+), 33 deletions(-) create mode 100644 src/filesystem/nacl/SDL_sysfilesytem.c diff --git a/README-nacl.txt b/README-nacl.txt index f2e562264fe80..c9adb2e1936c0 100644 --- a/README-nacl.txt +++ b/README-nacl.txt @@ -52,9 +52,24 @@ If you want to build a different test, for example testrendercopyex.c: Once the build finishes, you have to serve the contents with a web server (the script will give you instructions on how to do that with Python). +================================================================================ +RWOps and nacl_io +================================================================================ + +SDL_RWops work transparently with nacl_io. Two functions are provided to control +mount points: + + + For convenience, SDL will by default +mount an httpfs tree at / before calling the app's main function. Such setting +can be overriden by calling SDL_NaCl + +For more information on how nacl_io and mount points work, see: + + https://developer.chrome.com/native-client/devguide/coding/nacl_io + ================================================================================ TODO - Known Issues ================================================================================ -* Audio backend is not usable yet. * Testing of all systems with a real application (something other than SDL's tests) diff --git a/configure b/configure index b8cada0a6a008..ef7aaaadbb9be 100755 --- a/configure +++ b/configure @@ -23211,6 +23211,8 @@ $as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h CheckDummyAudio CheckDummyVideo CheckInputEvents + CheckPTHREAD + # Set up files for the timer library if test x$enable_timers = xyes; then $as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h @@ -23218,7 +23220,15 @@ $as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h SOURCES="$SOURCES $srcdir/src/timer/unix/*.c" have_timers=yes fi - CheckPTHREAD + + if test x$enable_filesystem = xyes; then + +$as_echo "#define SDL_FILESYSTEM_NACL 1" >>confdefs.h + + SOURCES="$SOURCES $srcdir/src/filesystem/nacl/*.c" + have_filesystem=yes + fi + ;; *) as_fn_error $? " diff --git a/configure.in b/configure.in index 4f9909c260c51..dc789d37694e4 100644 --- a/configure.in +++ b/configure.in @@ -3151,13 +3151,21 @@ AC_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau CheckDummyAudio CheckDummyVideo CheckInputEvents + CheckPTHREAD + # Set up files for the timer library if test x$enable_timers = xyes; then AC_DEFINE(SDL_TIMER_UNIX) SOURCES="$SOURCES $srcdir/src/timer/unix/*.c" have_timers=yes fi - CheckPTHREAD + + if test x$enable_filesystem = xyes; then + AC_DEFINE(SDL_FILESYSTEM_NACL, 1, [ ]) + SOURCES="$SOURCES $srcdir/src/filesystem/nacl/*.c" + have_filesystem=yes + fi + ;; *) AC_MSG_ERROR([ diff --git a/include/SDL_config.h.in b/include/SDL_config.h.in index 53ecfcb19bed6..79e3b68783644 100644 --- a/include/SDL_config.h.in +++ b/include/SDL_config.h.in @@ -336,6 +336,7 @@ #undef SDL_FILESYSTEM_DUMMY #undef SDL_FILESYSTEM_UNIX #undef SDL_FILESYSTEM_WINDOWS +#undef SDL_FILESYSTEM_NACL /* Enable assembly routines */ #undef SDL_ASSEMBLY_ROUTINES diff --git a/include/SDL_system.h b/include/SDL_system.h index cf3937ae702f3..dcca8f3b25c28 100644 --- a/include/SDL_system.h +++ b/include/SDL_system.h @@ -179,6 +179,22 @@ extern DECLSPEC const char * SDLCALL SDL_WinRTGetFSPathUTF8(SDL_WinRT_Path pathT #endif /* __WINRT__ */ +#ifdef __NACL__ + +/** + * \name Mount/umount functions + * + * Required for RWOps on Native Client + */ +/* @{ */ +extern DECLSPEC int SDLCALL SDL_NaClMount(const char* source, const char* target, + const char* filesystemtype, + unsigned long mountflags, const void *data); + +extern DECLSPEC int SDLCALL SDL_NaClUmount(const char *target); + +#endif /* __NACL__ */ + /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/src/audio/nacl/SDL_naclaudio.c b/src/audio/nacl/SDL_naclaudio.c index 8b62f60fd8793..d9179f2726cd7 100644 --- a/src/audio/nacl/SDL_naclaudio.c +++ b/src/audio/nacl/SDL_naclaudio.c @@ -49,15 +49,24 @@ static void nacl_audio_callback(void* samples, uint32_t buffer_size, PP_TimeDelt SDL_AudioDevice* _this = (SDL_AudioDevice*) data; SDL_LockMutex(private->mutex); - /*if (private->opened) {*/ - SDL_memset(samples, _this->spec.silence, buffer_size); - SDL_LockMutex(_this->mixer_lock); - (*_this->spec.callback)(_this->spec.userdata, (Uint8*)samples, buffer_size); - SDL_UnlockMutex(_this->mixer_lock); - /*} else { + + if (_this->enabled && !_this->paused) { + if (_this->convert.needed) { + SDL_LockMutex(_this->mixer_lock); + (*_this->spec.callback) (_this->spec.userdata, + (Uint8 *) _this->convert.buf, + _this->convert.len); + SDL_UnlockMutex(_this->mixer_lock); + SDL_ConvertAudio(&_this->convert); + SDL_memcpy(samples, _this->convert.buf, _this->convert.len_cvt); + } else { + SDL_LockMutex(_this->mixer_lock); + (*_this->spec.callback) (_this->spec.userdata, (Uint8 *) samples, buffer_size); + SDL_UnlockMutex(_this->mixer_lock); + } + } else { SDL_memset(samples, 0, buffer_size); - }*/ - SDL_UnlockMutex(private->mutex); + } return; } @@ -93,6 +102,9 @@ NACLAUD_OpenDevice(_THIS, const char *devname, int iscapture) { PP_AUDIOSAMPLERATE_44100, SAMPLE_FRAME_COUNT); + /* Calculate the final parameters for this audio specification */ + SDL_CalculateAudioSpec(&_this->spec); + private->audio = ppb_audio->Create( instance, ppb_audiocfg->CreateStereo16Bit(instance, PP_AUDIOSAMPLERATE_44100, _this->spec.samples), diff --git a/src/filesystem/nacl/SDL_sysfilesytem.c b/src/filesystem/nacl/SDL_sysfilesytem.c new file mode 100644 index 0000000000000..802283b76783f --- /dev/null +++ b/src/filesystem/nacl/SDL_sysfilesytem.c @@ -0,0 +1,59 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2014 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ +#include "../../SDL_internal.h" +#include "SDL_error.h" +#include "SDL_filesystem.h" + +#ifdef SDL_FILESYSTEM_NACL + +/* SDL_RWops on NACL are implemented using nacl_io, and require mount points + * to be established before actual file operations are performed + * + * Ref: https://developers.google.com/native-client/dev/devguide/coding/nacl_io + */ + +int +SDL_NaClMount(const char* source, const char* target, const char* filesystemtype, + unsigned long mountflags, const void *data) { + return mount(source, target, filesystemtype, mountflags, data); +} + +int +SDL_NaClUmount(const char *target) { + return umount(target); +} + + +char * +SDL_GetBasePath(void) +{ + SDL_Unsupported(); + return NULL; +} + +char * +SDL_GetPrefPath(const char *org, const char *app) +{ + SDL_Unsupported(); + return NULL; +} + +#endif /* __NACL__ */ \ No newline at end of file diff --git a/src/main/nacl/SDL_nacl_main.c b/src/main/nacl/SDL_nacl_main.c index 509f6415d9ba6..efa2d375f21af 100644 --- a/src/main/nacl/SDL_nacl_main.c +++ b/src/main/nacl/SDL_nacl_main.c @@ -24,6 +24,7 @@ /* Include the SDL main definition header */ #include "SDL_main.h" +#include "SDL_system.h" #include "ppapi_simple/ps_main.h" #include "ppapi_simple/ps_event.h" @@ -64,6 +65,18 @@ nacl_main(int argc, char *argv[]) } } + /* Do a default httpfs mount on /, + * apps can override this by unmounting / + * and remounting with the desired configuration + */ + SDL_NaClUmount("/"); + SDL_NaClMount( + "", /* source */ + "/", /* target */ + "httpfs", /* filesystemtype */ + 0, /* mountflags */ + ""); /* data specific to the html5fs type */ + /* Everything is ready, start the user main function */ SDL_SetMainReady(); status = SDL_main(argc, argv); diff --git a/test/nacl/Makefile b/test/nacl/Makefile index f09e83f0f336c..9ca166c12742e 100644 --- a/test/nacl/Makefile +++ b/test/nacl/Makefile @@ -13,8 +13,8 @@ include $(NACL_SDK_ROOT)/tools/common.mk TARGET = sdl_app DEPS = ppapi_simple nacl_io -# ppapi_simple ends up being listed twice due to dependency solving issues -- Gabriel -LIBS = SDL2_test SDL2 ppapi_simple SDL2main $(DEPS) ppapi_gles2 ppapi_cpp ppapi pthread +# ppapi_simple and SDL2 end up being listed twice due to dependency solving issues -- Gabriel +LIBS = SDL2_test SDL2 ppapi_simple SDL2main SDL2 $(DEPS) ppapi_gles2 ppapi_cpp ppapi pthread CFLAGS := -Wall SOURCES ?= testgles2.c diff --git a/test/testmultiaudio.c b/test/testmultiaudio.c index 52c90c27bbe80..985c05a73f4ed 100644 --- a/test/testmultiaudio.c +++ b/test/testmultiaudio.c @@ -134,16 +134,6 @@ main(int argc, char **argv) SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver()); - #if __NACL__ - SDL_RWUmount("/"); - SDL_RWMount( - "", /* source */ - "/", /* target */ - "httpfs", /* filesystemtype */ - 0, /* mountflags */ - ""); /* data specific to the html5fs type */ -#endif - devcount = SDL_GetNumAudioDevices(0); if (devcount < 1) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Don't see any specific audio devices!\n"); diff --git a/test/testrendercopyex.c b/test/testrendercopyex.c index 086d64b0b94cc..95a77a17f1550 100644 --- a/test/testrendercopyex.c +++ b/test/testrendercopyex.c @@ -161,16 +161,6 @@ main(int argc, char *argv[]) quit(2); } -#if __NACL__ - SDL_RWUmount("/"); - SDL_RWMount( - "", /* source */ - "/", /* target */ - "httpfs", /* filesystemtype */ - 0, /* mountflags */ - ""); /* data specific to the html5fs type */ -#endif - drawstates = SDL_stack_alloc(DrawState, state->num_windows); for (i = 0; i < state->num_windows; ++i) { DrawState *drawstate = &drawstates[i];