Skip to content
Permalink
Browse files

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
  • Loading branch information
gabomdq committed Jun 8, 2014
1 parent 5ae12b4 commit efa2d0581d0e6de9b6e61700083e7b6d7263580a
@@ -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)

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

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 $? "
@@ -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([
@@ -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
@@ -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
@@ -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),
@@ -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__ */
@@ -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);
@@ -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
@@ -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");
@@ -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];

0 comments on commit efa2d05

Please sign in to comment.