From: Jan Hoogenraad <jan-verisign@hoogenraad.net>
To: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>
Subject: change in build .sh due to Pulseaudio device removal /
Date: Sat, 18 Jun 2011 19:20:45 +0200 [thread overview]
Message-ID: <4DFCDE6D.8090008@hoogenraad.net> (raw)
In-Reply-To: <4DFBB431.60101@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 5926 bytes --]
Mauro:
The change in build.sh
http://git.linuxtv.org/media_build.git?a=commitdiff;h=16cf0606fd59484236356e400a89c083e76da64b
now requires installation of a Perl package Proc::ProcessTable that is
not present in standard Ubuntu systems.
I needed to run
sudo aptitude install libproc-processtable-perl
before I could continue after the change.
Is there a way around this ?
Mauro Carvalho Chehab wrote:
> During a long time, the removal of an alsa drivers were a problem
> for me, and other developers reported to have the same problem.
>
> With Hans de Goede help, I've got the pulseaudio syntax that allows
> releasing an alsa device. With that, I've added a patch to the media
> build that will automatically handle it, when "make rmmod" is
> called.
>
> Feel free to test and give some feedback. I suspect that the logic
> will need more hacks, as pulseaudio-libs is not capable of detecting
> the name of some USB alsa drivers.
>
> The logic there is not optimized: It is basically running pacmd list-sources
> and pacmd list-sinks several times, as I didn't have time yet to optimize.
> I'll probably do it soon, after finishing some other things.
>
> Enjoy!
> Mauro.
>
>
>> From 16cf0606fd59484236356e400a89c083e76da64b Mon Sep 17 00:00:00 2001
> From: Mauro Carvalho Chehab<mchehab@redhat.com>
> Date: Fri, 17 Jun 2011 16:48:04 -0300
> Subject: [PATCH] rmmod.pl: Add a logic to allow removing audio modules with pulseaudio
>
> Pulseaudio keeps audio devices opened forever. In order to be able to
> remove a device, pulseaudio needs to de-allocate the device.
>
> Unfortunately, pulseaudio recognizes alsa drivers as "module"
> (an integer number, not related to the device nodename), and only
> allows module removal if running with user matches the console owner.
>
> The logic inside rmmod.pl will now take the above into account. So,
> it will detect if pulseaudio is running. If it is, it will:
>
> 1) list the pulseaudio modules with "pacmd list-sinks"
> and "pacmd list-sources"
>
> 2) detect if any of the modules there is provided by a v4l device;
>
> 3) If they're provided by a video device, it removes the module with:
> pactl unload-module 26
>
> Even the above logic is not perfect as, due to a pulseaudio libs bug,
> pulseaudio can't detect the name of em28xx-alsa driver, as it uses the
> same interface as the video node. Similar hacks will may be needed
> for other USB devices, like tm6000 and cx231xx.
>
> Signed-off-by: Mauro Carvalho Chehab<mchehab@redhat.com>
>
> diff --git a/build.sh b/build.sh
> index 60d0c26..3cc21f8 100755
> --- a/build.sh
> +++ b/build.sh
> @@ -12,6 +12,8 @@ echo "Checking if the needed tools are present"
> run ./check_needs.pl
> echo "Checking for Digest::SHA1 (package perl-Digest-SHA1)"
> run perl -MDigest::SHA1 -e 1
> +echo "Checking for Proc::ProcessTable (package perl-Proc-ProcessTable)"
> +run perl -MProc::ProcessTable -e 1
> echo
> echo "************************************************************"
> echo "* This script will download the latest tarball and build it*"
> diff --git a/v4l/scripts/rmmod.pl b/v4l/scripts/rmmod.pl
> index ed79cbe..53ea451 100755
> --- a/v4l/scripts/rmmod.pl
> +++ b/v4l/scripts/rmmod.pl
> @@ -1,6 +1,8 @@
> #!/usr/bin/perl
> use strict;
> use File::Find;
> +use Proc::ProcessTable;
> +
>
> my %depend = ();
> my %depend2 = ();
> @@ -166,6 +168,69 @@ sub insmod ($)
> }
> }
>
> +my @pulse;
> +my $try_pulseaudio = 1;
> +
> +sub check_pulseaudio()
> +{
> + my $t = new Proc::ProcessTable;
> + foreach my $p ( @{$t->table} ) {
> + push @pulse, $p->uid if ($p->cmndline =~m,/pulseaudio ,);
> + }
> + $try_pulseaudio = 0 if (!@pulse);
> +
> + print "Pulseaudio is running with UUID(s): @pulse\n";
> +}
> +
> +sub unload_pulseaudio($)
> +{
> + my $driver_name = shift;
> + my $cur_module;
> +
> + return if (!$try_pulseaudio);
> +
> + check_pulseaudio() if (!@pulse);
> + return if (!$try_pulseaudio);
> +
> + for my $pid (@pulse) {
> +# printf "LANG=C sudo -u \\\#$pid pacmd list-sources |\n";
> + open IN, "LANG=C sudo -u \\\#$pid pacmd list-sources |";
> + while (<IN>) {
> + $cur_module = $1 if (/^\s*module:\s*(\d+)/);
> +
> + if (/^\s*alsa.driver_name\s*=\s*"(.*)"/) {
> + if ($1 eq $driver_name) {
> + print "LANG=C sudo -u \\#$pid pactl unload-module $cur_module\n";
> + system ("LANG=C sudo -u \\#$pid pactl unload-module $cur_module");
> + }
> + next;
> + }
> +
> + # Special case: em28xx sometimes use a Vendor Class at
> + # the same interface as the video node. Pulseaudio can't
> + # get the driver name in this case
> + if (/^\s*alsa.card_name\s*=\s*"Em28xx/) {
> + print "LANG=C sudo -u \\#$pid pactl unload-module $cur_module\n";
> + system ("LANG=C sudo -u \\#$pid pactl unload-module $cur_module");
> + }
> + }
> + close IN;
> +
> +# printf "LANG=C sudo -u \\\#$pid pacmd list-sinks |\n";
> + open IN, "LANG=C sudo -u \\#$pid pacmd list-sinks |" or return;
> + while (<IN>) {
> + $cur_module = $1 if (/^\s*module:\s*(\d+)/);
> + if (/^\s*alsa.driver_name\s*=\s*"(.*)"/) {
> + if ($1 eq $driver_name) {
> + print "LANG=C sudo -u \\#$pid pactl unload-module $1\n";
> + system ("LANG=C sudo -u \\#$pid pactl unload-module $1");
> + }
> + }
> + }
> + }
> + close IN;
> +}
> +
> sub rmmod(@)
> {
> my $rmmod = findprog('rmmod');
> @@ -173,8 +238,10 @@ sub rmmod(@)
> foreach (reverse @_) {
> s/-/_/g;
> if (exists ($loaded{$_})) {
> - print "$rmmod $_\n";
> - unshift @not, $_ if (system "$rmmod $_");
> + my $module = $_;
> + print "$rmmod $module\n";
> + unload_pulseaudio($module);
> + unshift @not, $module if (system "$rmmod $module");
> }
> }
> return @not;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
[-- Attachment #2: jan-verisign.vcf --]
[-- Type: text/x-vcard, Size: 322 bytes --]
begin:vcard
fn:Jan Hoogenraad
n:Hoogenraad;Jan
org:Hoogenraad Interface Services
adr;quoted-printable;dom:;;Postbus 2717;Utrecht;;-- =
=0D=0A=
Jan Hoogenraad=0D=0A=
Hoogenraad Interface Services=0D=0A=
Postbus 2717=0D=0A=
3500 GS
email;internet:jan-verisign@hoogenraad.net
x-mozilla-html:FALSE
version:2.1
end:vcard
next prev parent reply other threads:[~2011-06-18 17:20 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-17 20:08 Pulseaudio device removal Mauro Carvalho Chehab
2011-06-18 17:20 ` Jan Hoogenraad [this message]
2011-06-19 12:15 ` change in build .sh due to Pulseaudio device removal / Mauro Carvalho Chehab
2011-06-19 12:40 ` Jan Hoogenraad
2011-06-19 12:50 ` Mauro Carvalho Chehab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DFCDE6D.8090008@hoogenraad.net \
--to=jan-verisign@hoogenraad.net \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox