Commit efa2d0581d0e6de9b6e61700083e7b6d7263580a

Gabriel Jacobo 2014-06-08T18:18:13

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

diff --git a/README-nacl.txt b/README-nacl.txt
index f2e5622..c9adb2e 100644
--- a/README-nacl.txt
+++ b/README-nacl.txt
@@ -53,8 +53,23 @@ 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 b8cada0..ef7aaaa 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 4f9909c..dc789d3 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 53ecfcb..79e3b68 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 cf3937a..dcca8f3 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 8b62f60..d9179f2 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 0000000..802283b
--- /dev/null
+++ b/src/filesystem/nacl/SDL_sysfilesytem.c
@@ -0,0 +1,59 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
+
+  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 509f641..efa2d37 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 f09e83f..9ca166c 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 52c90c2..985c05a 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 086d64b..95a77a1 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];