summaryrefslogtreecommitdiffstats
path: root/perl-install/harddrake
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/harddrake')
-rw-r--r--perl-install/harddrake/autoconf.pm44
-rw-r--r--perl-install/harddrake/data.pm16
-rw-r--r--perl-install/harddrake/sound.pm815
-rw-r--r--perl-install/harddrake/v4l.pm2
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;