ALSAPulseAudio: Difference between revisions

From GNU Radio
Jump to navigation Jump to search
(reformat; clarify)
(Clarify the roles of ALSA and PulseAudio)
 
(2 intermediate revisions by one other user not shown)
Line 2: Line 2:
== Working with ALSA and Pulse Audio ==
== Working with ALSA and Pulse Audio ==


* Sound cards don't support arbitrary sampling rates. If your audio is choppy, check the rate of your audio sink or source: 44100 Hz works under all audio cards known, 48000 Hz on most, others may not.
* Don't clip: The maximum amplitude in your signal '''must not''' exceed 1.0.
* Don't clip: The maximum amplitude in your signal '''must not''' exceed 1.0.
* Set "OK to Block" to "No" when the flowgraph is throttled by another hardware device.  
* Set "OK to Block" to "No" when the flowgraph is throttled by another hardware device.
* Sound cards don't support arbitrary sampling rates. If your audio is choppy, check the rate of your audio sink or source: 44100 Hz works under all known audio cards, 48000 Hz on most, others may not.
* If you get lots of <code>aU</code> (audio underruns) on your terminal, try creating or editing ~/.gnuradio/config.conf as follows:
<pre>
[audio_alsa]
nperiods = 32
period_time = 0.010
verbose = false
</pre>


== Talking to ALSA ==
== Talking to ALSA ==


The GNU Radio Audio Sink and Source blocks use ALSA (unless ALSA support was disabled during build time). ALSA has been the standard sound API under Linux for a decade or more, so basically all programs that produce Audio know how to deal with it. Alternately one can use a ''sound server'' like PulseAudio that takes care of dealing with all the low-level details for the application.
When used on Linux, the GNU Radio Audio Sink and Source blocks typically use the ALSA Application Programming Interface (API), unless ALSA support was disabled during build time. ALSA has been the standard audio API under Linux for a decade or more, so basically all programs that produce audio know how to deal with it. GNU Radio also supports other audio APIs, but this page focuses on ALSA.
 
The ALSA system has a plug-in architecture, and one of these plug-ins allows applications that use the ALSA API such as GNU Radio to utilize the [https://en.wikipedia.org/wiki/PulseAudio PulseAudio] ''sound server'', which supports the complex use cases required on a modern computer such as mixing sound from various sources into a single stream that can be controlled by a central volume control, remote/network audio streaming, etc.


PulseAudio also provides a &quot;fake&quot; ALSA device to make ALSA applications talk to PulseAudio instead of directly with the hardware driver, allowing one central volume control, etc. However, PulseAudio's device isn't always perfect. PulseAudio is capable of resampling internally, but the results aren't always predictable. For GNU Radio applications, it's often desirable to use the raw device.
However, PulseAudio's device isn't always perfect. PulseAudio is capable of resampling internally, but the results aren't always predictable. Also, because of its complexity, PulseAudio can sometimes impact performance negatively, causing gaps in the audio being played back.  These gaps can be quite long on slower computers.  For some GNU Radio applications, it may be desirable to use the ALSA device directly, rather than using the PulseAudio path.


You can obtain a list the playback devices (for an Audio Sink) using the <code>aplay</code> program.
To do so, you can obtain a list of the ALSA playback devices (for an Audio Sink) using the <code>aplay</code> program.


* from a terminal window enter:
* from a terminal window enter:
Line 42: Line 51:
</pre>
</pre>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in the list which matches your desired device.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in the list which matches your desired device.
* use the first line of that entry (e.g. "hw:CARD=Generic,DEV=0") as the device name (without the quotes).
* use the first line of that entry (e.g. "hw:CARD=Generic,DEV=0") as the device name (without the quotes).  The device name can be set in the Audio Sink block in <code>gnuradio-companion</code>, or in the C++ source code of a GNU Radio C++ application, or in the <code>audio_alsa</code> stanza in the  <code>$HOME/.gnuradio/config.conf</code> file if you want to set the default device for all GNU Radio applications running from your Linux login session.


For audio input devices (an Audio Source), use:
For audio input devices (an Audio Source), use:

Latest revision as of 00:51, 23 December 2022

Working with ALSA and Pulse Audio

  • Don't clip: The maximum amplitude in your signal must not exceed 1.0.
  • Set "OK to Block" to "No" when the flowgraph is throttled by another hardware device.
  • Sound cards don't support arbitrary sampling rates. If your audio is choppy, check the rate of your audio sink or source: 44100 Hz works under all known audio cards, 48000 Hz on most, others may not.
  • If you get lots of aU (audio underruns) on your terminal, try creating or editing ~/.gnuradio/config.conf as follows:
[audio_alsa]
nperiods = 32
period_time = 0.010
verbose = false

Talking to ALSA

When used on Linux, the GNU Radio Audio Sink and Source blocks typically use the ALSA Application Programming Interface (API), unless ALSA support was disabled during build time. ALSA has been the standard audio API under Linux for a decade or more, so basically all programs that produce audio know how to deal with it. GNU Radio also supports other audio APIs, but this page focuses on ALSA.

The ALSA system has a plug-in architecture, and one of these plug-ins allows applications that use the ALSA API such as GNU Radio to utilize the PulseAudio sound server, which supports the complex use cases required on a modern computer such as mixing sound from various sources into a single stream that can be controlled by a central volume control, remote/network audio streaming, etc.

However, PulseAudio's device isn't always perfect. PulseAudio is capable of resampling internally, but the results aren't always predictable. Also, because of its complexity, PulseAudio can sometimes impact performance negatively, causing gaps in the audio being played back. These gaps can be quite long on slower computers. For some GNU Radio applications, it may be desirable to use the ALSA device directly, rather than using the PulseAudio path.

To do so, you can obtain a list of the ALSA playback devices (for an Audio Sink) using the aplay program.

  • from a terminal window enter:

aplay -L

  • a long list of options will be displayed, such as:
default
    Playback/recording through the PulseAudio sound server
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
hdmi:CARD=HDMI,DEV=0
    HDA ATI HDMI, HDMI 0
    HDMI Audio Output
hw:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    Direct hardware device without any conversions
plughw:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    Hardware device with all software conversions
...
  • find the entry such as:
hw:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    Direct hardware device without any conversions

      in the list which matches your desired device.

  • use the first line of that entry (e.g. "hw:CARD=Generic,DEV=0") as the device name (without the quotes). The device name can be set in the Audio Sink block in gnuradio-companion, or in the C++ source code of a GNU Radio C++ application, or in the audio_alsa stanza in the $HOME/.gnuradio/config.conf file if you want to set the default device for all GNU Radio applications running from your Linux login session.

For audio input devices (an Audio Source), use:

arecord -L

      to obtain a similar list.

Monitoring the audio input of your system with PulseAudio

IMPORTANT: this procedure only applies to an Audio Source block!

PulseAudio has its own monitor "ports". You can list all PulseAudio monitor sources by running:

pactl list|grep "Monitor Source"|sed 's/^[[:space:]]*Monitor Source: //g'

This will give you one or more lines containing something like

alsa_output.pci-0000_00_03.0.hdmi-stereo.monitor
alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
alsa_output.pci-0000_06_00.1.hdmi-stereo.monitor

Select the right name; assuming we use the analog input, the second line would be the right.

Add ALSA Pseudodevice for monitor

Now, we need to edit (or create, if it doesn't already exist) ~/.asoundrc.
Add

pcm.pulse_monitor {
    type pulse
    device alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
}

ctl.pulse_monitor {
    type pulse
    device alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
}

of course, replacing the device name with the correct one from the previous step.

Using the newly created device

In the Audio Source block, use pulse_monitor as the device name:

PulseAudio-ALSA-Monitoring.png