ALSA Basics
Stuff is a lot harder than it needs to be. Hopefully this article will do something to make things with ALSA less difficult.
The internet is filled with all these "do this, do that, just type this", and it will work. It's hit and miss. Most people are well intentioned, but... Anyway, this is an attempt to get someone going quick with sound on Linux, specifically OpenWRT. Yup, the router OS. It does sound too! But its capabilities are somewhat neutered compared to other versions of Linux (Rocky Linux, Ubuntu, etc.)
Hardware
CM6206 and CM6206-LX Based Chipsets with products made by several manufacturers and sold by even more vendors (just re-badging the same product)
...more coming soon
Drivers (Windows term there), AKA Firmware (Linux term there), and other Software (AKA Packages) to Install
opkg update
opkg install kmod-usb-audio kmod-sound-core alsa-utils alsa-lib alsa-ucm-conf alsa-utils alsa-utils-seq alsautils-tests
...more coming soon.
Basic Testing for a CM6206 Device from Amazon and Sold on AliExpress too
There's no need to have anything defined in /etc/asound.conf right now, for basic testing. Later, with more complex setups, configuration will need to be done here. But for now it can be an empty file.
Ready? Nope, not yet. You need a 2 Channel .WAV File for this as the aplay Utility doesn't 'speak' MP3. And make sure to be in the same directory as the .WAV file intended to be played.
aplay -D plug:dmix BeeGees.wav -vv
( -D = Device / AKA Plugin to use, where in this case a plugin is referred to as dmix)aplay -D hw:0,0 BeeGees.wav -vv
( -D = Device / AKA Plugin to use, where in this case the 'Hardware' PlugIn is being used and refers to a hardware device)
How do you know which hardware device to refer to?: aplay -l
(which outputs the following information, or something similar if there is only one sound / audio device);
**** List of PLAYBACK Hardware Devices ****
card 0: ICUSBAUDIO7D [ICUSBAUDIO7D], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
...and no, even though it is makes it seem like the hw (Hardware Device) would be hw:1,1 the 1,1 only refers to the fact that below is 1 of 1 "Subdevices", whose number is 0 (zero). So hw:0,0 is translated as hw:Card:Subdevice (which can be obtained, after reading carefully, the aplay -l command output).
Two Cool Commands to Try
Here's something fun to try. Two command prompts / SSH sessions are necessary because both commands need to be running at the same time.
Run this command in two 'sessions' (you don't have to press Enter simultaneously): aplay -D hw:0,0 BeeGees.wav -vv
aplay: main:834: audio open error: Resource busy
How'd that go? Not good, huh? Well, it wasn't supposed too (sorry, but it's a nice error message you'll be getting in the future for other stuff, so it's here to get you used to frustration : ) ).
OK, to make up for it, try running this command in two 'sessions': aplay -D plug:dmix BeeGees.wav -vv
Cool, huh! The below explanation is from ChatGPT, with very strict instructions on sources, what should be written, and some editing (easier than summing writing it from scratch, which is what ChatGPT is for, but not complex stuff like thisoverall article);
dmix Plugin:
- Primary Purpose: The
dmix
plugin is designed for mixing multiple audio streams from different clients and sending the mixed output to the same hardware device. Unlikedmix
allows multiple clients to play audio on the same channels simultaneously, effectively mixing their outputs together.- Example Use Case: If you have two instances of MPD, both wanting to play on channels 1-4 of an 8-channel device,
dmix
would mix the audio from both instances and send the combined output to those channels. This could result in overlapping sounds, which might be messy, butdmix
handles this mixing automatically.- Functionality:
dmix
allows clients to share the same hardware channels without any exclusive access. All clients' outputs are combined (mixed) and then sent to the hardware, making it suitable for scenarios where multiple audio sources need to be played simultaneously over the same channels.
...and
1. Streams:
- Definition: In the context of ALSA and the
dmix
plugin, a stream refers to an individual audio data flow from a specific application or source. Each application that plays or captures sound creates a separate stream.- Example: If you are playing music from a media player while simultaneously receiving notification sounds, each of these audio outputs is a separate stream. The
dmix
plugin mixes these streams together so that multiple applications can play sound through the same hardware device concurrently.2. Sharing:
- Definition:
dmix
combines multiple audio streams into one, whereasdshare
(not discussed here) allows distinct access to individual channels without altering or combining their data.- Example: If you have an 8-channel audio device,
dshare
could allow one application to use channels 1-2, another to use channels 3-4, and so on. Each application operates independently on its assigned channels.3. Channels:
- Definition: A channel refers to a single path of audio data. In stereo audio, there are two channels (left and right). Surround sound systems have more channels, such as 5.1 or 7.1, where each number represents an individual path for sound (e.g., front-left, front-right, center, subwoofer, etc.).
- Example in
dmix
anddshare
:
- In
dmix
, all channels from different streams are combined or mixed before being sent to the hardware.- In
dshare
, channels are assigned and accessed independently by different clients or streams, allowing for distinct control over each channel.4. Clients:
- Definition: A client in ALSA refers to any application or process that accesses ALSA for audio playback or capture. Each client can have one or more streams.
- Example: If you are running a music player, a video player, and a voice call application simultaneously, each is a separate ALSA client. Each of these clients can interact with the sound hardware via ALSA, using the
dmix
ordshare
plugin depending on the setup.