WhereiamL
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.
  • volume0.01.0.
  • posvector3 for positional (3D) sound.
  • loopboolean.
  • 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()        -- boolean

Client — 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).

On this page