[CSM] Add support for positional audio. (#5516)

Fixes parts of #5389.
master
red-001 2017-04-06 07:14:31 +01:00 committed by Loïc Blot
parent 6da828c471
commit 4ee6be856d
5 changed files with 51 additions and 23 deletions

View File

@ -131,7 +131,7 @@ The `:` prefix can also be used for maintaining backwards compatibility.
Sounds Sounds
------ ------
**NOTE: Not fully implemented yet.** **NOTE: max_hear_distance and connecting to objects is not implemented.**
Only Ogg Vorbis files are supported. Only Ogg Vorbis files are supported.
@ -158,18 +158,12 @@ from the available ones of the following files:
Examples of sound parameter tables: Examples of sound parameter tables:
-- Play locationless on all clients -- Play locationless
{ {
gain = 1.0, -- default gain = 1.0, -- default
} }
-- Play locationless to one player -- Play locationless, looped
{ {
to_player = name,
gain = 1.0, -- default
}
-- Play locationless to one player, looped
{
to_player = name,
gain = 1.0, -- default gain = 1.0, -- default
loop = true, loop = true,
} }
@ -187,8 +181,7 @@ Examples of sound parameter tables:
loop = true, loop = true,
} }
Looped sounds must either be connected to an object or played locationless to Looped sounds must either be connected to an object or played locationless.
one player using `to_player = name,`
### SimpleSoundSpec ### SimpleSoundSpec
* e.g. `""` * e.g. `""`

View File

@ -62,7 +62,6 @@ void ClientScripting::InitializeModApi(lua_State *L, int top)
{ {
ModApiUtil::InitializeClient(L, top); ModApiUtil::InitializeClient(L, top);
ModApiClient::Initialize(L, top); ModApiClient::Initialize(L, top);
ModApiSound::Initialize(L, top);
ModApiStorage::Initialize(L, top); ModApiStorage::Initialize(L, top);
ModApiEnvMod::InitializeClient(L, top); ModApiEnvMod::InitializeClient(L, top);

View File

@ -194,6 +194,45 @@ int ModApiClient::l_get_meta(lua_State *L)
return 1; return 1;
} }
int ModApiClient::l_sound_play(lua_State *L)
{
ISoundManager *sound = getClient(L)->getSoundManager();
SimpleSoundSpec spec;
read_soundspec(L, 1, spec);
float gain = 1.0 ;
bool looped = false;
s32 handle;
if (lua_istable(L, 2)) {
getfloatfield(L, 2, "gain", gain);
getboolfield(L, 2, "loop", looped);
lua_getfield(L, 2, "pos");
if (!lua_isnil(L, -1)) {
v3f pos = read_v3f(L, -1) * BS;
lua_pop(L, 1);
handle = sound->playSoundAt(spec.name, looped, gain * spec.gain, pos);
lua_pushinteger(L, handle);
return 1;
}
}
handle = sound->playSound(spec.name, looped, gain * spec.gain);
lua_pushinteger(L, handle);
return 1;
}
int ModApiClient::l_sound_stop(lua_State *L)
{
u32 handle = luaL_checkinteger(L, 1);
getClient(L)->getSoundManager()->stopSound(handle);
return 0;
}
void ModApiClient::Initialize(lua_State *L, int top) void ModApiClient::Initialize(lua_State *L, int top)
{ {
API_FCT(get_current_modname); API_FCT(get_current_modname);
@ -209,4 +248,6 @@ void ModApiClient::Initialize(lua_State *L, int top)
API_FCT(get_wielded_item); API_FCT(get_wielded_item);
API_FCT(disconnect); API_FCT(disconnect);
API_FCT(get_meta); API_FCT(get_meta);
API_FCT(sound_play);
API_FCT(sound_stop);
} }

View File

@ -65,6 +65,10 @@ private:
// get_meta(pos) // get_meta(pos)
static int l_get_meta(lua_State *L); static int l_get_meta(lua_State *L);
static int l_sound_play(lua_State *L);
static int l_sound_stop(lua_State *L);
public: public:
static void Initialize(lua_State *L, int top); static void Initialize(lua_State *L, int top);
}; };

View File

@ -30,12 +30,7 @@ int ModApiSound::l_sound_play(lua_State *L)
read_soundspec(L, 1, spec); read_soundspec(L, 1, spec);
bool looped = lua_toboolean(L, 2); bool looped = lua_toboolean(L, 2);
s32 handle; s32 handle = getGuiEngine(L)->playSound(spec, looped);
if (Client *client = getClient(L))
handle = client->getSoundManager()->playSound(spec, looped);
// Main menu doesn't have access to client, use guiEngine
else
handle = getGuiEngine(L)->playSound(spec, looped);
lua_pushinteger(L, handle); lua_pushinteger(L, handle);
@ -46,11 +41,7 @@ int ModApiSound::l_sound_stop(lua_State *L)
{ {
u32 handle = luaL_checkinteger(L, 1); u32 handle = luaL_checkinteger(L, 1);
if (Client *client = getClient(L)) getGuiEngine(L)->stopSound(handle);
client->getSoundManager()->stopSound(handle);
// Main menu doesn't have access to client, use guiEngine
else
getGuiEngine(L)->stopSound(handle);
return 1; return 1;
} }