Skip to content

Commit

Permalink
Fixes audio for Native Client, and other fixes...
Browse files Browse the repository at this point in the history
- 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 efa2d05
Show file tree
Hide file tree
Showing 11 changed files with 147 additions and 33 deletions.
17 changes: 16 additions & 1 deletion README-nacl.txt
Expand Up @@ -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 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). 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 TODO - Known Issues
================================================================================ ================================================================================
* Audio backend is not usable yet.
* Testing of all systems with a real application (something other than SDL's tests) * Testing of all systems with a real application (something other than SDL's tests)


12 changes: 11 additions & 1 deletion configure
Expand Up @@ -23211,14 +23211,24 @@ $as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h
CheckDummyAudio CheckDummyAudio
CheckDummyVideo CheckDummyVideo
CheckInputEvents CheckInputEvents
CheckPTHREAD

# Set up files for the timer library # Set up files for the timer library
if test x$enable_timers = xyes; then if test x$enable_timers = xyes; then
$as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h $as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h


SOURCES="$SOURCES $srcdir/src/timer/unix/*.c" SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
have_timers=yes have_timers=yes
fi 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 $? " as_fn_error $? "
Expand Down
10 changes: 9 additions & 1 deletion configure.in
Expand Up @@ -3151,13 +3151,21 @@ AC_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau
CheckDummyAudio CheckDummyAudio
CheckDummyVideo CheckDummyVideo
CheckInputEvents CheckInputEvents
CheckPTHREAD

# Set up files for the timer library # Set up files for the timer library
if test x$enable_timers = xyes; then if test x$enable_timers = xyes; then
AC_DEFINE(SDL_TIMER_UNIX) AC_DEFINE(SDL_TIMER_UNIX)
SOURCES="$SOURCES $srcdir/src/timer/unix/*.c" SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
have_timers=yes have_timers=yes
fi 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([ AC_MSG_ERROR([
Expand Down
1 change: 1 addition & 0 deletions include/SDL_config.h.in
Expand Up @@ -336,6 +336,7 @@
#undef SDL_FILESYSTEM_DUMMY #undef SDL_FILESYSTEM_DUMMY
#undef SDL_FILESYSTEM_UNIX #undef SDL_FILESYSTEM_UNIX
#undef SDL_FILESYSTEM_WINDOWS #undef SDL_FILESYSTEM_WINDOWS
#undef SDL_FILESYSTEM_NACL


/* Enable assembly routines */ /* Enable assembly routines */
#undef SDL_ASSEMBLY_ROUTINES #undef SDL_ASSEMBLY_ROUTINES
Expand Down
16 changes: 16 additions & 0 deletions include/SDL_system.h
Expand Up @@ -179,6 +179,22 @@ extern DECLSPEC const char * SDLCALL SDL_WinRTGetFSPathUTF8(SDL_WinRT_Path pathT


#endif /* __WINRT__ */ #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++ */ /* Ends C function definitions when using C++ */
#ifdef __cplusplus #ifdef __cplusplus
Expand Down
28 changes: 20 additions & 8 deletions src/audio/nacl/SDL_naclaudio.c
Expand Up @@ -49,15 +49,24 @@ static void nacl_audio_callback(void* samples, uint32_t buffer_size, PP_TimeDelt
SDL_AudioDevice* _this = (SDL_AudioDevice*) data; SDL_AudioDevice* _this = (SDL_AudioDevice*) data;


SDL_LockMutex(private->mutex); SDL_LockMutex(private->mutex);
/*if (private->opened) {*/
SDL_memset(samples, _this->spec.silence, buffer_size); if (_this->enabled && !_this->paused) {
SDL_LockMutex(_this->mixer_lock); if (_this->convert.needed) {
(*_this->spec.callback)(_this->spec.userdata, (Uint8*)samples, buffer_size); SDL_LockMutex(_this->mixer_lock);
SDL_UnlockMutex(_this->mixer_lock); (*_this->spec.callback) (_this->spec.userdata,
/*} else { (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_memset(samples, 0, buffer_size);
}*/ }
SDL_UnlockMutex(private->mutex);


return; return;
} }
Expand Down Expand Up @@ -93,6 +102,9 @@ NACLAUD_OpenDevice(_THIS, const char *devname, int iscapture) {
PP_AUDIOSAMPLERATE_44100, PP_AUDIOSAMPLERATE_44100,
SAMPLE_FRAME_COUNT); SAMPLE_FRAME_COUNT);


/* Calculate the final parameters for this audio specification */
SDL_CalculateAudioSpec(&_this->spec);

private->audio = ppb_audio->Create( private->audio = ppb_audio->Create(
instance, instance,
ppb_audiocfg->CreateStereo16Bit(instance, PP_AUDIOSAMPLERATE_44100, _this->spec.samples), ppb_audiocfg->CreateStereo16Bit(instance, PP_AUDIOSAMPLERATE_44100, _this->spec.samples),
Expand Down
59 changes: 59 additions & 0 deletions 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__ */
13 changes: 13 additions & 0 deletions src/main/nacl/SDL_nacl_main.c
Expand Up @@ -24,6 +24,7 @@


/* Include the SDL main definition header */ /* Include the SDL main definition header */
#include "SDL_main.h" #include "SDL_main.h"
#include "SDL_system.h"


#include "ppapi_simple/ps_main.h" #include "ppapi_simple/ps_main.h"
#include "ppapi_simple/ps_event.h" #include "ppapi_simple/ps_event.h"
Expand Down Expand Up @@ -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 */ /* Everything is ready, start the user main function */
SDL_SetMainReady(); SDL_SetMainReady();
status = SDL_main(argc, argv); status = SDL_main(argc, argv);
Expand Down
4 changes: 2 additions & 2 deletions test/nacl/Makefile
Expand Up @@ -13,8 +13,8 @@ include $(NACL_SDK_ROOT)/tools/common.mk


TARGET = sdl_app TARGET = sdl_app
DEPS = ppapi_simple nacl_io DEPS = ppapi_simple nacl_io
# ppapi_simple ends up being listed twice due to dependency solving issues -- Gabriel # ppapi_simple and SDL2 end up being listed twice due to dependency solving issues -- Gabriel
LIBS = SDL2_test SDL2 ppapi_simple SDL2main $(DEPS) ppapi_gles2 ppapi_cpp ppapi pthread LIBS = SDL2_test SDL2 ppapi_simple SDL2main SDL2 $(DEPS) ppapi_gles2 ppapi_cpp ppapi pthread


CFLAGS := -Wall CFLAGS := -Wall
SOURCES ?= testgles2.c SOURCES ?= testgles2.c
Expand Down
10 changes: 0 additions & 10 deletions test/testmultiaudio.c
Expand Up @@ -134,16 +134,6 @@ main(int argc, char **argv)


SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver()); 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); devcount = SDL_GetNumAudioDevices(0);
if (devcount < 1) { if (devcount < 1) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Don't see any specific audio devices!\n"); SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Don't see any specific audio devices!\n");
Expand Down
10 changes: 0 additions & 10 deletions test/testrendercopyex.c
Expand Up @@ -161,16 +161,6 @@ main(int argc, char *argv[])
quit(2); 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); drawstates = SDL_stack_alloc(DrawState, state->num_windows);
for (i = 0; i < state->num_windows; ++i) { for (i = 0; i < state->num_windows; ++i) {
DrawState *drawstate = &drawstates[i]; DrawState *drawstate = &drawstates[i];
Expand Down

0 comments on commit efa2d05

Please sign in to comment.