pactl to switch the active sink in Gnome on Ubuntu 20.04 LTS by identifying the correct device index and setting it as default. This method ensures reliable audio routing for digital signage players, even when connected monitors are powered off at night, preventing silent playback issues that occur with automatic device switching.
Understanding PulseAudio Sink Management
Ubuntu 20.04 LTS utilizes PulseAudio as its primary sound server, which manages audio streams and output devices. The graphical interface in Gnome typically handles this automatically, but headless or semi-headless environments like digital signage require manual intervention. The core concept here is the sink, which represents an audio output device such as a monitor's HDMI audio, a USB headset, or a built-in speaker.
When a monitor is turned off, the operating system may detect the loss of the HDMI signal and automatically switch the active sink to a dummy device or mute the output entirely. To maintain consistent behavior, you must explicitly set the desired sink as the default using command-line utilities. This bypasses the dynamic detection logic that often fails in unattended scenarios.
Identifying Available Audio Devices
Before changing the output, you need to know exactly which sink corresponds to your hardware. Open a terminal and run the following command to list all available sinks:
pactl list short sinks
This command outputs a concise list containing the index number, name, description, and state of each audio device. Look for the entry that matches your target hardware, such as "HDMI" for a monitor or "ALSA" for internal speakers. Note the index number (the first column) of the device you wish to use. For example, if your HDMI device is listed as index 1, you will need this number for the next step.
If you encounter multiple similar devices or are unsure which one is active, you can also use pactl info to see the currently active sink profile. However, listing all sinks provides a complete inventory, allowing you to choose the most appropriate one for your signage setup. This is particularly useful if you have both analog and digital outputs available simultaneously.
Setting the Default Output Device
Once you have identified the correct index, use the pactl command to set it as the default sink. Replace <index> with the actual number you noted earlier:
pactl set-default-sink <index>
For instance, if your HDMI device is index 1, the command would be pactl set-default-sink 1. This change takes effect immediately for new audio streams. Existing applications might not switch until they are restarted, so it is good practice to restart your media player or signage software after making this change.
To verify that the change was successful, run pactl info again and check the Default Sink field. It should now display the name of the device you selected. If the output does not change, ensure that the device is not suspended. You can resume a suspended sink by running pactl suspend-sink <index> 0.
Automating for Digital Signage
For digital signage players, manual intervention is not feasible. You should automate this process using a startup script or a systemd service. Create a simple shell script that contains the pactl set-default-sink command with the hardcoded index of your preferred device.
#!/bin/bash
# Set HDMI output as default
pactl set-default-sink 1
# Optional: Adjust volume
pactl set-sink-volume 1 80%
Save this script and make it executable with chmod +x script.sh. Then, add it to your user’s autostart directory (~/.config/autostart) or create a systemd user service to ensure it runs every time the system boots. This guarantees that even if the system reboots or the audio server restarts, the correct output device is always selected.
This approach solves the common issue where audio stops playing because the system defaults to a non-existent or muted device. By hardcoding the sink index, you eliminate ambiguity. If your hardware configuration changes, you simply update the index in the script. This is far more robust than relying on GUI settings which may reset after updates.
For related troubleshooting, if you find that no sound cards are detected at all, you might need to investigate kernel modules or driver installations. See our guide on Solving No Sound Issue in Ubuntu: A Tech Support Guide for deeper diagnostic steps. Additionally, if you are dealing with complex audio routing or virtual devices, creating dummy sound cards can help isolate audio issues, as detailed in Creating Four Dummy Sound Cards on Ubuntu 24.04.
Frequently Asked Questions
How do I find the sink index if pactl list short sinks shows nothing?
If the list is empty, your PulseAudio server may not be running or has failed to detect any hardware. Try restarting the PulseAudio daemon with pulseaudio -k and then check the system logs for ALSA errors. Ensure that your audio cables are securely connected and that the monitor is powered on before checking.
Will this command affect other users on the same system?
No, pactl commands only affect the current user session. Each user has their own PulseAudio instance and default sink settings. If multiple users are logged in simultaneously via different terminals, they will each maintain their own audio preferences independently.
What if the HDMI audio drops out when the monitor sleeps?
Monitor sleep modes can cause the HDMI audio link to drop, leading PulseAudio to switch to a dummy sink. Setting a persistent default sink helps, but you may also need to configure your monitor to stay awake or adjust power management settings in GNOME to prevent the display from sleeping during critical operations.
Can I set the volume level along with the sink?
Yes, you can combine commands in a script. After setting the default sink, use pactl set-sink-volume <index> <percentage> to adjust the volume. For example, pactl set-sink-volume 1 80% sets the volume to 80% for sink index 1. This ensures consistent loudness levels for signage content.
Why does my audio still not play after changing the sink?
The application may be holding onto the old sink reference. Restart the application to force it to query the new default sink. Also, check if the specific sink is muted using pactl list sinks and look for the mute flag. Unmute it if necessary using pactl set-sink-mute <index> false.