summaryrefslogtreecommitdiffstats
path: root/perl-install/harddrake/sound.pm
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2007-05-30 11:11:18 +0000
committerPascal Rigaux <pixel@mandriva.com>2007-05-30 11:11:18 +0000
commitc1af4addb6f18c15b59fc270854a0fbb8d92dcb6 (patch)
tree5a6f717efc60087849f45827fcbf618d40e15d46 /perl-install/harddrake/sound.pm
downloaddrakx-c1af4addb6f18c15b59fc270854a0fbb8d92dcb6.tar
drakx-c1af4addb6f18c15b59fc270854a0fbb8d92dcb6.tar.gz
drakx-c1af4addb6f18c15b59fc270854a0fbb8d92dcb6.tar.bz2
drakx-c1af4addb6f18c15b59fc270854a0fbb8d92dcb6.tar.xz
drakx-c1af4addb6f18c15b59fc270854a0fbb8d92dcb6.zip
create branch 2007.1 from drakx-installer-* tarballs
(needed after the big svn loss)
Diffstat (limited to 'perl-install/harddrake/sound.pm')
-rw-r--r--perl-install/harddrake/sound.pm377
1 files changed, 377 insertions, 0 deletions
diff --git a/perl-install/harddrake/sound.pm b/perl-install/harddrake/sound.pm
new file mode 100644
index 000000000..72c53d8d1
--- /dev/null
+++ b/perl-install/harddrake/sound.pm
@@ -0,0 +1,377 @@
+package harddrake::sound;
+# lists filled with Danny Tholen help, enhanced by Thierry Vignaud
+#
+# No ALSA for OSS's
+# o isa cards: msnd_pinnacle, pas2,
+# o pci cards: ad1889, sam9407
+# No OSS for ALSA's
+# o pci cards: snd-als4000, snd-es968, snd-hdsp
+# o isa cards: snd-azt2320, snd-cs4231, snd-cs4236,
+# snd-dt0197h, snd-korg1212, snd-rme32
+# o pcmcia cards: snd-vxp440 snd-vxpocket
+
+# TODO:
+# o ensure sound is not user (either dsp/midi/sequencer/mixer)
+# o fix sound/alsa services
+
+use strict;
+use common;
+use run_program;
+use modules;
+use list_modules;
+use detect_devices;
+use log;
+
+
+our %alsa2oss =
+ (
+ if_(arch() =~ /ppc/, "snd-powermac" => [ "dmasound_pmac" ]),
+ if_(arch() =~ /sparc/,
+ "snd-sun-amd7930" => [ "unknown" ],
+ "snd-sun-cs4231" => [ "unknown" ],
+ "snd-sun-dbri" => [ "unknown" ],
+ ),
+ "snd-ad1816a" => [ "ad1816" ], # isa
+ "snd-ad1848" => [ "ad1848", "pss" ], # isa
+ "snd-ad1889" => [ "ad1889" ],
+ "snd-ali5451" => [ "trident" ],
+ "snd-als100" => [ "sb" ], # isa
+ "snd-als300" => [ "unknown" ],
+ "snd-als4000" => [ "unknown" ],
+ "snd-asihpi" => [ "unknown" ],
+ "snd-atiixp" => [ "unknown" ],
+ "snd-au8810" => [ "unknown" ],
+ "snd-au8820" => [ "unknown" ],
+ "snd-au8830" => [ "unknown" ],
+ "snd-audigyls" => [ "unknown" ], # pci, renamed as snd-ca0106
+ "snd-azt2320" => [ "unknown" ], # isa
+ "snd-azt3328" => [ "unknown" ], # isa
+ "snd-azx" => [ "unknown" ],
+ "snd-bt87x" => [ "btaudio" ],
+ "snd-ca0106" => [ "unknown" ], # pci
+ "snd-cmi8330" => [ "sb" ], # isa
+ "snd-cmipci" => [ "cmpci" ],
+ "snd-cs4231" => [ "unknown" ], # isa
+ "snd-cs4232" => [ "cs4232" ], # isa
+ "snd-cs4236" => [ "ad1848" ], # isa
+ "snd-cs4281" => [ "cs4281" ],
+ "snd-cs46xx" => [ "cs46xx" ],
+ "snd-cs5535audio" => [ "unknown" ],
+ "snd-darla20" => [ "unknown" ],
+ "snd-darla24" => [ "unknown" ],
+ "snd-dt0197h" => [ "unknown" ], # isa
+ "snd-dt019x" => [ "unknown" ], # isa
+ "snd-emu10k1" => [ "audigy", "emu10k1" ],
+ "snd-emu10k1x" => [ "unknown" ],
+ "snd-ens1370" => [ "es1370" ],
+ "snd-ens1371" => [ "es1371" ],
+ "snd-es1688" => [ "sb" ], # isa
+ "snd-es18xx" => [ "sb" ], # isa
+ "snd-es1938" => [ "esssolo1" ],
+ "snd-es1968" => [ "maestro" ], # isa
+ "snd-es968" => [ "sb" ],
+ "snd-fm801" => [ "forte" ],
+ "snd-gina20" => [ "unknown" ],
+ "snd-gina24" => [ "unknown" ],
+ "snd-gina3g" => [ "unknown" ],
+ "snd-gusclassic" => [ "gus" ], # isa
+ "snd-gusextreme" => [ "gus" ], # isa
+ "snd-gusmax" => [ "gus" ], # isa
+ "snd-hda-intel" => [ "unknown" ],
+ "snd-hdspm" => [ "unknown" ],
+ "snd-hdsp" => [ "unknown" ],
+ "snd-ice1712" => [ "unknown" ], # isa
+ "snd-ice1724" => [ "unknown" ], # isa
+ "snd-indi" => [ "unknown" ], # pci
+ "snd-indigo" => [ "unknown" ], # pci
+ "snd-indigodj" => [ "unknown" ], # pci
+ "snd-indigoio" => [ "unknown" ], # pci
+ "snd-intel8x0" => [ "ali5455", "i810_audio", "nvaudio" ],
+ "snd-interwave" => [ "gus" ], # isa
+ "snd-interwave-stb" => [ "unknown" ], # isa
+ "snd-korg1212" => [ "unknown" ], # isa
+ "snd-layla20" => [ "unknown" ],
+ "snd-layla24" => [ "unknown" ],
+ "snd-layla3g" => [ "unknown" ],
+ "snd-maestro3" => [ "maestro3" ],
+ "snd-mia" => [ "unknown" ],
+ "snd-mixart" => [ "unknown" ],
+ "snd-mona" => [ "unknown" ],
+ "snd-mpu401" => [ "mpu401" ],
+ "snd-nm256" => [ "nm256_audio" ],
+ "snd-opl3sa2" => [ "opl3", "opl3sa", "opl3sa2" ], # isa
+ "snd-opti92x-ad1848" => [ "unknown" ], # isa
+ "snd-opti92x-cs4231" => [ "unknown" ], # isa
+ "snd-opti93x" => [ "mad16" ],
+ "snd-pcxhr" => [ "unknown" ], # pci
+ "snd-riptide" => [ "unknown" ],
+ "snd-rme32" => [ "unknown" ], # isa
+ "snd-rme96" => [ "rme96xx" ], # pci
+ "snd-rme9652" => [ "rme96xx" ], # pci
+ "snd-sb16" => ["sscape", "sb"],
+ "snd-sb8" => [ "sb" ],
+ "snd-sbawe" => [ "awe_wave" ],
+ "snd-sgalaxy" => [ "sgalaxy" ], # isa
+ "snd-sonicvibes" => [ "sonicvibes" ],
+ "snd-sscape" => [ "sscape" ], # isa
+ "snd-trident" => [ "trident" ],
+ "snd-usb-audio" => [ "audio" ], # usb
+ "snd-via82xx" => [ "via82cxxx_audio" ],
+ "snd-vx222" => [ "unknown" ],
+ "snd-vxp440" => [ "unknown" ], # pcmcia
+ "snd-vxpocket" => [ "unknown" ], # pcmcia
+ "snd-wavefront" => [ "wavefront" ], # isa
+ "snd-ymfpci" => [ "ymfpci" ],
+ );
+
+
+our %oss2alsa =
+ (
+ if_(arch() =~ /ppc/, "dmasound_pmac" => [ "snd-powermac" ]),
+ "ad1816" => [ "snd-ad1816a" ],
+ "ad1848" => [ "snd-ad1848", "snd-cs4236" ],
+ "ad1889" => [ "snd-ad1889" ],
+ "ali5455" => [ "snd-intel8x0" ],
+ "audigy" => [ "snd-emu10k1" ],
+ "audio" => [ "snd-usb-audio" ], # usb
+ "awe_wave" => [ "snd-sbawe" ],
+ "btaudio" => [ "snd-bt87x" ],
+ "cmpci" => [ "snd-cmipci" ],
+ "cs4232" => [ "snd-cs4232" ],
+ "cs4281" => [ "snd-cs4281" ],
+ "cs46xx" => [ "snd-cs46xx" ],
+ "emu10k1" => [ "snd-emu10k1" ],
+ "es1370" => [ "snd-ens1370" ],
+ "es1371" => [ "snd-ens1371" ],
+ "esssolo1" => [ "snd-es1938" ],
+ "forte" => [ "snd-fm801" ],
+ "gus" => ["snd-interwave", "snd-gusclassic", "snd-gusmax", "snd-gusextreme"],
+ "i810_audio" => [ "snd-intel8x0" ],
+ "ice1712" => [ "snd-ice1712" ],
+ "mad16" => [ "snd-opti93x" ],
+ "maestro" => [ "snd-es1968" ],
+ "maestro3" => [ "snd-maestro3" ],
+ "mpu401" => [ "snd-mpu401" ],
+ "msnd_pinnacle" => [ "unknown" ],
+ "nm256_audio" => [ "snd-nm256" ],
+ "nvaudio" => [ "snd-intel8x0" ],
+ "opl3" => [ "snd-opl3sa2" ],
+ "opl3sa" => [ "snd-opl3sa2" ],
+ "opl3sa2" => [ "snd-opl3sa2" ],
+ "pas2" => [ "unknown" ],
+ "pss" => [ "snd-ad1848" ],
+ "rme96xx" => [ "snd-rme96", "snd-rme9652" ],
+ "sam9407" => [ "unknown" ],
+ "sb" => [ "snd-als100", "snd-cmi8330", "snd-es1688", "snd-es18xx", "snd-es968", "snd-sb8", "snd-sb16" ],
+ "sgalaxy" => [ "snd-sgalaxy" ],
+ "sonicvibes" => [ "snd-sonicvibes" ],
+ "sscape" => [ "snd-sb16", "snd-sscape" ],
+ "trident" => [ "snd-ali5451", "snd-trident" ],
+ "via82cxxx_audio" => [ "snd-via82xx" ],
+ "wavefront" => [ "snd-wavefront" ],
+ "ymfpci" => [ "snd-ymfpci" ],
+ );
+
+my @blacklist = qw(cs46xx cs4281);
+my $blacklisted = 0;
+
+sub rooted { run_program::rooted($::prefix, @_) }
+
+sub unload { modules::unload(@_) if $::isStandalone || $blacklisted }
+
+sub load {
+ my ($modules_conf, $name) = @_;
+ modules::load_and_configure($modules_conf, $name) if $::isStandalone || $blacklisted;
+}
+
+sub get_alternative {
+ my ($driver) = @_;
+ $alsa2oss{$driver} || $oss2alsa{$driver};
+}
+
+sub do_switch {
+ my ($in, $modules_conf, $old_driver, $new_driver, $index) = @_;
+ return if $old_driver eq $new_driver;
+ my $_wait = $in->wait_message(N("Please wait"), N("Please Wait... Applying the configuration"));
+ log::explanations("removing old $old_driver\n");
+ if ($::isStandalone) {
+ rooted("service sound stop") unless $blacklisted;
+ rooted("service alsa stop") if $old_driver =~ /^snd-/ && !$blacklisted;
+ unload($old_driver); # run_program("/sbin/modprobe -r $driver"); # just in case ...
+ }
+ $modules_conf->remove_module($old_driver);
+ $modules_conf->set_sound_slot("sound-slot-$index", $new_driver);
+ $modules_conf->write;
+ if ($new_driver =~ /^snd-/) { # new driver is an alsa one
+ $in->do_pkgs->ensure_binary_is_installed(qw(alsa-utils alsactl), 1);
+ $in->do_pkgs->ensure_binary_is_installed(qw(aoss aoss), 1);
+ rooted("service alsa start") if $::isStandalone && !$blacklisted;
+ rooted("/sbin/chkconfig --add alsa") if $::isStandalone;
+ load($modules_conf, $new_driver) if $::isStandalone; # service alsa is buggy
+ } else { rooted("/sbin/chkconfig --del alsa") }
+ log::explanations("loading new $new_driver\n");
+ rooted("/sbin/chkconfig --add sound"); # just in case ...
+ rooted("service sound start") if $::isStandalone && !$blacklisted;
+}
+
+sub switch {
+ my ($in, $modules_conf, $device) = @_;
+ my $driver = $device->{current_driver} || $device->{driver};
+
+ foreach (@blacklist) { $blacklisted = 1 if $driver eq $_ }
+ my @alternative = $driver ne 'unknown' ? @{get_alternative($driver)} : ();
+ unless ($driver eq $device->{driver} || member($device->{driver}, @alternative)) {
+ push @alternative, @{get_alternative($device->{driver})}, $device->{driver};
+ }
+ if (@alternative) {
+ my $new_driver = $driver;
+ push @alternative, $driver;
+ my %des = modules::category2modules_and_description('multimedia/sound');
+
+ if ($new_driver eq 'unknown') {
+ $in->ask_from(N("No alternative driver"),
+ N("There's no known OSS/ALSA alternative driver for your sound card (%s) which currently uses \"%s\"",
+ $device->{description}, $driver),
+ [
+ get_any_driver_entry($in, $modules_conf, $driver, $device),
+ ]
+ );
+ } elsif ($in->ask_from_({ title => N("Sound configuration"),
+ messages =>
+ N("Here you can select an alternative driver (either OSS or ALSA) for your sound card (%s).",
+ $device->{description}) .
+ #-PO: here the first %s is either "OSS" or "ALSA",
+ #-PO: the second %s is the name of the current driver
+ #-PO: and the third %s is the name of the default driver
+ N("\n\nYour card currently use the %s\"%s\" driver (default driver for your card is \"%s\")", ($driver =~ /^snd-/ ? "ALSA " : "OSS "), $driver, $device->{driver}),
+ interactive_help => sub {
+ N("OSS (Open Sound System) was the first sound API. It's an OS independent sound API (it's available on most UNIX(tm) systems) but it's a very basic and limited API.
+What's more, OSS drivers all reinvent the wheel.
+
+ALSA (Advanced Linux Sound Architecture) is a modularized architecture which
+supports quite a large range of ISA, USB and PCI cards.\n
+It also provides a much higher API than OSS.\n
+To use alsa, one can either use:
+- the old compatibility OSS api
+- the new ALSA api that provides many enhanced features but requires using the ALSA library.
+");
+ },
+ },
+ [
+ {
+ label => N("Driver:"), val => \$new_driver, list => \@alternative, default => $new_driver, sort =>1,
+ allow_empty_list => 1,
+ format => sub { my ($drv) = @_;
+ $drv eq 'unknown' ? $drv :
+ sprintf(($des{$drv} ? "$des{$drv} (%s [%s])"
+ : "%s [%s]"), $drv, $drv =~ /^snd[-_]/ ? 'ALSA' : 'OSS');
+ }
+ },
+ {
+ val => N("Trouble shooting"), disabled => sub {},
+ clicked => sub { &trouble($in) }
+ },
+ get_any_driver_entry($in, $modules_conf, $driver, $device),
+ ]))
+ {
+ return if $new_driver eq $device->{current_driver};
+ log::explanations("switching audio driver from '" . $device->{current_driver} . "' to '$new_driver'\n");
+ $in->ask_warn(N("Warning"), N("The old \"%s\" driver is blacklisted.\n
+It has been reported to oops the kernel on unloading.\n
+The new \"%s\" driver will only be used on next bootstrap.", $device->{current_driver}, $new_driver)) if $blacklisted;
+ do_switch($in, $modules_conf, $device->{current_driver}, $new_driver, $device->{sound_slot_index});
+ $device->{current_driver} = $new_driver;
+ }
+ } elsif ($driver =~ /^Bad:/) {
+ $driver =~ s/^Bad://;
+ $in->ask_warn(N("No open source driver"),
+ N("There's no free driver for your sound card (%s), but there's a proprietary driver at \"%s\".",
+ $device->{description}, $driver));
+ } elsif ($driver eq "unknown") {
+ $in->ask_from(N("No known driver"),
+ N("There's no known driver for your sound card (%s)",
+ $device->{description}),
+ [ get_any_driver_entry($in, $modules_conf, $driver, $device) ]);
+ } else {
+ $in->ask_warn(N("Unknown driver"),
+ N("Error: The \"%s\" driver for your sound card is unlisted",
+ $driver));
+ }
+ end:
+}
+
+sub config {
+ my ($in, $modules_conf, $device) = @_;
+ switch($in, $modules_conf, $device);
+}
+
+
+sub trouble {
+ my ($in) = @_;
+ $in->ask_warn(N("Sound trouble shooting"),
+ formatAlaTeX(
+ #-PO: keep the double empty lines between sections, this is formatted a la LaTeX
+ N("The classic bug sound tester is to run the following commands:
+
+
+- \"lspcidrake -v | fgrep AUDIO\" will tell you which driver your card uses
+by default
+
+- \"grep sound-slot /etc/modprobe.conf\" will tell you what driver it
+currently uses
+
+- \"/sbin/lsmod\" will enable you to check if its module (driver) is
+loaded or not
+
+- \"/sbin/chkconfig --list sound\" and \"/sbin/chkconfig --list alsa\" will
+tell you if sound and alsa services're configured to be run on
+initlevel 3
+
+- \"aumix -q\" will tell you if the sound volume is muted or not
+
+- \"/sbin/fuser -v /dev/dsp\" will tell which program uses the sound card.
+")));
+}
+
+sub get_any_driver_entry {
+ my ($in, $modules_conf, $driver, $device) = @_;
+ return () if $::isInstall;
+ +{
+ val => N("Let me pick any driver"), disabled => sub {},
+ clicked => sub {
+ my $old_driver = $driver;
+ if ($in->ask_from(N("Choosing an arbitrary driver"),
+ formatAlaTeX(
+ #-PO: keep the double empty lines between sections, this is formatted a la LaTeX
+ N("If you really think that you know which driver is the right one for your card
+you can pick one in the above list.
+
+The current driver for your \"%s\" sound card is \"%s\" ", $device->{description}, $driver)),
+ [
+ { label => N("Driver:"), val => \$driver, list => [ category2modules("multimedia/sound") ], type => 'combo', default => $driver, sort =>1, separator => '|' },
+ ]
+ )) {
+ do_switch($in, $modules_conf, $old_driver, $driver, $device->{sound_slot_index});
+ goto end;
+ }
+ }
+ };
+}
+
+
+sub configure_sound_slots {
+ my ($modules_conf) = @_;
+ my $altered = 0;
+ each_index {
+ my $default_driver = $modules_conf->get_alias("sound-slot-$::i");
+ if (!member($default_driver, @{get_alternative($_->{driver})}, $_->{driver})) {
+ $altered ||= $default_driver;
+ $modules_conf->set_sound_slot("sound-slot-$::i", $_->{driver});
+ $modules_conf->set_options($_->{driver}, "xbox=1") if $_->{driver} eq "snd-intel8x0" && detect_devices::is_xbox();
+ }
+ } detect_devices::getSoundDevices();
+ $modules_conf->write if $altered && $::isStandalone;
+}
+
+
+1;