summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2008-12-19 14:24:19 -0500
committerJason A. Donenfeld <Jason@zx2c4.com>2008-12-19 14:24:19 -0500
commit1d493f9523a7fbd67802d325c767f92c1ca2b3ee (patch)
treed21013c69da899e98dabc208e23f1324afa3a230
downloadvolfixd-1d493f9523a7fbd67802d325c767f92c1ca2b3ee.tar.xz
volfixd-1d493f9523a7fbd67802d325c767f92c1ca2b3ee.zip
Initial commit.
-rwxr-xr-xbuild.sh4
-rw-r--r--etc.init.d.volfixd18
-rw-r--r--volfixd.c60
3 files changed, 82 insertions, 0 deletions
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..7f9e09e
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,4 @@
+gcc -O2 -lasound -I/usr/include/alsa -o volfixd volfixd.c
+cp volfixd /usr/bin/volfixd
+cp etc.init.d.volfixd /etc/init.d/volfixd
+chmod 755 /etc/init.d/volfixd
diff --git a/etc.init.d.volfixd b/etc.init.d.volfixd
new file mode 100644
index 0000000..b68f9e6
--- /dev/null
+++ b/etc.init.d.volfixd
@@ -0,0 +1,18 @@
+#!/sbin/runscript
+
+start(){
+ ebegin "Starting volfixd"
+ start-stop-daemon --start --quiet --exec /usr/bin/volfixd --nicelevel 12 --background --make-pidfile --pidfile /var/run/volfixd.pid
+ eend $?
+}
+
+stop(){
+ ebegin "Stopping volfixd"
+ start-stop-daemon --stop --quiet --pidfile=/var/run/volfixd.pid
+ eend $?
+}
+
+restart(){
+ svc_stop
+ svc_start
+}
diff --git a/volfixd.c b/volfixd.c
new file mode 100644
index 0000000..0e8fcda
--- /dev/null
+++ b/volfixd.c
@@ -0,0 +1,60 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <alsa/asoundlib.h>
+
+int main(int argc, char *argv[]) {
+ struct snd_mixer_selem_regopt smixer_options;
+ int err, ival;
+ char card[64] = "default";
+ long lval;
+ static snd_mixer_t *handle = NULL;
+ snd_mixer_elem_t *elem,*elemLFE;
+ snd_mixer_selem_id_t *sid;
+
+
+ if ((err = snd_mixer_open(&handle, 0)) < 0) {
+ error("Mixer %s open error: %s\n", card, snd_strerror(err));
+ return err;
+ }
+ if ((err = snd_mixer_attach(handle, card)) < 0) {
+ error("Mixer attach %s error: %s", card, snd_strerror(err));
+ snd_mixer_close(handle);
+ handle = NULL;
+ return err;
+ }
+ if ((err = snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
+ error("Mixer register error: %s", snd_strerror(err));
+ snd_mixer_close(handle);
+ handle = NULL;
+ return err;
+ }
+ if ((err = snd_mixer_load(handle)) < 0) {
+ error("Mixer %s load error: %s", card, snd_strerror(err));
+ snd_mixer_close(handle);
+ handle = NULL;
+ return err;
+ }
+
+ snd_mixer_selem_id_alloca(&sid);
+ snd_mixer_selem_id_set_index(sid, 0);
+
+ snd_mixer_selem_id_set_name(sid, "Master");
+ elem = snd_mixer_find_selem(handle, sid);
+
+ snd_mixer_selem_id_set_name(sid, "LFE");
+ elemLFE = snd_mixer_find_selem(handle, sid);
+
+ while (1==1) {
+ snd_mixer_wait(handle,-1);
+ snd_mixer_handle_events(handle);
+
+ snd_mixer_selem_get_playback_volume(elem, 1, &lval);
+ snd_mixer_selem_set_playback_volume(elemLFE, 0, lval);
+
+ snd_mixer_selem_get_playback_switch(elem, 1, &ival);
+ snd_mixer_selem_set_playback_switch(elemLFE, 0, ival);
+ }
+ snd_mixer_close(handle);
+ snd_mixer_free(handle);
+ return(0);
+}