betterxSound
Exports
Client and server exports (unchanged from xSound).
betterxSound keeps the full xSound export surface. The most common calls are below; signatures match upstream, so existing integrations keep working.
Client — playback
exports.xsound:PlayUrl(name, url, volume, loop, options)
exports.xsound:PlayUrlPos(name, url, volume, pos, loop, options)name— unique sound id (string).url— a direct audio file URL or a YouTube link.volume—0.0–1.0.pos—vector3for positional (3D) sound.loop—boolean.options— optional table of event callbacks (see below).
exports.xsound:PlayUrl("radio", "https://www.youtube.com/watch?v=jfKfPfyJRdk", 0.3, true)Client — control
exports.xsound:Destroy(name)
exports.xsound:Pause(name)
exports.xsound:Resume(name)
exports.xsound:repeatSound(name)
exports.xsound:Position(name, pos) -- pos: vector3
exports.xsound:Distance(name, distance) -- number
exports.xsound:setVolume(name, volume) -- 0.0–1.0
exports.xsound:setVolumeMax(name, volume) -- ceiling for dynamic falloff
exports.xsound:setTimeStamp(name, seconds) -- seek
exports.xsound:setSoundLoop(name, bool)
exports.xsound:setSoundDynamic(name, bool)
exports.xsound:setSoundURL(name, url)
exports.xsound:destroyOnFinish(name, bool)Client — info
exports.xsound:soundExists(name) -- boolean
exports.xsound:isPlaying(name) -- boolean
exports.xsound:isPaused(name) -- boolean
exports.xsound:isLooped(name) -- boolean
exports.xsound:isDynamic(name) -- boolean
exports.xsound:getTimeStamp(name) -- seconds
exports.xsound:getMaxDuration(name) -- seconds
exports.xsound:getVolume(name) -- number
exports.xsound:getDistance(name) -- number
exports.xsound:getInfo(name) -- table
exports.xsound:isPlayerCloseToAnySound() -- boolean
exports.xsound:isPlayerInStreamerMode() -- booleanClient — event callbacks
Pass callbacks in the options table on PlayUrl / PlayUrlPos:
exports.xsound:PlayUrl("radio", url, 0.3, false, {
onPlayStart = function(info) end,
onPlayEnd = function(info) end,
onPlayPause = function(info) end,
onPlayResume = function(info) end,
onLoading = function(info) end,
})Server
Server exports take source first and forward the action to that player's client:
exports.xsound:PlayUrl(source, name, url, volume, loop)
exports.xsound:PlayUrlPos(source, name, url, volume, pos, loop)
exports.xsound:Position(source, name, pos)
exports.xsound:Distance(source, name, distance)
exports.xsound:Destroy(source, name)
exports.xsound:Pause(source, name)
exports.xsound:Resume(source, name)
exports.xsound:setVolume(source, name, volume)
exports.xsound:setTimeStamp(source, name, seconds)
exports.xsound:destroyOnFinish(source, id, bool)To play a sound for every player from the server, loop over your player list and call the per-player export, or use the interact-sound emulator events (which are rate-limited and can be ACE-gated — see Security).