diff options
Diffstat (limited to 'perl-install/harddrake')
| -rw-r--r-- | perl-install/harddrake/autoconf.pm | 44 | ||||
| -rw-r--r-- | perl-install/harddrake/data.pm | 16 | ||||
| -rw-r--r-- | perl-install/harddrake/sound.pm | 815 | ||||
| -rw-r--r-- | perl-install/harddrake/v4l.pm | 2 |
4 files changed, 533 insertions, 344 deletions
diff --git a/perl-install/harddrake/autoconf.pm b/perl-install/harddrake/autoconf.pm index 002d562bb..fba5078cd 100644 --- a/perl-install/harddrake/autoconf.pm +++ b/perl-install/harddrake/autoconf.pm @@ -24,10 +24,43 @@ sub xconf { modules::load_category($modules_conf, 'various/agpgart'); } +sub setup_ethernet_device { + my ($in, $device) = @_; + + require network::connection; + require network::connection::ethernet; + require network::connection::wireless; + my @connection_types = qw(network::connection::ethernet network::connection::wireless); + my @all_connections = map { $_->get_connections(automatic_only => 1) } @connection_types; + my $interface = network::connection::ethernet::device_to_interface($device) + or return; + my $connection = find { $_->get_interface eq $interface } @all_connections + or return; + + require network::connection_manager; + my $net = {}; + network::network::read_net_conf($net); + my $cmanager = network::connection_manager->new($in, $net); + $cmanager->set_connection($connection); + + # this will installed required packages + $cmanager->setup_connection; +} + sub network_conf { - my ($obj) = @_; - require network::network; - network::network::easy_dhcp($obj->{net}, $obj->{modules_conf}); + my ($modules_conf, $in, $added) = @_; + $modules_conf->remove_alias_regexp('^(wlan|eth)[0-9]*$'); + modules::load_category($modules_conf, 'network/main|gigabit|usb|wireless|firewire|pcmcia'); + + setup_ethernet_device($in, $_) foreach @{$added || {}}; + + require network::connection::ethernet; + network::connection::ethernet::configure_eth_aliases($modules_conf); + require network::rfswitch; + network::rfswitch::configure(); + require network::shorewall; + network::shorewall::update_interfaces_list(); + $modules_conf->write; } sub mouse_conf { @@ -46,6 +79,11 @@ sub pcmcia { sub bluetooth { my ($enable) = @_; + # do not disable bluetooth service if adapter disappears + # (for example if disabled by Fn keys) + # systemd will automatically disable the service if needed + return if !$enable; + #- FIXME: make sure these packages are installed when needed # if ($enable) { # require do_pkgs; diff --git a/perl-install/harddrake/data.pm b/perl-install/harddrake/data.pm index 7c8b95198..8d4d4de21 100644 --- a/perl-install/harddrake/data.pm +++ b/perl-install/harddrake/data.pm @@ -12,7 +12,7 @@ our ($version, $sbindir, $bindir) = ("10", "/usr/sbin", "/usr/bin"); my @devices = (detect_devices::probeall(), detect_devices::getSCSI()); foreach my $dev (@devices) { - # normalize device IDs for devices cthat came from mouse.pm: + # normalize device IDs for devices that came from mouse.pm: next if !defined $dev->{Synaptics}; foreach my $field (qw(vendor id subvendor subid)) { next if !defined $dev->{$field}; @@ -24,7 +24,7 @@ foreach my $dev (@devices) { sub unknown() { grep { $_->{media_type} !~ /BRIDGE|class\|Mouse|DISPLAY|Hub|MEMORY_RAM|MULTIMEDIA_(VIDEO|AUDIO|OTHER)|NETWORK|Printer|SERIAL_(USB|SMBUS)|STORAGE_(IDE|OTHER|RAID|SCSI)|SYSTEM_(OTHER|SDHCI)|tape|UPS/ && !member($_->{driver}, qw(cpia_usb cyber2000fb forcedeth ibmcam megaraid mod_quickcam nvnet ohci1394 ov511 ov518_decomp scanner ultracam usbvideo usbvision)) - && $_->{driver} !~ /^ISDN|Mouse:USB|Removable:zip|class\|Mouse|sata|www.linmodems.org/ + && $_->{driver} !~ /^ISDN|Mouse:USB|Removable:zip|class\|Mouse|sata|www.linmodems.org|kbd|mouse|sysrq|usbhid/ && $_->{type} ne 'network' && $_->{description} !~ /Alcatel|ADSL Modem/; } @devices; @@ -62,7 +62,8 @@ our @tree = string => N("SATA controllers"), icon => "ide_hd.png", configurator => "", - detector => sub { f(grep { $_->{driver} !~ /^pata/ } detect_devices::probe_category('disk/sata')) }, + detector => sub { f(grep { $_->{driver} !~ /^pata/ } detect_devices::probe_category('disk/sata')), + f(grep { $_->{description} =~ /AHCI/ } @devices) }, checked_on_boot => 1, }, @@ -302,7 +303,7 @@ our @tree = require list_modules; my @modules = list_modules::category2modules('multimedia/sound'); f(grep { $_->{media_type} =~ /MULTIMEDIA_AUDIO|PROCESSOR_CO/ || member($_->{driver}, @modules) - || $_->{description} =~ /PC Speaker/ } @devices); + || $_->{description} =~ /^\|?HDA |PC Speaker/ } @devices); }, checked_on_boot => 1, }, @@ -399,7 +400,8 @@ our @tree = f(grep { $_->{media_type} && $_->{media_type} =~ /^NETWORK/ || $_->{type} && $_->{type} eq 'network' - || member($_->{driver}, @net_modules); + || member($_->{driver}, @net_modules) + || $_->{description} =~ /WLAN/; } @devices); }, checked_on_boot => 1, @@ -432,7 +434,7 @@ our @tree = string => N("Memory"), icon => "hw-memory.png", configurator => "", - detector => sub { grep { member($_->{name}, 'Cache', 'Memory Module') } detect_devices::dmidecode() }, + detector => sub { grep { member($_->{name}, 'Cache', 'Memory Module') || $_->{name} eq 'Memory Device' && $_->{Size} ne 'No Module Installed' } detect_devices::dmidecode() }, checked_on_boot => 0, }, @@ -475,7 +477,7 @@ our @tree = icon => "hw-keyboard.png", configurator => "$sbindir/keyboarddrake", detector => sub { - f(grep { $_->{description} =~ /Keyboard/i || $_->{media_type} =~ /Subclass\|Keyboard/i || + f(grep { $_->{description} =~ /Keyboard/i || $_->{media_type} =~ /Keyboard/i || # USB devices are filtered out since we already catch them through probeall(): $_->{bus} ne 'usb' && $_->{driver} =~ /^event|kbd|^usbhid/ && $_->{description} !~ /PC Speaker/; } @devices); diff --git a/perl-install/harddrake/sound.pm b/perl-install/harddrake/sound.pm index 8a560f03d..cdf24c219 100644 --- a/perl-install/harddrake/sound.pm +++ b/perl-install/harddrake/sound.pm @@ -1,14 +1,4 @@ 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) @@ -22,168 +12,10 @@ 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_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" => [ "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 is_pulseaudio_enabled() { +sub is_pulseaudio_enabled { + my ($in) = @_; my $soundprofile = common::read_alternative('soundprofile'); - $soundprofile =~ /pulse$/; + return $in->do_pkgs->is_installed('task-pulseaudio') && $soundprofile =~ /pulse$/; } sub set_pulseaudio { @@ -230,112 +62,499 @@ sub set_pulseaudio_glitchfree { } $pa_startup_scriptfile; } -my $pa_client_conffile = "$::prefix/etc/pulse/client.conf"; +sub is_pipewire_wireplumber_enabled { + my ($in) = @_; + return $in->do_pkgs->is_installed('pipewire') && $in->do_pkgs->is_installed('wireplumber'); +} -sub set_PA_autospan { - my ($val) = @_; +sub is_pipewire_media_session_enabled { + my ($in) = @_; + return $in->do_pkgs->is_installed('pipewire') && $in->do_pkgs->is_installed('pipewire-media-session'); +} - return if ! -f $pa_client_conffile; +sub rooted { + run_program::rooted($::prefix, @_); +} - $val = 'autospawn = ' . bool2yesno($val) . "\n"; - my $done; - substInFile { - if (/^autospawn\s*=/) { - $_ = $val; - $done = 1; +sub unload { modules::unload(@_) if $::isStandalone } + +sub load { + my ($modules_conf, $name) = @_; + modules::load_and_configure($modules_conf, $name) if $::isStandalone; +} + +sub _pidof { + my ($name) = @_; + rooted('/usr/bin/pidof', $name); +} + +# return the pid of a running command +sub _pidof_pid { + my ($name) = @_; + my ($pid) = chomp_(run_program::rooted_get_stdout($::prefix, '/usr/bin/pidof', $name)); + + return $pid; +} + +# return the username of a running command +sub _user_pid { + my ($name) = @_; + my ($pid) = _pidof_pid($name); + my $user; + + if ($pid) { + ($user) = chomp_(run_program::rooted_get_stdout($::prefix, '/usr/bin/ps', '-o', 'uname=', '-p', $pid)); + } + + return $user; +} + +# stop pulseaudio for the running user +sub stop_pulseaudio { + my ($pulseaudio_user) = _user_pid('/usr/bin/pulseaudio'); + + if ($pulseaudio_user) { + if (-x $::prefix . '/usr/bin/pulseaudio') { + rooted('/usr/bin/su', '-l', $pulseaudio_user, '-c', '/usr/bin/pulseaudio --kill'); + } + } + + # try stopping again (in case the /usr/bin/pulseaudio process is still running, but the executable no longer available) + my ($pulseaudio_user) = _user_pid('/usr/bin/pulseaudio'); + if ($pulseaudio_user) { + my ($pulseaudio_pid) = _pidof_pid('/usr/bin/pulseaudio'); + if ($pulseaudio_pid) { + rooted('/usr/bin/su', '-l', $pulseaudio_user, '-c', '/usr/bin/kill -TERM ' . $pulseaudio_pid); } - } $pa_client_conffile; - append_to_file($pa_client_conffile, $val) if !$done; + } + return $pulseaudio_user; } +# stop pipewire services for the running user +sub stop_pipewire { + my ($pipewire_user) = _user_pid('/usr/bin/pipewire'); -sub rooted { run_program::rooted($::prefix, @_) } + if ($pipewire_user) { + rooted('/usr/bin/systemctl', '--machine=' . $pipewire_user . '@.host', '--user', 'stop', 'pipewire-pulse.service', 'pipewire-pulse.socket', 'pipewire.service', 'pipewire.socket'); + } -sub unload { modules::unload(@_) if $::isStandalone || $blacklisted } + return $pipewire_user; +} -sub load { - my ($modules_conf, $name) = @_; - modules::load_and_configure($modules_conf, $name) if $::isStandalone || $blacklisted; +# start pulseaudio for the specified user +sub start_pulseaudio { + my ($pulseaudio_user) = @_; + + if ($pulseaudio_user) { + rooted('/usr/bin/su', '-l', $pulseaudio_user, '-c', '/usr/bin/pulseaudio --start'); + } +} + +# start pipewire services for the specified user +sub start_pipewire { + my ($pipewire_user) = @_; + + if ($pipewire_user) { + rooted('/usr/bin/systemctl', '--machine=' . $pipewire_user . '@.host', '--user', 'start', 'pipewire.socket', 'pipewire.service', 'pipewire-pulse.socket', 'pipewire-pulse.service'); + } +} + +# stop wireplumber services for the running user +sub stop_wireplumber { + my ($pipewire_user) = _user_pid('/usr/bin/wireplumber'); + + if ($pipewire_user) { + rooted('/usr/bin/systemctl', '--machine=' . $pipewire_user . '@.host', '--user', 'stop', 'wireplumber.service'); + } + + return $pipewire_user; +} + +# start wireplumber +sub start_wireplumber { + my ($pipewire_user) = @_; + + if ($pipewire_user) { + rooted('/usr/bin/systemctl', '--machine=' . $pipewire_user . '@.host', '--user', 'start', 'wireplumber.service'); + } +} + +# stop pipewire-media-session services for the running user +sub stop_pipewire_media_session { + my ($pipewire_user) = _user_pid('/usr/bin/pipewire-media-session'); + + if ($pipewire_user) { + rooted('/usr/bin/systemctl', '--machine=' . $pipewire_user . '@.host', '--user', 'stop', 'pipewire-media-session.service'); + } + + return $pipewire_user; } -sub get_alternative { - my ($driver) = @_; - my $list = $alsa2oss{$driver} || $oss2alsa{$driver}; - $list ? @$list : "unknown"; +# start pipewire-media-session services for the specified user +sub start_pipewire_media_session { + my ($pipewire_user) = @_; + + if ($pipewire_user) { + rooted('/usr/bin/systemctl', '--machine=' . $pipewire_user . '@.host', '--user', 'start', 'pipewire-media-session.service'); + } } -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); - 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(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 configure_pipewire_wireplumber { + my ($in) = @_; + my ($pipewire_wp_user); + + # preserve pulseaudio user + my ($pulseaudio_user) = _user_pid('/usr/bin/pulseaudio'); + + # stop pipewire and pipewire-media-session services (if any) before removing any packages + # and preserve pipewire-media-session user + $pipewire_wp_user = stop_pipewire_media_session(); + stop_pipewire(); + + my $plasma_installed = $in->do_pkgs->is_installed('plasma-desktop'); + my @pkgs = ( + 'task-pipewire', + 'wireplumber', + ); + if (!$in->do_pkgs->is_installed('pavucontrol-qt')) { + if ($plasma_installed) { + push(@pkgs, 'pavucontrol-qt'); + } + else { + push(@pkgs, 'pavucontrol'); + } + } + + + my $required_installed = $in->do_pkgs->ensure_are_installed( + \@pkgs + ); + + if (!$required_installed) + { + $in->ask_warn(N("Couldn't install the required packages"), + N("Please check the repositories are correctly configured") + ); + return; + } + + set_pulseaudio(0); + + # first of all disabling what has to be disabled to avoid conflicts + if ($in->do_pkgs->is_installed('pipewire-media-session')) { + rooted('/usr/bin/systemctl', '--global', 'disable', 'pipewire-media-session.service'); + } + + if ($in->do_pkgs->is_installed('pipewire')) { + foreach ('pipewire.socket', 'pipewire.service') { + rooted('/usr/bin/systemctl', '--global', 'enable', $_); + } + } + + if ($in->do_pkgs->is_installed('pipewire-pulseaudio')) { + foreach ('pipewire-pulse.socket', 'pipewire-pulse.service') { + rooted('/usr/bin/systemctl', '--global', 'enable', $_); + } + } + + if ($in->do_pkgs->is_installed('wireplumber')) { + rooted('/usr/bin/systemctl', '--global', 'enable', 'wireplumber.service'); + } + + + # stop pulseaudio process if still floating after the switch + stop_pulseaudio(); + + if ($pulseaudio_user) { + # restart pipewire and wireplumber with the same user as initial pulseaudio + start_pipewire($pulseaudio_user); + start_wireplumber($pulseaudio_user); + } + else { + if ($pipewire_wp_user) { + # restart pipewire and wireplumber with the same user as pipewire-media-session + start_pipewire($pipewire_wp_user); + start_wireplumber($pipewire_wp_user); + } + } + + #Plasma tricks + if ($plasma_installed) { + $in->do_pkgs->ensure_is_installed('kpipewire'); + } } -sub switch { +sub configure_pipewire_media_session { + my ($in) = @_; + my ($pipewire_ms_user); + + # preserve pulseaudio user + my ($pulseaudio_user) = _user_pid('/usr/bin/pulseaudio'); + + # stop pipewire and wireplumber services (if any) before removing any package + # and preserve wireplumber user + $pipewire_ms_user = stop_wireplumber(); + stop_pipewire(); + + + my $plasma_installed = $in->do_pkgs->is_installed('plasma-desktop'); + my @pkgs = ( + 'task-pipewire', + 'pipewire-media-session', + ); + if (!$in->do_pkgs->is_installed('pavucontrol-qt')) { + if ($plasma_installed) { + push(@pkgs, 'pavucontrol-qt'); + } + else { + push(@pkgs, 'pavucontrol'); + } + } + + my $required_installed = $in->do_pkgs->ensure_are_installed( + \@pkgs + ); + + if (!$required_installed) + { + $in->ask_warn(N("Couldn't install the required packages"), + N("Please check the repositories are correctly configured") + ); + return; + } + + set_pulseaudio(0); + + # first of all disabling what has to be disabled to avoid conflicts + if ($in->do_pkgs->is_installed('wireplumber')) { + rooted('/usr/bin/systemctl', '--global', 'disable', 'wireplumber.service'); + } + + if ($in->do_pkgs->is_installed('pipewire')) { + foreach ('pipewire.socket', 'pipewire.service') { + rooted('/usr/bin/systemctl', '--global', 'enable', $_); + } + } + + if ($in->do_pkgs->is_installed('pipewire-pulseaudio')) { + foreach ('pipewire-pulse.socket', 'pipewire-pulse.service') { + rooted('/usr/bin/systemctl', '--global', 'enable', $_); + } + } + + if ($in->do_pkgs->is_installed('pipewire-media-session')) { + rooted('/usr/bin/systemctl', '--global', 'enable', 'pipewire-media-session.service'); + } + + # stop pulseaudio process if still floating after the switch + stop_pulseaudio(); + + if ($pulseaudio_user) { + # restart pipewire and wireplumber with the same user as initial pulseaudio + start_pipewire($pulseaudio_user); + start_pipewire_media_session($pulseaudio_user); + } + else { + if ($pipewire_ms_user) { + # restart pipewire and wireplumber with the same user as pipewire-media-session + start_pipewire($pipewire_ms_user); + start_pipewire_media_session($pipewire_ms_user); + } + } + + #Plasma tricks + if ($plasma_installed) { + $in->do_pkgs->ensure_is_installed('kpipewire'); + } +} + +sub disable_all_pipewire { + my ($in) = @_; + + if ($in->do_pkgs->is_installed('wireplumber')) { + rooted('/usr/bin/systemctl', '--global', 'disable', 'wireplumber.service'); + } + + if ($in->do_pkgs->is_installed('pipewire-media-session')) { + rooted('/usr/bin/systemctl', '--global', 'disable', 'pipewire-media-session.service'); + } + + if ($in->do_pkgs->is_installed('pipewire-pulseaudio')) { + foreach ('pipewire-pulse.socket', 'pipewire-pulse.service') { + rooted('/usr/bin/systemctl', '--global', 'disable', $_); + } + } + + if ($in->do_pkgs->is_installed('pipewire')) { + foreach ('pipewire.socket', 'pipewire.service') { + rooted('/usr/bin/systemctl', '--global', 'disable', $_); + } + } +} + +sub configure_pulseaudio { + my ($in) = @_; + + # preserve pipewire running user + my ($pipewire_user) = _user_pid('/usr/bin/pipewire'); + + # stop pipewire, wireplumber and pipewire-media-session services (if any) before removing any packages + my ($wireplumber_user) = stop_wireplumber(); + my ($pipewire_media_session_user) = stop_pipewire_media_session(); + my ($pipewire_user_preserve) = stop_pipewire(); + + # now packages + $in->do_pkgs->remove('pipewire-alsa'); + + my $plasma_installed = $in->do_pkgs->is_installed('plasma-desktop'); + my @pkgs = 'task-pulseaudio'; + if (!$in->do_pkgs->is_installed('pavucontrol-qt')) { + if ($plasma_installed) { + push(@pkgs, 'pavucontrol-qt'); + } + else { + push(@pkgs, 'pavucontrol'); + } + } + + my $required_installed = $in->do_pkgs->ensure_are_installed( + \@pkgs + ); + + if (!$required_installed) + { + $in->ask_warn(N("Couldn't install the required packages"), + N("Please check the repositories are correctly configured") + ); + + # restore previous pipewire (if any) processes if something goes wrong with pulseaudio installation + if ($pipewire_user_preserve) { + start_pipewire($pipewire_user_preserve); + } + + if ($wireplumber_user) { + start_wireplumber($wireplumber_user); + } + + if ($pipewire_media_session_user) { + start_pipewire_media_session($pipewire_media_session_user); + } + + return; + } + + + # disable all the pipewire stuff before managing packages + disable_all_pipewire($in); + + # start pulseaudio with same pipewire preserved user + if ($pipewire_user) { + start_pulseaudio($pipewire_user); + } +} + +sub config { 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; + my @alternative = $driver ne $device->{driver} ? $device->{driver} : (); + if ($driver eq "unknown") { + $in->ask_warn(N("No known driver"), + N("There's no known driver for your sound card (%s)", + $device->{description})); + } else { 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 $is_pulseaudio_enabled_val = is_pulseaudio_enabled($in); + my $is_pulseaudio_glitchfree_enabled_val = is_pulseaudio_glitchfree_enabled(); + + my $audiosystem = 'None'; + if ($is_pulseaudio_enabled_val && $is_pulseaudio_glitchfree_enabled_val) { + $audiosystem = 'PulseAudioGF'; + } elsif ($is_pulseaudio_enabled_val) { + $audiosystem = 'PulseAudio'; + } elsif (is_pipewire_wireplumber_enabled($in) || _pidof('/usr/bin/wireplumber')) { + $audiosystem = 'PipeWireWP'; + } elsif (is_pipewire_media_session_enabled($in) || _pidof('/usr/bin/pipewire-media-session')) { + $audiosystem = 'PipeWireMS'; + } 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'); + if ($audiosystem eq 'None') { + #### ALSA alone + disable_all_pipewire($in); + set_pulseaudio(0); + set_pulseaudio_glitchfree(0); + # TODO check if adding autospawn = no to /etc/pulse/client.conf is needed + } elsif ($audiosystem eq 'PulseAudio') { + #### PulseAudio + configure_pulseaudio($in); + set_pulseaudio(1); + set_pulseaudio_glitchfree(0); + my $lib = get_libdir(); $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); + '/usr/' . $lib . '/alsa-lib/libasound_module_pcm_pulse.so'); + } elsif ($audiosystem eq 'PulseAudioGF') { + #### PulseAudio with Glitch-Free mode + configure_pulseaudio($in); + set_pulseaudio(1); + set_pulseaudio_glitchfree(1); + my $lib = get_libdir(); + $in->do_pkgs->ensure_is_installed($lib . 'alsa-plugins-pulseaudio', + '/usr/' . $lib . '/alsa-lib/libasound_module_pcm_pulse.so'); + } elsif ($audiosystem eq 'PipeWireWP') { + #### PipeWire with WirePlumber + configure_pipewire_wireplumber($in); + } elsif ($audiosystem eq 'PipeWireMS') { + #### PipeWire with PipeWire Media Session + configure_pipewire_media_session($in); + } else { + #### Unmanaged value + #TODO Error here } + + $in->ask_warn('', N("You need to reboot for changes to take effect")) if $::isStandalone; + }; + my $warn_both = ($in->do_pkgs->is_installed('pipewire') && $in->do_pkgs->is_installed('pulseaudio') && (-e $::prefix . '/etc/systemd/user/sockets.target.wants/pipewire.socket' || -e $::prefix . '/etc/systemd/user/sockets.target.wants/pipewire.service')) ? + N("Warning: both pulseaudio and pipewire are installed and can conflict each other. Please fix your config by applying a choice") : + ""; + + my $is_pipewire_available = $in->do_pkgs->is_available('task-pipewire'); + my $warn_pipewire_unavailable = !$is_pipewire_available ? + N("Warning: task-pipewire is not available in any media sources, so only pulseaudio could be set up. Please fix your repo configuration.") : + ""; + + my @service_list = ( + 'None', + 'PulseAudio', + 'PulseAudioGF', + ); + if ($is_pipewire_available) { + push @service_list, 'PipeWireWP'; + push @service_list, 'PipeWireMS'; + } 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 }, + label => N("Select the sound server"), + title => 1, }, { - text => N("Use Glitch-Free mode"), - type => 'bool', val => \$is_pulseaudio_glitchfree_enabled, - disabled => sub { !$is_pulseaudio_installed || !$is_pulseaudio_enabled }, + val => \$audiosystem, + list => \@service_list, + format => sub { + my ($choice) = @_; + +{ + 'None' => N("None"), + 'PulseAudio' => N("PulseAudio"), + 'PulseAudioGF' => N("PulseAudio with Glitch-Free mode"), + 'PipeWireWP' => N("PipeWire with WirePlumber"), + 'PipeWireMS' => N("PipeWire with PipeWire Media Session"), + }->{$choice}; + }, + type => 'list', }, { advanced => 1, @@ -343,13 +562,21 @@ sub switch { clicked => sub { run_program::run('reset_sound') } }, { - advanced => 1, val => N("Troubleshooting"), disabled => sub {}, clicked => sub { &trouble($in) } }, ); - if ($new_driver eq 'unknown') { + my @messages = ("<b><i>" . $device->{description} . "</i></b>", + N("Your card uses the <b>\"%s\"</b> driver\n", $driver)); + + if ($warn_both) { + push @messages, ("<b>" . $warn_both . "</b>"); + } + if (!$is_pipewire_available) { + push @messages, "<b>" . $warn_pipewire_unavailable . "</b>"; + } + if ($driver eq 'unknown') { 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\"", @@ -360,68 +587,17 @@ sub switch { $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).", - $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 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. - -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. -"); - }, + interactive_help_id => 'soundConfig', + messages => \@messages }, - [ - { - 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'); - } - }, - @common, - ])) + \@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 -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) ]); } - end: -} - -sub config { - my ($in, $modules_conf, $device) = @_; - switch($in, $modules_conf, $device); } - sub trouble { my ($in) = @_; $in->ask_warn(N("Sound troubleshooting"), @@ -437,7 +613,7 @@ https://wiki.mageia.org/en/Support:DebuggingSoundProblems -- \"kmix\" (KDE), \"gnome-control-center sound\" (GNOME) and \"pauvucontrol\" (generic) will launch graphical applications to allow you to view your sound devices and adjust volume levels +- \"kmix\" (KDE), \"gnome-control-center sound\" (GNOME) and \"pavucontrol\" (generic) will launch graphical applications to allow you to view your sound devices and adjust volume levels - \"ps aux | grep pulseaudio\" will check that PulseAudio is running. @@ -468,38 +644,11 @@ https://wiki.mageia.org/en/Support:DebuggingSoundProblems "))); } -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; - 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 from 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_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/; + $modules_conf->set_options('snd-ac97-codec', "power_save=1") if $driver =~ /^snd/ && detect_devices::isLaptop(); } sub configure_sound_slots { @@ -507,7 +656,7 @@ sub configure_sound_slots { 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, $_->{driver})) { $altered ||= $default_driver; configure_one_sound_slot($modules_conf, $::i, $_->{driver}); } diff --git a/perl-install/harddrake/v4l.pm b/perl-install/harddrake/v4l.pm index 12d130240..bd7c649bb 100644 --- a/perl-install/harddrake/v4l.pm +++ b/perl-install/harddrake/v4l.pm @@ -483,7 +483,7 @@ If your card is misdetected, you can force the right tuner and card types here. $conf{card} = $cards_list{$conf{card}}; if (my $options = join(' ', if_($driver eq 'bttv', 'radio=' . ($conf{radio} ? 1 : 0)), map { if_($conf{$_} ne -1, "$_=$conf{$_}") } qw(card pll tuner gbuffers))) { log::l(qq([harddrake::v4l] set "$options" options for $driver)); -# log::explanations("modified file /etc/modules.conf ($options)") if $::isStandalone; +# log::explanations("modified file /etc/modprobe.conf ($options)") if $::isStandalone; $modules_conf->set_options($driver, $options); } return 1; |
