Skip to content
marchell edited this page Aug 2, 2025 · 4 revisions

Audio

Playing audio clips is simple. All you need is your own AudioHandler instance.

Creating audio handlers

using LabExtended.API.Audio;

public void CreateHandler()
{
    // Retrieves our AudioHandler (if we've already created one) 
    // OR creates a new one (in which case the delegate in the second parameter is called)
    AudioHandler handler = AudioManager.GetOrAddHandler("ExampleHandler", handler =>
    {
        // Adds an AudioPlayer instance to your AudioHandler instance.
        handler.AddPlayer();

        // Adds a SpeakerToy instance to your AudioHandler instance.
        // The first parameter is the name of the SpeakerToy, used only in the AudioHandler.
        // The second parameter is the controller ID of the SpeakerToy, which is used when sending audio to players.
        // - Assigning the same ID to multiple speakers results in the same audio playing from all speakers with this ID.
        handler.EnsureSpeaker("ExampleSpeaker", 1);
    });

    // Lets also load the clip that we want to play.
    // It's important to use the same name as the file in the method's first argument (this includes any extensions).
    KeyValuePair<string, byte[]> clip = AudioManager.GetClip("ExampleClip");
}

Using audio handlers

Forwarding voice chat packets

// This is called every time a player sends a voice chat packet to the server.
public void OnSpeaking(PlayerSendingVoiceChatMessageEventArgs args)
{
    // You should save your AudioHandler instance as a field or a property, this event is called A LOT
    if (!AudioManager.TryGetHandler("ExampleHandler", out var handler))
        return;

    // Since this is a LabAPI events and not a custom LabExtended event, we need to cast the LabAPI player instance
    // into our custom subtype ExPlayer instance.
    if (args.Speaker is not ExPlayer speaker)
        return;

    // This will send the voice chat message through each speaker you defined in your AudioHandler.
    handler.Transmit(args.Messsage.Data, args.Message.DataLength);

    // This will send the voice chat message through each speaker to players that are within 20 meters of the speaking player.
    handler.Transmit(args.Messsage.Data, args.Message.DataLength, player => player.Position.DistanceTo(speaker) <= 20f);
}

Playing audio clips

public void PlayClip()
{
    // Will return false if no AudioHandler with name "ExampleHandler" is found.
    if (!AudioManager.TryGetHandler("ExampleHandler", out var handler))
        return;

    // Will return false if no audio clip file with name "ExampleClip" is found.
    if (!AudioManager.TryGetClip("ExampleClip", out var clip))
        return;

    // Will start playing the audio clip (or put it into the queue if something is playing)
    // Audio of the clip will be sent through each speaker ID defined in your AudioHandler.
    handler.Player.Play(clip, false);

    // You can also start playback of an audio clip at a specific location.
    handler.PlayAt(clip, Vector3.zero);

    // OR you can start playback of an audio clip with a specific Transform!
    handler.PlayOn(clip, ExPlayer.Players.RandomItem().CameraTransform);
}

Events

You can keep track of your playback using events defined in the AudioPlayer class.

Clone this wiki locally