From 1e1f35db2f5e352aa4bf369d8d809de3529261f0 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Fri, 20 Mar 2026 16:52:27 +0800 Subject: [PATCH 1/9] Integrate soloud for soluna.audio --- .gitmodules | 3 + 3rd/ltask | 2 +- 3rd/soloud | 1 + Makefile | 10 +- asset/sounds.dl | 3 + asset/sounds/bloop_x.wav | Bin 0 -> 3854 bytes src/audio.c | 83 ++++ src/embedlua.c | 2 + src/lualib/main.lua | 4 + src/lualib/soluna.lua | 13 + src/luamods.c | 2 + src/service/audio.lua | 94 ++++ src/soloudcapi.h | 993 +++++++++++++++++++++++++++++++++++++++ src/soloudone.cpp | 63 +++ src/soloudwavonly.h | 70 +++ test/audio.lua | 14 + 16 files changed, 1354 insertions(+), 3 deletions(-) create mode 160000 3rd/soloud create mode 100644 asset/sounds.dl create mode 100644 asset/sounds/bloop_x.wav create mode 100644 src/audio.c create mode 100644 src/service/audio.lua create mode 100644 src/soloudcapi.h create mode 100644 src/soloudone.cpp create mode 100644 src/soloudwavonly.h create mode 100644 test/audio.lua diff --git a/.gitmodules b/.gitmodules index f8e219f..d5d176d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,6 @@ [submodule "bin/sokol-tools-bin"] path = bin/sokol-tools-bin url = https://github.com/floooh/sokol-tools-bin.git +[submodule "3rd/soloud"] + path = 3rd/soloud + url = https://github.com/jarikomppa/soloud.git diff --git a/3rd/ltask b/3rd/ltask index c9b75e9..1c08acb 160000 --- a/3rd/ltask +++ b/3rd/ltask @@ -1 +1 @@ -Subproject commit c9b75e9413d93f0074c4a8fc154fcc9e823611a5 +Subproject commit 1c08acb8beda2fb8178bff402d9a1a208f952fbb diff --git a/3rd/soloud b/3rd/soloud new file mode 160000 index 0000000..e82fd32 --- /dev/null +++ b/3rd/soloud @@ -0,0 +1 @@ +Subproject commit e82fd32c1f62183922f08c14c814a02b58db1873 diff --git a/Makefile b/Makefile index 3af379d..80a47c5 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,7 @@ all : $(BIN)/$(APPNAME) 3RDINC=-I3rd YOGAINC=-I3rd/yoga +SOLOUDINC=-I3rd/soloud/include -I3rd/soloud/src LUAINC=-I3rd/lua LUASRC:=$(wildcard 3rd/lua/*.c 3rd/lua/*.h) @@ -125,7 +126,7 @@ $(BUILD)/soluna_entry.o : src/entry.c src/version.h $(COMPILE_C) $(LUAINC) $(3RDINC) -DSOLUNA_HASH_VERSION=\"$(VERSION)\" $(BUILD)/soluna_%.o : src/%.c - $(COMPILE_C) $(LUAINC) $(3RDINC) $(SHADERINC) $(YOGAINC) $(ZLIBINC) + $(COMPILE_C) $(LUAINC) $(3RDINC) $(SHADERINC) $(YOGAINC) $(ZLIBINC) $(SOLOUDINC) $(BUILD)/platform_%.o : src/platform/windows/%.c $(COMPILE_C) $(LUAINC) $(3RDINC) $(SHADERINC) $(YOGAINC) $(ZLIBINC) -Isrc @@ -143,6 +144,11 @@ YOGASRC:=$(wildcard 3rd/yoga/yoga/*.cpp $(addsuffix *.cpp,$(wildcard 3rd/yoga/yo $(BUILD)/yoga.o : src/yogaone.cpp $(YOGASRC) $(CCPP) $(STDCPP) $(OUTPUT_O) $@ $< $(YOGAINC) $(CFLAGS) +SOLOUDSRC:=$(wildcard 3rd/soloud/src/core/*.cpp) + +$(BUILD)/soloud.o : src/soloudone.cpp $(SOLOUDSRC) src/soloudwavonly.h + $(CCPP) $(STDCPP) $(OUTPUT_O) $@ $< $(SOLOUDINC) $(CFLAGS) -DWITH_WINMM=1 + $(BUILD)/zlib_%.o : 3rd/zlib/%.c $(COMPILE_C) $(ZLIBINC) @@ -152,7 +158,7 @@ $(BUILD)/minizip_%.o : 3rd/zlib/contrib/minizip/%.c $(BUILD)/extlua_impl.o : extlua/extlua_impl.c $(COMPILE_C) $(LUAINC) -$(BIN)/$(APPNAME): $(MAIN_O) $(PLATFORM_O) $(EXTLUA_O) $(LTASK_O) $(LUA_O) $(DATALIST_O) $(BUILD)/yoga.o $(ZLIB_O) $(MINIZIP_O) +$(BIN)/$(APPNAME): $(MAIN_O) $(PLATFORM_O) $(EXTLUA_O) $(LTASK_O) $(LUA_O) $(DATALIST_O) $(BUILD)/yoga.o $(BUILD)/soloud.o $(ZLIB_O) $(MINIZIP_O) $(LD) $(OUTPUT_EXE) $@ $^ $(LDFLAGS) $(BIN)/sample.dll : extlua/extlua.c extlua/extlua_sample.c diff --git a/asset/sounds.dl b/asset/sounds.dl new file mode 100644 index 0000000..b3cf841 --- /dev/null +++ b/asset/sounds.dl @@ -0,0 +1,3 @@ +-- +name : bloop +filename : asset/sounds/bloop_x.wav diff --git a/asset/sounds/bloop_x.wav b/asset/sounds/bloop_x.wav new file mode 100644 index 0000000000000000000000000000000000000000..85bdb2f783d43b89c804b2f57859c4b23748d484 GIT binary patch literal 3854 zcmXw62~ZSSnr0$qCuUf7)cT)p^_#j zCg$1)_2q5uS7M!rnVvI^4)#>#H#9+|rv^t#*K?%Z4TdZJ+2bZ0^&1SJcFqmM6 zz%jtW35+0V*5+{f0`+wPkDVcmI*m%DRI0TG07FrXG_$P3;p7|+9#A+NZJ|v@#Go@E zxDf$EDuoImt@i4g`o_lkYCA=sMikZSb!wGTqtP2M!bF*^HmAq$_xn6f)?zkO@D{)> zff=+Kr9vW8AtsB<7p$$X_wx*eV<;>JqKBI*wN7V1Nt1=+c{^vNO|%uFv6)G@tw(Sg zUIC_4X$)qYx3;m~Yo~A&$BlY}L64v~7=TScP*$7W?sU00n}tA8A$VLTlWI`XSsyg( zwX!0ytFyhvZ6#4eEfY!PIuk=fTxt#FYiVx^utv4oXanClLup>Qk`8t?Qj(JF)T+SQ zEmXz>NN(fT%j`HR+|OYAOyuYc?LJz zEI0zM5hYBFySdYkiWE8solvRuIK@yVOeIk>oWs|^$~Dev3vCn?DIK9kjgxjVo7IR)wE6YzR3f{Qd-D7^#{IS+Mrz~X= zi>e;Jy=be-EYV>EX42;#I%a5nFpfrlo>23{EBE1*>zE&3@lxE3tI9-dP;=;Dap38c za>JU;f&aK6jSD|=_WNGc(co0(7TUXAsXKB*-&`wN5rxkDwK-=)B=z(r$Fk$CU7 zrElMPjLIDBym#Gu$EKdjK3L4Yn=Sm856wS4Gge@Hk3Vif%B49^_%hA&9~{g6bbR)| zTXOZiBQ=NCWcS{wj@_u4dRf2i|E7_cgVo6L;WYPYeB)dCz(19JksGQbtAjpKmMf%$>mEyAuAMl@}Pc?>kP zKoGbf2SBPgj*%pgEN%q$(gKg_wHmcnqfy8uVzC%lN~u&Rl`6FwK1V$Q`ipHbgR|LKmIhOxw+I3& zsg#RlN;O!MLTu&b$15sIOG`@fa*IStg;cCmtE5tyTrQQXj0AyVKpPei4TsZP7Ya3a zYwBCTN~qcEX*zfLY6z*fDZ6K$jRlGJamO+5H=|Xm@td-* zswb`wwCZ&o{x1_wj1=#p&x<3APkIrmXlouH`@VQ6^ABm=ng5y;(q~eIi@vNcUS%4s zSZuyh6z;vwDEdq(j+=(`k=Np!C-)C){^zmx%&tN=|CzAZ9w;hfqNolnu zsUlRlRpQtj-5f|MP{nR5&smXb-?Jc3zWU2HHnBpRnr@Wk@l9gcNmo_qNh{XcM%A1T z_@+mg)~{{0SFhSTue5u5yKId;7}11QHJwDHxF)SYpO%ScMdqZh%k>}Mx-TmxGCymN zR1%x3`bysCD^|dg1q1q~K^=F2uKwF>b?v#X;K!5m)WZ6~8;^VmMwy+wu#Q zhjQx4q=dZG*yMv-GV@nNCP!!Z6;X%E3yXDC5*H(;P5S=3epPLA!`Z>$@Walop_;y* zp0@N1h6ejwOpeJO`8+*!cDHZGncq{*d2hp>VBQt1M24Ju0n8id?@nI%Y@QfgKT% zhe~B7Ir$Y5I7C=!Gk4?FItxo6<)z`1J=zI*$8YJZFNn+jmxAm zX-UqJy)lW!*;|*ci;juev1{jnEUB!pREc4f-Q{V#GCh9g^4r>r(2qa-~Rp1$m2IpCi>gD zM=rGo{9db}AWiB-zuLYdcKwp&>to`!ZHkFcO-s)%P%|GYPK|K@Pd zg(qLP)zo_p5^I||IWd37hifaO%fi-gTe2lvnYJspB2QA?A3)m&J4XKV=Lc7xOrE_y zbF()T;u+pci7IjqCKVowTD@-T?$qqK=zVD=s8wB}t3EL?cQw#^=ial|W6d3dJw2!V zI>dySu#`qnh0C@ znuU9F)rbH1eoU556djXm>Kjm{A(#I7^CXXV|NH+w?c<2h#Kj<*6JJb764!nF=Z*Ul z;`Z-P$S6^utc&;e+?jp(?EcO1+Y=)L-EFlVt5IB#vTyswwQJUI+_GbD!jarEC2sSD z&R(CqcXx7nYV6v@GbdXE4oX#eG(LL6>J^`@-VnJf?nqXN9Or{4FW#DY_T<6j#OUz3 z?ogeF(G(`_+_+}h;>9c1N5#gc9;?*aYP&Dre*EIqvqzH?S1gQMll*u$4^zL|S)XY9&gXV9uE&)glpbit>~)<(p{rQ}r^tc?R>)3dMU z<{nMn7&_hRGb;;|A{KqR@U!(>w#TPtl%n3y;Fa+g|9JQ4=E(4sGquLbyu7#t|MtfqU_cmJ51p1d`Bq1kQLiw~~+WJ!3`#?5<@%cOEFFf{l0_VlwCQ$xKS zjc!TO&h62w7OaRmkdmCEaCY`xn0oX5-0iWEa~+(vEMwR5KQ9iC*|q0LF~~qDijN2p&>t;PrE3PL=a}v zye7jr8HJPvMIb8x34&uVq!+>!sBkJqF%=iJrVAs`X22Da zK`7)eDWj0AL508hlyUwBNkE +#include +#include "soloud_c.h" + +static int +laudio_init(lua_State *L) { + void * so = Soloud_create(); + + // todo : Call Soloud_initEx + int err = Soloud_init(so); + + lua_pushlightuserdata(L, so); + + if (err) { + lua_pushstring(L, Soloud_getErrorString(so, err)); + return 2; + } else { + return 1; + } +} + +static int +laudio_deinit(lua_State *L) { + luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); + void * so = lua_touserdata(L, 1); + Soloud_deinit(so); + Soloud_destroy(so); + return 0; +} + +static int +laudio_load(lua_State *L) { + size_t sz; + const char * data = luaL_checklstring(L, 1, &sz); + void * s = Wav_create(); + int err = Wav_loadMemEx(s, (const unsigned char *)data, sz, 0, 0); + if (err) { + Wav_destroy(s); + return 0; + } + lua_pushlightuserdata(L, s); + return 1; +} + +static int +laudio_unload(lua_State *L) { + if (lua_isnoneornil(L, 1)) { + return 0; + } + luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); + void *s = lua_touserdata(L, 1); + Wav_destroy(s); + return 0; +} + +static int +laudio_play(lua_State *L) { + if (lua_isnoneornil(L, 2)) { + return 0; + } + luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); + luaL_checktype(L, 2, LUA_TLIGHTUSERDATA); + void * dev = lua_touserdata(L, 1); + void * s = lua_touserdata(L, 2); + unsigned int h = Soloud_play(dev, s); + lua_pushinteger(L, h); + return 1; +} + +int +luaopen_soluna_audio(lua_State *L) { + luaL_checkversion(L); + luaL_Reg l[] = { + { "init", laudio_init }, + { "deinit", laudio_deinit }, + { "load", laudio_load }, + { "unload", laudio_unload }, + { "play", laudio_play }, + { NULL, NULL }, + }; + luaL_newlib(L, l); + return 1; +} diff --git a/src/embedlua.c b/src/embedlua.c index 3db97d7..de9c046 100644 --- a/src/embedlua.c +++ b/src/embedlua.c @@ -21,6 +21,7 @@ #include "util.lua.h" #include "coroutine.lua.h" #include "packageloader.lua.h" +#include "audio.lua.h" #include "lua.h" #include "lauxlib.h" @@ -84,6 +85,7 @@ luaopen_embedsource(lua_State *L) { REG_SOURCE(render) REG_SOURCE(gamepad) REG_SOURCE(settings) + REG_SOURCE(audio) lua_setfield(L, -2, "service"); lua_newtable(L); // data list diff --git a/src/lualib/main.lua b/src/lualib/main.lua index 74402e0..11c0aef 100644 --- a/src/lualib/main.lua +++ b/src/lualib/main.lua @@ -180,6 +180,10 @@ function api.start(app) name = "loader", unique = true, }, + { + name = "audio", + unique = true, + }, }, } end diff --git a/src/lualib/soluna.lua b/src/lualib/soluna.lua index 5d18fa5..773c8b5 100644 --- a/src/lualib/soluna.lua +++ b/src/lualib/soluna.lua @@ -76,6 +76,19 @@ function soluna.load_sprites(filename) return sprites end + +local audio_service, audio_sounds + +function soluna.load_sounds(filename) + audio_service = audio_service or ltask.uniqueservice "audio" + audio_sounds = ltask.call(audio_service, "init", filename) + return audio_sounds +end + +function soluna.play_sound(name) + ltask.send(audio_service, true, audio_sounds[name]) +end + function soluna.preload(spr) local loader = ltask.uniqueservice "loader" if #spr == 0 then diff --git a/src/luamods.c b/src/luamods.c index 3e52c9a..65dd451 100644 --- a/src/luamods.c +++ b/src/luamods.c @@ -34,6 +34,7 @@ int luaopen_url(lua_State *L); int luaopen_skynet_crypt(lua_State *L); int luaopen_zip(lua_State *L); int luaopen_extlua(lua_State *L); +int luaopen_soluna_audio(lua_State *L); void soluna_embed(lua_State* L) { static const luaL_Reg modules[] = { @@ -69,6 +70,7 @@ void soluna_embed(lua_State* L) { { "soluna.crypt", luaopen_skynet_crypt }, { "soluna.zip", luaopen_zip }, { "soluna.extlua", luaopen_extlua }, + { "soluna.audio", luaopen_soluna_audio }, { NULL, NULL }, }; diff --git a/src/service/audio.lua b/src/service/audio.lua new file mode 100644 index 0000000..ab7c473 --- /dev/null +++ b/src/service/audio.lua @@ -0,0 +1,94 @@ +local ltask = require "ltask" +local audio = require "soluna.audio" +local file = require "soluna.file" +local datalist = require "soluna.datalist" + +global print, assert, setmetatable, tostring, error, ipairs + +local DEVICE, BANK + +local api = {} + +local play = audio.play + +-- play +api[true] = function(id) + play(DEVICE, BANK[id]) +end + +local S = {} + +global type, tonumber, error, assert, ipairs, print, pairs + +for k in pairs(api) do + S[k] = function() + error "Init audio first" + end +end + +local M = {} + +local function load_bundle(filename) + local b = datalist.parse(file.load(filename)) + local bank = {} + local map = {} + for i, v in ipairs(b) do + bank[i] = assert(v.filename) + map[assert(v.name)] = i + end + return bank, map +end + +local function load_all() + for i, filename in ipairs(BANK) do + local content = file.load(filename) + local obj = content and audio.load(content) + if obj then + BANK[i] = obj + BANK[obj] = content + print("Load", i, filename) + else + BANK[i] = false + print("Can't load " .. filename) + end + end +end + +function S.init(filename) + assert(DEVICE == nil) + DEVICE = false + local bank, ret = load_bundle(filename) + local d, err = audio.init() + if err then + print ("Error : ", err) + return {} + else + -- todo : load file list + BANK = bank + DEVICE = d + load_all() + local inject = ltask.dispatch() + for k, v in pairs(api) do + inject[k] = v + end + return ret + end +end + +function S.quit() + if BANK then + for i, obj in ipairs(BANK) do + if obj then + audio.unload(obj) + BANK[i] = false + BANK[obj] = nil + end + end + end + if DEVICE then + audio.deinit(DEVICE) + DEVICE = nil + end +end + +return S diff --git a/src/soloudcapi.h b/src/soloudcapi.h new file mode 100644 index 0000000..d496464 --- /dev/null +++ b/src/soloudcapi.h @@ -0,0 +1,993 @@ +#ifndef SOLOUD_C_API_H +#define SOLOUD_C_API_H + +#include "soloud.h" +#include "soloud_wav.h" +#include "soloud_wavstream.h" + +using namespace SoLoud; + +extern "C" +{ + +void Soloud_destroy(void * aClassPtr) +{ + delete (Soloud *)aClassPtr; +} + +void * Soloud_create() +{ + return (void *)new Soloud; +} + +int Soloud_init(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->init(); +} + +int Soloud_initEx(void * aClassPtr, unsigned int aFlags, unsigned int aBackend, unsigned int aSamplerate, unsigned int aBufferSize, unsigned int aChannels) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->init(aFlags, aBackend, aSamplerate, aBufferSize, aChannels); +} + +void Soloud_deinit(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->deinit(); +} + +unsigned int Soloud_getVersion(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getVersion(); +} + +const char * Soloud_getErrorString(void * aClassPtr, int aErrorCode) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getErrorString(aErrorCode); +} + +unsigned int Soloud_getBackendId(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getBackendId(); +} + +const char * Soloud_getBackendString(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getBackendString(); +} + +unsigned int Soloud_getBackendChannels(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getBackendChannels(); +} + +unsigned int Soloud_getBackendSamplerate(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getBackendSamplerate(); +} + +unsigned int Soloud_getBackendBufferSize(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getBackendBufferSize(); +} + +int Soloud_setSpeakerPosition(void * aClassPtr, unsigned int aChannel, float aX, float aY, float aZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->setSpeakerPosition(aChannel, aX, aY, aZ); +} + +int Soloud_getSpeakerPosition(void * aClassPtr, unsigned int aChannel, float * aX, float * aY, float * aZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getSpeakerPosition(aChannel, *aX, *aY, *aZ); +} + +unsigned int Soloud_play(void * aClassPtr, AudioSource * aSound) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->play(*aSound); +} + +unsigned int Soloud_playEx(void * aClassPtr, AudioSource * aSound, float aVolume, float aPan, int aPaused, unsigned int aBus) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->play(*aSound, aVolume, aPan, !!aPaused, aBus); +} + +unsigned int Soloud_playClocked(void * aClassPtr, double aSoundTime, AudioSource * aSound) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->playClocked(aSoundTime, *aSound); +} + +unsigned int Soloud_playClockedEx(void * aClassPtr, double aSoundTime, AudioSource * aSound, float aVolume, float aPan, unsigned int aBus) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->playClocked(aSoundTime, *aSound, aVolume, aPan, aBus); +} + +unsigned int Soloud_play3d(void * aClassPtr, AudioSource * aSound, float aPosX, float aPosY, float aPosZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->play3d(*aSound, aPosX, aPosY, aPosZ); +} + +unsigned int Soloud_play3dEx(void * aClassPtr, AudioSource * aSound, float aPosX, float aPosY, float aPosZ, float aVelX, float aVelY, float aVelZ, float aVolume, int aPaused, unsigned int aBus) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->play3d(*aSound, aPosX, aPosY, aPosZ, aVelX, aVelY, aVelZ, aVolume, !!aPaused, aBus); +} + +unsigned int Soloud_play3dClocked(void * aClassPtr, double aSoundTime, AudioSource * aSound, float aPosX, float aPosY, float aPosZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->play3dClocked(aSoundTime, *aSound, aPosX, aPosY, aPosZ); +} + +unsigned int Soloud_play3dClockedEx(void * aClassPtr, double aSoundTime, AudioSource * aSound, float aPosX, float aPosY, float aPosZ, float aVelX, float aVelY, float aVelZ, float aVolume, unsigned int aBus) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->play3dClocked(aSoundTime, *aSound, aPosX, aPosY, aPosZ, aVelX, aVelY, aVelZ, aVolume, aBus); +} + +unsigned int Soloud_playBackground(void * aClassPtr, AudioSource * aSound) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->playBackground(*aSound); +} + +unsigned int Soloud_playBackgroundEx(void * aClassPtr, AudioSource * aSound, float aVolume, int aPaused, unsigned int aBus) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->playBackground(*aSound, aVolume, !!aPaused, aBus); +} + +int Soloud_seek(void * aClassPtr, unsigned int aVoiceHandle, double aSeconds) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->seek(aVoiceHandle, aSeconds); +} + +void Soloud_stop(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->stop(aVoiceHandle); +} + +void Soloud_stopAll(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->stopAll(); +} + +void Soloud_stopAudioSource(void * aClassPtr, AudioSource * aSound) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->stopAudioSource(*aSound); +} + +int Soloud_countAudioSource(void * aClassPtr, AudioSource * aSound) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->countAudioSource(*aSound); +} + +void Soloud_setFilterParameter(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aFilterId, unsigned int aAttributeId, float aValue) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setFilterParameter(aVoiceHandle, aFilterId, aAttributeId, aValue); +} + +float Soloud_getFilterParameter(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aFilterId, unsigned int aAttributeId) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getFilterParameter(aVoiceHandle, aFilterId, aAttributeId); +} + +void Soloud_fadeFilterParameter(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aFilterId, unsigned int aAttributeId, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->fadeFilterParameter(aVoiceHandle, aFilterId, aAttributeId, aTo, aTime); +} + +void Soloud_oscillateFilterParameter(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aFilterId, unsigned int aAttributeId, float aFrom, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->oscillateFilterParameter(aVoiceHandle, aFilterId, aAttributeId, aFrom, aTo, aTime); +} + +double Soloud_getStreamTime(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getStreamTime(aVoiceHandle); +} + +double Soloud_getStreamPosition(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getStreamPosition(aVoiceHandle); +} + +int Soloud_getPause(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getPause(aVoiceHandle); +} + +float Soloud_getVolume(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getVolume(aVoiceHandle); +} + +float Soloud_getOverallVolume(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getOverallVolume(aVoiceHandle); +} + +float Soloud_getPan(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getPan(aVoiceHandle); +} + +float Soloud_getSamplerate(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getSamplerate(aVoiceHandle); +} + +int Soloud_getProtectVoice(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getProtectVoice(aVoiceHandle); +} + +unsigned int Soloud_getActiveVoiceCount(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getActiveVoiceCount(); +} + +unsigned int Soloud_getVoiceCount(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getVoiceCount(); +} + +int Soloud_isValidVoiceHandle(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->isValidVoiceHandle(aVoiceHandle); +} + +float Soloud_getRelativePlaySpeed(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getRelativePlaySpeed(aVoiceHandle); +} + +float Soloud_getPostClipScaler(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getPostClipScaler(); +} + +unsigned int Soloud_getMainResampler(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getMainResampler(); +} + +float Soloud_getGlobalVolume(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getGlobalVolume(); +} + +unsigned int Soloud_getMaxActiveVoiceCount(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getMaxActiveVoiceCount(); +} + +int Soloud_getLooping(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getLooping(aVoiceHandle); +} + +int Soloud_getAutoStop(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getAutoStop(aVoiceHandle); +} + +double Soloud_getLoopPoint(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getLoopPoint(aVoiceHandle); +} + +void Soloud_setLoopPoint(void * aClassPtr, unsigned int aVoiceHandle, double aLoopPoint) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setLoopPoint(aVoiceHandle, aLoopPoint); +} + +void Soloud_setLooping(void * aClassPtr, unsigned int aVoiceHandle, int aLooping) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setLooping(aVoiceHandle, !!aLooping); +} + +void Soloud_setAutoStop(void * aClassPtr, unsigned int aVoiceHandle, int aAutoStop) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setAutoStop(aVoiceHandle, !!aAutoStop); +} + +int Soloud_setMaxActiveVoiceCount(void * aClassPtr, unsigned int aVoiceCount) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->setMaxActiveVoiceCount(aVoiceCount); +} + +void Soloud_setInaudibleBehavior(void * aClassPtr, unsigned int aVoiceHandle, int aMustTick, int aKill) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setInaudibleBehavior(aVoiceHandle, !!aMustTick, !!aKill); +} + +void Soloud_setGlobalVolume(void * aClassPtr, float aVolume) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setGlobalVolume(aVolume); +} + +void Soloud_setPostClipScaler(void * aClassPtr, float aScaler) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setPostClipScaler(aScaler); +} + +void Soloud_setMainResampler(void * aClassPtr, unsigned int aResampler) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setMainResampler(aResampler); +} + +void Soloud_setPause(void * aClassPtr, unsigned int aVoiceHandle, int aPause) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setPause(aVoiceHandle, !!aPause); +} + +void Soloud_setPauseAll(void * aClassPtr, int aPause) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setPauseAll(!!aPause); +} + +int Soloud_setRelativePlaySpeed(void * aClassPtr, unsigned int aVoiceHandle, float aSpeed) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->setRelativePlaySpeed(aVoiceHandle, aSpeed); +} + +void Soloud_setProtectVoice(void * aClassPtr, unsigned int aVoiceHandle, int aProtect) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setProtectVoice(aVoiceHandle, !!aProtect); +} + +void Soloud_setSamplerate(void * aClassPtr, unsigned int aVoiceHandle, float aSamplerate) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setSamplerate(aVoiceHandle, aSamplerate); +} + +void Soloud_setPan(void * aClassPtr, unsigned int aVoiceHandle, float aPan) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setPan(aVoiceHandle, aPan); +} + +void Soloud_setPanAbsolute(void * aClassPtr, unsigned int aVoiceHandle, float aLVolume, float aRVolume) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setPanAbsolute(aVoiceHandle, aLVolume, aRVolume); +} + +void Soloud_setChannelVolume(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aChannel, float aVolume) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setChannelVolume(aVoiceHandle, aChannel, aVolume); +} + +void Soloud_setVolume(void * aClassPtr, unsigned int aVoiceHandle, float aVolume) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setVolume(aVoiceHandle, aVolume); +} + +void Soloud_setDelaySamples(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aSamples) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setDelaySamples(aVoiceHandle, aSamples); +} + +void Soloud_fadeVolume(void * aClassPtr, unsigned int aVoiceHandle, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->fadeVolume(aVoiceHandle, aTo, aTime); +} + +void Soloud_fadePan(void * aClassPtr, unsigned int aVoiceHandle, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->fadePan(aVoiceHandle, aTo, aTime); +} + +void Soloud_fadeRelativePlaySpeed(void * aClassPtr, unsigned int aVoiceHandle, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->fadeRelativePlaySpeed(aVoiceHandle, aTo, aTime); +} + +void Soloud_fadeGlobalVolume(void * aClassPtr, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->fadeGlobalVolume(aTo, aTime); +} + +void Soloud_schedulePause(void * aClassPtr, unsigned int aVoiceHandle, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->schedulePause(aVoiceHandle, aTime); +} + +void Soloud_scheduleStop(void * aClassPtr, unsigned int aVoiceHandle, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->scheduleStop(aVoiceHandle, aTime); +} + +void Soloud_oscillateVolume(void * aClassPtr, unsigned int aVoiceHandle, float aFrom, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->oscillateVolume(aVoiceHandle, aFrom, aTo, aTime); +} + +void Soloud_oscillatePan(void * aClassPtr, unsigned int aVoiceHandle, float aFrom, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->oscillatePan(aVoiceHandle, aFrom, aTo, aTime); +} + +void Soloud_oscillateRelativePlaySpeed(void * aClassPtr, unsigned int aVoiceHandle, float aFrom, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->oscillateRelativePlaySpeed(aVoiceHandle, aFrom, aTo, aTime); +} + +void Soloud_oscillateGlobalVolume(void * aClassPtr, float aFrom, float aTo, double aTime) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->oscillateGlobalVolume(aFrom, aTo, aTime); +} + +void Soloud_setGlobalFilter(void * aClassPtr, unsigned int aFilterId, Filter * aFilter) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setGlobalFilter(aFilterId, aFilter); +} + +void Soloud_setVisualizationEnable(void * aClassPtr, int aEnable) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->setVisualizationEnable(!!aEnable); +} + +float * Soloud_calcFFT(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->calcFFT(); +} + +float * Soloud_getWave(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getWave(); +} + +float Soloud_getApproximateVolume(void * aClassPtr, unsigned int aChannel) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getApproximateVolume(aChannel); +} + +unsigned int Soloud_getLoopCount(void * aClassPtr, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getLoopCount(aVoiceHandle); +} + +float Soloud_getInfo(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aInfoKey) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->getInfo(aVoiceHandle, aInfoKey); +} + +unsigned int Soloud_createVoiceGroup(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->createVoiceGroup(); +} + +int Soloud_destroyVoiceGroup(void * aClassPtr, unsigned int aVoiceGroupHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->destroyVoiceGroup(aVoiceGroupHandle); +} + +int Soloud_addVoiceToGroup(void * aClassPtr, unsigned int aVoiceGroupHandle, unsigned int aVoiceHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->addVoiceToGroup(aVoiceGroupHandle, aVoiceHandle); +} + +int Soloud_isVoiceGroup(void * aClassPtr, unsigned int aVoiceGroupHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->isVoiceGroup(aVoiceGroupHandle); +} + +int Soloud_isVoiceGroupEmpty(void * aClassPtr, unsigned int aVoiceGroupHandle) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->isVoiceGroupEmpty(aVoiceGroupHandle); +} + +void Soloud_update3dAudio(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->update3dAudio(); +} + +int Soloud_set3dSoundSpeed(void * aClassPtr, float aSpeed) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->set3dSoundSpeed(aSpeed); +} + +float Soloud_get3dSoundSpeed(void * aClassPtr) +{ + Soloud * cl = (Soloud *)aClassPtr; + return cl->get3dSoundSpeed(); +} + +void Soloud_set3dListenerParameters(void * aClassPtr, float aPosX, float aPosY, float aPosZ, float aAtX, float aAtY, float aAtZ, float aUpX, float aUpY, float aUpZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dListenerParameters(aPosX, aPosY, aPosZ, aAtX, aAtY, aAtZ, aUpX, aUpY, aUpZ); +} + +void Soloud_set3dListenerParametersEx(void * aClassPtr, float aPosX, float aPosY, float aPosZ, float aAtX, float aAtY, float aAtZ, float aUpX, float aUpY, float aUpZ, float aVelocityX, float aVelocityY, float aVelocityZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dListenerParameters(aPosX, aPosY, aPosZ, aAtX, aAtY, aAtZ, aUpX, aUpY, aUpZ, aVelocityX, aVelocityY, aVelocityZ); +} + +void Soloud_set3dListenerPosition(void * aClassPtr, float aPosX, float aPosY, float aPosZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dListenerPosition(aPosX, aPosY, aPosZ); +} + +void Soloud_set3dListenerAt(void * aClassPtr, float aAtX, float aAtY, float aAtZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dListenerAt(aAtX, aAtY, aAtZ); +} + +void Soloud_set3dListenerUp(void * aClassPtr, float aUpX, float aUpY, float aUpZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dListenerUp(aUpX, aUpY, aUpZ); +} + +void Soloud_set3dListenerVelocity(void * aClassPtr, float aVelocityX, float aVelocityY, float aVelocityZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dListenerVelocity(aVelocityX, aVelocityY, aVelocityZ); +} + +void Soloud_set3dSourceParameters(void * aClassPtr, unsigned int aVoiceHandle, float aPosX, float aPosY, float aPosZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dSourceParameters(aVoiceHandle, aPosX, aPosY, aPosZ); +} + +void Soloud_set3dSourceParametersEx(void * aClassPtr, unsigned int aVoiceHandle, float aPosX, float aPosY, float aPosZ, float aVelocityX, float aVelocityY, float aVelocityZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dSourceParameters(aVoiceHandle, aPosX, aPosY, aPosZ, aVelocityX, aVelocityY, aVelocityZ); +} + +void Soloud_set3dSourcePosition(void * aClassPtr, unsigned int aVoiceHandle, float aPosX, float aPosY, float aPosZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dSourcePosition(aVoiceHandle, aPosX, aPosY, aPosZ); +} + +void Soloud_set3dSourceVelocity(void * aClassPtr, unsigned int aVoiceHandle, float aVelocityX, float aVelocityY, float aVelocityZ) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dSourceVelocity(aVoiceHandle, aVelocityX, aVelocityY, aVelocityZ); +} + +void Soloud_set3dSourceMinMaxDistance(void * aClassPtr, unsigned int aVoiceHandle, float aMinDistance, float aMaxDistance) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dSourceMinMaxDistance(aVoiceHandle, aMinDistance, aMaxDistance); +} + +void Soloud_set3dSourceAttenuation(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aAttenuationModel, float aAttenuationRolloffFactor) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dSourceAttenuation(aVoiceHandle, aAttenuationModel, aAttenuationRolloffFactor); +} + +void Soloud_set3dSourceDopplerFactor(void * aClassPtr, unsigned int aVoiceHandle, float aDopplerFactor) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->set3dSourceDopplerFactor(aVoiceHandle, aDopplerFactor); +} + +void Soloud_mix(void * aClassPtr, float * aBuffer, unsigned int aSamples) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->mix(aBuffer, aSamples); +} + +void Soloud_mixSigned16(void * aClassPtr, short * aBuffer, unsigned int aSamples) +{ + Soloud * cl = (Soloud *)aClassPtr; + cl->mixSigned16(aBuffer, aSamples); +} + +void Wav_destroy(void * aClassPtr) +{ + delete (Wav *)aClassPtr; +} + +void * Wav_create() +{ + return (void *)new Wav; +} + +int Wav_load(void * aClassPtr, const char * aFilename) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->load(aFilename); +} + +int Wav_loadMem(void * aClassPtr, const unsigned char * aMem, unsigned int aLength) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadMem(aMem, aLength); +} + +int Wav_loadMemEx(void * aClassPtr, const unsigned char * aMem, unsigned int aLength, int aCopy, int aTakeOwnership) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadMem(aMem, aLength, !!aCopy, !!aTakeOwnership); +} + +int Wav_loadFile(void * aClassPtr, File * aFile) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadFile(aFile); +} + +int Wav_loadRawWave8(void * aClassPtr, unsigned char * aMem, unsigned int aLength) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadRawWave8(aMem, aLength); +} + +int Wav_loadRawWave8Ex(void * aClassPtr, unsigned char * aMem, unsigned int aLength, float aSamplerate, unsigned int aChannels) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadRawWave8(aMem, aLength, aSamplerate, aChannels); +} + +int Wav_loadRawWave16(void * aClassPtr, short * aMem, unsigned int aLength) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadRawWave16(aMem, aLength); +} + +int Wav_loadRawWave16Ex(void * aClassPtr, short * aMem, unsigned int aLength, float aSamplerate, unsigned int aChannels) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadRawWave16(aMem, aLength, aSamplerate, aChannels); +} + +int Wav_loadRawWave(void * aClassPtr, float * aMem, unsigned int aLength) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadRawWave(aMem, aLength); +} + +int Wav_loadRawWaveEx(void * aClassPtr, float * aMem, unsigned int aLength, float aSamplerate, unsigned int aChannels, int aCopy, int aTakeOwnership) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->loadRawWave(aMem, aLength, aSamplerate, aChannels, !!aCopy, !!aTakeOwnership); +} + +double Wav_getLength(void * aClassPtr) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->getLength(); +} + +void Wav_setVolume(void * aClassPtr, float aVolume) +{ + Wav * cl = (Wav *)aClassPtr; + cl->setVolume(aVolume); +} + +void Wav_setLooping(void * aClassPtr, int aLoop) +{ + Wav * cl = (Wav *)aClassPtr; + cl->setLooping(!!aLoop); +} + +void Wav_setAutoStop(void * aClassPtr, int aAutoStop) +{ + Wav * cl = (Wav *)aClassPtr; + cl->setAutoStop(!!aAutoStop); +} + +void Wav_set3dMinMaxDistance(void * aClassPtr, float aMinDistance, float aMaxDistance) +{ + Wav * cl = (Wav *)aClassPtr; + cl->set3dMinMaxDistance(aMinDistance, aMaxDistance); +} + +void Wav_set3dAttenuation(void * aClassPtr, unsigned int aAttenuationModel, float aAttenuationRolloffFactor) +{ + Wav * cl = (Wav *)aClassPtr; + cl->set3dAttenuation(aAttenuationModel, aAttenuationRolloffFactor); +} + +void Wav_set3dDopplerFactor(void * aClassPtr, float aDopplerFactor) +{ + Wav * cl = (Wav *)aClassPtr; + cl->set3dDopplerFactor(aDopplerFactor); +} + +void Wav_set3dListenerRelative(void * aClassPtr, int aListenerRelative) +{ + Wav * cl = (Wav *)aClassPtr; + cl->set3dListenerRelative(!!aListenerRelative); +} + +void Wav_set3dDistanceDelay(void * aClassPtr, int aDistanceDelay) +{ + Wav * cl = (Wav *)aClassPtr; + cl->set3dDistanceDelay(!!aDistanceDelay); +} + +void Wav_set3dCollider(void * aClassPtr, AudioCollider * aCollider) +{ + Wav * cl = (Wav *)aClassPtr; + cl->set3dCollider(aCollider); +} + +void Wav_set3dColliderEx(void * aClassPtr, AudioCollider * aCollider, int aUserData) +{ + Wav * cl = (Wav *)aClassPtr; + cl->set3dCollider(aCollider, aUserData); +} + +void Wav_set3dAttenuator(void * aClassPtr, AudioAttenuator * aAttenuator) +{ + Wav * cl = (Wav *)aClassPtr; + cl->set3dAttenuator(aAttenuator); +} + +void Wav_setInaudibleBehavior(void * aClassPtr, int aMustTick, int aKill) +{ + Wav * cl = (Wav *)aClassPtr; + cl->setInaudibleBehavior(!!aMustTick, !!aKill); +} + +void Wav_setLoopPoint(void * aClassPtr, double aLoopPoint) +{ + Wav * cl = (Wav *)aClassPtr; + cl->setLoopPoint(aLoopPoint); +} + +double Wav_getLoopPoint(void * aClassPtr) +{ + Wav * cl = (Wav *)aClassPtr; + return cl->getLoopPoint(); +} + +void Wav_setFilter(void * aClassPtr, unsigned int aFilterId, Filter * aFilter) +{ + Wav * cl = (Wav *)aClassPtr; + cl->setFilter(aFilterId, aFilter); +} + +void Wav_stop(void * aClassPtr) +{ + Wav * cl = (Wav *)aClassPtr; + cl->stop(); +} + +void WavStream_destroy(void * aClassPtr) +{ + delete (WavStream *)aClassPtr; +} + +void * WavStream_create() +{ + return (void *)new WavStream; +} + +int WavStream_load(void * aClassPtr, const char * aFilename) +{ + WavStream * cl = (WavStream *)aClassPtr; + return cl->load(aFilename); +} + +int WavStream_loadMem(void * aClassPtr, const unsigned char * aData, unsigned int aDataLen) +{ + WavStream * cl = (WavStream *)aClassPtr; + return cl->loadMem(aData, aDataLen); +} + +int WavStream_loadMemEx(void * aClassPtr, const unsigned char * aData, unsigned int aDataLen, int aCopy, int aTakeOwnership) +{ + WavStream * cl = (WavStream *)aClassPtr; + return cl->loadMem(aData, aDataLen, !!aCopy, !!aTakeOwnership); +} + +int WavStream_loadToMem(void * aClassPtr, const char * aFilename) +{ + WavStream * cl = (WavStream *)aClassPtr; + return cl->loadToMem(aFilename); +} + +int WavStream_loadFile(void * aClassPtr, File * aFile) +{ + WavStream * cl = (WavStream *)aClassPtr; + return cl->loadFile(aFile); +} + +int WavStream_loadFileToMem(void * aClassPtr, File * aFile) +{ + WavStream * cl = (WavStream *)aClassPtr; + return cl->loadFileToMem(aFile); +} + +double WavStream_getLength(void * aClassPtr) +{ + WavStream * cl = (WavStream *)aClassPtr; + return cl->getLength(); +} + +void WavStream_setVolume(void * aClassPtr, float aVolume) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->setVolume(aVolume); +} + +void WavStream_setLooping(void * aClassPtr, int aLoop) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->setLooping(!!aLoop); +} + +void WavStream_setAutoStop(void * aClassPtr, int aAutoStop) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->setAutoStop(!!aAutoStop); +} + +void WavStream_set3dMinMaxDistance(void * aClassPtr, float aMinDistance, float aMaxDistance) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->set3dMinMaxDistance(aMinDistance, aMaxDistance); +} + +void WavStream_set3dAttenuation(void * aClassPtr, unsigned int aAttenuationModel, float aAttenuationRolloffFactor) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->set3dAttenuation(aAttenuationModel, aAttenuationRolloffFactor); +} + +void WavStream_set3dDopplerFactor(void * aClassPtr, float aDopplerFactor) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->set3dDopplerFactor(aDopplerFactor); +} + +void WavStream_set3dListenerRelative(void * aClassPtr, int aListenerRelative) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->set3dListenerRelative(!!aListenerRelative); +} + +void WavStream_set3dDistanceDelay(void * aClassPtr, int aDistanceDelay) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->set3dDistanceDelay(!!aDistanceDelay); +} + +void WavStream_set3dCollider(void * aClassPtr, AudioCollider * aCollider) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->set3dCollider(aCollider); +} + +void WavStream_set3dColliderEx(void * aClassPtr, AudioCollider * aCollider, int aUserData) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->set3dCollider(aCollider, aUserData); +} + +void WavStream_set3dAttenuator(void * aClassPtr, AudioAttenuator * aAttenuator) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->set3dAttenuator(aAttenuator); +} + +void WavStream_setInaudibleBehavior(void * aClassPtr, int aMustTick, int aKill) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->setInaudibleBehavior(!!aMustTick, !!aKill); +} + +void WavStream_setLoopPoint(void * aClassPtr, double aLoopPoint) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->setLoopPoint(aLoopPoint); +} + +double WavStream_getLoopPoint(void * aClassPtr) +{ + WavStream * cl = (WavStream *)aClassPtr; + return cl->getLoopPoint(); +} + +void WavStream_setFilter(void * aClassPtr, unsigned int aFilterId, Filter * aFilter) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->setFilter(aFilterId, aFilter); +} + +void WavStream_stop(void * aClassPtr) +{ + WavStream * cl = (WavStream *)aClassPtr; + cl->stop(); +} + +} // extern "C" + +#endif \ No newline at end of file diff --git a/src/soloudone.cpp b/src/soloudone.cpp new file mode 100644 index 0000000..e3942c2 --- /dev/null +++ b/src/soloudone.cpp @@ -0,0 +1,63 @@ +#include "core/soloud.cpp" +#include "core/soloud_audiosource.cpp" +#include "core/soloud_bus.cpp" +#include "core/soloud_core_3d.cpp" +#include "core/soloud_core_basicops.cpp" +#include "core/soloud_core_faderops.cpp" +#include "core/soloud_core_filterops.cpp" +#include "core/soloud_core_getters.cpp" +#include "core/soloud_core_setters.cpp" +#include "core/soloud_core_voicegroup.cpp" +#include "core/soloud_core_voiceops.cpp" +#include "core/soloud_fader.cpp" +#include "core/soloud_fft.cpp" +#include "core/soloud_file.cpp" +#include "core/soloud_misc.cpp" +#include "core/soloud_queue.cpp" +#include "core/soloud_thread.cpp" + +#ifdef SOLOUD_FILTER + +#include "core/soloud_filter.cpp" + +#include "filter/soloud_bassboostfilter.cpp" +#include "filter/soloud_biquadresonantfilter.cpp" +#include "filter/soloud_dcremovalfilter.cpp" +#include "filter/soloud_duckfilter.cpp" +#include "filter/soloud_echofilter.cpp" +#define catmullrom catmullrom_ +#include "filter/soloud_eqfilter.cpp" +#undef catmullrom_ +#include "filter/soloud_fftfilter.cpp" +#include "filter/soloud_flangerfilter.cpp" +#include "filter/soloud_freeverbfilter.cpp" +#include "filter/soloud_lofifilter.cpp" +#include "filter/soloud_robotizefilter.cpp" +#include "filter/soloud_waveshaperfilter.cpp" + +#endif + +#include "backend/winmm/soloud_winmm.cpp" + +extern "C" { +#include "audiosource/wav/stb_vorbis.c" +} + +#ifdef SOLOUD_MP3_FLAC +#include "audiosource/wav/dr_impl.cpp" +#else +#include "soloudwavonly.h" +#endif + +#include "audiosource/wav/soloud_wav.cpp" +#include "audiosource/wav/soloud_wavstream.cpp" + +#ifdef SOLOUD_SPEECH +#include "audiosource/speech/darray.cpp" +#include "audiosource/speech/klatt.cpp" +#include "audiosource/speech/resonator.cpp" +#include "audiosource/speech/soloud_speech.cpp" +#include "audiosource/speech/tts.cpp" +#endif + +#include "soloudcapi.h" \ No newline at end of file diff --git a/src/soloudwavonly.h b/src/soloudwavonly.h new file mode 100644 index 0000000..b591aca --- /dev/null +++ b/src/soloudwavonly.h @@ -0,0 +1,70 @@ +#ifndef SOLOUD_FAKE_MP3_H +#define SOLOUD_FAKE_MP3_H + +#define DR_WAV_IMPLEMENTATION +#define DR_WAV_NO_STDIO +#include "audiosource/wav/dr_wav.h" + +#define DRMP3_API static inline +#define DR_MP3_NO_STDIO +#include "audiosource/wav/dr_mp3.h" + +#define DRFLAC_API static inline +#define DR_FLAC_NO_STDIO +#define DR_FLAC_NO_CRC +#include "audiosource/wav/dr_flac.h" + +DRMP3_API void +drmp3_uninit(drmp3* pMP3) { +} + +DRMP3_API drmp3_bool32 +drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_allocation_callbacks* pAllocationCallbacks) { + return 0; +} + +DRMP3_API drmp3_bool32 +drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_allocation_callbacks* pAllocationCallbacks) { + return 0; +} + +DRMP3_API drmp3_uint64 +drmp3_get_pcm_frame_count(drmp3* pMP3) { + return 0; +} + +DRMP3_API drmp3_bool32 +drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex) { + return 0; +} + +DRMP3_API drmp3_uint64 +drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut) { + return 0; +} + +DRFLAC_API void +drflac_close(drflac* pFlac) { +} + +DRFLAC_API drflac* +drflac_open_memory(const void* pData, size_t dataSize, const drflac_allocation_callbacks* pAllocationCallbacks) { + return NULL; +} + +DRFLAC_API drflac* +drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) { + return NULL; +} + +DRFLAC_API drflac_bool32 +drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex) { + return 0; +} + +DRFLAC_API drflac_uint64 +drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut) { + return 0; +} + +#endif diff --git a/test/audio.lua b/test/audio.lua new file mode 100644 index 0000000..b2ba0ff --- /dev/null +++ b/test/audio.lua @@ -0,0 +1,14 @@ +local soluna = require "soluna" + +soluna.load_sounds "asset/sounds.dl" +soluna.set_window_title "Soluna sound sample" + +local callback = {} + +soluna.play_sound "bloop" + +function callback.frame(count) +end + +return callback + From c69c6913f181f572929a78906910b9a43c601ac8 Mon Sep 17 00:00:00 2001 From: Hanchin Hsieh Date: Fri, 20 Mar 2026 23:37:30 +0800 Subject: [PATCH 2/9] feat(build/luamake): support audio --- clibs/soloud/make.lua | 28 ++++++++++++++++++++++++++++ clibs/soluna/make.lua | 4 +++- make.lua | 2 ++ src/soloudone.cpp | 10 +++++++++- 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 clibs/soloud/make.lua diff --git a/clibs/soloud/make.lua b/clibs/soloud/make.lua new file mode 100644 index 0000000..8516f88 --- /dev/null +++ b/clibs/soloud/make.lua @@ -0,0 +1,28 @@ +local lm = require "luamake" + +lm.rootdir = lm.basedir .. "/3rd/soloud" + +lm:source_set "soloud_src" { + sources = { + lm.basedir .. "/src/soloudone.cpp", + }, + includes = { + "include", + "src", + }, + windows = { + defines = { + "WITH_WINMM=1", + }, + }, + macos = { + defines = { + "WITH_COREAUDIO=1", + }, + }, + linux = { + defines = { + lm.platform == "emcc" and "WITH_SDL2_STATIC=1" or "WITH_ALSA=1", + }, + }, +} diff --git a/clibs/soluna/make.lua b/clibs/soluna/make.lua index ae29550..1e3397d 100644 --- a/clibs/soluna/make.lua +++ b/clibs/soluna/make.lua @@ -39,10 +39,11 @@ lm:source_set "soluna_src" { includes = { "build", "src", - "3rd/lua", "3rd", + "3rd/lua", "3rd/yoga", "3rd/zlib", + "3rd/soloud/include", }, clang = { sources = lm.os == "macos" and { @@ -52,6 +53,7 @@ lm:source_set "soluna_src" { "-x objective-c", }, frameworks = lm.os == "macos" and { + "AudioToolbox", "IOKit", "CoreText", "CoreFoundation", diff --git a/make.lua b/make.lua index bc23894..05e81a1 100644 --- a/make.lua +++ b/make.lua @@ -87,6 +87,7 @@ lm:conf { "-pthread", "-fPIC", "--use-port=emdawnwebgpu", + "-s USE_SDL=2", }, links = { "idbfs.js", @@ -99,6 +100,7 @@ lm:conf { "-s FORCE_FILESYSTEM=1", '-s EXPORTED_RUNTIME_METHODS=\'["FS","FS_createPath","FS_createDataFile","IDBFS"]\'', "-s USE_PTHREADS=1", + "-s USE_SDL=2", "-s PTHREAD_POOL_SIZE='Math.max(2,navigator.hardwareConcurrency)'", "-s PTHREAD_POOL_SIZE_STRICT=2", lm.mode == "debug" and "-s ASSERTIONS=2", diff --git a/src/soloudone.cpp b/src/soloudone.cpp index e3942c2..08e0688 100644 --- a/src/soloudone.cpp +++ b/src/soloudone.cpp @@ -37,7 +37,15 @@ #endif +#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) #include "backend/winmm/soloud_winmm.cpp" +#elif defined(__APPLE__) +#include "backend/coreaudio/soloud_coreaudio.cpp" +#elif defined(__linux__) +#include "backend/alsa/soloud_alsa.cpp" +#elif defined(__EMSCRIPTEN__) +#include "backend/sdl2_static/soloud_sdl2_static.cpp" +#endif extern "C" { #include "audiosource/wav/stb_vorbis.c" @@ -60,4 +68,4 @@ extern "C" { #include "audiosource/speech/tts.cpp" #endif -#include "soloudcapi.h" \ No newline at end of file +#include "soloudcapi.h" From 838b57c596c67929b3be33ddefa5ccbeb50dd924 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sat, 21 Mar 2026 09:31:19 +0800 Subject: [PATCH 3/9] add miniaudio --- .gitmodules | 3 +++ 3rd/miniaudio | 1 + 2 files changed, 4 insertions(+) create mode 160000 3rd/miniaudio diff --git a/.gitmodules b/.gitmodules index d5d176d..61cfe0a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,3 +25,6 @@ [submodule "3rd/soloud"] path = 3rd/soloud url = https://github.com/jarikomppa/soloud.git +[submodule "3rd/miniaudio"] + path = 3rd/miniaudio + url = https://github.com/mackron/miniaudio.git diff --git a/3rd/miniaudio b/3rd/miniaudio new file mode 160000 index 0000000..9634bed --- /dev/null +++ b/3rd/miniaudio @@ -0,0 +1 @@ +Subproject commit 9634bedb5b5a2ca38c1ee7108a9358a4e233f14d From 90f0cc03b9f72b5b3617264badb3511190a41f15 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sat, 21 Mar 2026 14:47:43 +0800 Subject: [PATCH 4/9] soloud to miniaudio --- Makefile | 11 +- src/audio.c | 218 ++++++++-- src/luazip.c | 2 +- src/service/audio.lua | 25 -- src/soloudcapi.h | 993 ------------------------------------------ src/soloudone.cpp | 71 --- src/soloudwavonly.h | 70 --- src/zipreader.h | 2 +- 8 files changed, 180 insertions(+), 1212 deletions(-) delete mode 100644 src/soloudcapi.h delete mode 100644 src/soloudone.cpp delete mode 100644 src/soloudwavonly.h diff --git a/Makefile b/Makefile index 80a47c5..b50c8e6 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ all : $(BIN)/$(APPNAME) 3RDINC=-I3rd YOGAINC=-I3rd/yoga -SOLOUDINC=-I3rd/soloud/include -I3rd/soloud/src +MINIAUDIOINC=-I3rd/miniaudio LUAINC=-I3rd/lua LUASRC:=$(wildcard 3rd/lua/*.c 3rd/lua/*.h) @@ -126,7 +126,7 @@ $(BUILD)/soluna_entry.o : src/entry.c src/version.h $(COMPILE_C) $(LUAINC) $(3RDINC) -DSOLUNA_HASH_VERSION=\"$(VERSION)\" $(BUILD)/soluna_%.o : src/%.c - $(COMPILE_C) $(LUAINC) $(3RDINC) $(SHADERINC) $(YOGAINC) $(ZLIBINC) $(SOLOUDINC) + $(COMPILE_C) $(LUAINC) $(3RDINC) $(SHADERINC) $(YOGAINC) $(ZLIBINC) $(MINIAUDIOINC) $(BUILD)/platform_%.o : src/platform/windows/%.c $(COMPILE_C) $(LUAINC) $(3RDINC) $(SHADERINC) $(YOGAINC) $(ZLIBINC) -Isrc @@ -144,11 +144,6 @@ YOGASRC:=$(wildcard 3rd/yoga/yoga/*.cpp $(addsuffix *.cpp,$(wildcard 3rd/yoga/yo $(BUILD)/yoga.o : src/yogaone.cpp $(YOGASRC) $(CCPP) $(STDCPP) $(OUTPUT_O) $@ $< $(YOGAINC) $(CFLAGS) -SOLOUDSRC:=$(wildcard 3rd/soloud/src/core/*.cpp) - -$(BUILD)/soloud.o : src/soloudone.cpp $(SOLOUDSRC) src/soloudwavonly.h - $(CCPP) $(STDCPP) $(OUTPUT_O) $@ $< $(SOLOUDINC) $(CFLAGS) -DWITH_WINMM=1 - $(BUILD)/zlib_%.o : 3rd/zlib/%.c $(COMPILE_C) $(ZLIBINC) @@ -158,7 +153,7 @@ $(BUILD)/minizip_%.o : 3rd/zlib/contrib/minizip/%.c $(BUILD)/extlua_impl.o : extlua/extlua_impl.c $(COMPILE_C) $(LUAINC) -$(BIN)/$(APPNAME): $(MAIN_O) $(PLATFORM_O) $(EXTLUA_O) $(LTASK_O) $(LUA_O) $(DATALIST_O) $(BUILD)/yoga.o $(BUILD)/soloud.o $(ZLIB_O) $(MINIZIP_O) +$(BIN)/$(APPNAME): $(MAIN_O) $(PLATFORM_O) $(EXTLUA_O) $(LTASK_O) $(LUA_O) $(DATALIST_O) $(BUILD)/yoga.o $(ZLIB_O) $(MINIZIP_O) $(LD) $(OUTPUT_EXE) $@ $^ $(LDFLAGS) $(BIN)/sample.dll : extlua/extlua.c extlua/extlua_sample.c diff --git a/src/audio.c b/src/audio.c index 01541c7..815fe09 100644 --- a/src/audio.c +++ b/src/audio.c @@ -1,70 +1,204 @@ #include #include -#include "soloud_c.h" + +#include "zipreader.h" + +#define MA_NO_WIN32_FILEIO +#define MA_NO_MP3 +#define MA_NO_FLAC +#define MA_API static inline +#define MINIAUDIO_IMPLEMENTATION +#include "miniaudio.h" + +FILE * fopen_utf8(const char *filename, const char *mode); + +static ma_result +vfs_open_local(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) { + FILE* pFileStd; + const char* pOpenModeStr; + + MA_ASSERT(pFilePath != NULL); + MA_ASSERT(openMode != 0); + MA_ASSERT(pFile != NULL); + + (void)pVFS; + + if ((openMode & MA_OPEN_MODE_READ) != 0) { + if ((openMode & MA_OPEN_MODE_WRITE) != 0) { + pOpenModeStr = "r+"; + } else { + pOpenModeStr = "rb"; + } + } else { + pOpenModeStr = "wb"; + } + + pFileStd = fopen_utf8(pFilePath, pOpenModeStr); + + if (pFileStd == NULL) { + return MA_ERROR; + } + + *pFile = pFileStd; + + return MA_SUCCESS; +} + +struct custom_vfs { + ma_default_vfs base; + struct zipreader_name *zipnames; +}; + +struct custom_engine { + struct ma_engine engine; + struct ma_resource_manager rm; + struct custom_vfs vfs; +}; + +static ma_result +zr_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) { + struct custom_vfs *vfs = (struct custom_vfs *)pVFS; + if (openMode != MA_OPEN_MODE_READ) + return MA_NOT_IMPLEMENTED; + zipreader_file zf = zipreader_open(vfs->zipnames, pFilePath); + if (zf == NULL) { + return MA_ERROR; + } + *pFile = (ma_vfs_file)zf; + return MA_SUCCESS; +} + +static ma_result +zr_close(ma_vfs* pVFS, ma_vfs_file file) { + (void)pVFS; + zipreader_close((zipreader_file)file); + return MA_SUCCESS; +} + +static ma_result +zr_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead) { + (void)pVFS; + int bytes = (int)sizeInBytes; + if (bytes!= sizeInBytes || bytes < 0) + return MA_OUT_OF_RANGE; + int rd = zipreader_read((zipreader_file)file, pDst, bytes); + if (rd < 0) + return MA_IO_ERROR; + *pBytesRead = rd; + return MA_SUCCESS; +} + +static ma_result +zr_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin) { + (void)pVFS; + int whence; + switch (origin) { + case ma_seek_origin_start : + whence = SEEK_SET; + break; + case ma_seek_origin_current : + whence = SEEK_CUR; + break; + case ma_seek_origin_end : + whence = SEEK_END; + break; + default : + return MA_INVALID_ARGS; + } + if (zipreader_seek((zipreader_file)file, offset, whence) != 0) { + return MA_ERROR; + } + return MA_SUCCESS; +} + +static ma_result +zr_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor) { + (void)pVFS; + *pCursor = zipreader_tell((zipreader_file)file); + if (*pCursor < 0) + return MA_ERROR; + return MA_SUCCESS; +} + +static ma_result +zr_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) { + (void)pVFS; + pInfo->sizeInBytes = zipreader_size((zipreader_file)file); + return MA_SUCCESS; +} static int laudio_init(lua_State *L) { - void * so = Soloud_create(); + lua_settop(L, 1); + struct custom_engine *e = (struct custom_engine *)lua_newuserdatauv(L, sizeof(*e), 1); - // todo : Call Soloud_initEx - int err = Soloud_init(so); - - lua_pushlightuserdata(L, so); + ma_default_vfs_init(&e->vfs.base, NULL); + e->vfs.base.cb.onOpen = vfs_open_local; + e->vfs.zipnames = NULL; - if (err) { - lua_pushstring(L, Soloud_getErrorString(so, err)); - return 2; - } else { - return 1; + if (lua_isuserdata(L, 1)) { + e->vfs.zipnames = lua_touserdata(L, 1); + e->vfs.base.cb.onOpen = zr_open; + e->vfs.base.cb.onOpenW = NULL; + e->vfs.base.cb.onClose = zr_close; + e->vfs.base.cb.onRead = zr_read; + e->vfs.base.cb.onWrite = NULL; + e->vfs.base.cb.onSeek = zr_seek; + e->vfs.base.cb.onTell = zr_tell; + e->vfs.base.cb.onInfo = zr_info; + lua_pushvalue(L, 1); + lua_setiuservalue(L, -2, 1); + } + + ma_resource_manager_config config = ma_resource_manager_config_init(); + config.pVFS = &e->vfs; + + ma_result r = ma_resource_manager_init(&config, &e->rm); + if (r != MA_SUCCESS) { + return luaL_error(L, "ma_resource_manager_init() error : %s", ma_result_description(r)); + } + + ma_engine_config ec = ma_engine_config_init(); + ec.pResourceManager = &e->rm; + r = ma_engine_init(&ec, &e->engine); + if (r != MA_SUCCESS) { + return luaL_error(L, "ma_engine_init() error : %s", ma_result_description(r)); } + + return 1; } static int laudio_deinit(lua_State *L) { - luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); - void * so = lua_touserdata(L, 1); - Soloud_deinit(so); - Soloud_destroy(so); + luaL_checktype(L, 1, LUA_TUSERDATA); + ma_engine *engine = (ma_engine *)lua_touserdata(L, 1); + ma_engine_uninit(engine); + return 0; } +/* +// todo : call ma_sound_init_from_file() + static int laudio_load(lua_State *L) { - size_t sz; - const char * data = luaL_checklstring(L, 1, &sz); - void * s = Wav_create(); - int err = Wav_loadMemEx(s, (const unsigned char *)data, sz, 0, 0); - if (err) { - Wav_destroy(s); - return 0; - } - lua_pushlightuserdata(L, s); - return 1; + return 0; } static int laudio_unload(lua_State *L) { - if (lua_isnoneornil(L, 1)) { - return 0; - } - luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); - void *s = lua_touserdata(L, 1); - Wav_destroy(s); return 0; } +*/ static int laudio_play(lua_State *L) { - if (lua_isnoneornil(L, 2)) { - return 0; - } - luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); - luaL_checktype(L, 2, LUA_TLIGHTUSERDATA); - void * dev = lua_touserdata(L, 1); - void * s = lua_touserdata(L, 2); - unsigned int h = Soloud_play(dev, s); - lua_pushinteger(L, h); - return 1; + luaL_checktype(L, 1, LUA_TUSERDATA); + ma_engine *engine = (ma_engine *)lua_touserdata(L, 1); + const char *filename = luaL_checkstring(L, 2); + + ma_engine_play_sound(engine, filename, NULL); + return 0; } int @@ -73,8 +207,6 @@ luaopen_soluna_audio(lua_State *L) { luaL_Reg l[] = { { "init", laudio_init }, { "deinit", laudio_deinit }, - { "load", laudio_load }, - { "unload", laudio_unload }, { "play", laudio_play }, { NULL, NULL }, }; diff --git a/src/luazip.c b/src/luazip.c index a96abe1..64bd11b 100644 --- a/src/luazip.c +++ b/src/luazip.c @@ -792,7 +792,7 @@ zipreader_read(zipreader_file zf, void *dst, int bytes) { return unzReadCurrentFile(zf, dst, bytes); } -size_t +ssize_t zipreader_tell(zipreader_file zf) { return unztell64(zf); } diff --git a/src/service/audio.lua b/src/service/audio.lua index ab7c473..20dfd52 100644 --- a/src/service/audio.lua +++ b/src/service/audio.lua @@ -39,21 +39,6 @@ local function load_bundle(filename) return bank, map end -local function load_all() - for i, filename in ipairs(BANK) do - local content = file.load(filename) - local obj = content and audio.load(content) - if obj then - BANK[i] = obj - BANK[obj] = content - print("Load", i, filename) - else - BANK[i] = false - print("Can't load " .. filename) - end - end -end - function S.init(filename) assert(DEVICE == nil) DEVICE = false @@ -66,7 +51,6 @@ function S.init(filename) -- todo : load file list BANK = bank DEVICE = d - load_all() local inject = ltask.dispatch() for k, v in pairs(api) do inject[k] = v @@ -76,15 +60,6 @@ function S.init(filename) end function S.quit() - if BANK then - for i, obj in ipairs(BANK) do - if obj then - audio.unload(obj) - BANK[i] = false - BANK[obj] = nil - end - end - end if DEVICE then audio.deinit(DEVICE) DEVICE = nil diff --git a/src/soloudcapi.h b/src/soloudcapi.h deleted file mode 100644 index d496464..0000000 --- a/src/soloudcapi.h +++ /dev/null @@ -1,993 +0,0 @@ -#ifndef SOLOUD_C_API_H -#define SOLOUD_C_API_H - -#include "soloud.h" -#include "soloud_wav.h" -#include "soloud_wavstream.h" - -using namespace SoLoud; - -extern "C" -{ - -void Soloud_destroy(void * aClassPtr) -{ - delete (Soloud *)aClassPtr; -} - -void * Soloud_create() -{ - return (void *)new Soloud; -} - -int Soloud_init(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->init(); -} - -int Soloud_initEx(void * aClassPtr, unsigned int aFlags, unsigned int aBackend, unsigned int aSamplerate, unsigned int aBufferSize, unsigned int aChannels) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->init(aFlags, aBackend, aSamplerate, aBufferSize, aChannels); -} - -void Soloud_deinit(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->deinit(); -} - -unsigned int Soloud_getVersion(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getVersion(); -} - -const char * Soloud_getErrorString(void * aClassPtr, int aErrorCode) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getErrorString(aErrorCode); -} - -unsigned int Soloud_getBackendId(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getBackendId(); -} - -const char * Soloud_getBackendString(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getBackendString(); -} - -unsigned int Soloud_getBackendChannels(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getBackendChannels(); -} - -unsigned int Soloud_getBackendSamplerate(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getBackendSamplerate(); -} - -unsigned int Soloud_getBackendBufferSize(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getBackendBufferSize(); -} - -int Soloud_setSpeakerPosition(void * aClassPtr, unsigned int aChannel, float aX, float aY, float aZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->setSpeakerPosition(aChannel, aX, aY, aZ); -} - -int Soloud_getSpeakerPosition(void * aClassPtr, unsigned int aChannel, float * aX, float * aY, float * aZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getSpeakerPosition(aChannel, *aX, *aY, *aZ); -} - -unsigned int Soloud_play(void * aClassPtr, AudioSource * aSound) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->play(*aSound); -} - -unsigned int Soloud_playEx(void * aClassPtr, AudioSource * aSound, float aVolume, float aPan, int aPaused, unsigned int aBus) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->play(*aSound, aVolume, aPan, !!aPaused, aBus); -} - -unsigned int Soloud_playClocked(void * aClassPtr, double aSoundTime, AudioSource * aSound) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->playClocked(aSoundTime, *aSound); -} - -unsigned int Soloud_playClockedEx(void * aClassPtr, double aSoundTime, AudioSource * aSound, float aVolume, float aPan, unsigned int aBus) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->playClocked(aSoundTime, *aSound, aVolume, aPan, aBus); -} - -unsigned int Soloud_play3d(void * aClassPtr, AudioSource * aSound, float aPosX, float aPosY, float aPosZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->play3d(*aSound, aPosX, aPosY, aPosZ); -} - -unsigned int Soloud_play3dEx(void * aClassPtr, AudioSource * aSound, float aPosX, float aPosY, float aPosZ, float aVelX, float aVelY, float aVelZ, float aVolume, int aPaused, unsigned int aBus) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->play3d(*aSound, aPosX, aPosY, aPosZ, aVelX, aVelY, aVelZ, aVolume, !!aPaused, aBus); -} - -unsigned int Soloud_play3dClocked(void * aClassPtr, double aSoundTime, AudioSource * aSound, float aPosX, float aPosY, float aPosZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->play3dClocked(aSoundTime, *aSound, aPosX, aPosY, aPosZ); -} - -unsigned int Soloud_play3dClockedEx(void * aClassPtr, double aSoundTime, AudioSource * aSound, float aPosX, float aPosY, float aPosZ, float aVelX, float aVelY, float aVelZ, float aVolume, unsigned int aBus) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->play3dClocked(aSoundTime, *aSound, aPosX, aPosY, aPosZ, aVelX, aVelY, aVelZ, aVolume, aBus); -} - -unsigned int Soloud_playBackground(void * aClassPtr, AudioSource * aSound) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->playBackground(*aSound); -} - -unsigned int Soloud_playBackgroundEx(void * aClassPtr, AudioSource * aSound, float aVolume, int aPaused, unsigned int aBus) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->playBackground(*aSound, aVolume, !!aPaused, aBus); -} - -int Soloud_seek(void * aClassPtr, unsigned int aVoiceHandle, double aSeconds) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->seek(aVoiceHandle, aSeconds); -} - -void Soloud_stop(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->stop(aVoiceHandle); -} - -void Soloud_stopAll(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->stopAll(); -} - -void Soloud_stopAudioSource(void * aClassPtr, AudioSource * aSound) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->stopAudioSource(*aSound); -} - -int Soloud_countAudioSource(void * aClassPtr, AudioSource * aSound) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->countAudioSource(*aSound); -} - -void Soloud_setFilterParameter(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aFilterId, unsigned int aAttributeId, float aValue) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setFilterParameter(aVoiceHandle, aFilterId, aAttributeId, aValue); -} - -float Soloud_getFilterParameter(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aFilterId, unsigned int aAttributeId) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getFilterParameter(aVoiceHandle, aFilterId, aAttributeId); -} - -void Soloud_fadeFilterParameter(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aFilterId, unsigned int aAttributeId, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->fadeFilterParameter(aVoiceHandle, aFilterId, aAttributeId, aTo, aTime); -} - -void Soloud_oscillateFilterParameter(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aFilterId, unsigned int aAttributeId, float aFrom, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->oscillateFilterParameter(aVoiceHandle, aFilterId, aAttributeId, aFrom, aTo, aTime); -} - -double Soloud_getStreamTime(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getStreamTime(aVoiceHandle); -} - -double Soloud_getStreamPosition(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getStreamPosition(aVoiceHandle); -} - -int Soloud_getPause(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getPause(aVoiceHandle); -} - -float Soloud_getVolume(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getVolume(aVoiceHandle); -} - -float Soloud_getOverallVolume(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getOverallVolume(aVoiceHandle); -} - -float Soloud_getPan(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getPan(aVoiceHandle); -} - -float Soloud_getSamplerate(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getSamplerate(aVoiceHandle); -} - -int Soloud_getProtectVoice(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getProtectVoice(aVoiceHandle); -} - -unsigned int Soloud_getActiveVoiceCount(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getActiveVoiceCount(); -} - -unsigned int Soloud_getVoiceCount(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getVoiceCount(); -} - -int Soloud_isValidVoiceHandle(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->isValidVoiceHandle(aVoiceHandle); -} - -float Soloud_getRelativePlaySpeed(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getRelativePlaySpeed(aVoiceHandle); -} - -float Soloud_getPostClipScaler(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getPostClipScaler(); -} - -unsigned int Soloud_getMainResampler(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getMainResampler(); -} - -float Soloud_getGlobalVolume(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getGlobalVolume(); -} - -unsigned int Soloud_getMaxActiveVoiceCount(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getMaxActiveVoiceCount(); -} - -int Soloud_getLooping(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getLooping(aVoiceHandle); -} - -int Soloud_getAutoStop(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getAutoStop(aVoiceHandle); -} - -double Soloud_getLoopPoint(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getLoopPoint(aVoiceHandle); -} - -void Soloud_setLoopPoint(void * aClassPtr, unsigned int aVoiceHandle, double aLoopPoint) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setLoopPoint(aVoiceHandle, aLoopPoint); -} - -void Soloud_setLooping(void * aClassPtr, unsigned int aVoiceHandle, int aLooping) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setLooping(aVoiceHandle, !!aLooping); -} - -void Soloud_setAutoStop(void * aClassPtr, unsigned int aVoiceHandle, int aAutoStop) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setAutoStop(aVoiceHandle, !!aAutoStop); -} - -int Soloud_setMaxActiveVoiceCount(void * aClassPtr, unsigned int aVoiceCount) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->setMaxActiveVoiceCount(aVoiceCount); -} - -void Soloud_setInaudibleBehavior(void * aClassPtr, unsigned int aVoiceHandle, int aMustTick, int aKill) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setInaudibleBehavior(aVoiceHandle, !!aMustTick, !!aKill); -} - -void Soloud_setGlobalVolume(void * aClassPtr, float aVolume) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setGlobalVolume(aVolume); -} - -void Soloud_setPostClipScaler(void * aClassPtr, float aScaler) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setPostClipScaler(aScaler); -} - -void Soloud_setMainResampler(void * aClassPtr, unsigned int aResampler) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setMainResampler(aResampler); -} - -void Soloud_setPause(void * aClassPtr, unsigned int aVoiceHandle, int aPause) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setPause(aVoiceHandle, !!aPause); -} - -void Soloud_setPauseAll(void * aClassPtr, int aPause) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setPauseAll(!!aPause); -} - -int Soloud_setRelativePlaySpeed(void * aClassPtr, unsigned int aVoiceHandle, float aSpeed) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->setRelativePlaySpeed(aVoiceHandle, aSpeed); -} - -void Soloud_setProtectVoice(void * aClassPtr, unsigned int aVoiceHandle, int aProtect) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setProtectVoice(aVoiceHandle, !!aProtect); -} - -void Soloud_setSamplerate(void * aClassPtr, unsigned int aVoiceHandle, float aSamplerate) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setSamplerate(aVoiceHandle, aSamplerate); -} - -void Soloud_setPan(void * aClassPtr, unsigned int aVoiceHandle, float aPan) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setPan(aVoiceHandle, aPan); -} - -void Soloud_setPanAbsolute(void * aClassPtr, unsigned int aVoiceHandle, float aLVolume, float aRVolume) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setPanAbsolute(aVoiceHandle, aLVolume, aRVolume); -} - -void Soloud_setChannelVolume(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aChannel, float aVolume) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setChannelVolume(aVoiceHandle, aChannel, aVolume); -} - -void Soloud_setVolume(void * aClassPtr, unsigned int aVoiceHandle, float aVolume) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setVolume(aVoiceHandle, aVolume); -} - -void Soloud_setDelaySamples(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aSamples) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setDelaySamples(aVoiceHandle, aSamples); -} - -void Soloud_fadeVolume(void * aClassPtr, unsigned int aVoiceHandle, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->fadeVolume(aVoiceHandle, aTo, aTime); -} - -void Soloud_fadePan(void * aClassPtr, unsigned int aVoiceHandle, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->fadePan(aVoiceHandle, aTo, aTime); -} - -void Soloud_fadeRelativePlaySpeed(void * aClassPtr, unsigned int aVoiceHandle, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->fadeRelativePlaySpeed(aVoiceHandle, aTo, aTime); -} - -void Soloud_fadeGlobalVolume(void * aClassPtr, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->fadeGlobalVolume(aTo, aTime); -} - -void Soloud_schedulePause(void * aClassPtr, unsigned int aVoiceHandle, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->schedulePause(aVoiceHandle, aTime); -} - -void Soloud_scheduleStop(void * aClassPtr, unsigned int aVoiceHandle, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->scheduleStop(aVoiceHandle, aTime); -} - -void Soloud_oscillateVolume(void * aClassPtr, unsigned int aVoiceHandle, float aFrom, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->oscillateVolume(aVoiceHandle, aFrom, aTo, aTime); -} - -void Soloud_oscillatePan(void * aClassPtr, unsigned int aVoiceHandle, float aFrom, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->oscillatePan(aVoiceHandle, aFrom, aTo, aTime); -} - -void Soloud_oscillateRelativePlaySpeed(void * aClassPtr, unsigned int aVoiceHandle, float aFrom, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->oscillateRelativePlaySpeed(aVoiceHandle, aFrom, aTo, aTime); -} - -void Soloud_oscillateGlobalVolume(void * aClassPtr, float aFrom, float aTo, double aTime) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->oscillateGlobalVolume(aFrom, aTo, aTime); -} - -void Soloud_setGlobalFilter(void * aClassPtr, unsigned int aFilterId, Filter * aFilter) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setGlobalFilter(aFilterId, aFilter); -} - -void Soloud_setVisualizationEnable(void * aClassPtr, int aEnable) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->setVisualizationEnable(!!aEnable); -} - -float * Soloud_calcFFT(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->calcFFT(); -} - -float * Soloud_getWave(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getWave(); -} - -float Soloud_getApproximateVolume(void * aClassPtr, unsigned int aChannel) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getApproximateVolume(aChannel); -} - -unsigned int Soloud_getLoopCount(void * aClassPtr, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getLoopCount(aVoiceHandle); -} - -float Soloud_getInfo(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aInfoKey) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->getInfo(aVoiceHandle, aInfoKey); -} - -unsigned int Soloud_createVoiceGroup(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->createVoiceGroup(); -} - -int Soloud_destroyVoiceGroup(void * aClassPtr, unsigned int aVoiceGroupHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->destroyVoiceGroup(aVoiceGroupHandle); -} - -int Soloud_addVoiceToGroup(void * aClassPtr, unsigned int aVoiceGroupHandle, unsigned int aVoiceHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->addVoiceToGroup(aVoiceGroupHandle, aVoiceHandle); -} - -int Soloud_isVoiceGroup(void * aClassPtr, unsigned int aVoiceGroupHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->isVoiceGroup(aVoiceGroupHandle); -} - -int Soloud_isVoiceGroupEmpty(void * aClassPtr, unsigned int aVoiceGroupHandle) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->isVoiceGroupEmpty(aVoiceGroupHandle); -} - -void Soloud_update3dAudio(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->update3dAudio(); -} - -int Soloud_set3dSoundSpeed(void * aClassPtr, float aSpeed) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->set3dSoundSpeed(aSpeed); -} - -float Soloud_get3dSoundSpeed(void * aClassPtr) -{ - Soloud * cl = (Soloud *)aClassPtr; - return cl->get3dSoundSpeed(); -} - -void Soloud_set3dListenerParameters(void * aClassPtr, float aPosX, float aPosY, float aPosZ, float aAtX, float aAtY, float aAtZ, float aUpX, float aUpY, float aUpZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dListenerParameters(aPosX, aPosY, aPosZ, aAtX, aAtY, aAtZ, aUpX, aUpY, aUpZ); -} - -void Soloud_set3dListenerParametersEx(void * aClassPtr, float aPosX, float aPosY, float aPosZ, float aAtX, float aAtY, float aAtZ, float aUpX, float aUpY, float aUpZ, float aVelocityX, float aVelocityY, float aVelocityZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dListenerParameters(aPosX, aPosY, aPosZ, aAtX, aAtY, aAtZ, aUpX, aUpY, aUpZ, aVelocityX, aVelocityY, aVelocityZ); -} - -void Soloud_set3dListenerPosition(void * aClassPtr, float aPosX, float aPosY, float aPosZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dListenerPosition(aPosX, aPosY, aPosZ); -} - -void Soloud_set3dListenerAt(void * aClassPtr, float aAtX, float aAtY, float aAtZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dListenerAt(aAtX, aAtY, aAtZ); -} - -void Soloud_set3dListenerUp(void * aClassPtr, float aUpX, float aUpY, float aUpZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dListenerUp(aUpX, aUpY, aUpZ); -} - -void Soloud_set3dListenerVelocity(void * aClassPtr, float aVelocityX, float aVelocityY, float aVelocityZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dListenerVelocity(aVelocityX, aVelocityY, aVelocityZ); -} - -void Soloud_set3dSourceParameters(void * aClassPtr, unsigned int aVoiceHandle, float aPosX, float aPosY, float aPosZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dSourceParameters(aVoiceHandle, aPosX, aPosY, aPosZ); -} - -void Soloud_set3dSourceParametersEx(void * aClassPtr, unsigned int aVoiceHandle, float aPosX, float aPosY, float aPosZ, float aVelocityX, float aVelocityY, float aVelocityZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dSourceParameters(aVoiceHandle, aPosX, aPosY, aPosZ, aVelocityX, aVelocityY, aVelocityZ); -} - -void Soloud_set3dSourcePosition(void * aClassPtr, unsigned int aVoiceHandle, float aPosX, float aPosY, float aPosZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dSourcePosition(aVoiceHandle, aPosX, aPosY, aPosZ); -} - -void Soloud_set3dSourceVelocity(void * aClassPtr, unsigned int aVoiceHandle, float aVelocityX, float aVelocityY, float aVelocityZ) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dSourceVelocity(aVoiceHandle, aVelocityX, aVelocityY, aVelocityZ); -} - -void Soloud_set3dSourceMinMaxDistance(void * aClassPtr, unsigned int aVoiceHandle, float aMinDistance, float aMaxDistance) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dSourceMinMaxDistance(aVoiceHandle, aMinDistance, aMaxDistance); -} - -void Soloud_set3dSourceAttenuation(void * aClassPtr, unsigned int aVoiceHandle, unsigned int aAttenuationModel, float aAttenuationRolloffFactor) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dSourceAttenuation(aVoiceHandle, aAttenuationModel, aAttenuationRolloffFactor); -} - -void Soloud_set3dSourceDopplerFactor(void * aClassPtr, unsigned int aVoiceHandle, float aDopplerFactor) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->set3dSourceDopplerFactor(aVoiceHandle, aDopplerFactor); -} - -void Soloud_mix(void * aClassPtr, float * aBuffer, unsigned int aSamples) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->mix(aBuffer, aSamples); -} - -void Soloud_mixSigned16(void * aClassPtr, short * aBuffer, unsigned int aSamples) -{ - Soloud * cl = (Soloud *)aClassPtr; - cl->mixSigned16(aBuffer, aSamples); -} - -void Wav_destroy(void * aClassPtr) -{ - delete (Wav *)aClassPtr; -} - -void * Wav_create() -{ - return (void *)new Wav; -} - -int Wav_load(void * aClassPtr, const char * aFilename) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->load(aFilename); -} - -int Wav_loadMem(void * aClassPtr, const unsigned char * aMem, unsigned int aLength) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadMem(aMem, aLength); -} - -int Wav_loadMemEx(void * aClassPtr, const unsigned char * aMem, unsigned int aLength, int aCopy, int aTakeOwnership) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadMem(aMem, aLength, !!aCopy, !!aTakeOwnership); -} - -int Wav_loadFile(void * aClassPtr, File * aFile) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadFile(aFile); -} - -int Wav_loadRawWave8(void * aClassPtr, unsigned char * aMem, unsigned int aLength) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadRawWave8(aMem, aLength); -} - -int Wav_loadRawWave8Ex(void * aClassPtr, unsigned char * aMem, unsigned int aLength, float aSamplerate, unsigned int aChannels) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadRawWave8(aMem, aLength, aSamplerate, aChannels); -} - -int Wav_loadRawWave16(void * aClassPtr, short * aMem, unsigned int aLength) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadRawWave16(aMem, aLength); -} - -int Wav_loadRawWave16Ex(void * aClassPtr, short * aMem, unsigned int aLength, float aSamplerate, unsigned int aChannels) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadRawWave16(aMem, aLength, aSamplerate, aChannels); -} - -int Wav_loadRawWave(void * aClassPtr, float * aMem, unsigned int aLength) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadRawWave(aMem, aLength); -} - -int Wav_loadRawWaveEx(void * aClassPtr, float * aMem, unsigned int aLength, float aSamplerate, unsigned int aChannels, int aCopy, int aTakeOwnership) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->loadRawWave(aMem, aLength, aSamplerate, aChannels, !!aCopy, !!aTakeOwnership); -} - -double Wav_getLength(void * aClassPtr) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->getLength(); -} - -void Wav_setVolume(void * aClassPtr, float aVolume) -{ - Wav * cl = (Wav *)aClassPtr; - cl->setVolume(aVolume); -} - -void Wav_setLooping(void * aClassPtr, int aLoop) -{ - Wav * cl = (Wav *)aClassPtr; - cl->setLooping(!!aLoop); -} - -void Wav_setAutoStop(void * aClassPtr, int aAutoStop) -{ - Wav * cl = (Wav *)aClassPtr; - cl->setAutoStop(!!aAutoStop); -} - -void Wav_set3dMinMaxDistance(void * aClassPtr, float aMinDistance, float aMaxDistance) -{ - Wav * cl = (Wav *)aClassPtr; - cl->set3dMinMaxDistance(aMinDistance, aMaxDistance); -} - -void Wav_set3dAttenuation(void * aClassPtr, unsigned int aAttenuationModel, float aAttenuationRolloffFactor) -{ - Wav * cl = (Wav *)aClassPtr; - cl->set3dAttenuation(aAttenuationModel, aAttenuationRolloffFactor); -} - -void Wav_set3dDopplerFactor(void * aClassPtr, float aDopplerFactor) -{ - Wav * cl = (Wav *)aClassPtr; - cl->set3dDopplerFactor(aDopplerFactor); -} - -void Wav_set3dListenerRelative(void * aClassPtr, int aListenerRelative) -{ - Wav * cl = (Wav *)aClassPtr; - cl->set3dListenerRelative(!!aListenerRelative); -} - -void Wav_set3dDistanceDelay(void * aClassPtr, int aDistanceDelay) -{ - Wav * cl = (Wav *)aClassPtr; - cl->set3dDistanceDelay(!!aDistanceDelay); -} - -void Wav_set3dCollider(void * aClassPtr, AudioCollider * aCollider) -{ - Wav * cl = (Wav *)aClassPtr; - cl->set3dCollider(aCollider); -} - -void Wav_set3dColliderEx(void * aClassPtr, AudioCollider * aCollider, int aUserData) -{ - Wav * cl = (Wav *)aClassPtr; - cl->set3dCollider(aCollider, aUserData); -} - -void Wav_set3dAttenuator(void * aClassPtr, AudioAttenuator * aAttenuator) -{ - Wav * cl = (Wav *)aClassPtr; - cl->set3dAttenuator(aAttenuator); -} - -void Wav_setInaudibleBehavior(void * aClassPtr, int aMustTick, int aKill) -{ - Wav * cl = (Wav *)aClassPtr; - cl->setInaudibleBehavior(!!aMustTick, !!aKill); -} - -void Wav_setLoopPoint(void * aClassPtr, double aLoopPoint) -{ - Wav * cl = (Wav *)aClassPtr; - cl->setLoopPoint(aLoopPoint); -} - -double Wav_getLoopPoint(void * aClassPtr) -{ - Wav * cl = (Wav *)aClassPtr; - return cl->getLoopPoint(); -} - -void Wav_setFilter(void * aClassPtr, unsigned int aFilterId, Filter * aFilter) -{ - Wav * cl = (Wav *)aClassPtr; - cl->setFilter(aFilterId, aFilter); -} - -void Wav_stop(void * aClassPtr) -{ - Wav * cl = (Wav *)aClassPtr; - cl->stop(); -} - -void WavStream_destroy(void * aClassPtr) -{ - delete (WavStream *)aClassPtr; -} - -void * WavStream_create() -{ - return (void *)new WavStream; -} - -int WavStream_load(void * aClassPtr, const char * aFilename) -{ - WavStream * cl = (WavStream *)aClassPtr; - return cl->load(aFilename); -} - -int WavStream_loadMem(void * aClassPtr, const unsigned char * aData, unsigned int aDataLen) -{ - WavStream * cl = (WavStream *)aClassPtr; - return cl->loadMem(aData, aDataLen); -} - -int WavStream_loadMemEx(void * aClassPtr, const unsigned char * aData, unsigned int aDataLen, int aCopy, int aTakeOwnership) -{ - WavStream * cl = (WavStream *)aClassPtr; - return cl->loadMem(aData, aDataLen, !!aCopy, !!aTakeOwnership); -} - -int WavStream_loadToMem(void * aClassPtr, const char * aFilename) -{ - WavStream * cl = (WavStream *)aClassPtr; - return cl->loadToMem(aFilename); -} - -int WavStream_loadFile(void * aClassPtr, File * aFile) -{ - WavStream * cl = (WavStream *)aClassPtr; - return cl->loadFile(aFile); -} - -int WavStream_loadFileToMem(void * aClassPtr, File * aFile) -{ - WavStream * cl = (WavStream *)aClassPtr; - return cl->loadFileToMem(aFile); -} - -double WavStream_getLength(void * aClassPtr) -{ - WavStream * cl = (WavStream *)aClassPtr; - return cl->getLength(); -} - -void WavStream_setVolume(void * aClassPtr, float aVolume) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->setVolume(aVolume); -} - -void WavStream_setLooping(void * aClassPtr, int aLoop) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->setLooping(!!aLoop); -} - -void WavStream_setAutoStop(void * aClassPtr, int aAutoStop) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->setAutoStop(!!aAutoStop); -} - -void WavStream_set3dMinMaxDistance(void * aClassPtr, float aMinDistance, float aMaxDistance) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->set3dMinMaxDistance(aMinDistance, aMaxDistance); -} - -void WavStream_set3dAttenuation(void * aClassPtr, unsigned int aAttenuationModel, float aAttenuationRolloffFactor) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->set3dAttenuation(aAttenuationModel, aAttenuationRolloffFactor); -} - -void WavStream_set3dDopplerFactor(void * aClassPtr, float aDopplerFactor) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->set3dDopplerFactor(aDopplerFactor); -} - -void WavStream_set3dListenerRelative(void * aClassPtr, int aListenerRelative) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->set3dListenerRelative(!!aListenerRelative); -} - -void WavStream_set3dDistanceDelay(void * aClassPtr, int aDistanceDelay) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->set3dDistanceDelay(!!aDistanceDelay); -} - -void WavStream_set3dCollider(void * aClassPtr, AudioCollider * aCollider) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->set3dCollider(aCollider); -} - -void WavStream_set3dColliderEx(void * aClassPtr, AudioCollider * aCollider, int aUserData) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->set3dCollider(aCollider, aUserData); -} - -void WavStream_set3dAttenuator(void * aClassPtr, AudioAttenuator * aAttenuator) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->set3dAttenuator(aAttenuator); -} - -void WavStream_setInaudibleBehavior(void * aClassPtr, int aMustTick, int aKill) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->setInaudibleBehavior(!!aMustTick, !!aKill); -} - -void WavStream_setLoopPoint(void * aClassPtr, double aLoopPoint) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->setLoopPoint(aLoopPoint); -} - -double WavStream_getLoopPoint(void * aClassPtr) -{ - WavStream * cl = (WavStream *)aClassPtr; - return cl->getLoopPoint(); -} - -void WavStream_setFilter(void * aClassPtr, unsigned int aFilterId, Filter * aFilter) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->setFilter(aFilterId, aFilter); -} - -void WavStream_stop(void * aClassPtr) -{ - WavStream * cl = (WavStream *)aClassPtr; - cl->stop(); -} - -} // extern "C" - -#endif \ No newline at end of file diff --git a/src/soloudone.cpp b/src/soloudone.cpp deleted file mode 100644 index 08e0688..0000000 --- a/src/soloudone.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "core/soloud.cpp" -#include "core/soloud_audiosource.cpp" -#include "core/soloud_bus.cpp" -#include "core/soloud_core_3d.cpp" -#include "core/soloud_core_basicops.cpp" -#include "core/soloud_core_faderops.cpp" -#include "core/soloud_core_filterops.cpp" -#include "core/soloud_core_getters.cpp" -#include "core/soloud_core_setters.cpp" -#include "core/soloud_core_voicegroup.cpp" -#include "core/soloud_core_voiceops.cpp" -#include "core/soloud_fader.cpp" -#include "core/soloud_fft.cpp" -#include "core/soloud_file.cpp" -#include "core/soloud_misc.cpp" -#include "core/soloud_queue.cpp" -#include "core/soloud_thread.cpp" - -#ifdef SOLOUD_FILTER - -#include "core/soloud_filter.cpp" - -#include "filter/soloud_bassboostfilter.cpp" -#include "filter/soloud_biquadresonantfilter.cpp" -#include "filter/soloud_dcremovalfilter.cpp" -#include "filter/soloud_duckfilter.cpp" -#include "filter/soloud_echofilter.cpp" -#define catmullrom catmullrom_ -#include "filter/soloud_eqfilter.cpp" -#undef catmullrom_ -#include "filter/soloud_fftfilter.cpp" -#include "filter/soloud_flangerfilter.cpp" -#include "filter/soloud_freeverbfilter.cpp" -#include "filter/soloud_lofifilter.cpp" -#include "filter/soloud_robotizefilter.cpp" -#include "filter/soloud_waveshaperfilter.cpp" - -#endif - -#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) -#include "backend/winmm/soloud_winmm.cpp" -#elif defined(__APPLE__) -#include "backend/coreaudio/soloud_coreaudio.cpp" -#elif defined(__linux__) -#include "backend/alsa/soloud_alsa.cpp" -#elif defined(__EMSCRIPTEN__) -#include "backend/sdl2_static/soloud_sdl2_static.cpp" -#endif - -extern "C" { -#include "audiosource/wav/stb_vorbis.c" -} - -#ifdef SOLOUD_MP3_FLAC -#include "audiosource/wav/dr_impl.cpp" -#else -#include "soloudwavonly.h" -#endif - -#include "audiosource/wav/soloud_wav.cpp" -#include "audiosource/wav/soloud_wavstream.cpp" - -#ifdef SOLOUD_SPEECH -#include "audiosource/speech/darray.cpp" -#include "audiosource/speech/klatt.cpp" -#include "audiosource/speech/resonator.cpp" -#include "audiosource/speech/soloud_speech.cpp" -#include "audiosource/speech/tts.cpp" -#endif - -#include "soloudcapi.h" diff --git a/src/soloudwavonly.h b/src/soloudwavonly.h deleted file mode 100644 index b591aca..0000000 --- a/src/soloudwavonly.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef SOLOUD_FAKE_MP3_H -#define SOLOUD_FAKE_MP3_H - -#define DR_WAV_IMPLEMENTATION -#define DR_WAV_NO_STDIO -#include "audiosource/wav/dr_wav.h" - -#define DRMP3_API static inline -#define DR_MP3_NO_STDIO -#include "audiosource/wav/dr_mp3.h" - -#define DRFLAC_API static inline -#define DR_FLAC_NO_STDIO -#define DR_FLAC_NO_CRC -#include "audiosource/wav/dr_flac.h" - -DRMP3_API void -drmp3_uninit(drmp3* pMP3) { -} - -DRMP3_API drmp3_bool32 -drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_allocation_callbacks* pAllocationCallbacks) { - return 0; -} - -DRMP3_API drmp3_bool32 -drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_allocation_callbacks* pAllocationCallbacks) { - return 0; -} - -DRMP3_API drmp3_uint64 -drmp3_get_pcm_frame_count(drmp3* pMP3) { - return 0; -} - -DRMP3_API drmp3_bool32 -drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex) { - return 0; -} - -DRMP3_API drmp3_uint64 -drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut) { - return 0; -} - -DRFLAC_API void -drflac_close(drflac* pFlac) { -} - -DRFLAC_API drflac* -drflac_open_memory(const void* pData, size_t dataSize, const drflac_allocation_callbacks* pAllocationCallbacks) { - return NULL; -} - -DRFLAC_API drflac* -drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) { - return NULL; -} - -DRFLAC_API drflac_bool32 -drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex) { - return 0; -} - -DRFLAC_API drflac_uint64 -drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut) { - return 0; -} - -#endif diff --git a/src/zipreader.h b/src/zipreader.h index e416ac9..8fa2a7b 100644 --- a/src/zipreader.h +++ b/src/zipreader.h @@ -15,7 +15,7 @@ zipreader_file zipreader_open(struct zipreader_name *names, const char * filenam void zipreader_close(zipreader_file f); int zipreader_read(zipreader_file f, void *dst, int bytes); int zipreader_seek(zipreader_file f, ssize_t offset, int origin); -size_t zipreader_tell(zipreader_file f); +ssize_t zipreader_tell(zipreader_file f); size_t zipreader_size(zipreader_file f); #endif From 35c6fbcb97ab7ceed6b37d7725dca96ec78e3b98 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sat, 21 Mar 2026 21:15:44 +0800 Subject: [PATCH 5/9] fix build --- clibs/soloud/make.lua | 28 ---------------------------- clibs/soluna/make.lua | 2 +- src/audio.c | 1 - src/luazip.c | 12 ++++++------ src/zipreader.h | 6 +++--- 5 files changed, 10 insertions(+), 39 deletions(-) delete mode 100644 clibs/soloud/make.lua diff --git a/clibs/soloud/make.lua b/clibs/soloud/make.lua deleted file mode 100644 index 8516f88..0000000 --- a/clibs/soloud/make.lua +++ /dev/null @@ -1,28 +0,0 @@ -local lm = require "luamake" - -lm.rootdir = lm.basedir .. "/3rd/soloud" - -lm:source_set "soloud_src" { - sources = { - lm.basedir .. "/src/soloudone.cpp", - }, - includes = { - "include", - "src", - }, - windows = { - defines = { - "WITH_WINMM=1", - }, - }, - macos = { - defines = { - "WITH_COREAUDIO=1", - }, - }, - linux = { - defines = { - lm.platform == "emcc" and "WITH_SDL2_STATIC=1" or "WITH_ALSA=1", - }, - }, -} diff --git a/clibs/soluna/make.lua b/clibs/soluna/make.lua index 1e3397d..bef6293 100644 --- a/clibs/soluna/make.lua +++ b/clibs/soluna/make.lua @@ -43,7 +43,7 @@ lm:source_set "soluna_src" { "3rd/lua", "3rd/yoga", "3rd/zlib", - "3rd/soloud/include", + "3rd/miniaudio", }, clang = { sources = lm.os == "macos" and { diff --git a/src/audio.c b/src/audio.c index 815fe09..9bfe120 100644 --- a/src/audio.c +++ b/src/audio.c @@ -6,7 +6,6 @@ #define MA_NO_WIN32_FILEIO #define MA_NO_MP3 #define MA_NO_FLAC -#define MA_API static inline #define MINIAUDIO_IMPLEMENTATION #include "miniaudio.h" diff --git a/src/luazip.c b/src/luazip.c index 64bd11b..7ba7d7b 100644 --- a/src/luazip.c +++ b/src/luazip.c @@ -792,7 +792,7 @@ zipreader_read(zipreader_file zf, void *dst, int bytes) { return unzReadCurrentFile(zf, dst, bytes); } -ssize_t +int64_t zipreader_tell(zipreader_file zf) { return unztell64(zf); } @@ -819,7 +819,7 @@ reopen_file(zipreader_file zf) { #define TMP_SKIP_BUFFER 4096 static int -skip_bytes(zipreader_file zf, ssize_t offset) { +skip_bytes(zipreader_file zf, int64_t offset) { char tmp[TMP_SKIP_BUFFER]; while (offset >= TMP_SKIP_BUFFER) { if (unzReadCurrentFile(zf, tmp, TMP_SKIP_BUFFER) != TMP_SKIP_BUFFER) @@ -832,22 +832,22 @@ skip_bytes(zipreader_file zf, ssize_t offset) { } int -zipreader_seek(zipreader_file zf, ssize_t offset, int origin) { +zipreader_seek(zipreader_file zf, int64_t offset, int origin) { if (origin == SEEK_CUR && offset >= 0) { return skip_bytes(zf, offset); } size_t size = zipreader_size(zf); size_t cur_pos = unztell64(zf); - ssize_t new_pos; + int64_t new_pos; switch (origin) { case SEEK_SET: new_pos = offset; break; case SEEK_CUR: - new_pos = (ssize_t)cur_pos + offset; + new_pos = (int64_t)cur_pos + offset; break; case SEEK_END: - new_pos = (ssize_t)size + offset; + new_pos = (int64_t)size + offset; break; default : return -1; diff --git a/src/zipreader.h b/src/zipreader.h index 8fa2a7b..351e5a6 100644 --- a/src/zipreader.h +++ b/src/zipreader.h @@ -1,7 +1,7 @@ #ifndef soluna_zip_reader_h #define soluna_zip_reader_h -#include +#include struct zipreader_name { const char * zipfile; @@ -14,8 +14,8 @@ typedef void * zipreader_file; zipreader_file zipreader_open(struct zipreader_name *names, const char * filename); void zipreader_close(zipreader_file f); int zipreader_read(zipreader_file f, void *dst, int bytes); -int zipreader_seek(zipreader_file f, ssize_t offset, int origin); -ssize_t zipreader_tell(zipreader_file f); +int zipreader_seek(zipreader_file f, int64_t offset, int origin); +int64_t zipreader_tell(zipreader_file f); size_t zipreader_size(zipreader_file f); #endif From 034ba19960ebd009211a7228dbdfcff867c0390a Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sat, 21 Mar 2026 21:21:00 +0800 Subject: [PATCH 6/9] fix none windows build --- src/luazip.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/luazip.c b/src/luazip.c index 7ba7d7b..8e44bfe 100644 --- a/src/luazip.c +++ b/src/luazip.c @@ -754,13 +754,7 @@ try_open(struct zipreader_name *name, const char *filename) { } filename += name->root_size; } - struct filename_convert tmp; - if (MultiByteToWideChar(CP_UTF8, 0, name->zipfile, -1, tmp.tmp, sizeof(tmp)) == 0) { - return NULL; - } - zlib_filefunc64_def ffunc; - fill_win32_filefunc64W(&ffunc); - unzFile zf = unzOpen2_64((const char *)tmp.tmp, &ffunc); + unzFile zf = unzip_open(NULL, name->zipfile); if (zf == NULL) return NULL; From d04c5fae02a93333372cf6bfce7ffa87f9313b44 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sat, 21 Mar 2026 22:57:08 +0800 Subject: [PATCH 7/9] call audio.init in mainthread by render service --- src/audio.c | 5 +++-- src/service/audio.lua | 12 ++++-------- src/service/render.lua | 25 +++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/audio.c b/src/audio.c index 9bfe120..04c8fd0 100644 --- a/src/audio.c +++ b/src/audio.c @@ -163,8 +163,9 @@ laudio_init(lua_State *L) { if (r != MA_SUCCESS) { return luaL_error(L, "ma_engine_init() error : %s", ma_result_description(r)); } + lua_pushlightuserdata(L, (void *)e); - return 1; + return 2; } static int @@ -192,7 +193,7 @@ laudio_unload(lua_State *L) { static int laudio_play(lua_State *L) { - luaL_checktype(L, 1, LUA_TUSERDATA); + luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); ma_engine *engine = (ma_engine *)lua_touserdata(L, 1); const char *filename = luaL_checkstring(L, 2); diff --git a/src/service/audio.lua b/src/service/audio.lua index 20dfd52..27f2526 100644 --- a/src/service/audio.lua +++ b/src/service/audio.lua @@ -43,9 +43,8 @@ function S.init(filename) assert(DEVICE == nil) DEVICE = false local bank, ret = load_bundle(filename) - local d, err = audio.init() - if err then - print ("Error : ", err) + local d = ltask.call(ltask.queryservice "render", "audio_engine") + if not d then return {} else -- todo : load file list @@ -59,11 +58,8 @@ function S.init(filename) end end -function S.quit() - if DEVICE then - audio.deinit(DEVICE) - DEVICE = nil - end +function S.deinit() + DEVICE = nil end return S diff --git a/src/service/render.lua b/src/service/render.lua index 0ccebc7..13045ab 100644 --- a/src/service/render.lua +++ b/src/service/render.lua @@ -228,6 +228,21 @@ end S.register_batch = assert(batch.register) S.submit_batch = assert(batch.submit) +local audio_engine + +function S.audio_engine() + if audio_engine then + local from = ltask.current_session().from + function audio_engine.quit() + local audio = require "soluna.audio" + ltask.call(from, "deinit") + audio.deinit(audio_engine.engine) + audio_engine = nil + end + return audio_engine.ptr + end +end + function S.quit() local workers = {} for _, v in ipairs(batch) do @@ -247,6 +262,9 @@ function S.quit() ltask.call(addr, "quit") end font.shutdown() + if audio_engine and audio_engine.quit then + audio_engine.quit() + end end function S.load_sprites(name) @@ -268,6 +286,13 @@ function S.load_sprites(name) end local function render_init(arg) + local audio = require "soluna.audio" + local engine, ptr = audio.init() + audio_engine = { + engine = engine, + ptr = ptr, + } + font.init() local texture_size = setting.texture_size From dfdb19ca7f702048948e3b38b97a09c628b168a8 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sat, 21 Mar 2026 23:00:28 +0800 Subject: [PATCH 8/9] remove soloud --- .gitmodules | 3 --- make.lua | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.gitmodules b/.gitmodules index 61cfe0a..2878dde 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,9 +22,6 @@ [submodule "bin/sokol-tools-bin"] path = bin/sokol-tools-bin url = https://github.com/floooh/sokol-tools-bin.git -[submodule "3rd/soloud"] - path = 3rd/soloud - url = https://github.com/jarikomppa/soloud.git [submodule "3rd/miniaudio"] path = 3rd/miniaudio url = https://github.com/mackron/miniaudio.git diff --git a/make.lua b/make.lua index 05e81a1..84d97c8 100644 --- a/make.lua +++ b/make.lua @@ -81,13 +81,12 @@ lm:conf { }, }, emcc = { - c = "c11", + c = "gnu11", flags = { "-Wall", "-pthread", "-fPIC", "--use-port=emdawnwebgpu", - "-s USE_SDL=2", }, links = { "idbfs.js", @@ -100,7 +99,6 @@ lm:conf { "-s FORCE_FILESYSTEM=1", '-s EXPORTED_RUNTIME_METHODS=\'["FS","FS_createPath","FS_createDataFile","IDBFS"]\'', "-s USE_PTHREADS=1", - "-s USE_SDL=2", "-s PTHREAD_POOL_SIZE='Math.max(2,navigator.hardwareConcurrency)'", "-s PTHREAD_POOL_SIZE_STRICT=2", lm.mode == "debug" and "-s ASSERTIONS=2", From d84e72b56447a5a4edf89038599e7b7267093ca8 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sat, 21 Mar 2026 23:01:20 +0800 Subject: [PATCH 9/9] remove soloud --- 3rd/soloud | 1 - 1 file changed, 1 deletion(-) delete mode 160000 3rd/soloud diff --git a/3rd/soloud b/3rd/soloud deleted file mode 160000 index e82fd32..0000000 --- a/3rd/soloud +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e82fd32c1f62183922f08c14c814a02b58db1873