This commit is contained in:
Nicolas Allemand 2018-12-04 19:20:16 +01:00 коммит произвёл Alon Zakai
Родитель 91d52039f3
Коммит 2e27745ef2
16 изменённых файлов: 125 добавлений и 42 удалений

Просмотреть файл

@ -374,3 +374,4 @@ a license to everyone to use it as detailed in LICENSE.)
* Kirill Smelkov <kirr@nexedi.com> (copyright owned by Nexedi)
* Lutz Hören <laitch383@gmail.com>
* Pedro K Custodio <git@pedrokcustodio.com>
* Nicolas Allemand <contact@nicolasallemand.com>

Просмотреть файл

@ -55,6 +55,7 @@ Available operations and tasks:
ogg
sdl2
sdl2-image
sdl2-mixer
sdl2-ttf
sdl2-net
vorbis
@ -102,7 +103,7 @@ CXX_WITH_STDLIB = '''
'''
SYSTEM_TASKS = ['compiler-rt', 'libc', 'libc-mt', 'libc-extras', 'emmalloc', 'emmalloc_debug', 'dlmalloc', 'dlmalloc_threadsafe', 'pthreads', 'dlmalloc_debug', 'dlmalloc_threadsafe_debug', 'libcxx', 'libcxx_noexcept', 'libcxxabi', 'html5']
USER_TASKS = ['al', 'gl', 'binaryen', 'bullet', 'freetype', 'icu', 'libpng', 'ogg', 'sdl2', 'sdl2-gfx', 'sdl2-image', 'sdl2-ttf', 'sdl2-net', 'vorbis', 'zlib']
USER_TASKS = ['al', 'gl', 'binaryen', 'bullet', 'freetype', 'icu', 'libpng', 'ogg', 'sdl2', 'sdl2-gfx', 'sdl2-image', 'sdl2-mixer', 'sdl2-ttf', 'sdl2-net', 'vorbis', 'zlib']
temp_files = shared.configuration.get_temp_files()
logger = logging.getLogger(__file__)
@ -254,6 +255,8 @@ def main():
build_port('sdl2-image', 'libsdl2_image.bc', ['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2'])
elif what == 'sdl2-net':
build_port('sdl2-net', 'libsdl2_net.bc', ['-s', 'USE_SDL=2', '-s', 'USE_SDL_NET=2'])
elif what == 'sdl2-mixer':
build_port('sdl2-mixer', 'libsdl2_mixer.a', ['-s', 'USE_SDL=2', '-s', 'USE_SDL_MIXER=2', '-s', 'USE_VORBIS=1'])
elif what == 'freetype':
build_port('freetype', 'libfreetype.a', ['-s', 'USE_FREETYPE=1'])
elif what == 'harfbuzz':

Просмотреть файл

