diff options
Diffstat (limited to 'perl-install/harddrake/sound.pm')
| -rw-r--r-- | perl-install/harddrake/sound.pm | 474 |
1 files changed, 303 insertions, 171 deletions
diff --git a/perl-install/harddrake/sound.pm b/perl-install/harddrake/sound.pm index e1651f23c..5bf5c55ab 100644 --- a/perl-install/harddrake/sound.pm +++ b/perl-install/harddrake/sound.pm @@ -5,10 +5,10 @@ package harddrake::sound; # 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 +# 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) @@ -16,7 +16,6 @@ package harddrake::sound; use strict; use common; -use interactive; use run_program; use modules; use list_modules; @@ -26,151 +25,230 @@ use log; our %alsa2oss = ( - if_(arch() =~ /ppc/, "snd-powermac" => [ "dmasound_pmac" ]), + if_(arch() =~ /ppc/, "snd_powermac" => [ "dmasound_pmac" ]), if_(arch() =~ /sparc/, - "snd-sun-amd7930" => [ "unknown" ], - "snd-sun-cs4231" => [ "unknown" ], - "snd-sun-dbri" => [ "unknown" ], + "snd_sun_amd7930" => [ "unknown" ], + "snd_sun_cs4231" => [ "unknown" ], + "snd_sun_dbri" => [ "unknown" ], ), - "snd-ad1816a" => [ "ad1816" ], # isa - "snd-ad1848" => [ "ad1848", "pss" ], # isa - "snd-ali5451" => [ "trident" ], - "snd-als100" => [ "sb" ], # isa - "snd-als4000" => [ "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-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-intelp" => [ "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-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" ], + "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_aoa" => [ "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_cmi8788" => [ "unknown" ], # pci + "snd_cmipci" => [ "cmpci" ], + "snd_cs4231" => [ "unknown" ], # isa + "snd_cs4232" => [ "cs4232" ], # isa + "snd_cs4236" => [ "ad1848" ], # isa + "snd_cs4281" => [ "cs4281" ], + "snd_cs46xx" => [ "cs46xx" ], + "snd_cs5530" => [ "unknown" ], + "snd_cs5535audio" => [ "unknown" ], + "snd_darla20" => [ "unknown" ], + "snd_darla24" => [ "unknown" ], + "snd_dt0197h" => [ "unknown" ], # isa + "snd_dt019x" => [ "unknown" ], # isa + "snd_echo3g" => [ "unknown" ], + "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_usb_caiaq" => [ "unknown" ], + "snd_usb_usx2y" => [ "unknown" ], + "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" => [ "unknown" ], - "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" ], + 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" ], + "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" ], + "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" ], + "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 is_pulseaudio_enabled() { + my $soundprofile = common::read_alternative('soundprofile'); + $soundprofile =~ /pulse$/; +} + +sub set_pulseaudio { + my ($val) = @_; + + my $alterative = '/etc/sound/profiles/' . ($val ? 'pulse' : 'alsa'); + return if ! -d $alterative; + + common::symlinkf_update_alternatives('soundprofile', $alterative); + + # (cg) This config file will eventually be dropped, but it is still needed for now + # as several packages/patches depend on it. + my $config_file = "$::prefix/etc/sysconfig/pulseaudio"; + $val = 'PULSE_SERVER_TYPE=' . ($val ? 'personal' : 'none') . "\n"; + my $done; + substInFile { + if (/^PULSE_SERVER_TYPE=/) { + $_ = $val; + $done = 1; + } + } $config_file; + append_to_file($config_file, $val) if !$done; +} + + +my $pa_startup_scriptfile = "$::prefix/etc/pulse/default.pa"; + +sub is_pulseaudio_glitchfree_enabled() { + return -f $pa_startup_scriptfile && + cat_($pa_startup_scriptfile) !~ /^load-module\s+module-(udev|hal)-detect\s+tsched=0/m; +} + +sub set_pulseaudio_glitchfree { + my ($val) = @_; + + return if ! -f $pa_startup_scriptfile; + + substInFile { + if ($val) { + s/^(load-module\s+module-(udev|hal)-detect)\s+tsched=0/$1/; + } else { + s/^(load-module\s+module-(udev|hal)-detect).*/$1 tsched=0/; + } + } $pa_startup_scriptfile; +} + +my $pa_client_conffile = "$::prefix/etc/pulse/client.conf"; + +sub set_PA_autospan { + my ($val) = @_; + + return if ! -f $pa_client_conffile; + + $val = 'autospawn = ' . bool2yesno($val) . "\n"; + my $done; + substInFile { + if (/^autospawn\s*=/) { + $_ = $val; + $done = 1; + } + } $pa_client_conffile; + append_to_file($pa_client_conffile, $val) if !$done; +} + + sub rooted { run_program::rooted($::prefix, @_) } sub unload { modules::unload(@_) if $::isStandalone || $blacklisted } @@ -182,7 +260,8 @@ sub load { sub get_alternative { my ($driver) = @_; - $alsa2oss{$driver} || $oss2alsa{$driver}; + my $list = $alsa2oss{$driver} || $oss2alsa{$driver}; + $list ? @$list : "unknown"; } sub do_switch { @@ -192,14 +271,15 @@ sub do_switch { log::explanations("removing old $old_driver\n"); if ($::isStandalone) { rooted("service sound stop") unless $blacklisted; - rooted("service alsa stop") if $old_driver =~ /^snd-/ && !$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); + configure_one_sound_slot($modules_conf, $index, $new_driver); $modules_conf->write; - if ($new_driver =~ /^snd-/) { # new driver is an alsa one - $in->do_pkgs->ensure_binary_is_installed('alsa-utils', 'alsactl'); + 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 @@ -214,23 +294,71 @@ sub switch { my $driver = $device->{current_driver} || $device->{driver}; foreach (@blacklist) { $blacklisted = 1 if $driver eq $_ } - my @alternative = @{get_alternative($driver)}; + 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}; + 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'); + + my $is_pulseaudio_installed = (-f $pa_startup_scriptfile && -f $pa_client_conffile && -d '/etc/sound/profiles/pulse'); + my $is_pulseaudio_enabled = is_pulseaudio_enabled(); + my $is_pulseaudio_glitchfree_enabled = is_pulseaudio_glitchfree_enabled(); + + my $old_value = $is_pulseaudio_enabled; + + my $write_config = sub { + return if !$is_pulseaudio_installed; + set_pulseaudio($is_pulseaudio_enabled); + set_pulseaudio_glitchfree($is_pulseaudio_glitchfree_enabled); + set_PA_autospan($is_pulseaudio_enabled); + if ($is_pulseaudio_enabled) { + my $lib = (arch() =~ /x86_64/ ? 'lib64' : 'lib'); + $in->do_pkgs->ensure_is_installed($lib . 'alsa-plugins-pulseaudio', + '/usr/' . $lib . '/alsa-lib/libasound_module_pcm_pulse.so'); + } + if ($old_value ne $is_pulseaudio_enabled) { + require any; + any::ask_for_X_restart($in); + } + }; + + my @common = ( + get_any_driver_entry($in, $modules_conf, $driver, $device), + { + text => N("Enable PulseAudio"), + type => 'bool', val => \$is_pulseaudio_enabled, + disabled => sub { !$is_pulseaudio_installed }, + }, + { + text => N("Use Glitch-Free mode"), + type => 'bool', val => \$is_pulseaudio_glitchfree_enabled, + disabled => sub { !$is_pulseaudio_installed || !$is_pulseaudio_enabled }, + }, + { + advanced => 1, + val => N("Reset sound mixer to default values"), + clicked => sub { run_program::run('reset_sound') } + }, + { + advanced => 1, + val => N("Troubleshooting"), disabled => sub {}, + clicked => sub { &trouble($in) } + }, + ); 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), - ] - ); + if ($in->ask_from_({ + title => N("No alternative driver"), + messages => N("There's no known OSS/ALSA alternative driver for your sound card (%s) which currently uses \"%s\"", + $device->{description}, $driver), + }, + \@common, + )) { + $write_config->(); + } } 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).", @@ -238,7 +366,7 @@ sub switch { #-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}), + N("\n\nYour card currently uses the %s\"%s\" driver (the 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. @@ -247,24 +375,25 @@ 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. +- 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, - help => join("\n\n", map { qq("$_": ) . $des{$_} } @alternative), - allow_empty_list => 1, - }, - { - val => N("Trouble shooting"), disabled => sub {}, - clicked => sub { &trouble($in) } + 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'); + } }, - get_any_driver_entry($in, $modules_conf, $driver, $device), + @common, ])) { + $write_config->(); 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 @@ -283,10 +412,6 @@ The new \"%s\" driver will only be used on next bootstrap.", $device->{current_d 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: } @@ -299,23 +424,23 @@ sub config { sub trouble { my ($in) = @_; - $in->ask_warn(N("Sound trouble shooting"), + $in->ask_warn(N("Sound troubleshooting"), 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 +- \"lspcidrake -v | fgrep -i AUDIO\" will tell you which driver your card uses by default -- \"grep sound-slot /etc/modules.conf\" will tell you what driver it +- \"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 +tell you if sound and alsa services are configured to be run on initlevel 3 - \"aumix -q\" will tell you if the sound volume is muted or not @@ -328,6 +453,7 @@ sub get_any_driver_entry { my ($in, $modules_conf, $driver, $device) = @_; return () if $::isInstall; +{ + advanced => 1, val => N("Let me pick any driver"), disabled => sub {}, clicked => sub { my $old_driver = $driver; @@ -335,7 +461,7 @@ sub get_any_driver_entry { 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. +you can pick one from the above list. The current driver for your \"%s\" sound card is \"%s\" ", $device->{description}, $driver)), [ @@ -349,16 +475,22 @@ The current driver for your \"%s\" sound card is \"%s\" ", $device->{description }; } +sub configure_one_sound_slot { + my ($modules_conf, $index, $driver) = @_; + $modules_conf->set_sound_slot("sound-slot-$index", $driver); + $modules_conf->set_options($driver, "xbox=1") if $driver eq "snd_intel8x0" && detect_devices::is_xbox(); + $modules_conf->set_options('snd-ac97-codec', "power_save=1") if $driver =~ /^snd/ && detect_devices::isLaptop() + && arch() !~ /mips/; +} 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})) { + 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" && is_xbox(); + configure_one_sound_slot($modules_conf, $::i, $_->{driver}); } } detect_devices::getSoundDevices(); $modules_conf->write if $altered && $::isStandalone; |
