alsamixergui-0.9.0rc2-1.orig/0040755000076400007640000000000007530677651013562 5ustar rjrjalsamixergui-0.9.0rc2-1.orig/AUTHORS0100644000076400007640000000004507466514257014626 0ustar rjrjMaarten de Boer alsamixergui-0.9.0rc2-1.orig/ChangeLog0100644000076400007640000000036007466514257015330 0ustar rjrj0.9rc1-2 - Applied patch from tvignaud@mandrakesoft.com to fix compilation on Mandrake (Fl/FL includes) - Fixed small bug in alsamixer.cxx that caused slider callback changes (using the mouse) to be lost. alsamixergui-0.9.0rc2-1.orig/Makefile.am0100644000076400007640000000001507466560704015605 0ustar rjrjSUBDIRS=src alsamixergui-0.9.0rc2-1.orig/NEWS0100644000076400007640000000000007466514257014244 0ustar rjrjalsamixergui-0.9.0rc2-1.orig/README0100644000076400007640000000044507466514257014442 0ustar rjrjalsamixergui is a FLTK based frontend for alsamixer. It is written directly on top of the alsamixer source, leaving the original source intact, only adding a couple of ifdefs, and some calls to the gui part, so it provides exactly the same functionality, but with a graphical userinterface. alsamixergui-0.9.0rc2-1.orig/configure.in0100644000076400007640000000102607466514257016067 0ustar rjrjdnl Process this file with autoconf to produce a configure script. AC_INIT(src/alsamixer.cxx) AM_INIT_AUTOMAKE(alsamixergui, 0.9.0rc1-2) AC_PREFIX_DEFAULT(/usr) AM_CONFIG_HEADER(src/config.h) dnl Checks for programs. AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_LN_S dnl Checks for libraries. AC_CHECK_LIB(fltk,numericsort,,AC_MSG_ERROR("missing fltk")) AM_PATH_ALSA(0.9.0) dnl Checks for header files. AC_HEADER_STDC AC_HAVE_HEADERS(stdio.h string.h stdlib.h getopt.h alsa/asoundlib.h FL/Fl.H) AC_OUTPUT(Makefile src/Makefile) alsamixergui-0.9.0rc2-1.orig/debian/0040755000076400007640000000000007530677651015004 5ustar rjrjalsamixergui-0.9.0rc2-1.orig/debian/alsamixergui.sgml0100644000076400007640000001033507466561505020357 0ustar rjrjRobert"> Jordens"> Mai 9, 2002"> 1"> rjo@gmx.de"> ALSAMIXERGUI"> Debian"> GNU"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2002 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; FLTK based frontend for alsamixer &dhpackage; <card number or idenfication> <mixer device> DESCRIPTION This manual page documents briefly the &dhpackage; commands. This manual page was written for the &debian; distribution because the original program does not have a manual page. &dhpackage; is a FLTK based frontend for alsamixer. It is written directly on top of the alsamixer source, leaving the original source intact, only adding a couple of ifdefs, and some calls to the gui part, so it provides exactly the same functionality, but with a graphical userinterface. OPTIONS Help: show available flags. <card number or idenfication> Select the soundcard to use, if you have more than one. Cards are numbered from 0 (the default). <device idenfication> Select the mixer device to control. Toggle the using of colors. (Accepted but ignored) Minimize the mixer window. (Accepted but ignored) SEE ALSO alsamixer (1), amixer(1), aplay(1), arecord(1). AUTHOR This manual page was written by &dhusername; &dhemail; for the &debian; system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts and no Back-Cover Texts.
alsamixergui-0.9.0rc2-1.orig/debian/changelog0100644000076400007640000000135607523767573016665 0ustar rjrjalsamixergui (0.9.0rc2-1-1) unstable; urgency=low * Upstream changes. * Corrected the fiddling with "prefix" in debian/rules now adhering to the recommended way. -- Robert Jordens Tue, 6 Aug 2002 17:22:05 +0200 alsamixergui (0.9.0rc1-2-1) unstable; urgency=low * Initial Release, closes: Bug#146372 * wrote manpage * zeroed DISTCLEANFILES in Makefile.in and .am to make it usable as a rules-target and to minimize the .diff * now native debian. debian/ tree in cvs; keeping the Debian revision though * don't build-depend automake, autoconf. Bad idea. * found that I can have two dashes in the version * added url to debian/control -- Robert Jordens Thu, 9 May 2002 13:15:49 +0200 alsamixergui-0.9.0rc2-1.orig/debian/control0100644000076400007640000000131707467206255016403 0ustar rjrjSource: alsamixergui Section: sound Priority: optional Maintainer: Robert Jordens Build-Depends: debhelper (>> 3.0.0), libfltk1-dev, libasound2-dev (>= 0.9.0), docbook-to-man Standards-Version: 3.5.2 Package: alsamixergui Architecture: any Depends: ${shlibs:Depends} Description: FLTK based frontend for alsamixer alsamixergui is a FLTK based frontend for alsamixer. It is written directly on top of the alsamixer source, leaving the original source intact, only adding a couple of ifdefs, and some calls to the gui part, so it provides exactly the same functionality, but with a graphical userinterface. . Further information can be found at http://www.iua.upf.es/~mdeboer/projects/alsamixergui/ alsamixergui-0.9.0rc2-1.orig/debian/copyright0100644000076400007640000000202707466561505016733 0ustar rjrjThis package was debianized by Robert Jordens on Thu, 9 May 2002 13:15:49 +0200. It was downloaded from ftp://www.iua.upf.es/pub/mdeboer/projects/alsamixergui Upstream Author: Maarten de Boer Copyright: 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 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUTANY 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. On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL file. alsamixergui-0.9.0rc2-1.orig/debian/dirs0100644000076400007640000000002107466561505015654 0ustar rjrjusr/bin usr/sbin alsamixergui-0.9.0rc2-1.orig/debian/docs0100644000076400007640000000000707466561505015647 0ustar rjrjREADME alsamixergui-0.9.0rc2-1.orig/debian/menu0100644000076400007640000000015407466561505015666 0ustar rjrj?package(alsamixergui):needs=X11 section=Apps/Sound\ title="alsamixergui" command="/usr/bin/alsamixergui" alsamixergui-0.9.0rc2-1.orig/debian/rules0100755000076400007640000000430207523766564016064 0ustar rjrj#!/usr/bin/make -f # rules # # Robert Jordens # # This software may be used and distributed according to the terms # of the GNU General Public License, incorporated herein by reference. # # $Id: rules,v 1.4 2002/08/06 15:38:28 rjordens Exp $ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # This is the debhelper compatibility version to use. export DH_COMPAT=3 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) CFLAGS += -g endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif configure: Makefile.am -rm -f aclocal.m4 INSTALL COPYING install-sh Makefile.in configure \ missing mkinstalldirs src/config.h.in src/Makefile.in \ src/stamp-h.in config.h.in aclocal automake --add-missing --copy autoheader autoconf config.status: configure dh_testdir ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info build: build-stamp build-stamp: config.status dh_testdir $(MAKE) /usr/bin/docbook-to-man debian/alsamixergui.sgml > debian/alsamixergui.1 touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp debian/alsamixergui.1 -$(MAKE) distclean dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs $(MAKE) install prefix=$(CURDIR)/debian/alsamixergui/usr # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot # dh_installdebconf dh_installdocs dh_installexamples dh_installmenu dh_installman debian/alsamixergui.1 dh_installinfo # dh_undocumented dh_installchangelogs ChangeLog dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install alsamixergui-0.9.0rc2-1.orig/src/0040755000076400007640000000000007530677652014352 5ustar rjrjalsamixergui-0.9.0rc2-1.orig/src/Fl_AM.H0100644000076400007640000000245707466514257015405 0ustar rjrj#ifndef __FL_AM__ #define __FL_AM__ #include #include #include #include #include #include #include class Fl_AMGroup:public Fl_Group { public: Fl_Slider *volumeL,*volumeR; Fl_Button *lock,*muteL,*muteR,*captureL,*captureR; Fl_Button *name; Fl_Box *captureLbox,*captureRbox; int elem_id; Fl_AMGroup(int X,int Y,int W,int H,char* L,int id); static void volumeL_cb(Fl_Slider* s); static void volumeR_cb(Fl_Slider* s); static void muteL_cb(Fl_Button* s); static void muteR_cb(Fl_Button* s); static void captureL_cb(Fl_Button* s); static void captureR_cb(Fl_Button* s); static void lock_cb(Fl_Button* s); static void name_cb(Fl_Button* s); int handle(int e) { return Fl_Group::handle(e); } }; class Fl_AMWindow:public Fl_Window { public: Fl_AMGroup* group[256]; Fl_Scroll *scroll; Fl_Box* card_name; Fl_Box* device_name; Fl_AMWindow(); int handle(int e); void add_group(char* name); }; class Fl_AMProcWindow:public Fl_Window { public: Fl_AMProcWindow(); static void cb(Fl_Window* ptr); ~Fl_AMProcWindow(); int handle(int e); }; class Fl_AMHelpWindow:public Fl_Window { public: Fl_AMHelpWindow(); static void cb(Fl_Window* ptr); ~Fl_AMHelpWindow(); int handle(int e); }; #endif alsamixergui-0.9.0rc2-1.orig/src/Fl_AM.cxx0100644000076400007640000003500407466514257016012 0ustar rjrj #include #include "Fl_AM.H" #include "Fl_Pixmap_Button.H" #include #include #include #include "images/rec0.xpm" #include "images/rec1.xpm" #include "images/speakerleft0.xpm" #include "images/speakerleft1.xpm" #include "images/speakerright0.xpm" #include "images/speakerright1.xpm" #include "images/lock0.xpm" #include "images/lock1.xpm" #include "images/alsalogo.xpm" #define BGCOLOR FL_GRAY #define NAMECOLOR1 FL_LIGHT1 #define NAMECOLOR2 FL_DARK1 #define SLIDERCOLOR FL_GRAY #define TEXTCOLOR FL_BLACK #define GROUPW 40 /**********************************/ Fl_Pixmap pixmap_speakerleft0(speakerleft0_xpm); Fl_Pixmap pixmap_speakerleft1(speakerleft1_xpm); Fl_Pixmap pixmap_speakerright0(speakerright0_xpm); Fl_Pixmap pixmap_speakerright1(speakerright1_xpm); Fl_Pixmap pixmap_rec0(rec0_xpm); Fl_Pixmap pixmap_rec1(rec1_xpm); Fl_Pixmap pixmap_lock0(lock0_xpm); Fl_Pixmap pixmap_lock1(lock1_xpm); Fl_Pixmap pixmap_alsalogo(alsalogo_xpm); /**********************************/ enum { VIEW_CHANNELS, VIEW_HELP, VIEW_PROCINFO }; /**********************************/ /* mixer bar channel : left or right */ #define MIXER_CHN_LEFT 0 #define MIXER_CHN_RIGHT 1 /* mask for toggle mute and capture */ #define MIXER_MASK_LEFT (1 << 0) #define MIXER_MASK_RIGHT (1 << 1) #define MIXER_MASK_STEREO (MIXER_MASK_LEFT|MIXER_MASK_RIGHT) int mixer_iteration (void); void mixer_write_cbar (int elem_index); void mixer_update_cbar (int); void mixer_update_cbars (void); void mixer_show_procinfo (void); void mixer_show_text (char *title, char *text, int *xoffs, int *yoffs); extern void *mixer_sid; extern int mixer_n_selems; extern int mixer_view; extern int mixer_n_vis_elems; extern int mixer_n_elems; extern int mixer_focus_elem; extern int mixer_toggle_mute; extern int mixer_toggle_capture; extern int mixer_volume_hard[]; extern char mixer_card_name[128]; extern char mixer_device_name[128]; extern snd_mixer_t *mixer_handle; extern char* mixer_help_text; extern int* mixer_grpidx; extern int *mixer_type; /**********************************/ Fl_AMWindow* mainWindow = 0; Fl_AMProcWindow* procWindow = 0; Fl_AMHelpWindow* helpWindow = 0; Fl_Browser* textOut = 0; int gui_do_update_all = 0; int gui_do_select = 0; int gui_prev_focus_elem = -1; /**********************************/ void gui_select(void) { // check for external mixer change mixer_n_vis_elems = mixer_n_elems; gui_do_select=1; mixer_iteration(); gui_do_select=0; } void gui_update(void) { // called after gui/key event mixer_n_vis_elems = mixer_n_elems; mixer_write_cbar(mixer_focus_elem); mixer_update_cbar(mixer_focus_elem); gui_select(); } void gui_update_all(void) { mixer_n_vis_elems = mixer_n_elems; gui_do_update_all = 1; mixer_update_cbars(); gui_do_update_all = 0; } void gui_init(void) { mainWindow = new Fl_AMWindow; } void gui_show_text(char* text) { int i=0; int j=0; char tmp[256]; while (text[i]) { if (text[i]=='\n') { tmp[j]='\0'; textOut->add(strdup(tmp)); j=0; }else{ tmp[j++]=text[i]; } i++; } } #include void gui_abort(const char* errorstr) { if (strcmp(errorstr,"")) fl_alert(errorstr); } void gui_mixer_change_view(void) { if (mixer_view == VIEW_CHANNELS) { mainWindow->show(); }else if (mixer_view == VIEW_PROCINFO) { if (procWindow == 0) { procWindow = new Fl_AMProcWindow; } procWindow->show(); }else if (mixer_view == VIEW_HELP) { if (helpWindow == 0) { helpWindow = new Fl_AMHelpWindow; } helpWindow->show(); } } void gui_open_help(void) { mixer_view = VIEW_HELP; gui_mixer_change_view(); } void gui_open_proc(void) { mixer_view = VIEW_PROCINFO; gui_mixer_change_view(); } void gui_idle_cb(void*) { gui_select(); Fl::add_timeout(0.1,gui_idle_cb,0); } #include void gui_start(void) { char tmp[256]; strcpy(tmp,"Card: "); strcat(tmp,mixer_card_name); mainWindow->card_name->label(strdup(tmp)); strcpy(tmp,"Chip: "); strcat(tmp,mixer_device_name); mainWindow->device_name->label(strdup(tmp)); gui_update_all(); mainWindow->show(); Fl::add_timeout(0.05,gui_idle_cb,0); #if FL_MAJOR_VERSION == 1 && FL_MINOR_VERSION >= 1 Fl::visible_focus(0); #endif Fl::run(); } static int cx; void get_name(int elem_index,char* string1) { int dc; snd_mixer_elem_t *elem; int type; snd_mixer_selem_id_t *sid; /* set new scontrol indices and read info */ if (mixer_sid == NULL) return; sid = (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * mixer_grpidx[elem_index]); elem = snd_mixer_find_selem(mixer_handle, sid); if (elem == NULL) return; type = mixer_type[elem_index]; if (snd_mixer_selem_id_get_index(sid) > 0) sprintf(string1, "%s %d", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); else strcpy(string1, snd_mixer_selem_id_get_name(sid)); } void gui_add_groups(void) { cx = mainWindow->scroll->x(); int cy = mainWindow->scroll->y(); mainWindow->scroll->add(new Fl_Box(cx,cy,3,0)); int i; for (i= 0; i < mixer_n_elems; i++) { mixer_volume_hard[i] = -1; } for (i = 0; i < mixer_n_elems; i++) { char string[256]; get_name(i,string); if ( strncmp(string,"PCM Chorus ", strlen("PCM Chorus ")) && strncmp(string,"PCM Front ", strlen("PCM Front ")) && strncmp(string,"PCM Pan Playback Control ", strlen("PCM Pan Playback Control ")) && strncmp(string,"PCM Reverb ",strlen("PCM Reverb ")) ) mainWindow->add_group(strdup(string)); else mainWindow->add_group(0); } cx-=3; mainWindow->scroll->add(new Fl_Box(cx,cy,3,0)); cx += 3; } /***************************************/ Fl_Menu_Item alsa_menu[] = { {"Help", 0, (Fl_Callback*) gui_open_help, 0, 0, 0, 0, 12, 0}, {"Proc Info", 0, (Fl_Callback*) gui_open_proc, 0, 0, 0, 0, 12, 0}, {0} }; /***************************************/ Fl_AMProcWindow::Fl_AMProcWindow():Fl_Window(500,240,"/proc/asound") { callback((Fl_Callback*) cb); Fl_Browser* o = new Fl_Browser(3,3,w()-6,h()-6); o->box(FL_FLAT_BOX); o->color(color()); o->textsize(12); o->textfont(FL_COURIER); textOut = o; mixer_show_procinfo (); resizable(o); end(); } void Fl_AMProcWindow::cb(Fl_Window* ptr) { delete ptr; } Fl_AMProcWindow::~Fl_AMProcWindow() { procWindow = 0; mixer_view = VIEW_CHANNELS; gui_mixer_change_view(); } int Fl_AMProcWindow::handle(int e) { if (e==FL_KEYBOARD) { mixer_iteration(); // mixer_iteration handles key event if (mainWindow) { mixer_write_cbar( mixer_focus_elem ); mixer_update_cbar( mixer_focus_elem ); } gui_select(); // check for external changes return 1; } return Fl_Window::handle(e); } Fl_AMHelpWindow::Fl_AMHelpWindow():Fl_Window(500,240,"ALSA Mixer Help") { callback((Fl_Callback*) cb); Fl_Browser* o = new Fl_Browser(3,3,w()-6,h()-6); o->box(FL_FLAT_BOX); o->color(color()); o->textfont(FL_COURIER); o->textsize(12); textOut = o; mixer_show_text ("Help", mixer_help_text,0,0); resizable(o); end(); } void Fl_AMHelpWindow::cb(Fl_Window* ptr) { delete ptr; } Fl_AMHelpWindow::~Fl_AMHelpWindow() { helpWindow = 0; mixer_view = VIEW_CHANNELS; gui_mixer_change_view(); } int Fl_AMHelpWindow::handle(int e) { if (e==FL_KEYBOARD) { mixer_iteration(); // mixer_iteration handles key event if (mainWindow) { mixer_write_cbar( mixer_focus_elem ); mixer_update_cbar( mixer_focus_elem ); } gui_select(); // check for external changes return 1; } return Fl_Window::handle(e); } #define NAMEBOXH 60 class Fl_AMSlider:public Fl_Slider { public: Fl_AMSlider(int X,int Y,int W,int H,char* L ="") :Fl_Slider(X,Y,W,H,L) { } void draw(void) { Fl_Slider::draw(); } int handle(int e) { return Fl_Slider::handle(e); } }; Fl_AMGroup::Fl_AMGroup(int X,int Y,int W,int H,char* L,int id) :Fl_Group(X,Y,W,H) { muteL = new Fl_Pixmap_Button(X,Y,W/2,16); muteR = new Fl_Pixmap_Button(X+W/2,Y,W/2,16); muteL->callback((Fl_Callback*)muteL_cb); muteR->callback((Fl_Callback*)muteR_cb); muteL->when(FL_WHEN_CHANGED); muteR->when(FL_WHEN_CHANGED); muteL->color(BGCOLOR,BGCOLOR); muteR->color(BGCOLOR,BGCOLOR); ((Fl_Pixmap_Button*)muteL)->pixmaps(&pixmap_speakerleft1,&pixmap_speakerleft0); ((Fl_Pixmap_Button*)muteR)->pixmaps(&pixmap_speakerright1,&pixmap_speakerright0); captureL = new Fl_Pixmap_Button(X,Y+16,W/2,16); captureR = new Fl_Pixmap_Button(X+W/2,Y+16,W/2,16); captureL->callback((Fl_Callback*)captureL_cb); captureR->callback((Fl_Callback*)captureR_cb); captureL->when(FL_WHEN_CHANGED); captureR->when(FL_WHEN_CHANGED); captureL->color(BGCOLOR,BGCOLOR); captureR->color(BGCOLOR,BGCOLOR); captureLbox = new Fl_Box(X,Y+16,W/2,16); captureRbox = new Fl_Box(X+W/2,Y+16,W/2,16); captureLbox->color(BGCOLOR,BGCOLOR); captureRbox->color(BGCOLOR,BGCOLOR); captureLbox->box(FL_FLAT_BOX); captureRbox->box(FL_FLAT_BOX); captureLbox->hide(); captureRbox->hide(); ((Fl_Pixmap_Button*)captureL)->pixmaps(&pixmap_rec0,&pixmap_rec1); ((Fl_Pixmap_Button*)captureR)->pixmaps(&pixmap_rec0,&pixmap_rec1); volumeL = new Fl_AMSlider(X,Y+32,W/2,H-NAMEBOXH-32-20); volumeR = new Fl_AMSlider(X+W/2,Y+32,W/2,H-NAMEBOXH-32-20); volumeL->callback((Fl_Callback*)volumeL_cb); volumeR->callback((Fl_Callback*)volumeR_cb); volumeL->color(BGCOLOR,SLIDERCOLOR); volumeR->color(BGCOLOR,SLIDERCOLOR); volumeL->type(FL_VERT_FILL_SLIDER); volumeR->type(FL_VERT_FILL_SLIDER); volumeL->box(FL_THIN_DOWN_BOX); volumeR->box(FL_THIN_DOWN_BOX); volumeL->range(100,0); volumeR->range(100,0); char* tmp=strdup(L); int j=0; char* substr[16]; int substri=0; char* prevptr = tmp; char* ptr=tmp; while (*ptr) { if (*ptr==' ') { *ptr=0; if (strcmp(prevptr,"-")) substr[substri++]=prevptr; prevptr=ptr+1; } ptr++; } substr[substri++]=prevptr; fl_font(FL_HELVETICA,10); ptr=tmp; for (int i=0;i40) { n--; flag=1; } if (flag==1) { substr[i][n-1]='.'; substr[i][n-2]='.'; } strncpy(ptr,substr[i],n); ptr+=n; if (i!=substri-1) *ptr++='\n'; } *ptr=0; lock = new Fl_Pixmap_Button(X,Y+H-NAMEBOXH-20,W,20); lock->color(BGCOLOR,BGCOLOR); lock->value(0); ((Fl_Pixmap_Button*)lock)->pixmaps(&pixmap_lock0,&pixmap_lock1); lock->callback((Fl_Callback*)lock_cb); name = new Fl_Button(X,Y+H-NAMEBOXH,W,NAMEBOXH,tmp); name->labelsize(10); name->box(FL_FLAT_BOX); name->color(NAMECOLOR1,NAMECOLOR2); name->labelcolor(TEXTCOLOR); name->align(FL_ALIGN_INSIDE|FL_ALIGN_TOP|FL_ALIGN_CLIP); name->callback((Fl_Callback*)name_cb); elem_id = id; end(); } void Fl_AMGroup::lock_cb(Fl_Button* b) { Fl_AMGroup* g = (Fl_AMGroup*) b->parent(); mixer_focus_elem = g->elem_id; b->value(!b->value()); gui_update(); } void Fl_AMGroup::name_cb(Fl_Button* b) { Fl_AMGroup* g = (Fl_AMGroup*) b->parent(); mixer_focus_elem = g->elem_id; gui_update(); } void Fl_AMGroup::volumeL_cb(Fl_Slider* s) { Fl_AMGroup* g = (Fl_AMGroup*) s->parent(); mixer_focus_elem = g->elem_id; if (g->lock->value()) { mixer_volume_hard[MIXER_CHN_RIGHT] = int(s->value()); } mixer_volume_hard[MIXER_CHN_LEFT] = int(s->value()); gui_update(); } void Fl_AMGroup::volumeR_cb(Fl_Slider* s) { Fl_AMGroup* g = (Fl_AMGroup*) s->parent(); mixer_focus_elem = g->elem_id; if (g->lock->value()) { mixer_volume_hard[MIXER_CHN_LEFT] = int(s->value()); } mixer_volume_hard[MIXER_CHN_RIGHT] = int(s->value()); gui_update(); } void Fl_AMGroup::muteL_cb(Fl_Button* s) { Fl_AMGroup* g = (Fl_AMGroup*) s->parent(); mixer_focus_elem = g->elem_id; mixer_toggle_mute |= MIXER_MASK_LEFT; if (g->lock->value()) { mixer_toggle_mute |= MIXER_MASK_RIGHT; } int prevvalue = s->value(); gui_update(); if (s->value()==prevvalue) { mixer_toggle_mute = MIXER_MASK_RIGHT | MIXER_MASK_LEFT; gui_update(); } } void Fl_AMGroup::muteR_cb(Fl_Button* s) { Fl_AMGroup* g = (Fl_AMGroup*) s->parent(); mixer_focus_elem = g->elem_id; mixer_toggle_mute |= MIXER_MASK_RIGHT; if (g->lock->value()) { mixer_toggle_mute |= MIXER_MASK_LEFT; } int prevvalue = s->value(); gui_update(); if (s->value()==prevvalue) { mixer_toggle_mute = MIXER_MASK_RIGHT | MIXER_MASK_LEFT; gui_update(); } } void Fl_AMGroup::captureL_cb(Fl_Button* s) { Fl_AMGroup* g = (Fl_AMGroup*) s->parent(); mixer_focus_elem = g->elem_id; mixer_toggle_capture |= MIXER_MASK_LEFT; if (g->lock->value()) { mixer_toggle_capture |= MIXER_MASK_RIGHT; } int prevvalue = s->value(); gui_update(); if (s->value()==prevvalue) { mixer_toggle_capture = MIXER_MASK_RIGHT | MIXER_MASK_LEFT; gui_update(); } } void Fl_AMGroup::captureR_cb(Fl_Button* s) { Fl_AMGroup* g = (Fl_AMGroup*) s->parent(); mixer_focus_elem = g->elem_id; mixer_toggle_capture |= MIXER_MASK_RIGHT; if (g->lock->value()) { mixer_toggle_capture |= MIXER_MASK_LEFT; } int prevvalue = s->value(); gui_update(); if (s->value()==prevvalue) { mixer_toggle_capture = MIXER_MASK_RIGHT | MIXER_MASK_LEFT; gui_update(); } } Fl_AMWindow::Fl_AMWindow():Fl_Window(512,256,"ALSA Mixer") { color(BGCOLOR); box(FL_NO_BOX); { Fl_Box* b = new Fl_Box(0,0,200,24); b->labelsize(10); b->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT); b->box(FL_THIN_UP_BOX); b->color(BGCOLOR); b->labelcolor(TEXTCOLOR); card_name = b; } { Fl_Box* b = new Fl_Box(200,0,200,24); b->labelsize(10); b->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT); b->box(FL_THIN_UP_BOX); b->color(BGCOLOR); b->labelcolor(TEXTCOLOR); device_name = b; } { Fl_Menu_Button* b = new Fl_Menu_Button(400,0,112,24); b->labelsize(10); b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_INSIDE|FL_ALIGN_RIGHT); pixmap_alsalogo.label(b); b->color(BGCOLOR); b->labelcolor(TEXTCOLOR); b->menu(alsa_menu); } { Fl_Box* b = new Fl_Box(0,24,w(),3); b->box(FL_FLAT_BOX); } scroll = new Fl_Scroll(0,27,w(),h()-27); scroll->box(FL_NO_BOX); scroll->color(BGCOLOR); resizable(scroll); } void Fl_AMWindow::add_group(char* name) { static int i=0; static int first = 1; if (name) { Fl_Box* b; if (first) { scroll->add(b = new Fl_Box(cx,scroll->y(),3,scroll->h()-20)); b->box(FL_FLAT_BOX); cx+=3; first = 0; } group[i] = new Fl_AMGroup(cx,scroll->y(),GROUPW,scroll->h()-20,name,i); scroll->add(group[i]); cx+=GROUPW; scroll->add(b = new Fl_Box(cx,scroll->y(),3,scroll->h()-20)); b->box(FL_FLAT_BOX); cx+=3; } else { group[i] = 0; } i++; } int Fl_AMWindow::handle(int e) { if (e==FL_KEYBOARD) { mixer_iteration(); // mixer_iteration handles key event if (mainWindow) { mixer_write_cbar( mixer_focus_elem ); mixer_update_cbar( mixer_focus_elem ); } gui_select(); // check for external changes return 1; } return Fl_Window::handle(e); } alsamixergui-0.9.0rc2-1.orig/src/Fl_Menu_Button.cxx0100644000076400007640000000474707466514257017766 0ustar rjrj// // "$Id: Fl_Menu_Button.cxx,v 1.1.1.1 2002/05/09 15:41:35 mdeboer Exp $" // // Menu button widget for the Fast Light Tool Kit (FLTK). // // Copyright 1998-1999 by Bill Spitzak and others. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library 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 // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA. // // Please report all bugs and problems to "fltk-bugs@easysw.com". // ////////// mdeboer: this is Fl_Menu_Button with a small hack ////////// to avoid the down-triangle. #include #include #include void Fl_Menu_Button::draw() { if (!box() || type()) return; draw_box(box(), color()); draw_label(); /* if (box() == FL_FLAT_BOX) return; // for XForms compatability int H = (labelsize()-3)&-2; int X = x()+w()-H*2; int Y = y()+(h()-H)/2; fl_color(FL_DARK3); fl_line(X+H/2, Y+H, X, Y, X+H, Y); fl_color(FL_LIGHT3); fl_line(X+H, Y, X+H/2, Y+H); */ } const Fl_Menu_Item* Fl_Menu_Button::popup() { const Fl_Menu_Item* m; if (!box() || type()) { m = menu()->popup(Fl::event_x(), Fl::event_y(), label(), mvalue(), this); } else { m = menu()->pulldown(x(), y(), w(), h(), 0, this); } picked(m); return m; } int Fl_Menu_Button::handle(int e) { if (!menu() || !menu()->text) return 0; switch (e) { case FL_ENTER: case FL_LEAVE: return (box() && !type()) ? 1 : 0; case FL_PUSH: if (!box()) { if (Fl::event_button() != 3) return 0; } else if (type()) { if (!(type() & (1 << (Fl::event_button()-1)))) return 0; } popup(); return 1; case FL_SHORTCUT: if (Fl_Widget::test_shortcut()) {popup(); return 1;} return test_shortcut() != 0; default: return 0; } } Fl_Menu_Button::Fl_Menu_Button(int X,int Y,int W,int H,const char *l) : Fl_Menu_(X,Y,W,H,l) { down_box(FL_NO_BOX); } // // End of "$Id: Fl_Menu_Button.cxx,v 1.1.1.1 2002/05/09 15:41:35 mdeboer Exp $". // alsamixergui-0.9.0rc2-1.orig/src/Fl_Pixmap_Button.H0100644000076400007640000000205107466514257017667 0ustar rjrj#ifndef __Pixmap_Button__ #define __Pixmap_Button__ #include #include #include class Fl_Pixmap_Button:public Fl_Button { public: Fl_Pixmap_Button(int X,int Y,int W,int H,char* L=""): Fl_Button(X,Y,W,H,L) { box(FL_FLAT_BOX); down_box(FL_FLAT_BOX); } void pixmaps(Fl_Pixmap* p0,Fl_Pixmap* p1) { pm[0]=p0; pm[1]=p1; } int handle(int e) { if (e==FL_PUSH) { do_callback(); return 1; } return 0; } Fl_Pixmap* pm[2]; void draw(void); }; #include inline void Fl_Pixmap_Button::draw(void) { draw_box(); Fl_Pixmap* p = pm[value()]; #if FL_MAJOR_VERSION == 1 && FL_MINOR_VERSION == 0 int pw = p->w; int ph = p->h; #else int pw = p->w(); int ph = p->h(); #endif if (pw<0) { #if FL_MAJOR_VERSION == 1 && FL_MINOR_VERSION == 0 fl_measure_pixmap(p->data,pw,ph); #else fl_measure_pixmap(p->data(),pw,ph); #endif } int px = x()+(w()-pw)/2; int py = y()+(h()-ph)/2; fl_push_clip(px,py,pw,ph); Fl_Button::draw(); fl_pop_clip(); p->draw(px,py); } #endif alsamixergui-0.9.0rc2-1.orig/src/Makefile.am0100644000076400007640000000034607466514257016405 0ustar rjrjbin_PROGRAMS = alsamixergui EXTRA_DIST = images alsamixergui_SOURCES = \ Fl_AM.H \ Fl_Menu_Button.cxx \ defines.H \ Fl_AM.cxx \ Fl_Pixmap_Button.H \ alsamixer.cxx \ ncurser_to_fl.H alsamixergui_LDADD = @LIBS@ @ALSA_LIBS@ alsamixergui-0.9.0rc2-1.orig/src/alsamixer.cxx0100644000076400007640000016033707466514257017071 0ustar rjrj/* AlsaMixerGUI - An FLTK-based GUI interface on top of AlsaMixer. Maarten de Boer This code comes directly from alsamixer. All GUI specific stuff is between #ifdef ALSAMIXER_GUI, and all alsamixer code that is not used is between #ifndef ALSAMIXER_GUI. */ /* AlsaMixer - Commandline mixer for the ALSA project Copyright (C) 1998, * 1999 Tim Janik and Jaroslav Kysela * * 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 * of the License, 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 Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * * ChangeLog: * * Wed Feb 14 13:08:17 CET 2001 Jaroslav Kysela * * * ported to the latest mixer 0.9.x API (function based) * * Fri Jun 23 14:10:00 MEST 2000 Jaroslav Kysela * * * ported to new mixer 0.9.x API (simple control) * * improved error handling (mixer_abort) * * Thu Mar 9 22:54:16 MET 2000 Takashi iwai * * * a group is split into front, rear, center and woofer elements. * * Mon Jan 3 23:33:42 MET 2000 Jaroslav Kysela * * * version 1.00 * * * ported to new mixer API (scontrol control) * * Sun Feb 21 19:55:01 1999 Tim Janik * * * bumped version to 0.10. * * * added scrollable text views. * we now feature an F1 Help screen and an F2 /proc info screen. * the help screen does still require lots of work though. * * * keys are evaluated view specific now. * * * we feature meta-keys now, e.g. M-Tab as back-tab. * * * if we are already in channel view and the user still hits Return, * we do a refresh nonetheless, since 'r'/'R' got removed as a redraw * key (reserved for capture volumes). 'l'/'L' is still preserved though, * and actually needs to be to e.g. get around the xterm bold-artefacts. * * * support terminals that can't write into lower right corner. * * * undocumented '-s' option that will keep the screen to its * minimum size, usefull for debugging only. * * Sun Feb 21 02:23:52 1999 Tim Janik * * * don't abort if snd_mixer_* functions failed due to EINTR, * we simply retry on the next cycle. hopefully asoundlib preserves * errno states correctly (Jaroslav can you asure that?). * * * feature WINCH correctly, so we make a complete relayout on * screen resizes. don't abort on too-small screen sizes anymore, * but simply beep. * * * redid the layout algorithm to fix some bugs and to preserve * space for a flag indication line. the channels are * nicer spread horizontally now (i.e. we also pad on the left and * right screen bounds now). * * * various other minor fixes. * * * indicate whether ExactMode is active or not. * * * fixed coding style to follow the GNU coding conventions. * * * reverted capture volume changes since they broke ExactMode display. * * * composed ChangeLog entries. * * 1998/11/04 19:43:45 perex * * * Stereo capture source and route selection... * provided by Carl van Schaik . * * 1998/09/20 08:05:24 perex * * * Fixed -m option... * * 1998/10/29 22:50:10 * * * initial checkin of alsamixer.c, written by Tim Janik, modified by * Jaroslav Kysela to feature asoundlib.h instead of plain ioctl()s and * automated updates after select() (i always missed that with OSS!). */ #define ALSAMIXER_GUI #include #include #include #include #include #include #include #include #include #include #ifndef ALSAMIXER_GUI #ifndef CURSESINC #include #else #include CURSESINC #endif #endif /* #ifndef ALSAMIXER_GUI */ #include #include #ifdef ALSAMIXER_GUI #include #include "ncurser_to_fl.H" #include "Fl_AM.H" #include "defines.H" int mixer_volume_hard[256]; #define static typedef void (*sighandler_t)(int); #define __FUNCTION__ #endif /* #ifdef ALSAMIXER_GUI */ /* example compilation commandline: * clear; gcc -Wall -pipe -O2 alsamixer.c -o alsamixer -lasound -lncurses */ /* --- defines --- */ #define PRGNAME "alsamixer" #define PRGNAME_UPPER "AlsaMixer" #define VERSION "v1.00" #define CHECK_ABORT(e,s,n) ({ if ((n) != -EINTR) mixer_abort ((e), (s), (n)); }) #define GETCH_BLOCK(w) ({ timeout ((w) ? -1 : 0); }) #undef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #undef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #undef ABS #define ABS(a) (((a) < 0) ? -(a) : (a)) #undef CLAMP #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) #define MIXER_MIN_X (18) /* abs minimum: 18 */ #define MIXER_TEXT_Y (10) #define MIXER_MIN_Y (MIXER_TEXT_Y + 3) /* abs minimum: 11 */ #define MIXER_BLACK (COLOR_BLACK) #define MIXER_DARK_RED (COLOR_RED) #define MIXER_RED (COLOR_RED | A_BOLD) #define MIXER_GREEN (COLOR_GREEN | A_BOLD) #define MIXER_ORANGE (COLOR_YELLOW) #define MIXER_YELLOW (COLOR_YELLOW | A_BOLD) #define MIXER_MARIN (COLOR_BLUE) #define MIXER_BLUE (COLOR_BLUE | A_BOLD) #define MIXER_MAGENTA (COLOR_MAGENTA) #define MIXER_DARK_CYAN (COLOR_CYAN) #define MIXER_CYAN (COLOR_CYAN | A_BOLD) #define MIXER_GREY (COLOR_WHITE) #define MIXER_GRAY (MIXER_GREY) #define MIXER_WHITE (COLOR_WHITE | A_BOLD) /* --- views --- */ enum { VIEW_CHANNELS, VIEW_HELP, VIEW_PROCINFO }; /* --- variables --- */ static WINDOW *mixer_window = NULL; static int mixer_needs_resize = 0; static int mixer_minimize = 0; static int mixer_no_lrcorner = 0; static int mixer_view = VIEW_CHANNELS; static int mixer_max_x = 0; static int mixer_max_y = 0; static int mixer_ofs_x = 0; static float mixer_extra_space = 0; static int mixer_cbar_height = 0; static char card_id[64] = "default"; static snd_mixer_t *mixer_handle; static char mixer_card_name[128]; static char mixer_device_name[128]; /* mixer bar channel : left or right */ #define MIXER_CHN_LEFT 0 #define MIXER_CHN_RIGHT 1 /* mask for toggle mute and capture */ #define MIXER_MASK_LEFT (1 << 0) #define MIXER_MASK_RIGHT (1 << 1) #define MIXER_MASK_STEREO (MIXER_MASK_LEFT|MIXER_MASK_RIGHT) /* mixer split types */ enum { MIXER_ELEM_FRONT, MIXER_ELEM_REAR, MIXER_ELEM_CENTER, MIXER_ELEM_WOOFER, MIXER_ELEM_CAPTURE, MIXER_ELEM_END }; #define MIXER_ELEM_TYPE_MASK 0xff #define MIXER_ELEM_CAPTURE_SWITCH 0x100 /* bit */ #define MIXER_ELEM_MUTE_SWITCH 0x200 /* bit */ #define MIXER_ELEM_CAPTURE_SUFFIX 0x400 /* left and right channels for each type */ static snd_mixer_selem_channel_id_t mixer_elem_chn[][2] = { { SND_MIXER_SCHN_FRONT_LEFT, SND_MIXER_SCHN_FRONT_RIGHT }, { SND_MIXER_SCHN_REAR_LEFT, SND_MIXER_SCHN_REAR_RIGHT }, { SND_MIXER_SCHN_FRONT_CENTER, SND_MIXER_SCHN_UNKNOWN }, { SND_MIXER_SCHN_WOOFER, SND_MIXER_SCHN_UNKNOWN }, { SND_MIXER_SCHN_FRONT_LEFT, SND_MIXER_SCHN_FRONT_RIGHT }, }; static void *mixer_sid = NULL; static int mixer_n_selems = 0; static int mixer_changed_state = 1; /* split scontrols */ static int mixer_n_elems = 0; static int mixer_n_vis_elems = 0; static int mixer_first_vis_elem = 0; static int mixer_focus_elem = 0; static int mixer_have_old_focus = 0; static int *mixer_grpidx; static int *mixer_type; static int mixer_volume_delta[2]; /* left/right volume delta in % */ static int mixer_balance_volumes = 0; /* boolean */ static unsigned mixer_toggle_mute = 0; /* left/right mask */ static unsigned mixer_toggle_capture = 0; /* left/right mask */ static int mixer_hscroll_delta = 0; static int mixer_vscroll_delta = 0; /* --- text --- */ static int mixer_procinfo_xoffs = 0; static int mixer_procinfo_yoffs = 0; static int mixer_help_xoffs = 0; static int mixer_help_yoffs = 0; static char *mixer_help_text = ( "\n" " Esc exit alsamixer\n" " F1 show Help screen\n" " F2 show /proc info screen\n" " Return return to main screen\n" " Space toggle Capture facility\n" " Tab toggle ExactMode\n" " m M mute both channels\n" " < > mute left/right channel\n" " Up increase left and right volume\n" " Down decrease left and right volume\n" " Right move (scroll) to the right next channel\n" " Left move (scroll) to the left next channel\n" "\n" "Alsamixer has been written and is Copyrighted in 1998, 1999 by\n" "Tim Janik and Jaroslav Kysela .\n" #ifdef ALSAMIXER_GUI "ALSA Mixer GUI by Maarten de Boer \n" #endif /* #ifdef ALSAMIXER_GUI */ ); /* --- draw contexts --- */ enum { DC_DEFAULT, DC_BACK, DC_TEXT, DC_PROMPT, DC_CBAR_MUTE, DC_CBAR_NOMUTE, DC_CBAR_CAPTURE, DC_CBAR_NOCAPTURE, DC_CBAR_EMPTY, DC_CBAR_LABEL, DC_CBAR_FOCUS_LABEL, DC_FOCUS, DC_ANY_1, DC_ANY_2, DC_ANY_3, DC_ANY_4, DC_LAST }; static int dc_fg[DC_LAST] = { 0 }; static int dc_attrib[DC_LAST] = { 0 }; static int dc_char[DC_LAST] = { 0 }; static int mixer_do_color = 1; #ifndef ALSAMIXER_GUI static void mixer_init_dc (int c, int n, int f, int b, int a) { dc_fg[n] = f; dc_attrib[n] = a; dc_char[n] = c; if (n > 0) init_pair (n, dc_fg[n] & 0xf, b & 0x0f); } static int mixer_dc (int n) { if (mixer_do_color) attrset (COLOR_PAIR (n) | (dc_fg[n] & 0xfffffff0)); else attrset (dc_attrib[n]); return dc_char[n]; } static void mixer_init_draw_contexts (void) { start_color (); mixer_init_dc ('.', DC_BACK, MIXER_WHITE, MIXER_BLACK, A_NORMAL); mixer_init_dc ('.', DC_TEXT, MIXER_YELLOW, MIXER_BLACK, A_BOLD); mixer_init_dc ('.', DC_PROMPT, MIXER_DARK_CYAN, MIXER_BLACK, A_NORMAL); mixer_init_dc ('M', DC_CBAR_MUTE, MIXER_CYAN, MIXER_BLACK, A_BOLD); mixer_init_dc (ACS_HLINE, DC_CBAR_NOMUTE, MIXER_CYAN, MIXER_BLACK, A_BOLD); mixer_init_dc ('x', DC_CBAR_CAPTURE, MIXER_DARK_RED, MIXER_BLACK, A_BOLD); mixer_init_dc ('-', DC_CBAR_NOCAPTURE, MIXER_GRAY, MIXER_BLACK, A_NORMAL); mixer_init_dc (' ', DC_CBAR_EMPTY, MIXER_GRAY, MIXER_BLACK, A_DIM); mixer_init_dc ('.', DC_CBAR_LABEL, MIXER_WHITE, MIXER_BLUE, A_REVERSE | A_BOLD); mixer_init_dc ('.', DC_CBAR_FOCUS_LABEL, MIXER_RED, MIXER_BLUE, A_REVERSE | A_BOLD); mixer_init_dc ('.', DC_FOCUS, MIXER_RED, MIXER_BLACK, A_BOLD); mixer_init_dc (ACS_BLOCK, DC_ANY_1, MIXER_WHITE, MIXER_BLACK, A_BOLD); mixer_init_dc (ACS_BLOCK, DC_ANY_2, MIXER_GREEN, MIXER_BLACK, A_BOLD); mixer_init_dc (ACS_BLOCK, DC_ANY_3, MIXER_RED, MIXER_BLACK, A_BOLD); mixer_init_dc ('.', DC_ANY_4, MIXER_WHITE, MIXER_GREEN, A_BOLD); mixer_init_dc ('.', DC_ANY_4, MIXER_WHITE, MIXER_BLUE, A_BOLD); } #endif /* #ifndef ALSAMIXER_GUI */ #define DC_CBAR_FRAME (DC_CBAR_MUTE) #define DC_FRAME (DC_PROMPT) /* --- error types --- */ typedef enum { ERR_NONE, ERR_OPEN, ERR_FCN, ERR_SIGNAL, ERR_WINSIZE, } ErrType; /* --- prototypes --- */ static void mixer_abort (ErrType error, const char *err_string, int xerrno) __attribute__ ((noreturn)); /* --- functions --- */ #ifndef ALSAMIXER_GUI static void mixer_clear (int full_redraw) { int x, y; int f = full_redraw ? 0 : 1; mixer_dc (DC_BACK); if (full_redraw) clearok (mixer_window, TRUE); /* buggy ncurses doesn't really write spaces with the specified * color into the screen on clear () or erase () */ for (x = f; x < mixer_max_x - f; x++) for (y = f; y < mixer_max_y - f; y++) mvaddch (y, x, ' '); } #endif /* #ifndef ALSAMIXER_GUI */ #ifdef ALSAMIXER_GUI void mixer_clear (int) { gui_mixer_change_view(); } #endif /* #ifdef ALSAMIXER_GUI */ static void mixer_abort (ErrType error, const char *err_string, int xerrno) { if (mixer_window) { mixer_clear (TRUE); refresh (); keypad (mixer_window, FALSE); leaveok (mixer_window, FALSE); endwin (); mixer_window = NULL; } printf ("\n"); #ifdef ALSAMIXER_GUI char errorstr[256]; strcpy(errorstr,""); #endif /* #ifdef ALSAMIXER_GUI */ switch (error) { case ERR_OPEN: #ifdef ALSAMIXER_GUI sprintf (errorstr, #else fprintf (stderr, #endif /* #ifdef ALSAMIXER_GUI */ PRGNAME ": function %s failed for %s: %s\n", err_string, card_id, snd_strerror (xerrno)); break; case ERR_FCN: #ifdef ALSAMIXER_GUI sprintf (errorstr, #else fprintf (stderr, #endif /* #ifdef ALSAMIXER_GUI */ PRGNAME ": function %s failed: %s\n", err_string, snd_strerror (xerrno)); break; case ERR_SIGNAL: #ifdef ALSAMIXER_GUI sprintf (errorstr, #else fprintf (stderr, #endif /* #ifdef ALSAMIXER_GUI */ PRGNAME ": aborting due to signal `%s'\n", err_string); break; case ERR_WINSIZE: #ifdef ALSAMIXER_GUI sprintf (errorstr, #else fprintf (stderr, #endif /* #ifdef ALSAMIXER_GUI */ PRGNAME ": screen size too small (%dx%d)\n", mixer_max_x, mixer_max_y); break; default: break; } #ifdef ALSAMIXER_GUI gui_abort(errorstr); #endif /* #ifdef ALSAMIXER_GUI */ exit (error); } #ifndef ALSAMIXER_GUI static int mixer_cbar_get_pos (int elem_index, int *x_p, int *y_p) { int x; int y; if (elem_index < mixer_first_vis_elem || elem_index - mixer_first_vis_elem >= mixer_n_vis_elems) return FALSE; elem_index -= mixer_first_vis_elem; x = mixer_ofs_x; x += (3 + 2 + 3 + 1) * elem_index + mixer_extra_space * (elem_index + 1); if (MIXER_TEXT_Y + 10 < mixer_max_y) y = mixer_max_y / 2 + 3; else y = (mixer_max_y + 1) / 2 + 3; y += mixer_cbar_height / 2; if (x_p) *x_p = x; if (y_p) *y_p = y; return TRUE; } #endif /* #ifndef ALSAMIXER_GUI */ static int mixer_conv(int val, int omin, int omax, int nmin, int nmax) { int orange = omax - omin, nrange = nmax - nmin; if (orange == 0) return 0; return ((nrange * (val - omin)) + (orange / 2)) / orange + nmin; } static int mixer_calc_volume(snd_mixer_elem_t *elem, int vol, int type, snd_mixer_selem_channel_id_t chn) { int vol1; long v; long min, max; if (type != MIXER_ELEM_CAPTURE) snd_mixer_selem_get_playback_volume_range(elem, &min, &max); else snd_mixer_selem_get_capture_volume_range(elem, &min, &max); vol1 = (vol < 0) ? -vol : vol; if (vol1 > 0) { if (vol1 > 100) vol1 = max; else vol1 = mixer_conv(vol1, 0, 100, min, max); if (vol1 <= 0) vol1 = 1; if (vol < 0) vol1 = -vol1; } if (type != MIXER_ELEM_CAPTURE) snd_mixer_selem_get_playback_volume(elem, chn, &v); else snd_mixer_selem_get_capture_volume(elem, chn, &v); vol1 += v; return CLAMP(vol1, min, max); } /* set new channel values */ static void mixer_write_cbar (int elem_index) { snd_mixer_elem_t *elem; int vleft, vright, vbalance; int type; snd_mixer_selem_id_t *sid; snd_mixer_selem_channel_id_t chn_left, chn_right, chn; int sw; if (mixer_sid == NULL) return; sid = (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * mixer_grpidx[elem_index]); elem = snd_mixer_find_selem(mixer_handle, sid); if (elem == NULL) CHECK_ABORT (ERR_FCN, __FUNCTION__ ": snd_mixer_find_selem()", -EINVAL); type = mixer_type[elem_index] & MIXER_ELEM_TYPE_MASK; chn_left = mixer_elem_chn[type][MIXER_CHN_LEFT]; chn_right = mixer_elem_chn[type][MIXER_CHN_RIGHT]; if (chn_right != SND_MIXER_SCHN_UNKNOWN) { if (type != MIXER_ELEM_CAPTURE) { if (!snd_mixer_selem_has_playback_channel(elem, chn_right)) chn_right = SND_MIXER_SCHN_UNKNOWN; } else { if (!snd_mixer_selem_has_capture_channel(elem, chn_right)) chn_right = SND_MIXER_SCHN_UNKNOWN; } } /* volume */ if ((mixer_volume_delta[MIXER_CHN_LEFT] || mixer_volume_delta[MIXER_CHN_RIGHT] || #ifdef ALSAMIXER_GUI mixer_volume_hard[MIXER_CHN_LEFT]!=-1 || mixer_volume_hard[MIXER_CHN_RIGHT]!=-1 || #endif mixer_balance_volumes) && ((type != MIXER_ELEM_CAPTURE && snd_mixer_selem_has_playback_volume(elem)) || (type == MIXER_ELEM_CAPTURE && snd_mixer_selem_has_capture_volume(elem)))) { int mono; int joined; mono = (chn_right == SND_MIXER_SCHN_UNKNOWN); if (type != MIXER_ELEM_CAPTURE) joined = snd_mixer_selem_has_playback_volume_joined(elem); else joined = snd_mixer_selem_has_capture_volume_joined(elem); mono |= joined; if (mono && !mixer_volume_delta[MIXER_CHN_LEFT]) mixer_volume_delta[MIXER_CHN_LEFT] = mixer_volume_delta[MIXER_CHN_RIGHT]; #ifdef ALSAMIXER_GUI if (mono && mixer_volume_hard[MIXER_CHN_LEFT]==-1) mixer_volume_hard[MIXER_CHN_LEFT]=mixer_volume_hard[MIXER_CHN_RIGHT]; #endif /* #ifdef ALSAMIXER_GUI */ vleft = mixer_calc_volume(elem, mixer_volume_delta[MIXER_CHN_LEFT], type, chn_left); #ifdef ALSAMIXER_GUI if (mixer_volume_hard[MIXER_CHN_LEFT]!=-1) { long min, max; snd_mixer_selem_get_playback_volume_range(elem, &min, &max); vleft = min + mixer_volume_hard[MIXER_CHN_LEFT]*(max-min)/100; mixer_volume_hard[MIXER_CHN_LEFT]=-1; } #endif /* #ifdef ALSAMIXER_GUI */ vbalance = vleft; if (! mono) { vright = mixer_calc_volume(elem, mixer_volume_delta[MIXER_CHN_RIGHT], type, chn_right); #ifdef ALSAMIXER_GUI if (mixer_volume_hard[MIXER_CHN_RIGHT]!=-1) { long min, max; snd_mixer_selem_get_playback_volume_range(elem, &min, &max); vright = min + mixer_volume_hard[MIXER_CHN_RIGHT]*(max-min)/100; mixer_volume_hard[MIXER_CHN_RIGHT]=-1; } #endif /* #ifdef ALSAMIXER_GUI */ vbalance += vright; vbalance /= 2; } else vright = vleft; if (vleft >= 0 && vright >= 0) { if (joined) { #ifdef ALSAMIXER_GUI for (chn = snd_mixer_selem_channel_id_t(0); chn < SND_MIXER_SCHN_LAST; snd_mixer_selem_channel_id_t(int(chn)++)) #else for (chn = 0; chn < SND_MIXER_SCHN_LAST; chn++) #endif if (type != MIXER_ELEM_CAPTURE) { if (snd_mixer_selem_has_playback_channel(elem, chn)) snd_mixer_selem_set_playback_volume(elem, chn, vleft); } else { if (snd_mixer_selem_has_capture_channel(elem, chn)) snd_mixer_selem_set_capture_volume(elem, chn, vleft); } } else { if (mixer_balance_volumes) vleft = vright = vbalance; if (type != MIXER_ELEM_CAPTURE) { if (snd_mixer_selem_has_playback_volume(elem) && snd_mixer_selem_has_playback_channel(elem, chn_left)) snd_mixer_selem_set_playback_volume(elem, chn_left, vleft); } else { if (snd_mixer_selem_has_capture_volume(elem) && snd_mixer_selem_has_capture_channel(elem, chn_left)) snd_mixer_selem_set_capture_volume(elem, chn_left, vleft); } if (! mono) { if (type != MIXER_ELEM_CAPTURE) { if (snd_mixer_selem_has_playback_volume(elem) && snd_mixer_selem_has_playback_channel(elem, chn_right)) snd_mixer_selem_set_playback_volume(elem, chn_right, vright); } else { if (snd_mixer_selem_has_capture_volume(elem) && snd_mixer_selem_has_capture_channel(elem, chn_right)) snd_mixer_selem_set_capture_volume(elem, chn_right, vright); } } } } } mixer_volume_delta[MIXER_CHN_LEFT] = mixer_volume_delta[MIXER_CHN_RIGHT] = 0; mixer_balance_volumes = 0; /* mute */ if (mixer_type[elem_index] & MIXER_ELEM_MUTE_SWITCH) { if (mixer_toggle_mute && snd_mixer_selem_has_playback_switch(elem)) { if (snd_mixer_selem_has_playback_switch_joined(elem)) { snd_mixer_selem_get_playback_switch(elem, chn_left, &sw); snd_mixer_selem_set_playback_switch_all(elem, !sw); } else { if (mixer_toggle_mute & MIXER_MASK_LEFT) { snd_mixer_selem_get_playback_switch(elem, chn_left, &sw); snd_mixer_selem_set_playback_switch(elem, chn_left, !sw); } if (chn_right != SND_MIXER_SCHN_UNKNOWN && (mixer_toggle_mute & MIXER_MASK_RIGHT)) { snd_mixer_selem_get_playback_switch(elem, chn_right, &sw); snd_mixer_selem_set_playback_switch(elem, chn_right, !sw); } } } } mixer_toggle_mute = 0; /* capture */ if (mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SWITCH) { if (mixer_toggle_capture && snd_mixer_selem_has_capture_switch(elem)) { if (snd_mixer_selem_has_capture_switch_joined(elem)) { snd_mixer_selem_get_capture_switch(elem, chn_left, &sw); snd_mixer_selem_set_capture_switch_all(elem, !sw); } else { if ((mixer_toggle_capture & MIXER_MASK_LEFT) && snd_mixer_selem_has_capture_channel(elem, chn_left)) { snd_mixer_selem_get_capture_switch(elem, chn_left, &sw); snd_mixer_selem_set_capture_switch(elem, chn_left, !sw); } if (chn_right != SND_MIXER_SCHN_UNKNOWN && snd_mixer_selem_has_capture_channel(elem, chn_right) && (mixer_toggle_capture & MIXER_MASK_RIGHT)) { snd_mixer_selem_get_capture_switch(elem, chn_right, &sw); snd_mixer_selem_set_capture_switch(elem, chn_right, !sw); } } } } mixer_toggle_capture = 0; } static void mixer_update_cbar (int elem_index) { char string[128], string1[64], *suffix; int dc; snd_mixer_elem_t *elem; long vleft, vright; int type; snd_mixer_selem_id_t *sid; snd_mixer_selem_channel_id_t chn_left, chn_right; int x, y, i; int swl, swr; /* set new scontrol indices and read info */ if (mixer_sid == NULL) return; sid = (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * mixer_grpidx[elem_index]); elem = snd_mixer_find_selem(mixer_handle, sid); if (elem == NULL) CHECK_ABORT (ERR_FCN, __FUNCTION__ ": snd_mixer_find_selem()", -EINVAL); type = mixer_type[elem_index] & MIXER_ELEM_TYPE_MASK; chn_left = mixer_elem_chn[type][MIXER_CHN_LEFT]; chn_right = mixer_elem_chn[type][MIXER_CHN_RIGHT]; if (chn_right != SND_MIXER_SCHN_UNKNOWN) { if (type != MIXER_ELEM_CAPTURE) { if (!snd_mixer_selem_has_playback_channel(elem, chn_right)) chn_right = SND_MIXER_SCHN_UNKNOWN; } else { if (!snd_mixer_selem_has_capture_channel(elem, chn_right)) chn_right = SND_MIXER_SCHN_UNKNOWN; } } vleft = vright = 0; if (type != MIXER_ELEM_CAPTURE && snd_mixer_selem_has_playback_volume(elem)) { long vmin, vmax; snd_mixer_selem_get_playback_volume_range(elem, &vmin, &vmax); snd_mixer_selem_get_playback_volume(elem, chn_left, &vleft); vleft = mixer_conv(vleft, vmin, vmax, 0, 100); if (chn_right != SND_MIXER_SCHN_UNKNOWN) { snd_mixer_selem_get_playback_volume(elem, chn_right, &vright); vright = mixer_conv(vright, vmin, vmax, 0, 100); } else { vright = vleft; } } if (type == MIXER_ELEM_CAPTURE && snd_mixer_selem_has_capture_volume(elem)) { long vmin, vmax; snd_mixer_selem_get_capture_volume_range(elem, &vmin, &vmax); snd_mixer_selem_get_capture_volume(elem, chn_left, &vleft); vleft = mixer_conv(vleft, vmin, vmax, 0, 100); if (chn_right != SND_MIXER_SCHN_UNKNOWN) { snd_mixer_selem_get_capture_volume(elem, chn_right, &vright); vright = mixer_conv(vright, vmin, vmax, 0, 100); } else { vright = vleft; } } /* update the focused full bar name */ if (elem_index == mixer_focus_elem) { mixer_dc (DC_PROMPT); mvaddstr (3, 2, "Item: "); mixer_dc (DC_TEXT); string1[8] = 0; for (i = 0; i < 63; i++) string1[i] = ' '; string1[63] = '\0'; strcpy(string, snd_mixer_selem_id_get_name(sid)); if (mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SUFFIX) strcat(string, " Capture"); if (snd_mixer_selem_id_get_index(sid) > 0) sprintf(string + strlen(string), " %i", snd_mixer_selem_id_get_index(sid)); string[63] = '\0'; strncpy(string1, string, strlen(string)); addstr(string1); } /* get channel bar position */ if (!mixer_cbar_get_pos (elem_index, &x, &y)) return; /* channel bar name */ mixer_dc (elem_index == mixer_focus_elem ? DC_CBAR_FOCUS_LABEL : DC_CBAR_LABEL); if (mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SUFFIX) suffix = " Capture"; else suffix = ""; if (snd_mixer_selem_id_get_index(sid) > 0) sprintf(string1, "%s%s %d", snd_mixer_selem_id_get_name(sid), suffix, snd_mixer_selem_id_get_index(sid)); else sprintf(string1, "%s%s", snd_mixer_selem_id_get_name(sid), suffix); string1[8] = 0; for (i = 0; i < 8; i++) { string[i] = ' '; } sprintf (string + (8 - strlen (string1)) / 2, "%s ", string1); string[8] = 0; mvaddstr (y, x, string); y--; /* current channel values */ mixer_dc (DC_BACK); mvaddstr (y, x, " "); mixer_dc (DC_TEXT); sprintf (string, "%ld", vleft); mvaddstr (y, x + 3 - strlen (string), string); mixer_dc (DC_CBAR_FRAME); mvaddch (y, x + 3, '<'); mvaddch (y, x + 4, '>'); mixer_dc (DC_TEXT); sprintf (string, "%ld", vright); mvaddstr (y, x + 5, string); y--; /* left/right bar */ mixer_dc (DC_CBAR_FRAME); mvaddstr (y, x, " "); mvaddch (y, x + 2, ACS_LLCORNER); mvaddch (y, x + 3, ACS_HLINE); mvaddch (y, x + 4, ACS_HLINE); mvaddch (y, x + 5, ACS_LRCORNER); y--; for (i = 0; i < mixer_cbar_height; i++) { mvaddstr (y - i, x, " "); mvaddch (y - i, x + 2, ACS_VLINE); mvaddch (y - i, x + 5, ACS_VLINE); } string[2] = 0; for (i = 0; i < mixer_cbar_height; i++) { if (i + 1 >= 0.8 * mixer_cbar_height) dc = DC_ANY_3; else if (i + 1 >= 0.4 * mixer_cbar_height) dc = DC_ANY_2; else dc = DC_ANY_1; mvaddch (y, x + 3, mixer_dc (vleft > i * 100 / mixer_cbar_height ? dc : DC_CBAR_EMPTY)); mvaddch (y, x + 4, mixer_dc (vright > i * 100 / mixer_cbar_height ? dc : DC_CBAR_EMPTY)); y--; } /* muted? */ mixer_dc (DC_BACK); mvaddstr (y, x, " "); if ((mixer_type[elem_index] & MIXER_ELEM_MUTE_SWITCH) && snd_mixer_selem_has_playback_switch(elem)) { mixer_dc (DC_CBAR_FRAME); mvaddch (y, x + 2, ACS_ULCORNER); snd_mixer_selem_get_playback_switch(elem, chn_left, &swl); dc = swl ? DC_CBAR_NOMUTE : DC_CBAR_MUTE; mvaddch (y, x + 3, mixer_dc (dc)); if (chn_right != SND_MIXER_SCHN_UNKNOWN) { snd_mixer_selem_get_playback_switch(elem, chn_right, &swr); dc = swr ? DC_CBAR_NOMUTE : DC_CBAR_MUTE; } mvaddch (y, x + 4, mixer_dc (dc)); mixer_dc (DC_CBAR_FRAME); mvaddch (y, x + 5, ACS_URCORNER); } else { mixer_dc (DC_CBAR_FRAME); mvaddch (y, x + 2, ACS_ULCORNER); mvaddch (y, x + 3, ACS_HLINE); mvaddch (y, x + 4, ACS_HLINE); mvaddch (y, x + 5, ACS_URCORNER); } y--; /* capture input? */ if ((mixer_type[elem_index] & MIXER_ELEM_CAPTURE_SWITCH) && snd_mixer_selem_has_capture_switch(elem)) { int has_r_sw = chn_right != SND_MIXER_SCHN_UNKNOWN && snd_mixer_selem_has_capture_channel(elem, chn_right); snd_mixer_selem_get_capture_switch(elem, chn_left, &swl); if (has_r_sw) snd_mixer_selem_get_capture_switch(elem, chn_right, &swr); if (swl || (has_r_sw && swr)) { mixer_dc (DC_CBAR_CAPTURE); mvaddstr (y, x + 1, "CAPTUR"); if (swl) { mvaddstr (y + 1, x + 1, "L"); if (! has_r_sw) mvaddstr (y + 1, x + 6, "R"); } if (has_r_sw && swr) mvaddstr (y + 1, x + 6, "R"); } else { for (i = 0; i < 6; i++) mvaddch (y, x + 1 + i, mixer_dc (DC_CBAR_NOCAPTURE)); } } else { mixer_dc (DC_BACK); mvaddstr (y, x, " "); } y--; #ifdef ALSAMIXER_GUI if (elem_index == mixer_focus_elem || gui_do_update_all) { Fl_AMGroup* g = mainWindow->group[elem_index]; if (g) { g->volumeL->value(vleft); g->volumeR->value(vright); if (type != MIXER_ELEM_CAPTURE && snd_mixer_selem_has_playback_switch(elem)) { snd_mixer_selem_get_playback_switch(elem, chn_left, &swl); if (chn_right != SND_MIXER_SCHN_UNKNOWN) { snd_mixer_selem_get_playback_switch(elem, chn_right, &swr); }else{ swr = swl; } g->muteL->value(!swl); g->muteR->value(!swr); } if (type != MIXER_ELEM_CAPTURE && snd_mixer_selem_has_capture_switch(elem)) { snd_mixer_selem_get_capture_switch(elem, chn_left, &swl); if (chn_right != SND_MIXER_SCHN_UNKNOWN) snd_mixer_selem_get_capture_switch(elem, chn_right, &swr); if (swl || (chn_right != SND_MIXER_SCHN_UNKNOWN && swr)) { if (swl) { g->captureL->value(1); if (chn_right == SND_MIXER_SCHN_UNKNOWN) g->captureR->value(1); } if (chn_right != SND_MIXER_SCHN_UNKNOWN && swr) g->captureR->value(1); } else { g->captureL->value(0); g->captureR->value(0); } } else { g->captureL->hide(); g->captureLbox->show(); g->captureR->hide(); g->captureRbox->show(); } if (elem_index == mixer_focus_elem) { if (gui_prev_focus_elem!=mixer_focus_elem) { if (gui_prev_focus_elem!=-1) { if (mainWindow->group[gui_prev_focus_elem]) { mainWindow->group[gui_prev_focus_elem]->name->value(0); mainWindow->group[gui_prev_focus_elem]->name->redraw(); } } g->name->value(1); g->name->redraw(); gui_prev_focus_elem = elem_index; } } } } #endif /* #ifdef ALSAMIXER_GUI */ } static void mixer_update_cbars (void) { static int o_x = 0; static int o_y = 0; int i, x, y; if (!mixer_cbar_get_pos (mixer_focus_elem, &x, &y)) { if (mixer_focus_elem < mixer_first_vis_elem) mixer_first_vis_elem = mixer_focus_elem; else if (mixer_focus_elem >= mixer_first_vis_elem + mixer_n_vis_elems) mixer_first_vis_elem = mixer_focus_elem - mixer_n_vis_elems + 1; mixer_cbar_get_pos (mixer_focus_elem, &x, &y); } if (mixer_first_vis_elem + mixer_n_vis_elems >= mixer_n_elems) { mixer_first_vis_elem = mixer_n_elems - mixer_n_vis_elems; if (mixer_first_vis_elem < 0) mixer_first_vis_elem = 0; mixer_cbar_get_pos (mixer_focus_elem, &x, &y); } mixer_write_cbar(mixer_focus_elem); for (i = 0; i < mixer_n_vis_elems; i++) { if (i + mixer_first_vis_elem >= mixer_n_elems) continue; mixer_update_cbar (i + mixer_first_vis_elem); } /* draw focused cbar */ if (mixer_have_old_focus) { mixer_dc (DC_BACK); mvaddstr (o_y, o_x, " "); mvaddstr (o_y, o_x + 9, " "); } o_x = x - 1; o_y = y; mixer_dc (DC_FOCUS); mvaddstr (o_y, o_x, "<"); mvaddstr (o_y, o_x + 9, ">"); mixer_have_old_focus = 1; } static void mixer_draw_frame (void) { char string[128]; int i; int max_len; mixer_dc (DC_FRAME); /* card name */ mixer_dc (DC_PROMPT); mvaddstr (1, 2, "Card: "); mixer_dc (DC_TEXT); sprintf (string, "%s", mixer_card_name); max_len = mixer_max_x - 2 - 6 - 2; if (strlen (string) > max_len) string[max_len] = 0; addstr (string); /* device name */ mixer_dc (DC_PROMPT); mvaddstr (2, 2, "Chip: "); mixer_dc (DC_TEXT); sprintf (string, "%s", mixer_device_name); max_len = mixer_max_x - 2 - 6 - 2; if (strlen (string) > max_len) string[max_len] = 0; addstr (string); /* lines */ mixer_dc (DC_PROMPT); for (i = 1; i < mixer_max_y - 1; i++) { mvaddch (i, 0, ACS_VLINE); mvaddch (i, mixer_max_x - 1, ACS_VLINE); } for (i = 1; i < mixer_max_x - 1; i++) { mvaddch (0, i, ACS_HLINE); mvaddch (mixer_max_y - 1, i, ACS_HLINE); } /* corners */ mixer_dc (DC_PROMPT); mvaddch (0, 0, ACS_ULCORNER); mvaddch (0, mixer_max_x - 1, ACS_URCORNER); mvaddch (mixer_max_y - 1, 0, ACS_LLCORNER); if (!mixer_no_lrcorner) mvaddch (mixer_max_y - 1, mixer_max_x - 1, ACS_LRCORNER); else { mvaddch (mixer_max_y - 2, mixer_max_x - 1, ACS_LRCORNER); mvaddch (mixer_max_y - 2, mixer_max_x - 2, ACS_ULCORNER); mvaddch (mixer_max_y - 1, mixer_max_x - 2, ACS_LRCORNER); } /* program title */ sprintf (string, "%s %s", PRGNAME_UPPER, VERSION); max_len = strlen (string); if (mixer_max_x >= max_len + 4) { mixer_dc (DC_PROMPT); mvaddch (0, mixer_max_x / 2 - max_len / 2 - 1, '['); mvaddch (0, mixer_max_x / 2 - max_len / 2 + max_len, ']'); } if (mixer_max_x >= max_len + 2) { mixer_dc (DC_TEXT); mvaddstr (0, mixer_max_x / 2 - max_len / 2, string); } } static char* mixer_offset_text (char **t, int col, int *length) { char *p = *t; char *r; while (*p && *p != '\n' && col--) p++; if (*p == '\n' || !*p) { if (*p == '\n') p++; *length = 0; *t = p; return p; } r = p; while (*r && *r != '\n' && (*length)--) r++; *length = r - p; while (*r && *r != '\n') r++; if (*r == '\n') r++; *t = r; return p; } #ifndef ALSAMIXER_GUI static void mixer_show_text (char *title, char *text, int *xoffs, int *yoffs) { int tlines = 0, tcols = 0; float hscroll, vscroll; float hoffs, voffs; char *p, *text_offs = text; int x1, x2, y1, y2; int i, n, l, r, block, stipple; /* coords */ x1 = 2; x2 = mixer_max_x - 3; y1 = 4; y2 = mixer_max_y - 2; if ((y2 - y1) < 3 || (x2 - x1) < 3) return; /* text dimensions */ l = 0; for (p = text; *p; p++) if (*p == '\n') { tlines++; tcols = MAX (l, tcols); l = 0; } else l++; tcols = MAX (l, tcols); if (p > text && *(p - 1) != '\n') tlines++; /* scroll areas / offsets */ l = x2 - x1 - 2; if (l > tcols) { x1 += (l - tcols) / 2; x2 = x1 + tcols + 1; } if (mixer_hscroll_delta) { *xoffs += mixer_hscroll_delta; mixer_hscroll_delta = 0; if (*xoffs < 0) { *xoffs = 0; beep (); } else if (*xoffs > tcols - l - 1) { *xoffs = MAX (0, tcols - l - 1); beep (); } } if (tcols - l - 1 <= 0) { hscroll = 1; hoffs = 0; } else { hscroll = ((float) l) / tcols; hoffs = ((float) *xoffs) / (tcols - l - 1); } l = y2 - y1 - 2; if (l > tlines) { y1 += (l - tlines) / 2; y2 = y1 + tlines + 1; } if (mixer_vscroll_delta) { *yoffs += mixer_vscroll_delta; mixer_vscroll_delta = 0; if (*yoffs < 0) { *yoffs = 0; beep (); } else if (*yoffs > tlines - l - 1) { *yoffs = MAX (0, tlines - l - 1); beep (); } } if (tlines - l - 1 <= 0) { voffs = 0; vscroll = 1; } else { vscroll = ((float) l) / tlines; voffs = ((float) *yoffs) / (tlines - l - 1); } /* colors */ mixer_dc (DC_ANY_4); /* corners */ mvaddch (y2, x2, ACS_LRCORNER); mvaddch (y2, x1, ACS_LLCORNER); mvaddch (y1, x1, ACS_ULCORNER); mvaddch (y1, x2, ACS_URCORNER); /* left + upper border */ for (i = y1 + 1; i < y2; i++) mvaddch (i, x1, ACS_VLINE); for (i = x1 + 1; i < x2; i++) mvaddch (y1, i, ACS_HLINE); if (title) { l = strlen (title); if (l <= x2 - x1 - 3) { mvaddch (y1, x1 + 1 + (x2 - x1 - l) / 2 - 1, '['); mvaddch (y1, x1 + 1 + (x2 - x1 - l) / 2 + l, ']'); } if (l <= x2 - x1 - 1) { mixer_dc (DC_ANY_3); mvaddstr (y1, x1 + 1 + (x2 - x1 - l) / 2, title); } mixer_dc (DC_ANY_4); } stipple = ACS_CKBOARD; block = ACS_BLOCK; if (block == '#' && ACS_BOARD == '#') { block = stipple; stipple = ACS_BLOCK; } /* lower scroll border */ l = x2 - x1 - 1; n = hscroll * l; r = (hoffs + 1.0 / (2 * (l - n - 1))) * (l - n - 1); for (i = 0; i < l; i++) mvaddch (y2, i + x1 + 1, hscroll >= 1 ? ACS_HLINE : i >= r && i <= r + n ? block : stipple); /* right scroll border */ l = y2 - y1 - 1; n = vscroll * l; r = (voffs + 1.0 / (2 * (l - n - 1))) * (l - n - 1); for (i = 0; i < l; i++) mvaddch (i + y1 + 1, x2, vscroll >= 1 ? ACS_VLINE : i >= r && i <= r + n ? block : stipple); /* show text */ x1++; y1++; for (i = 0; i < *yoffs; i++) { l = 0; mixer_offset_text (&text_offs, 0, &l); } for (i = y1; i < y2; i++) { l = x2 - x1; p = mixer_offset_text (&text_offs, *xoffs, &l); n = x1; while (l--) mvaddch (i, n++, *p++); while (n < x2) mvaddch (i, n++, ' '); } } #endif /* #ifndef ALSAMIXER_GUI */ #ifdef ALSAMIXER_GUI static void mixer_show_text (char *title, char *text, int *xoffs, int *yoffs) { gui_show_text(text); } #endif /* #ifdef ALSAMIXER_GUI */ struct vbuffer { char *buffer; int size; int len; }; static void vbuffer_kill (struct vbuffer *vbuf) { if (vbuf->size) free (vbuf->buffer); vbuf->buffer = NULL; vbuf->size = 0; vbuf->len = 0; } #define vbuffer_append_string(vb,str) vbuffer_append (vb, str, strlen (str)) static void vbuffer_append (struct vbuffer *vbuf, char *text, int len) { if (vbuf->size - vbuf->len <= len) { vbuf->size += len + 1; #ifdef ALSAMIXER_GUI vbuf->buffer = (char*) realloc (vbuf->buffer, vbuf->size); #else vbuf->buffer = realloc (vbuf->buffer, vbuf->size); #endif } memcpy (vbuf->buffer + vbuf->len, text, len); vbuf->len += len; vbuf->buffer[vbuf->len] = 0; } static int vbuffer_append_file (struct vbuffer *vbuf, char *name) { int fd; fd = open (name, O_RDONLY); if (fd >= 0) { char buffer[1025]; int l; do { l = read (fd, buffer, 1024); vbuffer_append (vbuf, buffer, MAX (0, l)); } while (l > 0 || (l < 0 && (errno == EAGAIN || errno == EINTR))); close (fd); return 0; } else return 1; } static void mixer_show_procinfo (void) { struct vbuffer vbuf = { NULL, 0, 0 }; vbuffer_append_string (&vbuf, "\n"); vbuffer_append_string (&vbuf, "/proc/asound/version:\n"); vbuffer_append_string (&vbuf, "====================\n"); if (vbuffer_append_file (&vbuf, "/proc/asound/version")) { vbuffer_kill (&vbuf); mixer_procinfo_xoffs = mixer_procinfo_yoffs = 0; mixer_show_text ("/proc", " No /proc information available. ", &mixer_procinfo_xoffs, &mixer_procinfo_yoffs); return; } else vbuffer_append_file (&vbuf, "/proc/asound/meminfo"); vbuffer_append_string (&vbuf, "\n"); vbuffer_append_string (&vbuf, "/proc/asound/cards:\n"); vbuffer_append_string (&vbuf, "===================\n"); if (vbuffer_append_file (&vbuf, "/proc/asound/cards")) vbuffer_append_string (&vbuf, "No information available.\n"); vbuffer_append_string (&vbuf, "\n"); vbuffer_append_string (&vbuf, "/proc/asound/devices:\n"); vbuffer_append_string (&vbuf, "=====================\n"); if (vbuffer_append_file (&vbuf, "/proc/asound/devices")) vbuffer_append_string (&vbuf, "No information available.\n"); vbuffer_append_string (&vbuf, "\n"); vbuffer_append_string (&vbuf, "/proc/asound/oss-devices:\n"); vbuffer_append_string (&vbuf, "=========================\n"); if (vbuffer_append_file (&vbuf, "/proc/asound/oss-devices")) vbuffer_append_string (&vbuf, "No information available.\n"); vbuffer_append_string (&vbuf, "\n"); vbuffer_append_string (&vbuf, "/proc/asound/timers:\n"); vbuffer_append_string (&vbuf, "====================\n"); if (vbuffer_append_file (&vbuf, "/proc/asound/timers")) vbuffer_append_string (&vbuf, "No information available.\n"); vbuffer_append_string (&vbuf, "\n"); vbuffer_append_string (&vbuf, "/proc/asound/pcm:\n"); vbuffer_append_string (&vbuf, "=================\n"); if (vbuffer_append_file (&vbuf, "/proc/asound/pcm")) vbuffer_append_string (&vbuf, "No information available.\n"); mixer_show_text ("/proc", vbuf.buffer, &mixer_procinfo_xoffs, &mixer_procinfo_yoffs); vbuffer_kill (&vbuf); } static int mixer_event (snd_mixer_t *mixer, unsigned int mask, snd_mixer_elem_t *elem) { mixer_changed_state = 1; return 0; } static void mixer_init (void) { snd_ctl_card_info_t *hw_info; snd_ctl_t *ctl_handle; int err; snd_ctl_card_info_alloca(&hw_info); if ((err = snd_ctl_open (&ctl_handle, card_id, 0)) < 0) mixer_abort (ERR_OPEN, "snd_ctl_open", err); if ((err = snd_ctl_card_info (ctl_handle, hw_info)) < 0) mixer_abort (ERR_FCN, "snd_ctl_card_info", err); snd_ctl_close (ctl_handle); /* open mixer device */ if ((err = snd_mixer_open (&mixer_handle, 0)) < 0) mixer_abort (ERR_FCN, "snd_mixer_open", err); if ((err = snd_mixer_attach (mixer_handle, card_id)) < 0) mixer_abort (ERR_FCN, "snd_mixer_attach", err); if ((err = snd_mixer_selem_register (mixer_handle, NULL, NULL)) < 0) mixer_abort (ERR_FCN, "snd_mixer_selem_register", err); snd_mixer_set_callback (mixer_handle, mixer_event); if ((err = snd_mixer_load (mixer_handle)) < 0) mixer_abort (ERR_FCN, "snd_mixer_load", err); /* setup global variables */ strcpy(mixer_card_name, snd_ctl_card_info_get_name(hw_info)); strcpy(mixer_device_name, snd_ctl_card_info_get_mixername(hw_info)); } static void mixer_reinit (void) { snd_mixer_elem_t *elem; int idx, elem_index, i, j, selem_count; snd_mixer_selem_id_t *sid; snd_mixer_selem_id_t *focus_gid; int focus_type = -1; snd_mixer_selem_id_alloca(&focus_gid); if (!mixer_changed_state) return; if (mixer_sid) { snd_mixer_selem_id_copy(focus_gid, (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * mixer_grpidx[mixer_focus_elem])); focus_type = mixer_type[mixer_focus_elem] & MIXER_ELEM_TYPE_MASK; } __again: mixer_changed_state = 0; if (mixer_sid != NULL) free(mixer_sid); selem_count = snd_mixer_get_count(mixer_handle); mixer_sid = malloc(snd_mixer_selem_id_sizeof() * selem_count); if (mixer_sid == NULL) mixer_abort (ERR_FCN, "malloc", 0); mixer_n_selems = 0; for (elem = snd_mixer_first_elem(mixer_handle); elem; elem = snd_mixer_elem_next(elem)) { sid = (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * mixer_n_selems); if (mixer_changed_state) goto __again; if (!snd_mixer_selem_is_active(elem)) continue; snd_mixer_selem_get_id(elem, sid); mixer_n_selems++; } mixer_n_elems = 0; for (idx = 0; idx < mixer_n_selems; idx++) { int nelems_added = 0; sid = (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * idx); if (mixer_changed_state) goto __again; elem = snd_mixer_find_selem(mixer_handle, sid); if (elem == NULL) CHECK_ABORT (ERR_FCN, __FUNCTION__ ": snd_mixer_find_selem()", -EINVAL); for (i = 0; i < MIXER_ELEM_CAPTURE; i++) { int ok; for (j = ok = 0; j < 2; j++) { if (mixer_changed_state) goto __again; if (snd_mixer_selem_has_playback_channel(elem, mixer_elem_chn[i][j])) ok++; } if (ok) { nelems_added++; mixer_n_elems++; } } if (snd_mixer_selem_has_capture_volume(elem) || (nelems_added == 0 && snd_mixer_selem_has_capture_switch(elem))) mixer_n_elems++; } if (mixer_type) free(mixer_type); mixer_type = (int *)malloc(sizeof(int) * mixer_n_elems); if (mixer_type == NULL) mixer_abort(ERR_FCN, "malloc", 0); if (mixer_grpidx) free(mixer_grpidx); mixer_grpidx = (int *)malloc(sizeof(int) * mixer_n_elems); if (mixer_grpidx == NULL) mixer_abort(ERR_FCN, "malloc", 0); elem_index = 0; for (idx = 0; idx < mixer_n_selems; idx++) { int nelems_added = 0; sid = (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * idx); if (mixer_changed_state) goto __again; elem = snd_mixer_find_selem(mixer_handle, sid); if (elem == NULL) CHECK_ABORT (ERR_FCN, __FUNCTION__ ": snd_mixer_find_selem()", -EINVAL); for (i = 0; i < MIXER_ELEM_CAPTURE; i++) { int ok; for (j = ok = 0; j < 2; j++) { if (mixer_changed_state) goto __again; if (snd_mixer_selem_has_playback_channel(elem, mixer_elem_chn[i][j])) ok++; } if (ok) { sid = (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * idx); mixer_grpidx[elem_index] = idx; mixer_type[elem_index] = i; if (i == 0 && snd_mixer_selem_has_playback_switch(elem)) mixer_type[elem_index] |= MIXER_ELEM_MUTE_SWITCH; if (i == 0 && snd_mixer_selem_has_capture_switch(elem)) mixer_type[elem_index] |= MIXER_ELEM_CAPTURE_SWITCH; elem_index++; nelems_added++; if (elem_index >= mixer_n_elems) break; } } if (snd_mixer_selem_has_capture_volume(elem) || (nelems_added == 0 && snd_mixer_selem_has_capture_switch(elem))) { mixer_grpidx[elem_index] = idx; mixer_type[elem_index] = MIXER_ELEM_CAPTURE; if (nelems_added == 0 && snd_mixer_selem_has_capture_switch(elem)) mixer_type[elem_index] |= MIXER_ELEM_CAPTURE_SWITCH; if (nelems_added) mixer_type[elem_index] |= MIXER_ELEM_CAPTURE_SUFFIX; elem_index++; if (elem_index >= mixer_n_elems) break; } } mixer_focus_elem = 0; if (focus_type >= 0) { for (elem_index = 0; elem_index < mixer_n_elems; elem_index++) { sid = (snd_mixer_selem_id_t *)(((char *)mixer_sid) + snd_mixer_selem_id_sizeof() * mixer_grpidx[elem_index]); if (!strcmp(snd_mixer_selem_id_get_name(focus_gid), snd_mixer_selem_id_get_name(sid)) && snd_mixer_selem_id_get_index(focus_gid) == snd_mixer_selem_id_get_index(sid) && (mixer_type[elem_index] & MIXER_ELEM_TYPE_MASK) == focus_type) { mixer_focus_elem = elem_index; break; } } } if (mixer_changed_state) goto __again; #ifdef ALSAMIXER_GUI gui_add_groups(); #endif } #ifndef ALSAMIXER_GUI static void mixer_init_window (void) { /* initialize ncurses */ mixer_window = initscr (); mixer_no_lrcorner = tigetflag ("xenl") != 1 && tigetflag ("am") != 1; if (mixer_do_color) mixer_do_color = has_colors (); mixer_init_draw_contexts (); /* react on key presses */ cbreak (); noecho (); leaveok (mixer_window, TRUE); keypad (mixer_window, TRUE); GETCH_BLOCK (1); /* init mixer screen */ getmaxyx (mixer_window, mixer_max_y, mixer_max_x); if (mixer_minimize) { mixer_max_x = MIXER_MIN_X; mixer_max_y = MIXER_MIN_Y; } mixer_ofs_x = 2 /* extra begin padding: */ + 1; /* required allocations */ mixer_n_vis_elems = (mixer_max_x - mixer_ofs_x * 2 + 1) / 9; mixer_n_vis_elems = CLAMP (mixer_n_vis_elems, 1, mixer_n_elems); mixer_extra_space = mixer_max_x - mixer_ofs_x * 2 + 1 - mixer_n_vis_elems * 9; mixer_extra_space = MAX (0, mixer_extra_space / (mixer_n_vis_elems + 1)); if (MIXER_TEXT_Y + 10 < mixer_max_y) mixer_cbar_height = 10 + MAX (0, mixer_max_y - MIXER_TEXT_Y - 10 ) / 2; else mixer_cbar_height = MAX (1, mixer_max_y - MIXER_TEXT_Y); mixer_clear (TRUE); } static void mixer_resize (void) { struct winsize winsz = { 0, }; mixer_needs_resize = 0; if (ioctl (fileno (stdout), TIOCGWINSZ, &winsz) >= 0 && winsz.ws_row && winsz.ws_col) { keypad (mixer_window, FALSE); leaveok (mixer_window, FALSE); endwin (); mixer_max_x = MAX (2, winsz.ws_col); mixer_max_y = MAX (2, winsz.ws_row); /* humpf, i don't get it, if only the number of rows change, * ncurses will segfault shortly after (could trigger that with mc as well). */ resizeterm (mixer_max_y + 1, mixer_max_x + 1); resizeterm (mixer_max_y, mixer_max_x); mixer_init_window (); if (mixer_max_x < MIXER_MIN_X || mixer_max_y < MIXER_MIN_Y) beep (); // mixer_abort (ERR_WINSIZE, ""); mixer_have_old_focus = 0; } } #endif /* #ifndef ALSAMIXER_GUI */ #ifdef ALSAMIXER_GUI #define mixer_resize() #endif /* #ifdef ALSAMIXER_GUI */ static void mixer_set_delta(int delta) { int grp; for (grp = 0; grp < 2; grp++) mixer_volume_delta[grp] = delta; } static void mixer_add_delta(int delta) { int grp; for (grp = 0; grp < 2; grp++) mixer_volume_delta[grp] += delta; } static int mixer_iteration (void) { int count, err; struct pollfd *fds; int finished = 0; int key = 0; int old_view; unsigned short revents; /* setup for select on stdin and the mixer fd */ if ((count = snd_mixer_poll_descriptors_count(mixer_handle)) < 0) mixer_abort (ERR_FCN, "snd_mixer_poll_descriptors_count", count); #ifndef ALSAMIXER_GUI fds = calloc(count + 1, sizeof(struct pollfd)); #else fds = (struct pollfd *) calloc(count + 1, sizeof(struct pollfd)); #endif if (fds == NULL) mixer_abort (ERR_FCN, "malloc", 0); fds->fd = fileno(stdin); fds->events = POLLIN; if ((err = snd_mixer_poll_descriptors(mixer_handle, fds + 1, count)) < 0) mixer_abort (ERR_FCN, "snd_mixer_poll_descriptors", err); if (err != count) mixer_abort (ERR_FCN, "snd_mixer_poll_descriptors (err != count)", 0); #ifndef ALSAMIXER_GUI finished = poll(fds, count + 1, -1); /* don't abort on handled signals */ if (finished < 0 && errno == EINTR) finished = 0; if (mixer_needs_resize) mixer_resize (); if (finished > 0) { if (fds->revents & POLLIN) { key = getch (); finished--; } } else { key = 0; } if (finished > 0) { if (snd_mixer_poll_descriptors_revents(mixer_handle, fds + 1, count, &revents) >= 0) { if (revents & POLLIN) snd_mixer_handle_events(mixer_handle); } } finished = 0; free(fds); old_view = mixer_view; #else { snd_mixer_handle_events(mixer_handle); gui_update_all(); } if (gui_do_select) return 0; key = Fl::event_key(); switch (key) { case FL_Enter: key=13; break; case FL_Escape: key=27; break; } old_view = VIEW_CHANNELS; if (Fl_Window::current()==procWindow) { old_view = VIEW_PROCINFO; } if (Fl_Window::current()==helpWindow) { old_view = VIEW_HELP; } #endif /* #ifndef ALSAMIXER_GUI */ #ifndef ALSAMIXER_GUI /* feature Escape prefixing for some keys */ if (key == 27) { GETCH_BLOCK (0); key = getch (); GETCH_BLOCK (1); switch (key) { case 9: /* Tab */ key = KEY_BTAB; break; default: key = 27; break; } } #endif /* #ifndef ALSAMIXER_GUI */ /* general keys */ switch (key) { case 0: /* ignore */ break; case 27: /* Escape */ finished = 1; key = 0; #ifdef ALSAMIXER_GUI if (helpWindow) delete helpWindow; if (procWindow) delete procWindow; if (mainWindow) delete mainWindow; mainWindow = 0; procWindow = 0; helpWindow = 0; return 0; #endif /* #ifdef ALSAMIXER_GUI */ break; case 13: /* Return */ case 10: /* NewLine */ if (mixer_view == VIEW_CHANNELS) mixer_clear (FALSE); mixer_view = VIEW_CHANNELS; key = 0; break; case 'h': case 'H': case KEY_F (1): mixer_view = VIEW_HELP; key = 0; break; case '/': case KEY_F (2): mixer_view = VIEW_PROCINFO; key = 0; break; case '\014': case 'L': case 'l': mixer_clear (TRUE); break; } if (key && (mixer_view == VIEW_HELP || mixer_view == VIEW_PROCINFO)) switch (key) { case 9: /* Tab */ mixer_hscroll_delta += 8; break; case KEY_BTAB: mixer_hscroll_delta -= 8; break; case KEY_A1: mixer_hscroll_delta -= 1; mixer_vscroll_delta -= 1; break; case KEY_A3: mixer_hscroll_delta += 1; mixer_vscroll_delta -= 1; break; case KEY_C1: mixer_hscroll_delta -= 1; mixer_vscroll_delta += 1; break; case KEY_C3: mixer_hscroll_delta += 1; mixer_vscroll_delta += 1; break; case KEY_RIGHT: case 'n': mixer_hscroll_delta += 1; break; case KEY_LEFT: case 'p': mixer_hscroll_delta -= 1; break; case KEY_UP: case 'w': case 'W': mixer_vscroll_delta -= 1; break; case KEY_DOWN: case 'x': case 'X': mixer_vscroll_delta += 1; break; case KEY_PPAGE: case 'B': case 'b': mixer_vscroll_delta -= (mixer_max_y - 5) / 2; break; case KEY_NPAGE: case ' ': mixer_vscroll_delta += (mixer_max_y - 5) / 2; break; case KEY_BEG: case KEY_HOME: mixer_hscroll_delta -= 0xffffff; break; case KEY_LL: case KEY_END: mixer_hscroll_delta += 0xffffff; break; } if (key && mixer_view == VIEW_CHANNELS) switch (key) { case KEY_RIGHT: case 'n': mixer_focus_elem += 1; break; case KEY_LEFT: case 'p': mixer_focus_elem -= 1; break; case KEY_PPAGE: mixer_set_delta(5); break; case KEY_NPAGE: mixer_set_delta(-5); break; #if 0 case KEY_BEG: case KEY_HOME: mixer_set_delta(100); break; #endif case KEY_LL: case KEY_END: mixer_set_delta(-100); break; case '+': mixer_set_delta(1); break; case '-': mixer_set_delta(-1); break; case 'w': case KEY_UP: mixer_set_delta(1); case 'W': mixer_add_delta(1); break; case 'x': case KEY_DOWN: mixer_set_delta(-1); case 'X': mixer_add_delta(-1); break; case 'q': mixer_volume_delta[MIXER_CHN_LEFT] = 1; case 'Q': mixer_volume_delta[MIXER_CHN_LEFT] += 1; break; case 'y': case 'z': mixer_volume_delta[MIXER_CHN_LEFT] = -1; case 'Y': case 'Z': mixer_volume_delta[MIXER_CHN_LEFT] += -1; break; case 'e': mixer_volume_delta[MIXER_CHN_RIGHT] = 1; case 'E': mixer_volume_delta[MIXER_CHN_RIGHT] += 1; break; case 'c': mixer_volume_delta[MIXER_CHN_RIGHT] = -1; case 'C': mixer_volume_delta[MIXER_CHN_RIGHT] += -1; break; case 'm': case 'M': mixer_toggle_mute |= MIXER_MASK_STEREO; break; case 'b': case 'B': case '=': mixer_balance_volumes = 1; break; case '<': case ',': mixer_toggle_mute |= MIXER_MASK_LEFT; break; case '>': case '.': mixer_toggle_mute |= MIXER_MASK_RIGHT; break; case ' ': mixer_toggle_capture |= MIXER_MASK_STEREO; break; case KEY_IC: case ';': mixer_toggle_capture |= MIXER_MASK_LEFT; break; case '\'': case KEY_DC: mixer_toggle_capture |= MIXER_MASK_RIGHT; break; } if (old_view != mixer_view) mixer_clear (FALSE); mixer_focus_elem = CLAMP (mixer_focus_elem, 0, mixer_n_elems - 1); return finished; } static void mixer_winch (void) { #ifndef ALSAMIXER_GUI signal (SIGWINCH, (void*) mixer_winch); #else signal (SIGWINCH, (sighandler_t) mixer_winch); #endif mixer_needs_resize++; } static void mixer_signal_handler (int signal) { if (signal != SIGSEGV) mixer_abort (ERR_SIGNAL, sys_siglist[signal], 0); else { fprintf (stderr, "\nSegmentation fault.\n"); _exit (11); } } int main (int argc, char **argv) { int opt; /* parse args */ do { opt = getopt (argc, argv, "c:D:shg"); switch (opt) { case '?': case 'h': fprintf (stderr, "%s %s\n", PRGNAME_UPPER, VERSION); fprintf (stderr, "Usage: %s [-h] [-c ] [-D ] [-g] [-s]\n", PRGNAME); mixer_abort (ERR_NONE, "", 0); case 'c': { int i = snd_card_get_index(optarg); if (i < 0 || i > 31) { fprintf (stderr, "wrong -c argument '%s'\n", optarg); mixer_abort (ERR_NONE, "", 0); } sprintf(card_id, "hw:%i", i); } break; case 'D': strncpy(card_id, optarg, sizeof(card_id)); card_id[sizeof(card_id)-1] = '\0'; break; case 'g': mixer_do_color = !mixer_do_color; break; case 's': mixer_minimize = 1; break; } } while (opt > 0); /* initialize mixer */ mixer_init (); #ifdef ALSAMIXER_GUI gui_init(); #endif /* #ifdef ALSAMIXER_GUI */ mixer_reinit (); if (mixer_n_elems == 0) { fprintf(stderr, "No mixer elems found\n"); mixer_abort (ERR_NONE, "", 0); } /* setup signal handlers */ signal (SIGINT, mixer_signal_handler); signal (SIGTRAP, mixer_signal_handler); // signal (SIGABRT, mixer_signal_handler); signal (SIGQUIT, mixer_signal_handler); signal (SIGBUS, mixer_signal_handler); signal (SIGSEGV, mixer_signal_handler); signal (SIGPIPE, mixer_signal_handler); signal (SIGTERM, mixer_signal_handler); /* initialize ncurses */ #ifndef ALSAMIXER_GUI mixer_init_window (); if (mixer_max_x < MIXER_MIN_X || mixer_max_y < MIXER_MIN_Y) beep (); // mixer_abort (ERR_WINSIZE, ""); signal (SIGWINCH, (void*) mixer_winch); do { /* draw window upon every iteration */ if (!mixer_needs_resize) { switch (mixer_view) { case VIEW_CHANNELS: mixer_update_cbars (); break; case VIEW_HELP: mixer_show_text ("Help", mixer_help_text, &mixer_help_xoffs, &mixer_help_yoffs); break; case VIEW_PROCINFO: mixer_show_procinfo (); break; } mixer_draw_frame (); refresh (); } } while (!mixer_iteration ()); #endif /* #ifndef ALSAMIXER_GUI */ #ifdef ALSAMIXER_GUI gui_start(); #endif /* #ifdef ALSAMIXER_GUI */ mixer_abort (ERR_NONE, "", 0); }; alsamixergui-0.9.0rc2-1.orig/src/defines.H0100644000076400007640000000146407466514257016101 0ustar rjrjtypedef void* WINDOW; #define TRUE 1 #define FALSE 1 #define mixer_init_dc(a,b,c,d,e) #define mixer_dc(a) #define mvaddch(a,b,c) #define mvaddstr(a,b,c) #define addstr(a) #define mixer_cbar_get_pos(a,b,c) 1 #define initscr() 0 #define keypad(a,b) #define refresh() #define leaveok(a,b) #define endwin() #define noecho() #define timeout(a) #define getmaxyx(a,b,c) extern Fl_AMWindow* mainWindow; extern Fl_AMProcWindow* procWindow; extern Fl_AMHelpWindow* helpWindow; extern int gui_do_update_all; extern int gui_do_select; extern int gui_prev_focus_elem; void gui_select(void); void gui_idle_cb(void*); void gui_start(void); void gui_init(void); void gui_abort(const char* errorstr); void gui_update_all(void); void gui_add_groups(void); void gui_show_text(char* text); void gui_mixer_change_view(void); alsamixergui-0.9.0rc2-1.orig/src/ncurser_to_fl.H0100644000076400007640000000077007466514257017327 0ustar rjrj#define KEY_BTAB FL_Tab #define KEY_RIGHT FL_Right #define KEY_LEFT FL_Left #define KEY_UP FL_Up #define KEY_DOWN FL_Down #define KEY_PPAGE FL_Page_Up #define KEY_NPAGE FL_Page_Down #define KEY_HOME FL_Home #define KEY_END FL_End #define KEY_F(k) (FL_F+k) #define KEY_BEG 0xffa0 /*?????????*/ #define KEY_LL 0xffa1 /*?????????*/ #define KEY_IC FL_Insert #define KEY_DC FL_Delete #define KEY_A1 (FL_KP+'7') #define KEY_A3 (FL_KP+'9') #define KEY_C1 (FL_KP+'1') #define KEY_C3 (FL_KP+'3') alsamixergui-0.9.0rc2-1.orig/src/images/0040755000076400007640000000000007530677652015617 5ustar rjrjalsamixergui-0.9.0rc2-1.orig/src/images/alsalogo.xpm0100644000076400007640000000210507466514257020140 0ustar rjrj/* XPM */ static char *alsalogo_xpm[] = { /* width height ncolors chars_per_pixel */ "40 20 6 1", /* colors */ " c #000000", ". c #C7D9C5", "X c #737A72", "o c #262926", "O c #B7C5B6", "+ c None", /* pixels */ "++++++++++++OXXoo ooXXO++++++++++++", "++++++++.Xo oX.++++++++", "++++++Xo oXXXOO.....OOXXXo oX++++++", "++++O oXO...................OXo O++++", "+++o XO.. ... .....X .... ....OXo+++", "++o X..... ... ....X .... .......X++", "+o O.....X X.. .... .....X X.......O+", "X o....... .. ....X ..... .......OX", "o O....... .. ..... X.... ........o", " X.......X . X. ..... ...X . X......O ", " O....... . . ...... X.. . ......X ", "o........ . . ...... .. . .....O o", "XO....... . ....... X. .....o X", "+O....... . ....... . ...O o+", "++X...... . . . X. . ..X o++", "+++oXO... . . . X.. . X o+++", "++++O oXO...................OXo O++++", "++++++Xo oXXXOO.....OOXXXo oX++++++", "++++++++.Xo oX.++++++++", "++++++++++++OXXoo ooXXO++++++++++++" }; alsamixergui-0.9.0rc2-1.orig/src/images/lock0.xpm0100644000076400007640000000063707466514257017357 0ustar rjrj/* XPM */ static char* lock0_xpm[]={ "19 14 3 1", "# c #505050", ". c None", "c c #ffffff", "..#####............", ".#ccccc#...........", "#ccccccc#..........", "#cc###cc#..........", "#cc#.#cc#..........", "#cc#.#########.....", "####.#ccccccc#.....", ".....#ccccccc#.....", ".....#########.....", ".....#ccccccc#.....", ".....#ccccccc#.....", ".....#ccccccc#.....", ".....#ccccccc#.....", ".....#########....."}; alsamixergui-0.9.0rc2-1.orig/src/images/lock1.xpm0100644000076400007640000000065607466514257017361 0ustar rjrj/* XPM */ static char* lock1_xpm[]={ "19 14 4 1", "x c #C7D9C5", "A c #505050", ". c None", "# c #000000", ".......#####.......", "......#xxxxx#......", ".....#xxxxxxx#.....", ".....#xx###xx#.....", ".....#xx#.#xx#.....", ".....#########.....", ".....#xxxxxxx#.....", ".....#xxxxxxx#.....", ".....#AAAAAAA#.....", ".....#xxxxxxx#.....", ".....#xxxxxxx#.....", ".....#xxxxxxx#.....", ".....#xxxxxxx#.....", ".....#########....."}; alsamixergui-0.9.0rc2-1.orig/src/images/rec0.xpm0100644000076400007640000000043707466514257017176 0ustar rjrj/* XPM */ static char * rec0_xpm[] = { "12 12 3 1", " c None", ". c #505050", "X c #FFFFFF", " ", " ...... ", " ..XXXX.. ", " ..XXXXXX.. ", " .XXXXXXXX. ", " .XXXXXXXX. ", " .XXXXXXXX. ", " .XXXXXXXX. ", " ..XXXXXX.. ", " ..XXXX.. ", " ...... ", " "}; alsamixergui-0.9.0rc2-1.orig/src/images/rec1.xpm0100644000076400007640000000043707466514257017177 0ustar rjrj/* XPM */ static char * rec1_xpm[] = { "12 12 3 1", " c None", ". c #FF0000", "X c #FFA0A0", " ", " ...... ", " ..XXXX.. ", " ..XXXXXX.. ", " .XXXXXXXX. ", " .XXXXXXXX. ", " .XXXXXXXX. ", " .XXXXXXXX. ", " ..XXXXXX.. ", " ..XXXX.. ", " ...... ", " "}; alsamixergui-0.9.0rc2-1.orig/src/images/speakerleft0.xpm0100644000076400007640000000064707466514257020735 0ustar rjrj/* XPM */ static char * speakerleft0_xpm[] = { "16 16 3 1", " c None", ". c #505050", "X c #FFFFFF", " ", " ", " .. ", " .X. .... ", " .XX..XX. ", " .XXX.XX. ", " .XXX.XX. ", " .XXX.XX. ", " .XXX.XX. ", " .XXX.XX. ", " .XXX.XX. ", " .XX..XX. ", " .X. .... ", " .. ", " ", " "}; alsamixergui-0.9.0rc2-1.orig/src/images/speakerleft1.xpm0100644000076400007640000000051607466514257020731 0ustar rjrj/* XPM */ static char * speakerleft1_xpm[] = { "14 12 4 1", " c None", ". c #000000", "X c #C7D9C5", "x c #505050", " xx .. ", " x .X. ....", " x x.XX..XX.", "x x .XXX.XX.", "x x .XXX.XX.", "x x .XXX.XX.", "x x .XXX.XX.", "x x .XXX.XX.", "x x .XXX.XX.", " x x.XX..XX.", " x .X. ....", " xx .. "}; alsamixergui-0.9.0rc2-1.orig/src/images/speakerright0.xpm0100644000076400007640000000065007466514257021112 0ustar rjrj/* XPM */ static char * speakerright0_xpm[] = { "16 16 3 1", " c None", ". c #505050", "X c #FFFFFF", " ", " ", " .. ", " .... .X. ", " .XX..XX. ", " .XX.XXX. ", " .XX.XXX. ", " .XX.XXX. ", " .XX.XXX. ", " .XX.XXX. ", " .XX.XXX. ", " .XX..XX. ", " .... .X. ", " .. ", " ", " "}; alsamixergui-0.9.0rc2-1.orig/src/images/speakerright1.xpm0100644000076400007640000000052207466514257021111 0ustar rjrj/* XPM */ static char * speakerright1_xpm[] = { "14 12 4 1", " c None", ". c #000000", "X c #C7D9C5", "x c #505050", " .. xx ", ".... .X. x ", ".XX..XX.x x ", ".XX.XXX. x x ", ".XX.XXX. x x", ".XX.XXX. x x", ".XX.XXX. x x", ".XX.XXX. x x", ".XX.XXX. x x ", ".XX..XX.x x ", ".... .X. x ", " .. xx " };