diff --git a/alsa-utils.spec b/alsa-utils.spec index 70a04ab..603659b 100644 --- a/alsa-utils.spec +++ b/alsa-utils.spec @@ -4,7 +4,7 @@ Summary: Advanced Linux Sound Architecture (ALSA) utilities Name: alsa-utils Version: 1.0.14 -Release: 0.4%{?prever_dot}%{?dist} +Release: 0.5%{?prever_dot}%{?dist} License: GPL Group: Applications/Multimedia URL: http://www.alsa-project.org/ @@ -39,15 +39,19 @@ Architecture (ALSA). %{__rm} -rf ${RPM_BUILD_ROOT} make install DESTDIR=$RPM_BUILD_ROOT -mkdir -p $RPM_BUILD_ROOT/%{_sbindir} -ln -s ../../sbin/alsactl $RPM_BUILD_ROOT/%{_sbindir}/alsactl - -install -m 755 salsa $RPM_BUILD_ROOT/sbin +# Install ALSA udev rules mkdir -p -m755 $RPM_BUILD_ROOT/etc/udev/rules.d/ install -m 644 %{SOURCE10} $RPM_BUILD_ROOT/etc/udev/rules.d/90-alsa.rules + +# Install support utilities mkdir -p -m755 $RPM_BUILD_ROOT/bin install -m 755 alsaunmute %{buildroot}/bin install -m 755 alsacard %{buildroot}/bin +install -m 755 salsa %{buildroot}/sbin + +# Link alsactl to /usr/sbin +mkdir -p $RPM_BUILD_ROOT/%{_sbindir} +ln -s ../../sbin/alsactl $RPM_BUILD_ROOT/%{_sbindir}/alsactl %clean %{__rm} -rf $RPM_BUILD_ROOT @@ -57,9 +61,9 @@ install -m 755 alsacard %{buildroot}/bin %doc COPYING ChangeLog README TODO /etc/udev/rules.d/* /bin/* +/sbin/* %{_bindir}/* %{_sbindir}/* -/sbin/* %{_mandir}/man?/* %dir %{_datadir}/sounds %dir %{_datadir}/sounds/alsa @@ -70,6 +74,10 @@ install -m 755 alsacard %{buildroot}/bin /usr/share/locale/* %changelog +* Wed Apr 18 2007 Martin Stransky 1.0.14-0.5.rc2 +- added more funcionality to salsa (save/load sound settings), + moved volume settings to /etc/alsa/ + * Thu Apr 10 2007 Martin Stransky 1.0.14-0.4.rc2 - added support for large files - minor fix in alsaunmute diff --git a/salsa.c b/salsa.c index aaec4ca..4c63f46 100644 --- a/salsa.c +++ b/salsa.c @@ -1,4 +1,4 @@ -/* Copyright 2005 Red Hat, Inc. +/* Copyright 2007 Red Hat, Inc. * * Portions extraced from various ALSA code: * Copyright (c) by Abramo Bagnara @@ -16,10 +16,13 @@ #include #include #include +#include #include -#define ALSA_CONFIG_PATH "/etc/asound.state" +#define ALSA_CONFIG_PATH "/etc/alsa/asound.state" +#define ALL_CARDS (-1) + int get_card_number() { @@ -46,8 +49,8 @@ int has_config(int index) snd_ctl_t *handle; snd_ctl_card_info_t *info; const char *id; - char path[32]; - + char path[32]; + rc = snd_config_top(&config); if (rc < 0) goto out; @@ -75,15 +78,30 @@ out: } -int run_alsactl(int index) +void load_volume_settings(int index) { - char *args[] = { "/sbin/alsactl", "restore", NULL, NULL }; - char num[10]; + char *args[] = { "/sbin/alsactl", "-f", ALSA_CONFIG_PATH, "restore", NULL, NULL }; + char num[10]; + + if(index != ALL_CARDS) { + snprintf(num, 10, "%d", index); + args[4] = num; + } + + execv(args[0], args); +} - sprintf(num, "%d", index); - args[2] = num; +void save_volume_settings(int index) +{ + char *args[] = { "/sbin/alsactl", "-f", ALSA_CONFIG_PATH, "store", NULL, NULL }; + char num[10]; + + if(index != ALL_CARDS) { + snprintf(num, 10, "%d", index); + args[4] = num; + } + execv(args[0], args); - return 1; } void frob_mixer(int index) @@ -94,17 +112,55 @@ void frob_mixer(int index) execl("/bin/alsaunmute","/bin/alsaunmute", tmp, "-v", NULL); } +void banner(void) +{ + printf("ALSA volume settings handler, Copyright 2007 Red Hat, Inc.\n"); + printf("This software may be freely redistributed under\nthe terms of the GNU public license.\n\n"); + + printf("Usage: salsa [options] [card number]\n\n"); + printf(" Options:\n"); + printf(" -l - Load volume settings\n"); + printf(" -s - Save volume settings\n\n"); + printf(" Card number:\n"); + printf(" ## - An affected card. If it isn't specified,\n"); + printf(" configure all installed sound cards.\n\n"); + + exit(0); +} + int main(int argc, char **argv) { int i; - - i = get_card_number(); - if (i < 0) - return 0; - if (has_config(i)) - return run_alsactl(i); - else - frob_mixer(i); + + if(argc == 1) { + i = get_card_number(); + if (i < 0) { + return 0; + } + if (has_config(i)) { + load_volume_settings(i); + } + else { + frob_mixer(i); + } + } + else if(argc >= 2) { + + int card_number = ALL_CARDS; + if(argc == 3) { + card_number = atoi(argv[2]); + } + + if(argv[1][1] == 'l') { + load_volume_settings(card_number); + } + else if(argv[1][1] == 's') { + save_volume_settings(card_number); + } + else { + banner(); + } + } return(0); }