@ -174,10 +174,11 @@ Another option is to implement needed C APIs as JavaScript libraries (see ``--js
What are my options for audio playback?
=======================================
Emscripten has partial support for SDL (1, not 2) audio, and OpenAL.
Emscripten has partial support for SDL1 and 2 audio, and OpenAL.
To use SDL audio, include it as ``#include <SDL/SDL_mixer.h>``. You can use it that way alongside SDL1, SDL2, or another library for platform integration.
To use SDL1 audio, include it as ``#include <SDL/SDL_mixer.h>``. You can use it that way alongside SDL1, SDL2, or another library for platform integration.
To use SDL2 audio, include it as ``#include <SDL2/SDL_mixer.h>`` and use `-s SDL_MIXER=2`. Format support is currently limited to OGG.
How can my compiled program access files?
=========================================

Просмотреть файл

@ -395,7 +395,7 @@ var FULL_ES2 = 0;
var GL_EMULATE_GLES_VERSION_STRING_FORMAT = 1;
// Some old Android WeChat (Chromium 37?) browser has a WebGL bug that it ignores
// the offset of a typed array view pointing to an ArrayBuffer. Set this to
// the offset of a typed array view pointing to an ArrayBuffer. Set this to
// 1 to enable a polyfill that works around the issue when it appears. This
// bug is only relevant to WebGL 1, the affected browsers do not support WebGL 2.
var WORKAROUND_OLD_WEBGL_UNIFORM_UPLOAD_IGNORED_OFFSET_BUG = 0;
@ -1070,6 +1070,10 @@ var USE_OGG = 0;
// 1 = use freetype from emscripten-ports
var USE_FREETYPE = 0;
// Specify the SDL_mixer version that is being linked against.
// Doesn't *have* to match USE_SDL, but a good idea.
var USE_SDL_MIXER = 1;
// 1 = use harfbuzz from harfbuzz upstream
var USE_HARFBUZZ = 0;

43
tests/sdl2_mixer.c Normal file
Просмотреть файл

@ -0,0 +1,43 @@
#include <emscripten.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_mixer.h>
#define OGG_PATH "/sound.ogg"
Mix_Chunk *wave = NULL;
void sound_loop_then_quit() {
if (Mix_Playing(-1))
return;
printf("Done audio\n");
Mix_FreeChunk(wave);
Mix_CloseAudio();
emscripten_cancel_main_loop();
printf("Shutting down\n");
REPORT_RESULT(1);
}
int main(int argc, char* argv[]){
if (SDL_Init(SDL_INIT_AUDIO) < 0)
return -1;
int const frequency = EM_ASM_INT_V({
var context;
try {
context = new AudioContext();
} catch (e) {
context = new webkitAudioContext(); // safari only
}
return context.sampleRate;
});
if(Mix_OpenAudio(frequency, MIX_DEFAULT_FORMAT, 2, 1024) == -1)
return -1;
wave = Mix_LoadWAV(OGG_PATH);
if (wave == NULL)
return -1;
if (Mix_PlayChannel(-1, wave, 0) == -1)
return -1;
printf("Starting sound play loop\n");
emscripten_set_main_loop(sound_loop_then_quit, 0, 1);
return 0;
}

Просмотреть файл

@ -3064,6 +3064,11 @@ window.close = function() {
run_process([PYTHON, EMCC, 'test.o', '-s', 'USE_SDL=2', '-o', 'test.html'])
self.run_browser('test.html', '...', '/report_result?1')
@requires_sound_hardware
def test_sdl2_mixer(self):
shutil.copyfile(path_from_root('tests', 'sounds', 'alarmvictory_1.ogg'), os.path.join(self.get_dir(), 'sound.ogg'))
self.btest('sdl2_mixer.c', expected='1', args=['--preload-file', 'sound.ogg', '-s', 'USE_SDL=2', '-s', 'USE_SDL_MIXER=2', '-s', 'TOTAL_MEMORY=33554432'])
@requires_graphics_hardware
def test_cocos2d_hello(self):
cocos2d_root = os.path.join(system_libs.Ports.get_build_dir(), 'Cocos2d')

Просмотреть файл

@ -99,6 +99,13 @@ class interactive(BrowserCore):
Popen([PYTHON, EMCC, '-O2', '--closure', '1', '--minify', '0', os.path.join(self.get_dir(), 'sdl_audio_beep.cpp'), '-s', 'DISABLE_EXCEPTION_CATCHING=0', '-o', 'page.html']).communicate()
self.run_browser('page.html', '', '/report_result?1')
def test_sdl2_mixer(self):
shutil.copyfile(path_from_root('tests', 'sounds', 'alarmvictory_1.ogg'), os.path.join(self.get_dir(), 'sound.ogg'))
open(os.path.join(self.get_dir(), 'sdl2_mixer.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_mixer.c')).read()))
Popen([PYTHON, EMCC, '-O2', '--minify', '0', os.path.join(self.get_dir(), 'sdl2_mixer.c'), '-s', 'USE_SDL=2', '-s', 'USE_SDL_MIXER=2', '-s', 'TOTAL_MEMORY=33554432', '--preload-file', 'sound.ogg', '-o', 'page.html']).communicate()
self.run_browser('page.html', '', '/report_result?1')
def zzztest_sdl2_audio_beeps(self):
open(os.path.join(self.get_dir(), 'sdl2_audio_beep.cpp'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl2_audio_beep.cpp')).read()))

Просмотреть файл

@ -748,6 +748,7 @@ fi
([PYTHON, EMBUILDER, 'build', 'icu'], ['building and verifying icu', 'success'], True, ['icu.bc']),
([PYTHON, EMBUILDER, 'build', 'sdl2-ttf'], ['building and verifying sdl2-ttf', 'success'], True, ['sdl2-ttf.bc']),
([PYTHON, EMBUILDER, 'build', 'sdl2-net'], ['building and verifying sdl2-net', 'success'], True, ['sdl2-net.bc']),
([PYTHON, EMBUILDER, 'build', 'sdl2-mixer'], ['building and verifying sdl2-mixer', 'success'], True, ['sdl2-mixer.bc']),
([PYTHON, EMBUILDER, 'build', 'binaryen'], ['building and verifying binaryen', 'success'], True, []),
([PYTHON, EMBUILDER, 'build', 'cocos2d'], ['building and verifying cocos2d', 'success'], True, ['libCocos2d.bc']),
([PYTHON, EMBUILDER, 'build', 'wasm-libc'], ['building and verifying wasm-libc', 'success'], True, ['wasm-libc.bc']),

Просмотреть файл

@ -3,10 +3,10 @@
# University of Illinois/NCSA Open Source License. Both these licenses can be
# found in the LICENSE file.
from . import binaryen, bullet, cocos2d, freetype, harfbuzz, icu, libpng, ogg, sdl, sdl_gfx, sdl_image, sdl_ttf, sdl_net, vorbis, zlib
from . import binaryen, bullet, cocos2d, freetype, harfbuzz, icu, libpng, ogg, sdl, sdl_gfx, sdl_image, sdl_mixer, sdl_ttf, sdl_net, vorbis, zlib
# If port A depends on port B, then A should be _after_ B
ports = [icu, zlib, libpng, sdl, sdl_image, sdl_gfx, ogg, vorbis, bullet, freetype, harfbuzz, sdl_ttf, sdl_net, binaryen, cocos2d]
ports = [icu, zlib, libpng, sdl, sdl_image, sdl_gfx, ogg, vorbis, sdl_mixer, bullet, freetype, harfbuzz, sdl_ttf, sdl_net, binaryen, cocos2d]
ports_by_name = {}
for port in ports:

Просмотреть файл

@ -7,16 +7,6 @@ import os, shutil, logging, subprocess, sys, stat
TAG = 'version_1'
def build_with_configure(ports, shared, path): # not currently used
if not sys.platform.startswith('win'): #TODO: test on windows
autogen_path = os.path.join(path, 'bullet', 'autogen.sh')
os.chmod(autogen_path, os.stat(autogen_path).st_mode | 0o111) # Make executable
subprocess.Popen(["sh", "autogen.sh"], cwd=os.path.join(path, 'bullet')).wait()
subprocess.Popen(["python", "make.py"], cwd=path).wait()
final = os.path.join(path, 'libbullet.bc')
shutil.copyfile(os.path.join(path, 'bullet', 'build', 'libbullet.bc'), final)
return final
def get(ports, settings, shared):
if settings.USE_BULLET == 1:
ports.fetch_project('bullet', 'https://github.com/emscripten-ports/bullet/archive/' + TAG + '.zip', 'Bullet-' + TAG)

Просмотреть файл

@ -7,22 +7,6 @@ import os, shutil, logging
TAG = 'version_15'
def get_with_configure(ports, settings, shared): # not currently used; no real need for configure on emscripten users' machines!
if settings.USE_SDL == 2:
ports.fetch_project('sdl2', 'https://github.com/emscripten-ports/SDL2/archive/' + TAG + '.zip', 'SDL2-' + TAG)
def setup_includes():
# copy includes to a location so they can be used as 'SDL2/'
include_path = os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2', 'include')
shared.try_delete(os.path.join(include_path, 'SDL2'))
shutil.copytree(include_path, os.path.join(include_path, 'SDL2'))
ret = [ports.build_project('sdl2', 'SDL2-' + TAG,
['sh', './configure', '--host=asmjs-unknown-emscripten', '--disable-assembly', '--disable-threads', '--enable-cpuinfo=false', 'CFLAGS=-O2'],
[os.path.join('build', '.libs', 'libSDL2.a')],
setup_includes)]
return ret
else:
return []
def get(ports, settings, shared):
if settings.USE_SDL == 2:
# SDL2 uses some things on the Module object, make sure they are exported

Просмотреть файл

@ -13,6 +13,8 @@ def get(ports, settings, shared):
assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_image'
ports.fetch_project('sdl2-image', 'https://github.com/emscripten-ports/SDL2_image/archive/' + TAG + '.zip', 'SDL2_image-' + TAG)
def create():
# although we shouldn't really do this and could instead use '-Xclang -isystem' as a kind of 'overlay' as sdl_mixer does,
# by now people may be relying on headers being pulled in by '-s USE_SDL=2' if sdl_image was built in the past
shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-' + TAG, 'SDL_image.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL_image.h'))
shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-image', 'SDL2_image-' + TAG, 'SDL_image.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL2', 'SDL_image.h'))
srcs = 'IMG.c IMG_bmp.c IMG_gif.c IMG_jpg.c IMG_lbm.c IMG_pcx.c IMG_png.c IMG_pnm.c IMG_tga.c IMG_tif.c IMG_xcf.c IMG_xpm.c IMG_xv.c IMG_webp.c IMG_ImageIO.m'.split(' ')

48
tools/ports/sdl_mixer.py Normal file
Просмотреть файл

@ -0,0 +1,48 @@
import os, shutil, logging
import stat
TAG = 'release-2.0.1'
def get(ports, settings, shared):
if settings.USE_SDL_MIXER == 2:
sdl_build = os.path.join(ports.get_build_dir(), 'sdl2')
assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_mixer'
ports.fetch_project('sdl2-mixer', 'https://github.com/emscripten-ports/SDL2_mixer/archive/' + TAG + '.zip', 'SDL2_mixer-' + TAG)
def create():
cwd = os.getcwd()
commonflags = ['--disable-shared', '--disable-music-cmd', '--enable-sdltest', '--disable-smpegtest']
formatflags = ['--disable-music-wave', '--disable-music-mod', '--disable-music-midi', '--enable-music-ogg', '--disable-music-ogg-shared', '--disable-music-flac', '--disable-music-mp3']
configure = os.path.join(ports.get_dir(), 'sdl2-mixer', 'SDL2_mixer-' + TAG, 'configure')
build_dir = os.path.join(ports.get_build_dir(), 'sdl2-mixer')
dist_dir = os.path.join(ports.get_build_dir(), 'sdl2-mixer', 'dist')
out = os.path.join(dist_dir, 'lib', 'libSDL2_mixer.a')
final = os.path.join(ports.get_build_dir(), 'sdl2-mixer', 'libsdl2_mixer.a')
shared.safe_ensure_dirs(build_dir)
try:
os.chdir(build_dir)
os.chmod(configure, os.stat(configure).st_mode | stat.S_IEXEC)
ports.run_commands([[shared.EMCONFIGURE, configure, '--prefix=' + dist_dir] + formatflags + commonflags + ['CFLAGS=-s USE_VORBIS=1']])
ports.run_commands([[shared.EMMAKE, 'make', 'install']])
shutil.copyfile(out, final)
finally:
os.chdir(cwd)
return final
return [shared.Cache.get('sdl2-mixer', create, what='port')]
else:
return []
def process_dependencies(settings):
if settings.USE_SDL_MIXER == 2:
settings.USE_SDL = 2
settings.USE_VORBIS = 1
def process_args(ports, args, settings, shared):
if settings.USE_SDL_MIXER == 2:
get(ports, settings, shared)
args += ['-Xclang', '-isystem' + os.path.join(shared.Cache.get_path('ports-builds'), 'sdl2-mixer', 'dist', 'include')]
return args
def show():
return 'SDL2_mixer (USE_SDL_MIXER=2; zlib license)'

Просмотреть файл

@ -14,6 +14,8 @@ def get(ports, settings, shared):
ports.fetch_project('sdl2-net', 'https://github.com/emscripten-ports/SDL2_net/archive/' + TAG + '.zip', 'SDL2_net-' + TAG)
def create():
logging.info('building port: sdl2-net')
# although we shouldn't really do this and could instead use '-Xclang -isystem' as a kind of 'overlay' as sdl_mixer does,
# by now people may be relying on headers being pulled in by '-s USE_SDL=2' if sdl_net was built in the past
shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-net', 'SDL2_net-' + TAG, 'SDL_net.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL_net.h'))
shutil.copyfile(os.path.join(ports.get_dir(), 'sdl2-net', 'SDL2_net-' + TAG, 'SDL_net.h'), os.path.join(ports.get_build_dir(), 'sdl2', 'include', 'SDL2', 'SDL_net.h'))
srcs = 'SDLnet.c SDLnetselect.c SDLnetTCP.c SDLnetUDP.c'.split(' ')

Просмотреть файл

@ -8,15 +8,6 @@ from subprocess import Popen
TAG = 'version_1'
def get_with_configure(ports, settings, shared):
if settings.USE_ZLIB == 1:
ports.fetch_project('zlib', 'https://github.com/emscripten-ports/zlib/archive/' + TAG + '.zip', 'zlib-' + TAG)
return [ports.build_project('zlib', 'zlib-' + TAG,
['sh', './configure'],
['libz.a'])]
else:
return []
def get(ports, settings, shared):
if settings.USE_ZLIB == 1:
ports.fetch_project('zlib', 'https://github.com/emscripten-ports/zlib/archive/' + TAG + '.zip', 'zlib-' + TAG)

Просмотреть файл

@ -784,7 +784,8 @@ EMAR = path_from_root('emar.py')
EMRANLIB = path_from_root('emranlib')
EMCONFIG = path_from_root('em-config')
EMLINK = path_from_root('emlink.py')
EMMAKEN = path_from_root('tools', 'emmaken.py')
EMCONFIGURE = path_from_root('emconfigure.py')
EMMAKE = path_from_root('emmake.py')
AUTODEBUGGER = path_from_root('tools', 'autodebugger.py')
EXEC_LLVM = path_from_root('tools', 'exec_llvm.py')
FILE_PACKAGER = path_from_root('tools', 'file_packager.py')