From 250ef385d4f7a7825b7490c42681d6b9a809432b Mon Sep 17 00:00:00 2001 From: Thierry Vignaud Date: Tue, 20 Aug 2002 17:15:47 +0000 Subject: add draksound: allow to switch between alsa and oss; should result in better sound support --- perl-install/harddrake/Makefile | 2 + perl-install/harddrake/gen_snd_list | 18 ++++ perl-install/harddrake/sound.pm | 193 ++++++++++++++++++++++++++++++++++++ perl-install/standalone/draksound | 59 +++++++++++ 4 files changed, 272 insertions(+) create mode 100644 perl-install/harddrake/Makefile create mode 100755 perl-install/harddrake/gen_snd_list create mode 100644 perl-install/harddrake/sound.pm create mode 100755 perl-install/standalone/draksound diff --git a/perl-install/harddrake/Makefile b/perl-install/harddrake/Makefile new file mode 100644 index 000000000..313fc2eca --- /dev/null +++ b/perl-install/harddrake/Makefile @@ -0,0 +1,2 @@ +sound_drivers.pm: ../../kernel/list_modules.pm gen_snd_list + ./gen_snd_list > $@ diff --git a/perl-install/harddrake/gen_snd_list b/perl-install/harddrake/gen_snd_list new file mode 100755 index 000000000..e791ae431 --- /dev/null +++ b/perl-install/harddrake/gen_snd_list @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# +# Copyright (C) 2002 MandrakeSoft (tvignaud@mandrakesoft.com) +# Released under the GNU General Public License + +use lib qw(/usr/lib/libDrakX); +use common; +use list_modules; +use Data::Dumper; + +$Data::Dumper::Terse = 1; # don't output names where feasible +$Data::Dumper::Purity = 1; # fill in the holes for eval + +# ne '' for missing modules ... if_($i ne '', $i, '') +print "package harddrake::sound_drivers;\n#This is an autogenrated file by gen_snd_list from list_modules.pm\nour\$sound_drivers = ", Dumper({map { my $i=qx((/sbin/modinfo -d $_)|head -1|tr -d \\\"|perl -pi -e 's!\n!!g'); $_ => $i } category2modules("multimedia/sound")}), ";\n1;"; +#print qq( +#sub +#) diff --git a/perl-install/harddrake/sound.pm b/perl-install/harddrake/sound.pm new file mode 100644 index 000000000..9069966ef --- /dev/null +++ b/perl-install/harddrake/sound.pm @@ -0,0 +1,193 @@ +package harddrake::sound; +# lists filled with Danny Tholen help, enhanced by Thierry Vignaud +# +# No ALSA for OSS's +# o btaudio (tv card), +# o isa cards: msnd_pinnacle, pas2, +# No OSS for ALSA's +# o pci cards: snd-ali5451, snd-als4000, snd-es968, snd-fm801, +# snd-hdsp, snd-via8233 +# o isa cards: snd-als100, snd-azt2320, snd-cmi8330, snd-cs4231, +# snd-cs4236, snd-dt0197h, snd-es18xx,snd-es1688, snd-ice1712, +# snd-korg1212, snd-rme32, snd-rme96 +# o usb cards: snd-usb-audio + +# TODO: +# o ensure sound isn't user (either dsp/midi/sequencer/mixer) +# o fix sound/alsa services + +use strict; +use common; +use interactive; +use run_program; +use modules; +use harddrake::sound_drivers; # autogenerated +use standalone; + +my %alsa2oss = + ( + "snd-ad1816a" => [ "ad1816" ], # isa + "snd-ad1848" => [ "ad1848" ], # isa + "snd-ali5451" => [ "unknown" ], + "snd-als100" => [ "unknown" ], # isa + "snd-als4000" => [ "unknown" ], + "snd-azt2320" => [ "unknown" ], # isa + "snd-cmi8330" => [ "unknown" ], # isa + "snd-cmipci" => [ "cmpci" ], + "snd-cs4231" => [ "unknown" ], # isa + "snd-cs4232" => [ "cs4232" ], # isa + "snd-cs4236" => [ "unknown" ], # isa + "snd-cs4281" => [ "cs4281" ], + "snd-cs46xx" => [ "cs46xx" ], + "snd-dt0197h" => [ "unknown" ], # isa + "snd-emu10k1" => [ "audigy", "emu10k1" ], + "snd-ens1370" => [ "es1370" ], + "snd-ens1371" => [ "es1371" ], + "snd-es1688" => [ "unknown" ], # isa + "snd-es18xx" => [ "unknown" ], # isa + "snd-es1938" => [ "esssolo1" ], + "snd-es1968" => [ "maestro" ], # isa + "snd-es968" => [ "unknown" ], + "snd-fm801" => [ "unknown"], + "snd-gusclassic" => [ "gus" ], # isa + "snd-gusextreme" => [ "gus" ], # isa + "snd-gusmax" => [ "gus" ], # isa + "snd-hdsp" => [ "unknown" ], + "snd-ice1712" => [ "unknown" ], # isa + "snd-intel8x0" => [ "i810_audio" ], + "snd-interwave" => [ "gus" ], # isa + "snd-korg1212" => [ "unknown" ], # isa + "snd-maestro3" => [ "maestro3" ], + "snd-mpu401" => [ "mpu401" ], + "snd-nm256" => [ "nm256_audio" ], + "snd-opl3sa2" => [ "opl3", "opl3sa", "opl3sa2" ], # isa + "snd-opti93x" => [ "mad16" ], + "snd-rme32" => [ "unknown" ], # isa + "snd-rme96" => [ "unknown" ], # isa + "snd-rme9652g" => [ "rme96xx" ], + "snd-sb16" => ["sscape", "sb"], + "snd-sb8" => [ "sb" ], + "snd-sbawe" => [ "awe_wave" ], + "snd-sgalaxy" => [ "sgalaxy" ], # isa + "snd-sonicvibes" => [ "sonicvibes" ], + "snd-trident" => [ "trident" ], + "snd-usb-audio" => [ "unknown" ], # usb + "snd-via686" => [ "via82cxxx_audio" ], + "snd-via8233" => [ "unknown" ], + "snd-wavefront" => [ "wavefront" ], # isa + "snd-ymfpci" => [ "ymfpci" ] + ); + + +my %oss2alsa = + ( + "ad1816" => [ "snd-ad1816a" ], + "ad1848" => [ "snd-ad1848" ], + "audigy" => [ "snd-emu10k1" ], + "awe_wave" => [ "snd-sbawe" ], + "btaudio" => [ "unknown" ], + "cmpci" => [ "snd-cmipci" ], + "cs4232" => [ "snd-cs4232" ], + "cs4281" => [ "snd-cs4281" ], + "cs46xx" => [ "snd-cs46xx" ], + "emu10k1" => [ "snd-emu10k1" ], + "es1370" => [ "snd-ens1370" ], + "es1371" => [ "snd-ens1371" ], + "esssolo1" => [ "snd-es1938" ], + "gus" => ["snd-interwave", "snd-gusclassic", "snd-gusmax", "snd-gusextreme"], + "i810_audio" => [ "snd-intel8x0"], + "mad16" => [ "snd-opti93x" ], + "maestro" => [ "snd-es1968" ], + "maestro3" => [ "snd-maestro3" ], + "mpu401" => [ "snd-mpu401" ], + "msnd_pinnacle" => [ "unknown" ], + "msnd_pinnacle" => [ "unknown" ], + "nm256_audio" => [ "snd-nm256" ], + "opl3" => [ "snd-opl3sa2" ], + "opl3sa" => [ "snd-opl3sa2" ], + "opl3sa2" => [ "snd-opl3sa2" ], + "pas2" => [ "unknown" ], + "rme96xx" => [ "snd-rme9652.o.g" ], + "sb" => ["snd-sb8", "snd-sb16"], + "sgalaxy" => [ "snd-sgalaxy" ], + "sonicvibes" => [ "snd-sonicvibes" ], + "sscape" => [ "snd-sb16" ], + "trident" => [ "snd-trident" ], + "via82cxxx_audio" => [ "snd-via686" ], + "wavefront" => [ "snd-wavefront" ], + "ymfpci" => [ "snd-ymfpci" ] + ); + +my $drivers_description = $harddrake::sound_drivers::sound_drivers; + + +sub get_alternative { + my ($driver) = @_; + if ($alsa2oss{$driver}) { + $alsa2oss{$driver}; + } elsif ($oss2alsa{$driver}) { + $oss2alsa{$driver} + } else { {} } +} + +sub do_switch { + my ($old_driver, $new_driver) = @_; + standalone::explanations("removing old $old_driver\n"); + run_program::run("service sound stop"); + run_program::run("service alsa stop") if $old_driver =~ /^snd-/; + modules::unload($old_driver); # run_program("/sbin/modprobe -r $driver"); # just in case ... + modules::remove_module($old_driver); # completed by the next add_alias() + modules::add_alias('sound-slot-0', $new_driver); + modules::write_conf; + if ($new_driver =~ /^snd-/) { + run_program::run("service alsa start"); + run_program::run("/sbin/chkconfig --add alsa"); + modules::load($new_driver); # service alsa is buggy + } else { run_program::run("/sbin/chkconfig --del alsa") } + standalone::explanations("loading new $new_driver\n"); + run_program::run("/sbin/chkconfig --add sound"); # just in case ... + run_program::run("service sound start"); +} + +sub switch { + my ($in, $device) = @_; + my $driver = $device->{driver}; + my $alternative = get_alternative($driver); +# $alternative = [ "i810_audio", "snd-intel8x0"]; + if ($alternative) { + my $new_driver = $alternative->[0]; + if ($driver eq "unknown") { + $in->ask_warn(_("No alternative driver"), + _("There's no known OSS/ALSA alternative driver for your sound card (%s)", + $device->{description})); + } elsif ($in->ask_from(_("Sound configuration"), + _("Here you can select an alternative driver (either OSS or ALSA) for your sound card (%s)", + $device->{description}), + [ + { label => _("Driver :"), val => \$new_driver, list => $alternative, default => $new_driver, sort =>1, format => sub { "$_[0] ($drivers_description->{$_[0]})" }, allow_empty_list => 1 } + ] + )) + { + standalone::explanations("switching audio driver from '$driver' to '$new_driver'\n"); + do_switch($driver, $new_driver); + } + } elsif ($driver eq "unknown") { + $in->ask_warn(_("No known driver"), + _("There's no known driver for your sound card (%s)", + $device->{description})); + } elsif (is_listed($driver)) { + } else { + $in->ask_warn(_("Unkown driver"), + _("The \"%s\" driver for your sound card is unlisted\n +Please send the output of the \"lspcidrake -v\" command to +Thierry Vignaud +with subject: unlisted sound driver") + , $driver); + } +} + +sub config { + my ($in, $device) = @_; + switch($in, $device); + +} diff --git a/perl-install/standalone/draksound b/perl-install/standalone/draksound new file mode 100755 index 000000000..1744df1b4 --- /dev/null +++ b/perl-install/standalone/draksound @@ -0,0 +1,59 @@ +#!/usr/bin/perl +# DrakxSound +# Copyright (C) 2002 MandrakeSoft (tvignaud@mandrakesoft.com) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +use lib qw(/usr/lib/libDrakX); + +use standalone; #- warning, standalone must be loaded very first, for 'explanations' + +use strict; +use interactive; +use detect_devices; +use common; +use harddrake::sound; + +("@ARGV" =~ /--help|-h/) and die "usage: draksound [-h] [--help]\n"; + + +my $in = 'interactive'->vnew(); + +use modules; + +#no strict 'subs'; +modules::mergein_conf('/etc/modules.conf'); + +my @devices = grep { $_->{media_type} eq 'MULTIMEDIA_AUDIO' } detect_devices::probeall(1); +if (@devices) { + # TODO: That need some work for multiples sound cards + foreach (@devices) { + # we should overwrite $device->{driver} with the right sound-slot-XX + $_->{driver} = modules::get_alias('sound-slot-0'); + harddrake::sound::config($in, $_); + } +} else { + $in->ask_warn(_("No Sound Card detected!"), formatAlaTeX( + _("No Sound Card has been detected on your machine. Please verify that a Linux-supported Sound Card is correctly plugged in. + + +You can visit our hardware database at: + + +http://www.linux-mandrake.com/en/hardware.php3"))); +} + +modules::write_conf; +$in->exit(0); -- cgit v1.2.1