Is there a way to control the JACK Output volume via terminal or get a PulseAudio Input?
Solution 1
Based on this example we can solve the problem.
If your sound card can't control the volume on the hardware side or the driver
doesn't support this feature of your sound card, a possible workaround is to
define a new virtual pcm device in the ~/.asoundrc
file, which controls the volume
on the software side.
First we need to know the name of our soundcard, thus
aplay -L
is the helpful command here. The actual card name will be displayed after CARD=
and the device name (number) after DEV=
.
We can test the device with
speaker-test -D <card name> -c <channel count> -twav
Now we create a new softvol
device by adding
pcm.softvol {
type softvol
slave {
pcm "<card name>,<device name>"
}
control {
name "<control name>"
card "<card name>"
}
}
to ~/.asoundrc
. (If the file doesn't exist, we have to create the file)
In this case should be Master
, please see additional information on control names in the link above.
Now we test the new device with
speaker-test -D softvol -c <channel count> -twav
Open alsamixer, you should see the new control Master
now and should be able to change the volume using alsamixer.
It may be necessary to additionally set the device as default in /etc/asound.conf
with:
pcm.!default {
type hw
card <card name>
}
ctl.!default {
type hw
card <card name>
}
Note that this is different from the suggestion in the link above, but that's what OP reported to work.
Now we need to set Jack interface device to softvol
and can use e.g.
amixer -q sset Master 5%+
amixer -q sset Master 5%-
amixer -q sset Master 50%
to increase or decrease the output volume by 5% respectively or set to 50%, fixed.
Amixer needs to "open" the device the first time before the Master volume commands are accessible. Start a sound-test with speaker-test -D softvol -c <channel count> -twav
while jackd
is not running and then use sudo alsactl store
to save the Master-volume state. Otherwise, a sound must be played through softvol
after each reboot for the volume control to work.
Solution 2
Update July 21, 2019
From a professional music website for Linux:
Sorry for posting non-ardour question but I need your guidance. When Jack takes control over audio, many apps, including flashplayer, act very loud i.e in VLC I have volume set to 5%. I would like to control the master volume like in alsamixer instead of setting levels for each app individually. How can I do that?
There are two answers posted and this one is the most helpful:
there is no such concept. JACK is designed for pro-audio and music creation workflows. Its not a desktop sound server, even though some of use it in that way. If you need such a thing, you will need to route all your JACK clients via a mixing client which could be something as simply as JackMix or as complex as Ardour. JACK itself does not provide this facility, and its totally out of the scope of its design.
The simplest solution then is to install JackMix:
"Ever struggled with a number of jack applications on your desktop everyone using its own master volume-fader but not one common place for all the volumes directly accessible?"
"The solution to your problem is JackMix, a mixer app for jack that looks exactly like the mixer you would use if you had to connect your analog equipment."
There are other applications for Jack which you can find listed here.
Original answer
I must confess to be musically-challenged but I think this script is where you are heading:
You can get a list of all sinks with
pacmd list-sinks, and set the volume with
pacmd set-sink-volume`, so you need to do something likeVOLUME='+5%' for SINK in `pacmd list-sinks | grep 'index:' | cut -b12-` do pacmd set-sink-volume $SINK $VOLUME done
where
$VOLUME
can be absolute (150%) or relative (+5%, -5%), and possibly other formats, too.Most window managers can be configured to launch scripts or programs, complete with arguments, when you press keys. That's the best method, but if your WM doesn't, there are tools like
xbindkeys
. So you can customize in any way you want.Note that Pulseaudio will start using hardware mixers if the sink volume goes over 100%, and that can distort the sound.
Also note that Pulseaudio allows to set the volume for each application ("audio stream") with pamcd set-sink-input-volume. You can list them with pacmd list-sink-inputs and set them in a similar way.
That allows you have the sink volumes at a fixed level so they are about equal, without using hardware mixers, and when you switch sinks, it will automatically have the "right" volume. That's the setup I prefer.
Solution 3
UPDATE 1
Just so I can give a quick explanation before a longer write up.
Even If PCM is not available (not just invisible in amixer) then we can still use PulseAudio to manage JACK because dbus will discover it.
Before anything else make sure you have the kernel modules loaded for your usb sound card with:
sudo modprobe snd-usb-audio
because this might be why your sound card controls are not showing up in amixer. Just to confirm please execute aplay -l
and aplay -L
and post the output of these two commands.
Next, we start by installing the corresponding pulseaudio packages:
sudo apt-get update && sudo apt-get install pulseaudio-module-jack
and then loading its corresponding module:
pactl load-module module-jack-sink channels=2
and finally setting the default sink to JACK
pacmd set-default-sink jack_out
As far as sudo pactl load-module module-alsa-sink control=PCM
, this line enables pulseaudio to create a new sink-source that handles the pulse code modulation volume level at the ALSA API sound card level. OP's sound card has to be capable of converting the digital audio stream to an analog one through pulse modulation, as there is audio coming out of the system and through the speakers.
You should first add a sink that controls the pcm device as an output with:
sudo pactl load-module module-alsa-sink control=PCM
then (just to double-check, see if you see the new output visible through the pavucontrol
i.e. pulseaudio volume control GUI)
you can control PCM sink output volume directly with
pactl set-sink-volume [pcm-sink-name likely something along the lines of alsa.default] 50%
Related videos on Youtube
Prototype700
Still trying to fix Ubuntu Bug #1 (Liberation)...
Updated on September 18, 2022Comments
-
Prototype700 over 1 year
I have a bit of a specific question:
Being a musician, I use Ubuntu for software monitoring and I would like to control my output master volume with my mouse wheel.
For this purpose, I currently use EasyStroke with the commands
amixer -D pulse sset Master 5%+
(Mouse wheel up) andamixer -D pulse sset Master 5%-
(Mouse wheel down), which works fine.The problem is that I use some programs that have a direct JACK output, such as Reaper, my DAW, and also some media players.
As long as the software uses the PulseAudio JACK Sink output, I can control the output volume via mouse wheel, but when the software does not use PulseAudio, it is directly connected to JACK and always at max volume.
If you refer to the screenshot: I am able to manipulate the master volume of the red-marked output (PulseAudio JACK Sink), but I actually need to access the one marked green to control all sound (system out).
Unfortunately, I can not control my ALSA master volume via
amixer -q sset Master X
, because ALSA does not offer any controls for my only USB sound card.Is there any way to control the JACK Output volume via terminal that I could replace my mouse button commands with?
Or alternatively, is there a way to add a PulseAudio input module to the right side of the JACK connections to connect Reaper and all other JACK software and route them through the PulseAudio JACK Sink? (PulseAudio JACK Source is only used for microphones and won't play back the input.)
-
mook765 almost 5 yearsAs far as I understand jack doesn't perform any signal processing, it only manages connections, so there is no existing command out of the box which would do what you want. But you may check github.com/voidseg/jack-volume , it looks at this might be a solution. I haven't tried it though, but it looks promising.
-
BJsgoodlife almost 5 yearsJust to clarify, you want pulse audio and jack to play nice with each other, right?
-
Prototype700 almost 5 years@mook765 I'm a little reluctant to build & install two old repositories on my production machine at the moment, especially since the libOSC it's based on removed all binaries and build files for some reason. Thank you for the suggestion, but I'll see if somebody has a more "native" solution first.
-
Prototype700 almost 5 years@BJsgoodlife I'm not sure what that implies? Is there something unclear about the problem?
-
mook765 almost 5 yearsI found this and follwed the instructions. I was able to create a control which appeared in alsamixer, but I couldn't get it to override the "Master" control and gave up. But I don't have a sound-card like the one you use, so maybe you are successful with that, take a look and try.
-
mook765 almost 5 yearsAnd no, you cannot route jack clients to
PulseAudio JACK Sink
, this is a readable client. You can route jack clients toPulseAudio JACK Source
and see that it doesn't work. I can see the volume slider in pavucontrol jumping when connected, but the audio stream is not registered in pulseaudio and you can't use it. -
Prototype700 almost 5 years@mook765 I would like to notify you that your softvol solution has solved this problem. I had to figure out a couple of issues, but the master volume control works perfectly now, even with JACK-programs. The first problem was to find out the device name of my sound card, because it's not the default "card 0", instead aplay -L shows it as "Track" (CARD=Track). So in that guide, I had to replace both "device_name" and "0" with "Track" for it to work. After that, I set the JACK interface device to "softvol" and replaced my hotkeys with "amixer -q sset Master %+/-" (I named the control "Master").
-
Prototype700 almost 5 years@mook765 Do you want to add an answer? I would like to award you the bounty, because you found the most simple and correct solution, I consider this solved. Thanks again, by the way!
-
mook765 almost 5 yearsI will do that, please give me one or two days. Did you had to add the
pcm.!default
section as well? This was an nice topic and I learned a lot about pulse and jack this way, thanks for the inspiration. -
Prototype700 almost 5 years@mook765 To be honest, I haven't looked deeper into that part, as it was clear to me that I just had to replace my USB sound card with softvol in the qJackCtl settings at that point. All programs connect at my JACK interface and softvol handles the rest. However, now that you mention it, I also had to add "pcm.!default {type hw; card Track} ctl.!default {type hw; card Track}" to /etc/asound.conf for the master volume to work. Again, this seems to be related to the unconventional name of my sound card. I don't know if that might have been the issue all along, but anyway this solution does work.
-
Prototype700 almost 5 years@mook765 Oh, and there is another small issue. Since amixer needs to "open" the device first before the Master volume commands are accessible, I had to add "aplay -D softvol ~/softvol-wakeup.wav &" to my JACK pre-start script (the WAV-file being a second of silence), else I would get no volume control in JACK, as I set it to autostart on boot without opening the softvol-device first. It's not super elegant, but it works for me and seems reliable, so not a big deal.
-
-
mook765 almost 5 yearsAnd how does this control the output volume of jackd? That's the problem in this case.
-
WinEunuuchs2Unix almost 5 years@mook765 Thanks for pointing that out. I've revised the answer.
-
mook765 almost 5 yearsThis looks quite mystic. The sound card OP uses does not have any controls, so how should that work. And how does this control the output volume of jack? Please elaborate.
-
Neticegear almost 5 yearsOk, gfive me a few minutes, and I will try to write up how the whole audio management more or less works in linux and update my answer.
-
Prototype700 almost 5 years@BarBar1234 Thank you for your answer. The snd-usb-audio module is loaded and aplay does show my sound card "card 1: Track [Fast Track], device 0: USB Audio [USB Audio]". However, alsamixer does not have any controls, as seen in the screenshot. I was hoping I could route my JACK connections into the ALSA Sink module you suggested, but when I try to add it via 'sudo pactl load-module module-alsa-sink', I just get the output 'Failure: Module initialisation failed' and no module is added, the package is installed, however. Any idea why that could be the case? There is no other info...
-
Prototype700 almost 5 years@WinEunuuchs2Unix Hi, thanks! I'm going to comment on both your answers: First, I tried to change the volume of the "alsa_output" sink (0, in my case), however changing the value does not change the volume at all, unfortunately. I can change the volume of the "jack_out" sink (1), but that only changes the volume of the programs that have a PulseAudio sound output set, which I was able to do previously as well.
-
Prototype700 almost 5 yearsRegarding your second solution with JackMix: If I understand it correctly, it works as a JACK plugin to route all connections through? This would be fine, however is there a way to control it via bash commands so I can assign hotkeys to the volume controls? I already route all my connections through the Calf EQ plugin, but I can't control it with bash commands. I could change the master volume with the plugin GUI, but I'd have to leave it open at all times and can't do it quickly. Unfortunately, I can't risk breaking my production PC, so I'd have to set up another system first to test JackMix.
-
mook765 almost 5 yearsI tried that too, sometimes
pactl load-module module-alsa-sink control=PCM
doesn't work, sometimes it does. If prepended with sudo I get errorno home directory
.pactl
shouldn't need sudo in normal configuration as pulseaudio runs in user space. -
mook765 almost 5 yearsAh, I see,
pactl load-module module-alsa-sink control=PCM
fails if jack is running and works when jack is stopped. -
Neticegear almost 5 yearsAh, good catch about pulseaudio running in user space under normal circumstances (--system mode is an option, I just had it running as such for something). In addition to further simplify the JACK control,. I would highly suggest also installing
apt-get install qjackctl
as that will create the connection script for you after initial basic configuration -
WinEunuuchs2Unix almost 5 yearsIf you have the disk space you can clone your current system and have a "test system" on your grub menu where you can safely destroy things and reclone later: askubuntu.com/questions/1028604/… I've searched for JackMix command line interface but came up empty. You could try linuxmusicians.com for more assistance on anything professionally music related.
-
Prototype700 almost 5 yearsHi, thank you for your answer. I've submitted some minor edit suggestions, because I couldn't explain myself clearly in the comments (I used ; as a line break, which should not actually be in the code). I've also rewritten the parts from the guide slightly to make it clearer which names must be placed where, because I've spent the most time finding out what exactly the card/device name is and where it needs to go and where it doesn't. I hope you agree with the changes, else feel free to reject or edit them.
-
mook765 almost 5 years@Prototype700 That's beautiful!
-
Michael Ivko over 4 yearsAs far as I understand, JACK cannot use virtual devices for I/O, so this answer is not very useful.
-
mook765 over 4 years@MichaelIvko Obviously this is a working solution, so how is it not useful?
-
Michael Ivko over 4 yearsI don't know why it was accepted. OP asked how to control volumes of JACK clients. This solution doesn't answer that question, because JACK disregards .asoundrc and sound.conf and can only use physical interfaces.
-
mook765 over 4 years@MichaelIvko This answer was accepted because it works as you can see in the comments under the question. OP asked how to control the volume of Jack (not clients) which is not possible at all. So we found this workaround which uses alsa to control the volume. End of discussion.