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
This commit is contained in:
Gabriel Jacobo 2014-06-08 18:18:13 -03:00
parent 5ae12b46b5
commit efa2d0581d
11 changed files with 147 additions and 33 deletions

View File

@ -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)

12
configure vendored
View File

@ -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 $? "

View File

@ -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([

View File

@ -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

View File

@ -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

View File

@ -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),

View File

@ -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__ */

View File

@ -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);

View File

@ -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

View File

@ -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");

View File

@ -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];