public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
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


  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