Compare commits

..

No commits in common. "master" and "v1.0.29" have entirely different histories.

208 changed files with 1899 additions and 2682 deletions

View file

@ -1,142 +0,0 @@
name: Build alsa-tools
on: [push, pull_request]
jobs:
fedora_latest_build:
runs-on: ubuntu-latest
container:
image: fedora:latest
env:
QTDIR: /usr/lib64/qt-3.3
steps:
- name: Prepare environment
run: |
dnf -y upgrade
dnf -y install @development-tools gcc-c++ libtool bzip2 gtk2-devel gtk3-devel fltk-devel qt3-devel
- name: Checkout alsa-lib
uses: actions/checkout@v4
with:
repository: alsa-project/alsa-lib
ref: master
path: alsa-lib
- name: Configure alsa-lib
run: |
cd alsa-lib
head -5 configure.ac
libtoolize --force --copy --automake
aclocal
autoheader
automake --foreign --copy --add-missing
autoconf
export CFLAGS="-O2 -Wall -W -Wunused-const-variable=0 -pipe -g"
./configure
echo "Version: $(cat version)"
- name: Build alsa-lib
run: |
cd alsa-lib
make
- name: Install alsa-lib
run: |
cd alsa-lib
make install
- name: Checkout
uses: actions/checkout@v4
with:
path: alsa-tools
- name: Checkout all tags
run: |
cd alsa-tools
git fetch --prune --tags --force
git fetch --prune --unshallow --force
- name: Modify version
run: |
cd alsa-tools
mv Makefile Makefile.old
version=$(git describe | sed -e 's/v//')
if test -z "$version"; then version=$(git describe --tags | sed -e 's/v//'); fi
if test -z "$version"; then version1=$(grep "VERSION = .*" Makefile.old | cut -d ' ' -f 3); version2=$(git rev-parse --short HEAD); version="${version1}-g${version2}"; fi
echo "Version: ${version}"
sed -r "s/VERSION = .*/VERSION = ${version}/" < Makefile.old > Makefile
grep "VERSION =" Makefile
- name: Compile and install as10k1 (dependency)
run: |
cd alsa-tools/as10k1
./gitcompile --prefix=/usr
make install
- name: Compile and install ld10k1 (dependency)
run: |
cd alsa-tools/ld10k1
./gitcompile --prefix=/usr
make install
- name: Configure and build
run: |
cd alsa-tools
./gitcompile
- name: Create package
run: |
cd alsa-tools
make alsa-dist
mkdir ../artifacts
mv alsa-tools*.tar.bz2 ../artifacts
- name: Archive package
uses: actions/upload-artifact@v4
with:
name: alsa-tools-test-package
path: artifacts/
ubuntu_last_build:
runs-on: ubuntu-latest
container:
image: ubuntu:latest
steps:
- name: Prepare
run: |
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -y install apt-utils
apt-get -y full-upgrade
apt-get install -y git build-essential pkg-config m4 autoconf automake libtool ibgtk2.0-dev libgtk-3-dev libfltk1.3-dev
- name: Checkout alsa-lib
uses: actions/checkout@v4
with:
repository: alsa-project/alsa-lib
ref: master
- name: Configure alsa-lib
run: |
libtoolize --force --copy --automake
aclocal
autoheader
automake --foreign --copy --add-missing
autoconf
export CFLAGS="-O2 -Wall -W -Wunused-const-variable=0 -pipe -g"
./configure
- name: Build alsa-lib
run: |
make
- name: Install alsa-lib
run: |
make install
- name: Checkout
uses: actions/checkout@v4
- name: Remove qlo10k1
run: |
mv Makefile Makefile.old
sed -e 's/qlo10k1//' < Makefile.old > Makefile
- name: Compile and install as10k1 (dependency)
run: |
cd as10k1
./gitcompile --prefix=/usr
make install
- name: Compile and install ld10k1 (dependency)
run: |
cd ld10k1
./gitcompile --prefix=/usr
make install
- name: Configure and build
run: |
./gitcompile

11
.gitignore vendored
View file

@ -30,7 +30,6 @@ autom4te.cache
stamp-h1
version
distdir
*/compile
ac3dec/Makefile
ac3dec/ac3dec
@ -46,28 +45,24 @@ as10k1/configure
echomixer/echomixer
echomixer/Makefile
echomixer/configure
echomixer/desktop/Makefile
envy24control/Makefile
envy24control/configure
envy24control/desktop/Makefile
hdspconf/Makefile
hdspconf/configure
hdspconf/src/hdspconf
hdspconf/src/Makefile
hdspconf/pixmaps/Makefile
hdspconf/desktop/Makefile
hdspmixer/Makefile
hdspmixer/configure
hdspmixer/src/hdspmixer
hdspmixer/pixmaps/Makefile
hdspmixer/desktop/Makefile
hdspmixer/src/Makefile
hdsploader/Makefile
hdsploader/configure
hwmixvolume/Makefile
hwmixvolume/configure
hwmixvolume/desktop/Makefile
ld10k1/Makefile
ld10k1/compile
ld10k1/ld10k1d
ld10k1/configure
ld10k1/m4/
@ -128,10 +123,6 @@ hdajackretask/configure
hdajackretask/Makefile
hdajackretask/README.generated.h
hdajackretask/hdajackretask
hdajackretask/desktop/Makefile
hdajacksensetest/Makefile
hdajacksensetest/configure
hdajacksensetest/hdajacksensetest
hda-verb/Makefile
hda-verb/configure
hda-verb/hda-verb

View file

@ -1,4 +1,4 @@
VERSION = 1.2.14
VERSION = 1.0.29
TOP = .
SUBDIRS = as10k1 envy24control hdsploader hdspconf hdspmixer \
mixartloader pcxhrloader rmedigicontrol sb16_csp seq sscape_ctl \
@ -29,7 +29,7 @@ install:
done
alsa-dist:
@echo $(VERSION) > $(TOP)/version
@echo $(VERSION) >> $(TOP)/version
@mkdir -p $(TOP)/distdir
@for i in $(SUBDIRS); do \
cd $(TOP)/$$i; echo $(TOP)/$$i; \

View file

@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.

View file

@ -244,7 +244,6 @@ void asm_open(char *name)
struct stat st;
char *next;
int backup_line_num,backup_file_num;
size_t rsize;
@ -285,10 +284,8 @@ void asm_open(char *name)
buff[i].mem_end = buff[i].mem_start+st.st_size;
rsize = read(fd, buff[i].mem_start, st.st_size);
read(fd, buff[i].mem_start, st.st_size);
close(fd);
if (rsize != st.st_size)
as_exit("short read from input file\n");
#ifdef DEBUG
printf("File %s opened:\n",name);
@ -369,8 +366,8 @@ void as_exit(const char *message)
exit(1);
}
void output_tram_line(struct list_head *line_head, int type)
{
inline void output_tram_line( struct list_head *line_head, int type){
struct tram *tram_sym;
struct list_head *entry;
@ -386,14 +383,13 @@ void output_tram_line(struct list_head *line_head, int type)
val = __cpu_to_le32(tram_sym->data.value);
fwrite(&val,sizeof(u32),1,fp);
if(listing){
if(type==TYPE_TRAM_ADDR_READ) {
if(type==TYPE_TRAM_ADDR_READ)
fprintf(listfile,"\tRead");
} else {
else
fprintf(listfile,"\tWrite");
}
fprintf(listfile,": 0x3%02x/0x2%02x (%s), offset 0x%07x\n",tram_sym->data.address,tram_sym->data.address,
(prev_sym((&tram_sym->list)))->data.name,tram_sym->data.value);
fprintf(listfile,": 0x3%02x/0x2%02x (%s), offset 0x%07x\n",tram_sym->data.address,tram_sym->data.address,
(prev_sym((&tram_sym->list)))->data.name,tram_sym->data.value);
}
}

View file

@ -55,6 +55,6 @@ int tram_table_count=0;
int gpr_constant_count=0;
char patch_name[PATCH_NAME_SIZE]="NO_NAME";
unsigned int macro_depth=0;
int macro_depth=0;

View file

@ -22,7 +22,6 @@
#include"types.h"
#include"proto.h"
#include"parse.h"
extern int dbg_opt;
extern FILE *listfile;
@ -46,6 +45,7 @@ void op(int op, int z,int w,int x,int y)
int w0, w1;
extern int dsp_code[DSP_CODE_SIZE];
extern int ip;
extern char op_codes[35][9];
extern char listtemp[60];
if (ip >= 0x200)
as_exit("to many instructions");
@ -306,6 +306,7 @@ void add_symbol(char *name, u16 type, u16 address, u32 value)
extern int gpr_input_count,gpr_output_count,gpr_static_count,gpr_dynamic_count,gpr_control_count,gpr_constant_count;
struct sym *sym;
struct tram *tmp_ptr;
extern struct list_head sym_head;
extern struct delay tram_delay[MAX_TANK_ADDR];
extern struct lookup tram_lookup[MAX_TANK_ADDR];
@ -355,8 +356,10 @@ void add_symbol(char *name, u16 type, u16 address, u32 value)
else
tram_delay[tmp].write++;
}else{
tmp_ptr=(struct tram *)sym;
list_add_tail(&(((struct tram *)sym)->tram) , &(tram_lookup[tmp].tram) );
if(type== TYPE_TRAM_ADDR_READ)
tmp_ptr=(struct tram *)sym;
if(type== TYPE_TRAM_ADDR_READ)
tram_lookup[tmp].read++;
else
tram_lookup[tmp].write++;

View file

@ -72,11 +72,14 @@ void new_macro(char *symbol, char *line, char *operand)
void macro_expand(int macnum,char *operand )
{
char *line,*next;
int done=0,old;
int done=0,i,old;
extern unsigned int macro_depth;
extern int macro_line_num;
char string[MAX_LINE_LENGTH];
//initialize macro use:
i=0;
if(macro_depth+1> MAX_MAC_DEPTH)
as_exit("Error exceeded maximum number of recursive macro calls");

View file

@ -18,7 +18,6 @@
#include<string.h>
#include<stdio.h>
#include"types.h"
#define DECLARE_OP_CODES
#include"parse.h"
#include"proto.h"
@ -88,7 +87,7 @@ int parse( char line_string[MAX_LINE_LENGTH], char *line)
if((tmp=ismacro(op_name_ptr)) != -1 ){
if(defmacro==0)
macro_expand(tmp,strtok(NULL,""));
return(0);
return(0);
}
if( (op_num=op_decode(op_name_ptr))==-1) {

View file

@ -63,9 +63,7 @@ enum foo {
};
#ifndef DECLARE_OP_CODES
extern char op_codes[NUM_OPS+1][9];
#else
char op_codes[NUM_OPS+1][9]=
{
"MACS",
@ -112,7 +110,6 @@ char op_codes[NUM_OPS+1][9]=
"con",
"NotAnOp"
};
#endif
//extern int file_num,source_line_num

View file

@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.

View file

@ -1,4 +1,3 @@
SUBDIRS = desktop
AM_CFLAGS = @ECHOMIXER_CFLAGS@
bin_PROGRAMS = echomixer
man_MANS =

View file

@ -7,4 +7,4 @@ AM_MAINTAINER_MODE([enable])
PKG_CHECK_MODULES(ECHOMIXER, gtk+-2.0 alsa >= 1.0.0)
AC_OUTPUT(Makefile desktop/Makefile)
AC_OUTPUT(Makefile)

View file

@ -1,34 +0,0 @@
APPNAME = echomixer
desktopdir = $(datadir)/applications
desktop_DATA = $(APPNAME).desktop
public_icons = \
hicolor_apps_48x48_$(APPNAME).png
EXTRA_DIST = \
$(public_icons) \
$(desktop_DATA)
install-icons:
for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \
$(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
uninstall-icons:
-for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
install-data-local: install-icons
uninstall-local: uninstall-icons

View file

@ -1,10 +0,0 @@
[Desktop Entry]
Name=Echomixer
GenericName=Control Echo Digital Audio sound cards
Comment=Mixer and GUI control utility for Echo Digital Audio sound cards
Exec=echomixer
Icon=echomixer
Terminal=false
Type=Application
Categories=AudioVideo;
Version=0.9.4

Binary file not shown.

Before

Width:  |  Height:  |  Size: 841 B

View file

@ -13,7 +13,7 @@
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#define EM_VERSION "%s Echomixer v" VERSION
@ -525,25 +525,6 @@ void GetChannels(void) {
nLOut=snd_ctl_elem_value_get_integer(control, 2); // Number of output channels
fdOut=snd_ctl_elem_value_get_integer(control, 3); // First digital out
nPOut=snd_ctl_elem_value_get_integer(control, 4); // Number of virtual output channels (==nLOut on non-vmixer cards)
mixerControl.outputs = nLOut;
mixerControl.inputs = nIn;
if (vmixerId) {
vmixerControl.outputs = nLOut;
vmixerControl.inputs = nPOut;
/* For outputs and inputs. */
metersStreams = 2;
} else {
/* For outputs, inputs and system outputs. */
metersStreams = 3;
}
/* For the number of channels. */
metersNumber = 16;
/* For each of levels and peaks. */
metersTypes = 2;
}
ClockMask=snd_ctl_elem_value_get_integer(control, 5); // Bitmask of available input clocks
}
@ -629,7 +610,9 @@ gint DrawMixer(gpointer unused) {
int OutPeak[ECHO_MAXAUDIOOUTPUTS];
int VirLevel[ECHO_MAXAUDIOOUTPUTS];
int VirPeak[ECHO_MAXAUDIOOUTPUTS];
char str[16];
static int InClip[ECHO_MAXAUDIOINPUTS];
static int OutClip[ECHO_MAXAUDIOOUTPUTS];
char str[8];
int i, o, dB;
GdkColor Grid={0x787878, 0, 0, 0};
GdkColor Labels={0x9694C4, 0, 0, 0};
@ -645,8 +628,13 @@ gint DrawMixer(gpointer unused) {
update_rect.height = Mixheight;
GetVUmeters(InLevel, InPeak, OutLevel, OutPeak, VirLevel, VirPeak);
if (!gc)
if (!gc) {
gc=gdk_gc_new(gtk_widget_get_parent_window(Mixdarea));
for (i=0; i<nIn; i++)
InClip[i]=0;
for (i=0; i<nLOut; i++)
OutClip[i]=0;
}
gdk_draw_rectangle(Mixpixmap, Mixdarea->style->black_gc, TRUE, 0, 0, Mixwidth, Mixheight);
@ -1686,7 +1674,7 @@ void ToggleWindow(GtkWidget *widget, gpointer window) {
// Scan all controls and sets up the structures needed to access them.
int OpenControls(const char *card, const char *cardname) {
int err, i, o;
int numid, items, item;
int numid, count, items, item;
snd_hctl_t *handle;
snd_hctl_elem_t *elem;
snd_ctl_elem_id_t *id;
@ -1719,15 +1707,20 @@ int OpenControls(const char *card, const char *cardname) {
continue;
snd_hctl_elem_get_id(elem, id);
numid=snd_ctl_elem_id_get_numid(id);
count=snd_ctl_elem_info_get_count(info);
if (!strcmp("Monitor Mixer Volume", snd_ctl_elem_id_get_name(id))) {
if (!mixerId) {
mixerId=numid;
CTLID_DEBUG(("First Mixer id=%d\n", mixerId));
mixerControl.outputs=snd_ctl_elem_info_get_dimension(info, 0);
mixerControl.inputs=snd_ctl_elem_info_get_dimension(info, 1);
}
} else if (!strcmp("VMixer Volume", snd_ctl_elem_id_get_name(id))) {
if (!vmixerId) {
vmixerId=vmixerControl.id=numid;
CTLID_DEBUG(("First Vmixer id=%d\n", vmixerId));
vmixerControl.outputs=snd_ctl_elem_info_get_dimension(info, 0);
vmixerControl.inputs=snd_ctl_elem_info_get_dimension(info, 1);
}
} else if (!strcmp("PCM Playback Volume", snd_ctl_elem_id_get_name(id))) {
pcmoutId=pcmoutControl.id=numid;
@ -1796,6 +1789,9 @@ int OpenControls(const char *card, const char *cardname) {
CTLID_DEBUG(("VU-meter switch id=%d\n", numid));
} else if (!strcmp("VU-meters", snd_ctl_elem_id_get_name(id))) {
vumetersId=numid;
metersStreams=snd_ctl_elem_info_get_dimension(info, 0); // 2 or 3: output, input and (vmixer cards only) pcm
metersNumber=snd_ctl_elem_info_get_dimension(info, 1); // Number of channels
metersTypes=snd_ctl_elem_info_get_dimension(info, 2); // 2: level and peak
CTLID_DEBUG(("VU-meters id=%d\n", numid));
} else if (!strcmp("Channels info", snd_ctl_elem_id_get_name(id))) {
channelsId=numid;
@ -1871,7 +1867,7 @@ int main(int argc, char *argv[]) {
GtkWidget *label, *menu, *menuitem;
GSList *bgroup;
int err, i, o, n, cardnum, value;
char hwname[16], cardname[32], load, save;
char hwname[8], cardname[32], load, save;
snd_ctl_card_info_t *hw_info;
load=save=1;
@ -1892,8 +1888,8 @@ int main(int argc, char *argv[]) {
}
if ((err=snd_ctl_card_info(ctlhandle, hw_info))>=0) {
if (!strncmp(snd_ctl_card_info_get_driver(hw_info), "Echo_", 5)) {
strncpy(card, hwname, sizeof(hwname)-1);
card[sizeof(hwname)-1]=0;
strncpy(card, hwname, 7);
hwname[7]=0;
strncpy(cardname, snd_ctl_card_info_get_name(hw_info), 31);
cardname[31]=0;
strncpy(cardId, snd_ctl_card_info_get_name(hw_info), 15);
@ -2097,7 +2093,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
for (i=0; i<ndmodes; i++) {
menuitem=gtk_menu_item_new_with_label(dmodeName[i]);
gtk_widget_show(menuitem);
gtk_signal_connect(GTK_OBJECT(menuitem), "activate", G_CALLBACK(Digital_mode_activate), (gpointer)(long)i);
gtk_signal_connect(GTK_OBJECT(menuitem), "activate", Digital_mode_activate, (gpointer)(long)i);
gtk_menu_append(GTK_MENU(menu), menuitem);
}
gtk_option_menu_set_menu(GTK_OPTION_MENU(dmodeOpt), menu);
@ -2123,7 +2119,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
clocksrc_menuitem[i]=gtk_menu_item_new_with_label(clocksrcName[i]);
gtk_widget_show(clocksrc_menuitem[i]);
gtk_widget_set_sensitive(clocksrc_menuitem[i], FALSE);
gtk_signal_connect(GTK_OBJECT(clocksrc_menuitem[i]), "activate", G_CALLBACK(Clock_source_activate), (gpointer)(long)i);
gtk_signal_connect(GTK_OBJECT(clocksrc_menuitem[i]), "activate", Clock_source_activate, (gpointer)(long)i);
gtk_menu_append(GTK_MENU(menu), clocksrc_menuitem[i]);
}
gtk_option_menu_set_menu(GTK_OPTION_MENU(clocksrcOpt), menu);
@ -2149,7 +2145,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
for (i=0; i<nspdifmodes; i++) {
menuitem=gtk_menu_item_new_with_label(spdifmodeName[i]);
gtk_widget_show(menuitem);
gtk_signal_connect(GTK_OBJECT(menuitem), "activate", G_CALLBACK(SPDIF_mode_activate), (gpointer)(long)i);
gtk_signal_connect(GTK_OBJECT(menuitem), "activate", SPDIF_mode_activate, (gpointer)(long)i);
gtk_menu_append(GTK_MENU(menu), menuitem);
}
gtk_option_menu_set_menu(GTK_OPTION_MENU(spdifmodeOpt), menu);
@ -2174,7 +2170,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
ReadControl(&i, 1, PhantomPower.id, SND_CTL_ELEM_IFACE_MIXER);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), i);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(Switch_toggled), (gpointer)&PhantomPower);
gtk_signal_connect(GTK_OBJECT(button), "toggled", Switch_toggled, (gpointer)&PhantomPower);
PhantomPower.Button=button;
}
@ -2185,7 +2181,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
ReadControl(&i, 1, Automute.id, SND_CTL_ELEM_IFACE_CARD);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), i);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(Switch_toggled), (gpointer)&Automute);
gtk_signal_connect(GTK_OBJECT(button), "toggled", Switch_toggled, (gpointer)&Automute);
Automute.Button=button;
}
@ -2194,7 +2190,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
autoclockChkbutton=gtk_check_button_new_with_label("Autoclock");
gtk_widget_show(autoclockChkbutton);
gtk_box_pack_start(GTK_BOX(hbox), autoclockChkbutton, TRUE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(autoclockChkbutton), "toggled", G_CALLBACK(AutoClock_toggled), NULL);
gtk_signal_connect(GTK_OBJECT(autoclockChkbutton), "toggled", AutoClock_toggled, NULL);
AutoClock=-1;
}
}
@ -2664,7 +2660,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), 1);
gtk_widget_show(button);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(Gang_button_toggled), 0);
gtk_signal_connect(GTK_OBJECT(button), "toggled", Gang_button_toggled, 0);
// Controls frame
frame=gtk_frame_new("Controls");
@ -2679,7 +2675,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("VU");
gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(VUmeters_button_click), 0);
gtk_signal_connect(GTK_OBJECT(button), "toggled", VUmeters_button_click, 0);
VUw_geom.toggler=button;
if (VUw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2689,7 +2685,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("Line");
gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)LVwindow);
gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)LVwindow);
LVw_geom.toggler=button;
if (LVw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2699,7 +2695,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("Misc");
gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)Miscwindow);
gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)Miscwindow);
Miscw_geom.toggler=button;
if (Miscw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2710,7 +2706,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("GrMix");
gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(GMixer_button_click), 0);
gtk_signal_connect(GTK_OBJECT(button), "toggled", GMixer_button_click, 0);
GMw_geom.toggler=button;
if (GMw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2719,7 +2715,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("Mixer");
gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)mixerControl.window);
gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)mixerControl.window);
Mixerw_geom.toggler=button;
if (Mixerw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2730,7 +2726,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("Vmixer");
gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)vmixerControl.window);
gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)vmixerControl.window);
Vmixerw_geom.toggler=button;
if (Vmixerw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2741,7 +2737,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("PCM");
gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)pcmoutControl.window);
gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)pcmoutControl.window);
PVw_geom.toggler=button;
if (PVw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);

View file

@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.

View file

@ -1,4 +1,3 @@
SUBDIRS = desktop
AM_CFLAGS = @ENVY24CONTROL_CFLAGS@
bin_PROGRAMS = envy24control
man_MANS = envy24control.1

View file

@ -46,8 +46,8 @@ void config_close()
void config_set_stereo(GtkWidget *but, gpointer data)
{
gint i=GPOINTER_TO_INT(data);
config_stereo[i]=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(but));
gint i=(gint)data;
config_stereo[i]=GTK_TOGGLE_BUTTON(but)->active;
}
void config_restore_stereo()

View file

@ -5,6 +5,6 @@ AC_HEADER_STDC
AM_INIT_AUTOMAKE
AM_MAINTAINER_MODE([enable])
PKG_CHECK_MODULES(ENVY24CONTROL, gtk+-3.0 alsa >= 0.9.0)
PKG_CHECK_MODULES(ENVY24CONTROL, gtk+-2.0 alsa >= 0.9.0)
AC_OUTPUT(Makefile desktop/Makefile)
AC_OUTPUT(Makefile)

View file

@ -1,34 +0,0 @@
APPNAME = envy24control
desktopdir = $(datadir)/applications
desktop_DATA = $(APPNAME).desktop
public_icons = \
hicolor_apps_48x48_$(APPNAME).png
EXTRA_DIST = \
$(public_icons) \
$(desktop_DATA)
install-icons:
for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \
$(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
uninstall-icons:
-for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
install-data-local: install-icons
uninstall-local: uninstall-icons

View file

@ -1,10 +0,0 @@
[Desktop Entry]
Name=Envy24 Control
GenericName=Envy24 Control Utility
Comment=Mixer and GUI control utility for Envy24-based sound cards
Exec=envy24control
Icon=envy24control
Terminal=false
Type=Application
Categories=AudioVideo;
Version=0.9.4

Binary file not shown.

Before

Width:  |  Height:  |  Size: 945 B

View file

@ -14,12 +14,12 @@
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
#include "envy24control.h"
gboolean control_input_callback(GIOChannel *source, GIOCondition condition, gpointer data)
void control_input_callback(gpointer data, gint source, GdkInputCondition condition)
{
snd_ctl_t *ctl = (snd_ctl_t *)data;
snd_ctl_event_t *ev;
@ -29,12 +29,12 @@ gboolean control_input_callback(GIOChannel *source, GIOCondition condition, gpoi
snd_ctl_event_alloca(&ev);
if (snd_ctl_read(ctl, ev) < 0)
return TRUE;
return;
name = snd_ctl_event_elem_get_name(ev);
index = snd_ctl_event_elem_get_index(ev);
mask = snd_ctl_event_elem_get_mask(ev);
if (! (mask & (SND_CTL_EVENT_MASK_VALUE | SND_CTL_EVENT_MASK_INFO)))
return TRUE;
return;
switch (snd_ctl_event_elem_get_interface(ev)) {
case SND_CTL_ELEM_IFACE_MIXER:
@ -81,13 +81,8 @@ gboolean control_input_callback(GIOChannel *source, GIOCondition condition, gpoi
else if (!strcmp(name, "Input Sensitivity Switch"))
adc_sense_update(index);
break;
case SND_CTL_ELEM_IFACE_PCM:
if (!strcmp(name, "IEC958 Playback Default"))
spdif_output_update();
break;
default:
break;
}
return TRUE;
}

File diff suppressed because it is too large Load diff

View file

@ -85,7 +85,7 @@ extern ice1712_eeprom_t card_eeprom;
extern GtkWidget *mixer_mix_drawing;
extern GtkWidget *mixer_clear_peaks_button;
extern GtkWidget *mixer_drawing[20];
extern GtkAdjustment *mixer_adj[20][2];
extern GtkObject *mixer_adj[20][2];
extern GtkWidget *mixer_vscale[20][2];
extern GtkWidget *mixer_solo_toggle[20][2];
extern GtkWidget *mixer_mute_toggle[20][2];
@ -108,7 +108,7 @@ extern GtkWidget *hw_master_clock_actual_rate_label;
extern GtkWidget *hw_rate_locking_check;
extern GtkWidget *hw_rate_reset_check;
extern GtkAdjustment *hw_volume_change_adj;
extern GtkObject *hw_volume_change_adj;
extern GtkWidget *hw_volume_change_spin;
extern GtkWidget *hw_spdif_profi_nonaudio_radio;
@ -151,9 +151,9 @@ extern GtkWidget *input_interface_internal;
extern GtkWidget *input_interface_front_input;
extern GtkWidget *input_interface_rear_input;
extern GtkWidget *input_interface_wavetable;
extern GtkAdjustment *av_dac_volume_adj[];
extern GtkAdjustment *av_adc_volume_adj[];
extern GtkAdjustment *av_ipga_volume_adj[];
extern GtkObject *av_dac_volume_adj[];
extern GtkObject *av_adc_volume_adj[];
extern GtkObject *av_ipga_volume_adj[];
extern GtkLabel *av_dac_volume_label[];
extern GtkLabel *av_adc_volume_label[];
extern GtkLabel *av_ipga_volume_label[];
@ -163,7 +163,8 @@ extern GtkWidget *av_adc_sense_radio[][4];
/* flags */
extern int card_is_dmx6fire;
gboolean level_meters_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data);
gint level_meters_configure_event(GtkWidget *widget, GdkEventConfigure *event);
gint level_meters_expose_event(GtkWidget *widget, GdkEventExpose *event);
gint level_meters_timeout_callback(gpointer data);
void level_meters_reset_peaks(GtkButton *button, gpointer data);
void level_meters_init(void);
@ -237,5 +238,6 @@ void ipga_volume_adjust(GtkAdjustment *adj, gpointer data);
void dac_sense_toggled(GtkWidget *togglebutton, gpointer data);
void adc_sense_toggled(GtkWidget *togglebutton, gpointer data);
gboolean control_input_callback(GIOChannel *gio, GIOCondition condition, gpointer data);
void control_input_callback(gpointer data, gint source, GdkInputCondition condition);
void mixer_input_callback(gpointer data, gint source, GdkInputCondition condition);

View file

@ -14,7 +14,7 @@
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
#include "envy24control.h"
@ -39,14 +39,7 @@ static inline int is_update_needed(void);
static int is_active(GtkWidget *widget)
{
return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? 1 : 0;
}
static void label_set(GtkWidget* widget, const char* str)
{
const char* old = gtk_label_get_text(GTK_LABEL(widget));
if (strcmp(old, str))
gtk_label_set_text(GTK_LABEL(widget), str);
return GTK_TOGGLE_BUTTON(widget)->active ? 1 : 0;
}
void master_clock_update(void)
@ -177,8 +170,8 @@ gint master_clock_status_timeout_callback(gpointer data)
snd_ctl_elem_value_set_name(sw, "Word Clock Status");
if ((err = snd_ctl_elem_read(ctl, sw)) < 0)
g_print("Unable to determine word clock status: %s\n", snd_strerror(err));
label_set(hw_master_clock_status_label,
snd_ctl_elem_value_get_boolean(sw, 0) ? "No signal" : "Locked");
gtk_label_set_text(GTK_LABEL(hw_master_clock_status_label),
snd_ctl_elem_value_get_boolean(sw, 0) ? "No signal" : "Locked");
return TRUE;
}
@ -253,7 +246,7 @@ gint internal_clock_status_timeout_callback(gpointer data)
}
}
}
label_set(hw_master_clock_actual_rate_label, label);
gtk_label_set_text(GTK_LABEL(hw_master_clock_actual_rate_label), label);
return TRUE;
}
@ -361,7 +354,7 @@ void volume_change_rate_adj(GtkAdjustment *adj, gpointer data)
{
int err;
snd_ctl_elem_value_set_integer(volume_rate, 0, gtk_adjustment_get_value(adj));
snd_ctl_elem_value_set_integer(volume_rate, 0, adj->value);
if ((err = snd_ctl_elem_write(ctl, volume_rate)) < 0)
g_print("Unable to write volume change rate: %s\n", snd_strerror(err));
}
@ -462,9 +455,9 @@ void profi_stream_toggled(GtkWidget *togglebutton, gpointer data)
return;
iec958.status[1] &= ~IEC958_AES1_PRO_MODE;
if (!strcmp(str, "NOTID")) {
iec958.status[1] |= IEC958_AES1_PRO_MODE_NOTID;
iec958.status[0] |= IEC958_AES1_PRO_MODE_STEREOPHONIC;
} else if (!strcmp(str, "Stereo")) {
iec958.status[1] |= IEC958_AES1_PRO_MODE_STEREOPHONIC;
iec958.status[0] |= IEC958_AES1_PRO_MODE_NOTID;
}
snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write();
@ -507,7 +500,7 @@ void consumer_copyright_toggled(GtkWidget *togglebutton, gpointer data)
if (!strcmp(str, "Copyright")) {
iec958.status[0] &= ~IEC958_AES0_CON_NOT_COPYRIGHT;
} else if (!strcmp(str, "Permitted")) {
iec958.status[0] |= IEC958_AES0_CON_NOT_COPYRIGHT;
iec958.status[1] |= IEC958_AES0_CON_NOT_COPYRIGHT;
}
snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write();
@ -524,9 +517,9 @@ void consumer_copy_toggled(GtkWidget *togglebutton, gpointer data)
if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
return;
if (!strcmp(str, "1st")) {
iec958.status[1] &= ~IEC958_AES1_CON_ORIGINAL;
iec958.status[0] |= IEC958_AES1_CON_ORIGINAL;
} else if (!strcmp(str, "Original")) {
iec958.status[1] |= IEC958_AES1_CON_ORIGINAL;
iec958.status[1] &= ~IEC958_AES1_CON_ORIGINAL;
}
snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write();
@ -546,7 +539,7 @@ void consumer_emphasis_toggled(GtkWidget *togglebutton, gpointer data)
if (!strcmp(str, "No")) {
iec958.status[0] |= IEC958_AES0_CON_EMPHASIS_NONE;
} else if (!strcmp(str, "5015")) {
iec958.status[0] |= IEC958_AES0_CON_EMPHASIS_5015;
iec958.status[1] |= ~IEC958_AES0_CON_EMPHASIS_5015;
}
snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write();
@ -562,15 +555,15 @@ void consumer_category_toggled(GtkWidget *togglebutton, gpointer data)
return;
if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
return;
iec958.status[1] &= ~IEC958_AES1_CON_CATEGORY;
iec958.status[0] &= ~IEC958_AES1_CON_CATEGORY;
if (!strcmp(str, "DAT")) {
iec958.status[1] |= IEC958_AES1_CON_DAT;
iec958.status[0] |= IEC958_AES1_CON_DAT;
} else if (!strcmp(str, "PCM")) {
iec958.status[1] |= IEC958_AES1_CON_PCM_CODER;
iec958.status[0] |= IEC958_AES1_CON_PCM_CODER;
} else if (!strcmp(str, "CD")) {
iec958.status[1] |= IEC958_AES1_CON_IEC908_CD;
iec958.status[0] |= IEC958_AES1_CON_IEC908_CD;
} else if (!strcmp(str, "General")) {
iec958.status[1] |= IEC958_AES1_CON_GENERAL;
iec958.status[0] |= IEC958_AES1_CON_GENERAL;
}
snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write();
@ -605,7 +598,7 @@ void spdif_output_toggled(GtkWidget *togglebutton, gpointer data)
page = 1;
}
spdif_output_write();
gtk_notebook_set_current_page(GTK_NOTEBOOK(hw_spdif_output_notebook), page);
gtk_notebook_set_page(GTK_NOTEBOOK(hw_spdif_output_notebook), page);
spdif_output_update();
}
}

View file

@ -14,18 +14,18 @@
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
#include "envy24control.h"
static GdkRGBA *penGreenShadow = NULL;
static GdkRGBA *penGreenLight = NULL;
static GdkRGBA *penOrangeShadow = NULL;
static GdkRGBA *penOrangeLight = NULL;
static GdkRGBA *penRedShadow = NULL;
static GdkRGBA *penRedLight = NULL;
static int level[22] = { 0 };
static GdkGC *penGreenShadow[21] = { NULL, };
static GdkGC *penGreenLight[21] = { NULL, };
static GdkGC *penOrangeShadow[21] = { NULL, };
static GdkGC *penOrangeLight[21] = { NULL, };
static GdkGC *penRedShadow[21] = { NULL, };
static GdkGC *penRedLight[21] = { NULL, };
static GdkPixmap *pixmap[21] = { NULL, };
static snd_ctl_elem_value_t *peaks;
extern int input_channels, output_channels, pcm_output_channels, spdif_channels, view_spdif_playback;
@ -50,19 +50,22 @@ static void get_levels(int idx, int *l1, int *l2)
}
}
static GdkRGBA *get_pen(int nRed, int nGreen, int nBlue)
static GdkGC *get_pen(int idx, int nRed, int nGreen, int nBlue)
{
GdkRGBA *c;
GdkColor *c;
GdkGC *gc;
c = (GdkRGBA *)g_malloc(sizeof(GdkRGBA));
c->red = nRed / 65535.0;
c->green = nGreen / 65535.0;
c->blue = nBlue / 65535.0;
c->alpha = 1.0;
return c;
c = (GdkColor *)g_malloc(sizeof(GdkColor));
c->red = nRed;
c->green = nGreen;
c->blue = nBlue;
gdk_color_alloc(gdk_colormap_get_system(), c);
gc = gdk_gc_new(pixmap[idx]);
gdk_gc_set_foreground(gc, c);
return gc;
}
static int get_index(const gchar *name)
static int get_index(gchar *name)
{
int result;
@ -76,7 +79,7 @@ static int get_index(const gchar *name)
return result;
}
static void redraw_meters(int idx, int width, int height, int level1, int level2, cairo_t *cr)
static void redraw_meters(int idx, int width, int height, int level1, int level2)
{
int stereo = idx == 0;
int segment_width = stereo ? (width / 2) - 8 : width - 12;
@ -87,156 +90,167 @@ static void redraw_meters(int idx, int width, int height, int level1, int level2
int seg;
int segs_on1 = ((segments * level1) + 128) / 255;
int segs_on2 = ((segments * level2) + 128) / 255;
int end_seg;
GdkRectangle clip;
// g_print("segs_on1 = %i (%i), segs_on2 = %i (%i)\n", segs_on1, level1, segs_on2, level2);
cairo_rectangle(cr, 0, 0, width, height);
cairo_fill(cr);
gdk_cairo_get_clip_rectangle(cr, &clip);
seg = segments - (clip.y + clip.height) / 4;
if (seg < 0)
seg = 0;
segs_on1 -= seg;
segs_on2 -= seg;
end_seg = segments - (clip.y - 2) / 4;
for (; seg < green_segments && seg < end_seg; seg++) {
gdk_cairo_set_source_rgba(cr,
segs_on1 > 0 ? penGreenLight : penGreenShadow);
cairo_rectangle(cr,
6, 3 + ((segments - seg - 1) * 4),
segment_width,
3);
cairo_fill(cr);
if (stereo) {
gdk_cairo_set_source_rgba(cr,
segs_on2 > 0 ? penGreenLight : penGreenShadow);
cairo_rectangle(cr,
2 + (width / 2),
3 + ((segments - seg - 1) * 4),
segment_width,
3);
cairo_fill(cr);
}
for (seg = 0; seg < green_segments; seg++) {
gdk_draw_rectangle(pixmap[idx],
segs_on1 > 0 ? penGreenLight[idx] : penGreenShadow[idx],
TRUE,
6, 3 + ((segments - seg - 1) * 4),
segment_width,
3);
if (stereo)
gdk_draw_rectangle(pixmap[idx],
segs_on2 > 0 ? penGreenLight[idx] : penGreenShadow[idx],
TRUE,
2 + (width / 2),
3 + ((segments - seg - 1) * 4),
segment_width,
3);
segs_on1--;
segs_on2--;
}
for (; seg < green_segments + orange_segments && seg < end_seg; seg++) {
gdk_cairo_set_source_rgba(cr,
segs_on1 > 0 ? penOrangeLight : penOrangeShadow);
cairo_rectangle(cr,
6, 3 + ((segments - seg - 1) * 4),
segment_width,
3);
cairo_fill(cr);
if (stereo) {
gdk_cairo_set_source_rgba(cr,
segs_on2 > 0 ? penOrangeLight : penOrangeShadow);
cairo_rectangle(cr,
2 + (width / 2),
3 + ((segments - seg - 1) * 4),
segment_width,
3);
cairo_fill(cr);
}
for (seg = green_segments; seg < green_segments + orange_segments; seg++) {
gdk_draw_rectangle(pixmap[idx],
segs_on1 > 0 ? penOrangeLight[idx] : penOrangeShadow[idx],
TRUE,
6, 3 + ((segments - seg - 1) * 4),
segment_width,
3);
if (stereo)
gdk_draw_rectangle(pixmap[idx],
segs_on2 > 0 ? penOrangeLight[idx] : penOrangeShadow[idx],
TRUE,
2 + (width / 2),
3 + ((segments - seg - 1) * 4),
segment_width,
3);
segs_on1--;
segs_on2--;
}
for (; seg < segments && seg < end_seg; seg++) {
gdk_cairo_set_source_rgba(cr,
segs_on1 > 0 ? penRedLight : penRedShadow);
cairo_rectangle(cr,
6, 3 + ((segments - seg - 1) * 4),
segment_width,
3);
cairo_fill(cr);
if (stereo) {
gdk_cairo_set_source_rgba(cr,
segs_on2 > 0 ? penRedLight : penRedShadow);
cairo_rectangle(cr,
2 + (width / 2),
3 + ((segments - seg - 1) * 4),
segment_width,
3);
cairo_fill(cr);
}
for (seg = green_segments + orange_segments; seg < segments; seg++) {
gdk_draw_rectangle(pixmap[idx],
segs_on1 > 0 ? penRedLight[idx] : penRedShadow[idx],
TRUE,
6, 3 + ((segments - seg - 1) * 4),
segment_width,
3);
if (stereo)
gdk_draw_rectangle(pixmap[idx],
segs_on2 > 0 ? penRedLight[idx] : penRedShadow[idx],
TRUE,
2 + (width / 2),
3 + ((segments - seg - 1) * 4),
segment_width,
3);
segs_on1--;
segs_on2--;
}
}
gboolean level_meters_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data)
gint level_meters_configure_event(GtkWidget *widget, GdkEventConfigure *event)
{
int idx = get_index(gtk_widget_get_name(widget));
if (pixmap[idx] != NULL)
gdk_pixmap_unref(pixmap[idx]);
pixmap[idx] = gdk_pixmap_new(widget->window,
widget->allocation.width,
widget->allocation.height,
-1);
penGreenShadow[idx] = get_pen(idx, 0, 0x77ff, 0);
penGreenLight[idx] = get_pen(idx, 0, 0xffff, 0);
penOrangeShadow[idx] = get_pen(idx, 0xddff, 0x55ff, 0);
penOrangeLight[idx] = get_pen(idx, 0xffff, 0x99ff, 0);
penRedShadow[idx] = get_pen(idx, 0xaaff, 0, 0);
penRedLight[idx] = get_pen(idx, 0xffff, 0, 0);
gdk_draw_rectangle(pixmap[idx],
widget->style->black_gc,
TRUE,
0, 0,
widget->allocation.width,
widget->allocation.height);
// g_print("configure: %i:%i\n", widget->allocation.width, widget->allocation.height);
redraw_meters(idx, widget->allocation.width, widget->allocation.height, 0, 0);
return TRUE;
}
gint level_meters_expose_event(GtkWidget *widget, GdkEventExpose *event)
{
int idx = get_index(gtk_widget_get_name(widget));
int l1, l2;
get_levels(idx, &l1, &l2);
redraw_meters(idx, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget), l1, l2, cr);
redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
gdk_draw_pixmap(widget->window,
widget->style->black_gc,
pixmap[idx],
event->area.x, event->area.y,
event->area.x, event->area.y,
event->area.width, event->area.height);
return FALSE;
}
static void update_meter(int idx)
{
int stereo = idx == 0;
GtkWidget *widget = stereo ? mixer_mix_drawing : mixer_drawing[idx - 1];
int width = gtk_widget_get_allocated_width(widget);
int height = gtk_widget_get_allocated_height(widget);
int segments = (height - 6) / 4;
int level_idx = stereo ? 20 : idx - 1;
int l1, l2, segs_on, old_segs_on, h;
get_levels(idx, &l1, &l2);
segs_on = ((segments * l1) + 128) / 255;
old_segs_on = ((segments * level[level_idx]) + 128) / 255;
h = abs(old_segs_on - segs_on);
level[level_idx] = l1;
if (h > 0) {
int y = segments - MAX(old_segs_on, segs_on);
gtk_widget_queue_draw_area(widget,
6, 4 * y + 3,
stereo ? (width / 2) - 8 : width - 12,
4 * h - 1);
}
if (stereo) {
level_idx++;
segs_on = ((segments * l2) + 128) / 255;
old_segs_on = ((segments * level[level_idx]) + 128) / 255;
h = abs(old_segs_on - segs_on);
level[level_idx] = l2;
if (h > 0) {
int y = segments - MAX(old_segs_on, segs_on);
gtk_widget_queue_draw_area(widget,
2 + (width / 2), 4 * y + 3,
(width / 2) - 8,
4 * h - 1);
}
}
}
gint level_meters_timeout_callback(gpointer data)
{
int idx;
GtkWidget *widget;
int idx, l1, l2;
update_peak_switch();
for (idx = 0; idx <= pcm_output_channels; idx++) {
update_meter(idx);
get_levels(idx, &l1, &l2);
widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
if (GTK_WIDGET_VISIBLE(widget) && (pixmap[idx] != NULL)) {
redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
gdk_draw_pixmap(widget->window,
widget->style->black_gc,
pixmap[idx],
0, 0,
0, 0,
widget->allocation.width, widget->allocation.height);
}
}
if (view_spdif_playback) {
for (idx = MAX_PCM_OUTPUT_CHANNELS + 1; idx <= MAX_OUTPUT_CHANNELS + spdif_channels; idx++) {
update_meter(idx);
get_levels(idx, &l1, &l2);
widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
if (GTK_WIDGET_VISIBLE(widget) && (pixmap[idx] != NULL)) {
redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
gdk_draw_pixmap(widget->window,
widget->style->black_gc,
pixmap[idx],
0, 0,
0, 0,
widget->allocation.width, widget->allocation.height);
}
}
}
for (idx = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 1; idx <= input_channels + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS; idx++) {
update_meter(idx);
get_levels(idx, &l1, &l2);
widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
if (GTK_WIDGET_VISIBLE(widget) && (pixmap[idx] != NULL)) {
redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
gdk_draw_pixmap(widget->window,
widget->style->black_gc,
pixmap[idx],
0, 0,
0, 0,
widget->allocation.width, widget->allocation.height);
}
}
for (idx = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS + 1; \
idx <= spdif_channels + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS; idx++) {
update_meter(idx);
get_levels(idx, &l1, &l2);
widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
if (GTK_WIDGET_VISIBLE(widget) && (pixmap[idx] != NULL)) {
redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
gdk_draw_pixmap(widget->window,
widget->style->black_gc,
pixmap[idx],
0, 0,
0, 0,
widget->allocation.width, widget->allocation.height);
}
}
return TRUE;
}
@ -256,13 +270,6 @@ void level_meters_init(void)
/* older ALSA driver, using MIXER type */
snd_ctl_elem_value_set_interface(peaks,
SND_CTL_ELEM_IFACE_MIXER);
penGreenShadow = get_pen(0, 0x77ff, 0);
penGreenLight = get_pen(0, 0xffff, 0);
penOrangeShadow = get_pen(0xddff, 0x55ff, 0);
penOrangeLight = get_pen(0xffff, 0x99ff, 0);
penRedShadow = get_pen(0xaaff, 0, 0);
penRedLight = get_pen(0xffff, 0, 0);
}
void level_meters_postinit(void)

View file

@ -15,7 +15,7 @@
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
#include <string.h>
@ -243,7 +243,7 @@ int midi_init(char *appname, int channel, int midi_enhanced)
void mixer_adjust(GtkAdjustment *adj, gpointer data);
void mixer_set_mute(int stream, int left, int right);
gboolean midi_process(GIOChannel *gio, GIOCondition condition, gpointer data)
void midi_process(gpointer data, gint source, GdkInputCondition condition)
{
snd_seq_event_t *ev;
static GtkAdjustment *adj=0;
@ -306,7 +306,6 @@ gboolean midi_process(GIOChannel *gio, GIOCondition condition, gpointer data)
snd_seq_free_event(ev);
}
while (snd_seq_event_input_pending(seq, 0) > 0);
return TRUE;
}
/* ************************************************* */

View file

@ -7,7 +7,7 @@ int midi_init(char *appname, int channel, int midi_enhanced);
int midi_close();
void midi_maxstreams(int);
int midi_controller(int c, int v);
gboolean midi_process(GIOChannel *gio, GIOCondition condition, gpointer data);
void midi_process(gpointer data, gint source, GdkInputCondition condition);
int midi_button(int b, int v);
#endif

View file

@ -14,7 +14,7 @@
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
#include "envy24control.h"
@ -39,7 +39,7 @@ extern int input_channels, output_channels, pcm_output_channels, spdif_channels,
static int is_active(GtkWidget *widget)
{
return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? 1 : 0;
return GTK_TOGGLE_BUTTON(widget)->active ? 1 : 0;
}
void mixer_update_stream(int stream, int vol_flag, int sw_flag)
@ -181,10 +181,10 @@ void mixer_adjust(GtkAdjustment *adj, gpointer data)
int stereo = is_active(mixer_stereo_toggle[stream-1]) ? 1 : 0;
int vol[2] = { -1, -1 };
vol[button] = 96 - gtk_adjustment_get_value(adj);
vol[button] = 96 - adj->value;
if (stereo) {
gtk_adjustment_set_value(GTK_ADJUSTMENT(mixer_adj[stream-1][button ^ 1]), gtk_adjustment_get_value(adj));
vol[button ^ 1] = 96 - gtk_adjustment_get_value(adj);
gtk_adjustment_set_value(GTK_ADJUSTMENT(mixer_adj[stream-1][button ^ 1]), adj->value);
vol[button ^ 1] = 96 - adj->value;
}
set_volume1(stream, vol[0], vol[1]);
}

View file

@ -20,9 +20,9 @@ int new_process(char * const cmd_line[MAX_PARAM])
struct stat file_status;
/* memory for storage of function pointers from the signal handling routines */
void (*int_stat)(int);
void (*quit_stat)(int);
void (*usr2_stat)(int);
void (*int_stat)();
void (*quit_stat)();
void (*usr2_stat)();
/*
* check command file

View file

@ -14,7 +14,7 @@
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
#include "envy24control.h"
@ -30,7 +30,7 @@ extern int output_channels, input_channels, pcm_output_channels, spdif_channels;
static int is_active(GtkWidget *widget)
{
return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? 1 : 0;
return GTK_TOGGLE_BUTTON(widget)->active ? 1 : 0;
}
static int get_toggle_index(int stream)

View file

@ -17,7 +17,7 @@
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
@ -54,9 +54,9 @@ void subst_tilde_in_filename(char * const filename)
if ((pos_after_tilde = strchr(filename, '~')) != NULL) {
pos_after_tilde++;
strncpy(new_filename, getenv("HOME"), sizeof(new_filename) - 1);
strncpy(new_filename + strlen(new_filename), pos_after_tilde, sizeof(new_filename) - strlen(new_filename) - 1);
new_filename[sizeof(new_filename) - 1] = '\0';
strncpy(new_filename, getenv("HOME"), MAX_FILE_NAME_LENGTH);
strncpy(new_filename + strlen(new_filename), pos_after_tilde, MAX_FILE_NAME_LENGTH - strlen(new_filename));
new_filename[MAX_FILE_NAME_LENGTH - 1] = '\0';
strncpy(filename, new_filename, MAX_FILE_NAME_LENGTH);
}
}
@ -78,9 +78,7 @@ int which_cfgfile(char ** const cfgfile)
(inputFile = fopen(SYS_PROFILERC, "r")) == NULL) {
res = -ENOENT;
} else {
if (inputFile != NULL) {
fclose(inputFile);
}
fclose(inputFile);
*cfgfile = SYS_PROFILERC;
res = EXIT_SUCCESS;
}
@ -96,9 +94,7 @@ int get_file_size(const char * const filename)
{
struct stat file_status;
if (filename_without_tilde != filename) {
strncpy(filename_without_tilde, filename, MAX_FILE_NAME_LENGTH);
}
strncpy(filename_without_tilde, filename, MAX_FILE_NAME_LENGTH);
filename_without_tilde[MAX_FILE_NAME_LENGTH - 1] = '\0';
subst_tilde_in_filename(filename_without_tilde);
if (stat(filename_without_tilde, &file_status) < 0) {
@ -474,8 +470,7 @@ int get_pos_name_header_from_card(const char * const buffer, const int profile_n
char place_holder;
int pos_card_begin, pos_card_end, pos_name_header;
if ((pos_card_begin = get_card_begin(buffer, profile_number, card_number)) < 0)
return pos_card_begin;
pos_card_begin = get_card_begin(buffer, profile_number, card_number);
pos_card_end = get_card_end(buffer, profile_number, card_number);
place_holder = PLACE_HOLDER_STR;
strncpy(header, PROFILE_NAME_TEMPL, MAX_SEARCH_FIELD_LENGTH);
@ -527,7 +522,7 @@ int reorganize_profiles(char * const buffer, const int max_length)
{
int profile_number, card_number, card_number_max;
int res;
int pos_profile_begin, pos_card_begin, pos_card_end, pos_name_header;
int pos_profile_begin, pos_profile_end, pos_card_begin, pos_card_end, pos_name_header;
int pos_alsa_section_begin, pos_after_alsa_section;
char header[MAX_SEARCH_FIELD_LENGTH];
void *buffer_copy = NULL;
@ -552,6 +547,7 @@ int reorganize_profiles(char * const buffer, const int max_length)
compose_search_string(header, PROFILE_HEADER_TEMPL, profile_or_card_number_as_str, place_holder, MAX_SEARCH_FIELD_LENGTH);
header[MAX_SEARCH_FIELD_LENGTH - 1] = '\0';
snprintf(buffer_copy + strlen(buffer_copy), max_length - strlen(buffer_copy), "%s\n", header);
pos_profile_end = get_profile_end(buffer, profile_number);
/* search max card number in profile */
card_number_max = get_max_card_number_in_profile(buffer, profile_number);
for (card_number = 0; card_number <= card_number_max; card_number++)
@ -645,9 +641,9 @@ int save_restore_alsactl_settings(char * const tmpfile, const int card_number, c
void compose_tmpfile_name(char * const tmpfile, const char * const cfgfile)
{
strncpy(tmpfile, cfgfile, MAX_FILE_NAME_LENGTH - 1);
strncpy(tmpfile, cfgfile, MAX_FILE_NAME_LENGTH);
tmpfile[MAX_FILE_NAME_LENGTH - 1] = '\0';
strncpy(tmpfile + strlen(tmpfile), "_alsactl_tmp", MAX_FILE_NAME_LENGTH - strlen(tmpfile) - 1);
strncpy(tmpfile + strlen(tmpfile), "_alsactl_tmp", MAX_FILE_NAME_LENGTH - strlen(tmpfile));
tmpfile[MAX_FILE_NAME_LENGTH - 1] = '\0';
}
@ -1149,16 +1145,13 @@ int save_restore(const char * const operation, const int profile_number, const i
fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number);
return -errno;
}
close(res);
unlink(cfgfile);
} else {
close(res);
if ((res = open(cfgfile, O_RDWR | 0400000 /* O_NOFOLLOW */, FILE_CREA_MODE)) < 0) {
fprintf(stderr, "Cannot open configuration file '%s' for writing.\n", cfgfile);
fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number);
return -errno;
}
close(res);
}
res = save_profile(profile_number, card_number, profile_name, cfgfile);
} else if (!strcmp(operation, ALSACTL_OP_RESTORE)) {

View file

@ -44,7 +44,7 @@
#define MAX_PROFILE_SIZE 32768
#define MAX_SEARCH_FIELD_LENGTH 1024
#define MAX_FILE_NAME_LENGTH 1024
#define MAX_NUM_STR_LENGTH 11
#define MAX_NUM_STR_LENGTH 10
#define TOKEN_SEP "|"
#define SEP_CHAR ' '

View file

@ -16,7 +16,7 @@
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
@ -48,7 +48,6 @@ int strstr_icase_blank(const char * const string1, const char * const string2)
char search_string[MAX_SEARCH_FIELD_LENGTH];
char *pstr;
int pos_first_non_blank;
size_t len;
strncpy(search_string, string2, MAX_SEARCH_FIELD_LENGTH);
search_string[MAX_SEARCH_FIELD_LENGTH - 1] = '\0';
@ -85,11 +84,7 @@ int strstr_icase_blank(const char * const string1, const char * const string2)
}
}
}
len = strlen(search_string);
if (len > sizeof(search_string) - 1)
len = sizeof(search_string) - 1;
strncpy(search_string, cmp_line, len);
search_string[len] = '\0';
strncpy(search_string, cmp_line, strlen(search_string));
position = 0;
while (position < strlen(string1))

View file

@ -17,7 +17,7 @@
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "envy24control.h"
@ -217,7 +217,7 @@ void dac_volume_adjust(GtkAdjustment *adj, gpointer data)
{
int idx = (int)(long)data;
snd_ctl_elem_value_t *val;
int err, ival = -(int)gtk_adjustment_get_value(adj);
int err, ival = -(int)adj->value;
char text[16];
snd_ctl_elem_value_alloca(&val);
@ -235,7 +235,7 @@ void adc_volume_adjust(GtkAdjustment *adj, gpointer data)
{
int idx = (int)(long)data;
snd_ctl_elem_value_t *val;
int err, ival = -(int)gtk_adjustment_get_value(adj);
int err, ival = -(int)adj->value;
char text[16];
snd_ctl_elem_value_alloca(&val);
@ -253,7 +253,7 @@ void ipga_volume_adjust(GtkAdjustment *adj, gpointer data)
{
int idx = (int)(long)data;
snd_ctl_elem_value_t *val;
int err, ival = -(int)gtk_adjustment_get_value(adj);
int err, ival = -(int)adj->value;
char text[16];
snd_ctl_elem_value_alloca(&val);

View file

@ -15,7 +15,7 @@
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __SOUND_HDA_HWDEP_H

View file

@ -1,4 +1,3 @@
SUBDIRS = desktop
EXTRA_DIST = gitcompile README
AM_CFLAGS = @GTK3_CFLAGS@ -Wno-deprecated-declarations
bin_PROGRAMS = hdajackretask
@ -22,3 +21,4 @@ alsa-dist: distdir
@mkdir -p ../distdir/hdajackretask
@cp -RLpv $(distdir)/* ../distdir/hdajackretask
@rm -rf $(distdir)

View file

@ -51,4 +51,4 @@ This is for the experts only. It makes you select each configuration field indiv
http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf )
* Parser hints
This enables you to send special "hints" to the driver that causes parsing to behave differently. Leave them at the "default" setting unless you have read the driver documentation. ( Which, at the time of this writing, is available here: https://www.kernel.org/doc/Documentation/sound/hd-audio/notes.rst - see the "Hint strings" section. )
This enables you to send special "hints" to the driver that causes parsing to behave differently. Leave them at the "default" setting unless you have read the driver documentation. ( Which, at the time of this writing, is available here: https://www.kernel.org/doc/Documentation/sound/alsa/HD-Audio.txt - see the "Hint strings" section. )

View file

@ -15,15 +15,6 @@ static gchar* tempdir = NULL;
static gchar* scriptfile = NULL;
static gchar* errorfile = NULL;
struct soundserver {
enum {
PULSEAUDIO,
PIPEWIRE
} type;
gboolean was_killed;
gchar *user;
};
static GQuark quark()
{
return g_quark_from_static_string("hda-jack-retask-error");
@ -134,73 +125,33 @@ static gchar* get_pulseaudio_client_conf()
return fname;
}
static gboolean call_systemctl(gchar* user, gchar* operation, gchar *unit, GError **err)
{
gchar* s;
gboolean ok;
if (getuid() == 0) {
// special case for root
// XDG_RUNTIME_DIR setup seems to be mandatory for Fedora, may differ for other distros
s = g_strdup_printf("runuser -l %s -c 'XDG_RUNTIME_DIR=/var/run/user/$(id -u) systemctl --user %s %s'", user, operation, unit);
} else {
s = g_strdup_printf("systemctl --user %s %s", operation, unit);
}
ok = g_spawn_command_line_sync(s, NULL, NULL, NULL, err);
g_free(s);
return ok;
}
static gboolean kill_soundserver(struct soundserver* state, int card, GError** err)
static gboolean kill_pulseaudio(gboolean* was_killed, int card, GError** err)
{
gchar* fuser = NULL, *fuser2 = NULL;
gchar* s = NULL;
gchar* clientconf = NULL;
gboolean ok;
char *p;
state->type = PULSEAUDIO;
state->was_killed = FALSE;
state->user = NULL;
*was_killed = FALSE;
/* Is PA having a lock on the sound card? */
s = g_strdup_printf("fuser -v /dev/snd/controlC%d", card);
/* Due to some bug in fuser, stdout and stderr output is unclear. Better check both. */
if (!(ok = g_spawn_command_line_sync(s, &fuser, &fuser2, NULL, err)))
goto cleanup;
if (strstr(fuser, "pulseaudio") != NULL || strstr(fuser2, "pulseaudio") != NULL) {
clientconf = get_pulseaudio_client_conf();
if (!(ok = !g_file_test(clientconf, G_FILE_TEST_EXISTS))) {
g_set_error(err, quark(), 0, "Cannot block PulseAudio from respawning:\n"
"Please either remove '%s' or kill PulseAudio manually.", clientconf);
goto cleanup;
}
if (!(ok = g_file_set_contents(clientconf, "autospawn=no\n", -1, err)))
goto cleanup;
state->was_killed = TRUE;
ok = g_spawn_command_line_sync("pulseaudio -k", NULL, NULL, NULL, err);
} else if ((p = strstr(fuser, "wireplumber")) != NULL || (p = strstr(fuser2, "wireplumber")) != NULL) {
*p = '\0';
while (p != fuser && p != fuser2 && *p != '\n')
p--;
if (*p == '\n')
p++;
GRegex *regex;
GMatchInfo *match_info;
if ((ok = strstr(fuser, "pulseaudio") == NULL && strstr(fuser2, "pulseaudio") == NULL))
goto cleanup; // PulseAudio not locking the sound card
regex = g_regex_new (" ([a-zA-Z0-9_-]+) ", G_REGEX_DEFAULT, G_REGEX_MATCH_DEFAULT, NULL);
g_regex_match (regex, p, 0, &match_info);
if (g_match_info_matches (match_info))
state->user = g_match_info_fetch (match_info, 1);
g_match_info_free (match_info);
g_regex_unref (regex);
state->type = PIPEWIRE;
ok = call_systemctl(state->user, "stop", "wireplumber.service", err);
state->was_killed = ok;
} else {
// Sound server not locking the sound card
clientconf = get_pulseaudio_client_conf();
if (!(ok = !g_file_test(clientconf, G_FILE_TEST_EXISTS))) {
g_set_error(err, quark(), 0, "Cannot block PulseAudio from respawning:\n"
"Please either remove '%s' or kill PulseAudio manually.", clientconf);
goto cleanup;
}
if (!(ok = g_file_set_contents(clientconf, "autospawn=no\n", -1, err)))
goto cleanup;
*was_killed = TRUE;
ok = g_spawn_command_line_sync("pulseaudio -k", NULL, NULL, NULL, err);
cleanup:
g_free(clientconf);
@ -210,34 +161,16 @@ cleanup:
return ok;
}
static gboolean restore_soundserver(struct soundserver* state, GError** err)
static gboolean restore_pulseaudio(gboolean was_killed, GError** err)
{
gboolean ok = FALSE;
gchar* clientconf;
switch (state->type) {
case PULSEAUDIO:
clientconf = get_pulseaudio_client_conf();
if (state->was_killed && g_unlink(clientconf) != 0) {
g_set_error(err, quark(), 0, "%s", g_strerror(errno));
g_free(clientconf);
goto cleanup;
}
g_free(clientconf);
ok = TRUE;
break;
case PIPEWIRE:
if (state->was_killed)
ok = call_systemctl(state->user, "start", "wireplumber.service", err);
else
ok = TRUE;
break;
gchar* clientconf = get_pulseaudio_client_conf();
if (was_killed && g_unlink(clientconf) != 0) {
g_set_error(err, quark(), 0, "%s", g_strerror(errno));
g_free(clientconf);
return FALSE;
}
cleanup:
g_free(state->user);
state->user = NULL;
return ok;
g_free(clientconf);
return TRUE;
}
gboolean apply_changes_reconfig(pin_configs_t* pins, int entries, int card, int device,
@ -245,10 +178,10 @@ gboolean apply_changes_reconfig(pin_configs_t* pins, int entries, int card, int
{
gboolean result = FALSE;
// gchar* script_name = NULL;
struct soundserver state = { 0 };
gboolean pa_killed = FALSE;
/* Check for users of the sound card */
/* Kill pulseaudio if necessary (and possible) */
if (!kill_soundserver(&state, card, err))
if (!kill_pulseaudio(&pa_killed, card, err))
goto cleanup;
/* Create script */
if (!create_reconfig_script(pins, entries, card, device, model, hints, err))
@ -258,7 +191,7 @@ gboolean apply_changes_reconfig(pin_configs_t* pins, int entries, int card, int
goto cleanup;
result = TRUE;
cleanup:
if (!restore_soundserver(&state, result ? err : NULL)) {
if (!restore_pulseaudio(pa_killed, result ? err : NULL)) {
result = FALSE;
}
// g_free(script_name);

View file

@ -9,7 +9,7 @@ gboolean apply_changes_reconfig(pin_configs_t* pins, int entries, int card, int
gboolean apply_changes_boot(pin_configs_t* pins, int entries, int card, int device,
const char* model, const char* hints, GError** err);
gboolean reset_changes_boot(GError ** err);
gboolean reset_changes_boot();
#endif

View file

@ -8,4 +8,4 @@ AC_HEADER_STDC
PKG_CHECK_MODULES(GTK3, gtk+-3.0)
AC_OUTPUT(Makefile desktop/Makefile)
AC_OUTPUT(Makefile)

View file

@ -1,36 +0,0 @@
APPNAME = hdajackretask
desktopdir = $(datadir)/applications
desktop_DATA = $(APPNAME).desktop
public_icons = \
hicolor_apps_48x48_$(APPNAME).png \
hicolor_apps_128x128_$(APPNAME).png \
hicolor_apps_256x256_$(APPNAME).png
EXTRA_DIST = \
$(public_icons) \
$(desktop_DATA)
install-icons:
for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \
$(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
uninstall-icons:
-for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
install-data-local: install-icons
uninstall-local: uninstall-icons

View file

@ -1,8 +0,0 @@
[Desktop Entry]
Name=HDAJackRetask
GenericName=Retask the audio jacks for the HDA sound driver
Exec=hdajackretask
Terminal=false
Type=Application
Categories=AudioVideo;
Version=0.9.4

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -519,7 +519,7 @@ static void documentation_clicked(GtkWidget* sender, ui_data_t* ui)
int neww = screen ? (gdk_screen_get_width(screen)*3)/4 : 800;
int newh = screen ? (gdk_screen_get_height(screen)*3)/4 : 600;
gtk_window_set_default_size(GTK_WINDOW(dlg), MIN(1600, neww), MIN(1000, newh));
gtk_window_set_default_size(GTK_WINDOW(dlg), neww, newh);
}
gtk_dialog_run(dlg);

View file

@ -1,4 +1,3 @@
EXTRA_DIST = gitcompile
MYNAME = hdajacksensetest
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hdajacksensetest

View file

@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.

View file

@ -1,5 +1,8 @@
EXTRA_DIST = gitcompile depcomp
SUBDIRS = src pixmaps desktop
EXTRA_DIST = gitcompile hdspconf.desktop depcomp
SUBDIRS = src pixmaps
desktopdir = $(DESKTOP_DIR)
desktop_DATA = hdspconf.desktop
alsa-dist: distdir
@rm -rf ../distdir/hdspconf

View file

@ -39,4 +39,4 @@ FLTK_LIBS=`$FLTK_CONFIG $fltk_config_args --ldflags`
CXXFLAGS="$CXXFLAGS $ALSA_CFLAGS $FLTK_CXXFLAGS"
LIBS="$LIBS $ALSA_LIBS $FLTK_LIBS"
AC_OUTPUT(Makefile src/Makefile pixmaps/Makefile desktop/Makefile)
AC_OUTPUT(Makefile src/Makefile pixmaps/Makefile)

View file

@ -1,34 +0,0 @@
APPNAME = hdspconf
desktopdir = $(datadir)/applications
desktop_DATA = $(APPNAME).desktop
public_icons = \
hicolor_apps_48x48_$(APPNAME).png
EXTRA_DIST = \
$(public_icons) \
$(desktop_DATA)
install-icons:
for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \
$(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
uninstall-icons:
-for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
install-data-local: install-icons
uninstall-local: uninstall-icons

View file

@ -1,8 +1,10 @@
[Desktop Entry]
Encoding=UTF-8
Name=HDSPConf
Comment=Hammerfall DSP control application
Exec=hdspconf
Icon=hdspconf
FilePattern=hdspconf
Icon=hdspconf.png
Terminal=false
Type=Application
Categories=AudioVideo;
Categories=Application;AudioVideo;

View file

@ -1 +1,4 @@
EXTRA_DIST = $(wildcard *.xpm)
pixmapdir = $(PIXMAP_DIR)
pixmap_DATA = hdspconf.png
EXTRA_DIST = $(wildcard *.xpm) hdspconf.png

View file

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before After
Before After

View file

@ -32,7 +32,7 @@ public:
HC_AboutText(int x, int y, int w, int h);
void draw();
private:
const char *text;
char *text;
};
#endif

View file

@ -21,7 +21,7 @@
#pragma implementation
#include "HC_Aeb.h"
static void setAebStatus(const char *ctl_name, int val, int card_index)
static void setAebStatus(char *ctl_name, int val, int card_index)
{
int err;
char card_name[6];

View file

@ -21,7 +21,7 @@
#pragma implementation
#include "HC_SpdifOut.h"
static void setSpdifBit(const char *ctl_name, int val, int card_index)
static void setSpdifBit(char *ctl_name, int val, int card_index)
{
int err;
char card_name[6];

View file

@ -51,7 +51,7 @@ public:
void setAdatSyncStatus(unsigned char s);
void setWCStatus(unsigned char s);
private:
const char *adat_name;
char *adat_name;
int h_step;
Fl_Box_Draw_F *draw_box;
};

View file

@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.

View file

@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.

View file

@ -1,5 +1,8 @@
EXTRA_DIST = gitcompile depcomp
SUBDIRS = src pixmaps desktop
EXTRA_DIST = gitcompile hdspmixer.desktop depcomp
SUBDIRS = src pixmaps
desktopdir = $(DESKTOP_DIR)
desktop_DATA = hdspmixer.desktop
alsa-dist: distdir
@rm -rf ../distdir/hdspmixer

View file

@ -9,6 +9,25 @@ AC_PATH_X
AM_PATH_ALSA(1.0.0)
dnl desktop install
AC_ARG_WITH(desktop-dir,
[ --with-desktop-dir specify the path to install desktop file],
[desktopdir="$withval"], [desktopdir=""])
if test -z "$desktopdir"; then
desktopdir=$datadir/applications
fi
DESKTOP_DIR="$desktopdir"
AC_SUBST(DESKTOP_DIR)
AC_ARG_WITH(pixmap-dir,
[ --with-pixmap-dir specify the path to install desktop pixmap file],
[pixmapdir="$withval"], [pixmapdir=""])
if test -z "$pixmapdir"; then
pixmapdir=$datadir/pixmaps
fi
PIXMAP_DIR="$pixmapdir"
AC_SUBST(PIXMAP_DIR)
dnl library check
AC_PATH_PROG(FLTK_CONFIG, fltk-config, no)
if test "$FLTK_CONFIG" = "no" && ! test "`hostname -f`" = "alsa.alsa-project.org"; then
@ -20,4 +39,4 @@ FLTK_LIBS="`$FLTK_CONFIG --ldflags`"
CXXFLAGS="$CXXFLAGS $ALSA_CFLAGS $FLTK_CXXFLAGS"
LIBS="$LIBS $ALSA_LIBS $FLTK_LIBS"
AC_OUTPUT(Makefile src/Makefile pixmaps/Makefile desktop/Makefile)
AC_OUTPUT(Makefile src/Makefile pixmaps/Makefile)

View file

@ -1,34 +0,0 @@
APPNAME = hdspmixer
desktopdir = $(datadir)/applications
desktop_DATA = $(APPNAME).desktop
public_icons = \
hicolor_apps_48x48_$(APPNAME).png
EXTRA_DIST = \
$(public_icons) \
$(desktop_DATA)
install-icons:
for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \
$(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
uninstall-icons:
-for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
install-data-local: install-icons
uninstall-local: uninstall-icons

View file

@ -1,8 +1,10 @@
[Desktop Entry]
Encoding=UTF-8
Name=HDSPMixer
Comment=Hammerfall DSP matrix mixer control GUI
Exec=hdspmixer
Icon=hdspmixer
FilePattern=hdspmixer
Icon=hdspmixer.png
Terminal=false
Type=Application
Categories=AudioVideo;
Categories=Application;AudioVideo;

View file

@ -1,3 +1,4 @@
pixmapdir = $(PIXMAP_DIR)
pixmap_DATA = hdspmixer.png
EXTRA_DIST = $(wildcard *.xpm)
EXTRA_DIST = $(wildcard *.xpm) hdspmixer.png

View file

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Before After
Before After

View file

@ -1,69 +0,0 @@
/* XPM */
char const * loopback_xpm[] = {
"34 15 51 1",
" c None",
". c #2E3038",
"+ c #FFFB7C",
"@ c #FDF97B",
"# c #2E2D11",
"$ c #000000",
"% c #383716",
"& c #898740",
"* c #F1EE75",
"= c #22210A",
"- c #727034",
"; c #E2DE6D",
"> c #D5D267",
", c #787637",
"' c #FBF77A",
") c #AAA750",
"! c #ABA851",
"~ c #CDC962",
"{ c #83813C",
"] c #C8C560",
"^ c #84823D",
"/ c #F7F378",
"( c #949145",
"_ c #B7B457",
": c #949245",
"< c #353414",
"[ c #87853F",
"} c #F1ED75",
"| c #3B3A17",
"1 c #DFDB6C",
"2 c #161505",
"3 c #4B4A20",
"4 c #E5E16E",
"5 c #FEFA7C",
"6 c #E8E470",
"7 c #535124",
"8 c #FAF679",
"9 c #E7E370",
"0 c #66642E",
"a c #E4E06E",
"b c #F6F277",
"c c #EAE671",
"d c #E0DC6C",
"e c #B9B658",
"f c #5F5D2A",
"g c #EDE973",
"h c #69672F",
"i c #DDD96A",
"j c #333342",
"k c #32323E",
"l c #313136",
"..................................",
".++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++.",
".+++@#++++@$$%&*@$$=-;+@#++>,*+++.",
".+++@#++++@#+')!@#+@~{+@#+]^/++++.",
".+++@#++++@#+'!!@#+@~(+@#_:'+++++.",
".+++@#++++@$$<[}@$$$|1+@234++++++.",
".+++@#++++@#++++@#+5678@#90a+++++.",
".+++@#++++@#++++@#+59#b@#+c0d++++.",
".+++@$$$$e@#++++@$$2f]+@#++ghi+++.",
".++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++.",
"..jklllllllllkj....jklllllllllkj.."};

View file

@ -1,282 +1,220 @@
/* XPM */
char const * output_xpm[] = {
"36 224 55 1",
" c None",
". c #595966",
"+ c #2E3038",
"@ c #000000",
"# c #474951",
"$ c #404044",
"% c #7A7A8F",
"& c #27272B",
"* c #616176",
"= c #737384",
"- c #757585",
"; c #D4D4D4",
"> c #D6D6D6",
", c #D3D3D4",
"' c #C3C3C6",
") c #848491",
"! c #D5D5D5",
"~ c #CACACB",
"{ c #93939C",
"] c #9D9DA5",
"^ c #C8C8CA",
"/ c #787888",
"( c #B6B6BA",
"_ c #A3A3AA",
": c #C5C5C7",
"< c #A7A7AE",
"[ c #C4C4C6",
"} c #7D7D8C",
"| c #797989",
"1 c #C0C0C2",
"2 c #AFAFB4",
"3 c #BFBFC2",
"4 c #D3D3D3",
"5 c #95959F",
"6 c #D5D5D6",
"7 c #D1D1D2",
"8 c #91919B",
"9 c #757586",
"0 c #8E8E99",
"a c #D1D1D1",
"b c #8F8F99",
"c c #CBCBCD",
"d c #92929C",
"e c #7F7F8D",
"f c #8C8C97",
"g c #96969F",
"h c #AFAFB5",
"i c #CECECF",
"j c #A6A6AD",
"k c #8A8A96",
"l c #CCCCCD",
"m c #9898A1",
"n c #333342",
"o c #32323E",
"p c #313136",
"....................................",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++++++++++++@@@@@@@@@@++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
"....................................",
".++++++++++++++++++++++++++++++++++.",
".+================================+.",
".+================================+.",
".+================================+.",
".+===-;====->>,')->>!~{=-;==]^)===+.",
".+===-;====-;=/((-;=-_:=-;=<[}====+.",
".+===-;====-;=|((-;=-_1=-;23/=====+.",
".+===-;====->>,[)->>>45=-678======+.",
".+===-;====-;====-;=90a|-;bcd=====+.",
".+===-;====-;====-;=9b;e-;=fcg====+.",
".+===->>>>h-;====->>6ij=-;==klm===+.",
".+================================+.",
".+================================+.",
".+================================+.",
".++nopppppppppon++++nopppppppppon++.",
"...................................."};
"36 208 9 1",
" c #595966",
". c #2E3038",
"+ c #000000",
"@ c #474951",
"# c #404044",
"$ c #7A7A8F",
"% c #27272B",
"& c #616176",
"* c #737384",
" ",
" .................................. ",
" .................................. ",
" .................................. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" ..................++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ..................++++++++++...... ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" .................................. ",
" .................................. ",
" .................................. ",
" "};

View file

@ -1,282 +1,220 @@
/* XPM */
char const * output_r_xpm[] = {
"36 224 55 1",
" c None",
". c #595966",
"+ c #2E3038",
"@ c #000000",
"# c #474951",
"$ c #404044",
"% c #7A7A8F",
"& c #27272B",
"* c #616176",
"= c #737384",
"- c #757585",
"; c #D4D4D4",
"> c #D6D6D6",
", c #D3D3D4",
"' c #C3C3C6",
") c #848491",
"! c #D5D5D5",
"~ c #CACACB",
"{ c #93939C",
"] c #9D9DA5",
"^ c #C8C8CA",
"/ c #787888",
"( c #B6B6BA",
"_ c #A3A3AA",
": c #C5C5C7",
"< c #A7A7AE",
"[ c #C4C4C6",
"} c #7D7D8C",
"| c #797989",
"1 c #C0C0C2",
"2 c #AFAFB4",
"3 c #BFBFC2",
"4 c #D3D3D3",
"5 c #95959F",
"6 c #D5D5D6",
"7 c #D1D1D2",
"8 c #91919B",
"9 c #757586",
"0 c #8E8E99",
"a c #D1D1D1",
"b c #8F8F99",
"c c #CBCBCD",
"d c #92929C",
"e c #7F7F8D",
"f c #8C8C97",
"g c #96969F",
"h c #AFAFB5",
"i c #CECECF",
"j c #A6A6AD",
"k c #8A8A96",
"l c #CCCCCD",
"m c #9898A1",
"n c #333342",
"o c #32323E",
"p c #313136",
"....................................",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".+#######$%###+++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++&*++++++++@@@@@@@@@@++++++.",
".++++++++++++++++++@@@@@@@@@@++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++==============================++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
".++++++++++++++++++++++++++++++++++.",
"....................................",
".++++++++++++++++++++++++++++++++++.",
".+================================+.",
".+================================+.",
".+================================+.",
".+===-;====->>,')->>!~{=-;==]^)===+.",
".+===-;====-;=/((-;=-_:=-;=<[}====+.",
".+===-;====-;=|((-;=-_1=-;23/=====+.",
".+===-;====->>,[)->>>45=-678======+.",
".+===-;====-;====-;=90a|-;bcd=====+.",
".+===-;====-;====-;=9b;e-;=fcg====+.",
".+===->>>>h-;====->>6ij=-;==klm===+.",
".+================================+.",
".+================================+.",
".+================================+.",
".++nopppppppppon++++nopppppppppon++.",
"...................................."};
"36 208 9 1",
" c #595966",
". c #2E3038",
"+ c #000000",
"@ c #474951",
"# c #404044",
"$ c #7A7A8F",
"% c #27272B",
"& c #616176",
"* c #737384",
" ",
" .................................. ",
" .................................. ",
" .................................. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" ..................++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" .@@@@@@@#$@@@.....++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ........%&........++++++++++...... ",
" ..................++++++++++...... ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" ..++++++++++++++++++++++++++++++.. ",
" .................................. ",
" .................................. ",
" .................................. ",
" .................................. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" ..******************************.. ",
" .................................. ",
" .................................. ",
" .................................. ",
" "};

View file

@ -231,8 +231,6 @@ void HDSPMixerCard::adjustSettings() {
/* should never happen */
break;
}
max_channels = sizeof(channel_map_mf_ss);
}
if (type == Digiface) {
@ -255,8 +253,6 @@ void HDSPMixerCard::adjustSettings() {
/* should never happen */
break;
}
max_channels = sizeof(channel_map_df_ss);
}
if (type == RPM) {
@ -267,8 +263,6 @@ void HDSPMixerCard::adjustSettings() {
channel_map_input = channel_map_playback = channel_map_rpm;
dest_map = dest_map_rpm;
meter_map_input = meter_map_playback = channel_map_rpm;
max_channels = sizeof(channel_map_rpm);
}
@ -292,8 +286,6 @@ void HDSPMixerCard::adjustSettings() {
/* should never happen */
break;
}
max_channels = sizeof(channel_map_df_ss);
}
if (type == H9632) {
@ -320,8 +312,6 @@ void HDSPMixerCard::adjustSettings() {
meter_map_input = meter_map_playback = channel_map_h9632_qs;
break;
}
max_channels = sizeof(channel_map_h9632_ss);
}
if (HDSPeMADI == type) {
@ -351,7 +341,6 @@ void HDSPMixerCard::adjustSettings() {
break;
}
max_channels = sizeof(channel_map_unity_ss);
}
if (HDSPeAIO == type) {
@ -390,7 +379,6 @@ void HDSPMixerCard::adjustSettings() {
break;
}
max_channels = sizeof(channel_map_aio_out_ss);
}
if (HDSP_AES == type) {
@ -406,7 +394,6 @@ void HDSPMixerCard::adjustSettings() {
meter_map_input = channel_map_aes32;
meter_map_playback = channel_map_aes32;
max_channels = sizeof(channel_map_aes32);
}
if (HDSPeRayDAT == type) {
@ -439,7 +426,6 @@ void HDSPMixerCard::adjustSettings() {
break;
}
max_channels = sizeof(channel_map_raydat_ss);
}
window_width = (channels_playback+2)*STRIP_WIDTH;
@ -559,23 +545,3 @@ int HDSPMixerCard::initializeCard(HDSPMixerWindow *w)
return 0;
}
int HDSPMixerCard::supportsLoopback() const
{
int err = 0;
snd_ctl_elem_value_t *elemval;
snd_ctl_elem_id_t * elemid;
snd_ctl_t *handle;
snd_ctl_elem_value_alloca(&elemval);
snd_ctl_elem_id_alloca(&elemid);
if ((err = snd_ctl_open(&handle, name, SND_CTL_NONBLOCK)) < 0)
return err;
snd_ctl_elem_id_set_name(elemid, "Output Loopback");
snd_ctl_elem_id_set_interface(elemid, SND_CTL_ELEM_IFACE_HWDEP);
snd_ctl_elem_id_set_index(elemid, 0);
snd_ctl_elem_value_set_id(elemval, elemid);
err = snd_ctl_elem_read(handle, elemval);
snd_ctl_close(handle);
return err;
}

View file

@ -52,7 +52,6 @@ public:
HDSPMixerCard(int cardtype, int id, char *shortname);
int channels_input, channels_playback, window_width, window_height, card_id;
int channels_output;
int max_channels;
int type;
int last_preset; /* Last activated preset before switching to another card */
int last_dirty; /* Last dirty flag before switching to another card */
@ -69,7 +68,6 @@ public:
void adjustSettings();
void getAeb();
hdsp_9632_aeb_t h9632_aeb;
int supportsLoopback() const;
};
#endif

View file

@ -1,133 +0,0 @@
/*
* HDSPMixer
*
* Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
*
* 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 General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#pragma implementation
#include "HDSPMixerLoopback.h"
HDSPMixerLoopback::HDSPMixerLoopback(int x, int y, int idx):Fl_Widget(x, y, 34, 15)
{
basew = (HDSPMixerWindow *)window();
index = idx;
}
void HDSPMixerLoopback::draw()
{
if (_loopback == 1)
fl_draw_pixmap(loopback_xpm, x(), y());
}
int HDSPMixerLoopback::get()
{
auto const card { basew->cards[basew->current_card] };
if (card->supportsLoopback() != 0)
return -1;
if (index >= card->max_channels)
return -1;
int err;
snd_ctl_elem_value_t *elemval;
snd_ctl_elem_id_t * elemid;
snd_ctl_t *handle;
snd_ctl_elem_value_alloca(&elemval);
snd_ctl_elem_id_alloca(&elemid);
char const * const name = basew->cards[basew->current_card]->name;
if ((err = snd_ctl_open(&handle, name, SND_CTL_NONBLOCK)) < 0) {
fprintf(stderr, "Error accessing ctl interface on card %s\n.", name);
return -1;
}
snd_ctl_elem_id_set_name(elemid, "Output Loopback");
snd_ctl_elem_id_set_interface(elemid, SND_CTL_ELEM_IFACE_HWDEP);
snd_ctl_elem_id_set_index(elemid, index);
snd_ctl_elem_value_set_id(elemval, elemid);
if ((err = snd_ctl_elem_read(handle, elemval)) < 0)
fprintf(stderr, "cannot read loopback: %d\n", err);
else
_loopback = snd_ctl_elem_value_get_integer(elemval, 0);
snd_ctl_close(handle);
return _loopback;
}
void HDSPMixerLoopback::set(int l)
{
auto const card { basew->cards[basew->current_card] };
if (card->supportsLoopback() != 0)
return;
if (index >= card->max_channels)
return;
if (l != _loopback) {
int err;
snd_ctl_elem_id_t *id;
snd_ctl_elem_value_t *ctl;
snd_ctl_t *handle;
snd_ctl_elem_value_alloca(&ctl);
snd_ctl_elem_id_alloca(&id);
snd_ctl_elem_id_set_name(id, "Output Loopback");
snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_HWDEP);
snd_ctl_elem_id_set_device(id, 0);
snd_ctl_elem_id_set_index(id, index);
snd_ctl_elem_value_set_id(ctl, id);
if ((err = snd_ctl_open(
&handle, basew->cards[basew->current_card]->name, SND_CTL_NONBLOCK)) < 0) {
fprintf(stderr, "Alsa error 1: %s\n", snd_strerror(err));
return;
}
snd_ctl_elem_value_set_integer(ctl, 0, l);
if ((err = snd_ctl_elem_write(handle, ctl)) < 0) {
fprintf(stderr, "Alsa error 2: %s\n", snd_strerror(err));
snd_ctl_close(handle);
return;
}
_loopback = l;
snd_ctl_close(handle);
redraw();
}
}
int HDSPMixerLoopback::handle(int e)
{
int button3 = Fl::event_button3();
switch (e) {
case FL_PUSH:
set(!_loopback);
if (button3)
relative->set(_loopback);
basew->checkState();
redraw();
return 1;
default:
return Fl_Widget::handle(e);
}
}

View file

@ -1,48 +0,0 @@
/*
* HDSPMixer
*
* Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
*
* 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 General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#pragma interface
#ifndef HDSPMixerLoopback_H
#define HDSPMixerLoopback_H
#include <FL/Fl.H>
#include <FL/Fl_Widget.H>
#include "HDSPMixerWindow.h"
#include "pixmaps.h"
class HDSPMixerWindow;
class HDSPMixerLoopback:public Fl_Widget
{
private:
HDSPMixerWindow *basew;
int _loopback{-1};
public:
HDSPMixerLoopback *relative;
int index;
HDSPMixerLoopback(int x, int y, int idx);
void draw();
int handle(int e);
int get();
void set(int l);
};
#endif

View file

@ -93,7 +93,7 @@ static char const *labels_aio_ss_input[18] = {
"AES.L", "AES.R",
"A 1", "A 2", "A 3", "A 4",
"A 5", "A 6", "A 7", "A 8",
"AEB 1", "AEB 2", "AEB 3", "AEB 4"
"AEB 1", "AEB 2", "AEB 3," "AEB 4"
};
static char const *labels_aio_ss_playback[20] = {
@ -204,7 +204,6 @@ HDSPMixerOutput::HDSPMixerOutput(int x, int y, int w, int h, int num):Fl_Group(x
peak = new HDSPMixerPeak(x+3, y+4, 0);
gain = new HDSPMixerGain(x+3, y+175, 0);
meter = new HDSPMixerMeter(x+20, y+27, false, peak);
loopback = new HDSPMixerLoopback(x+1, y+208, out_num);
end();
}

View file

@ -27,7 +27,6 @@
#include <FL/fl_draw.H>
#include <alsa/sound/hdsp.h>
#include "HDSPMixerFader.h"
#include "HDSPMixerLoopback.h"
#include "HDSPMixerPeak.h"
#include "HDSPMixerGain.h"
#include "HDSPMixerMeter.h"
@ -37,7 +36,6 @@
class HDSPMixerFader;
class HDSPMixerGain;
class HDSPMixerLoopback;
class HDSPMixerPeak;
class HDSPMixerMeter;
class HDSPMixerOutputData;
@ -58,7 +56,6 @@ public:
HDSPMixerFader *fader;
HDSPMixerGain *gain;
HDSPMixerMeter *meter;
HDSPMixerLoopback *loopback;
HDSPMixerOutput(int x, int y, int w, int h, int out);
void draw();
void draw_background();

View file

@ -26,7 +26,6 @@ class HDSPMixerOutputData
{
public:
int fader_pos;
int loopback;
HDSPMixerOutputData();
};

View file

@ -25,15 +25,13 @@ HDSPMixerOutputs::HDSPMixerOutputs(int x, int y, int w, int h, int nchans):Fl_Gr
{
int i;
for (i = 0; i < HDSP_MAX_CHANNELS+2; i += 2) {
strips[i] = new HDSPMixerOutput((i*STRIP_WIDTH), y, STRIP_WIDTH, SMALLSTRIP_HEIGHT, i);
strips[i] = new HDSPMixerOutput((i*STRIP_WIDTH), y, STRIP_WIDTH, SMALLSTRIP_HEIGHT, i);
strips[i+1] = new HDSPMixerOutput(((i+1)*STRIP_WIDTH), y, STRIP_WIDTH, SMALLSTRIP_HEIGHT, i+1);
/* Setup linked stereo channels */
strips[i]->fader->relative = strips[i+1]->fader;
strips[i+1]->fader->relative = strips[i]->fader;
strips[i]->fader->gain = strips[i]->gain;
strips[i+1]->fader->gain = strips[i+1]->gain;
strips[i]->loopback->relative = strips[i+1]->loopback;
strips[i+1]->loopback->relative = strips[i]->loopback;
}
empty_aebo[0] = new HDSPMixerEmpty((nchans-6)*STRIP_WIDTH, y, 2*STRIP_WIDTH, SMALLSTRIP_HEIGHT, 0);

View file

@ -36,6 +36,5 @@ HDSPMixerPresetData::HDSPMixerPresetData()
over = 3;
level = 0;
rate = 1;
loopback = 0;
}

View file

@ -38,7 +38,6 @@ public:
int over;
int rate;
int rmsplus3;
int loopback;
HDSPMixerPresetData();
};

View file

@ -143,7 +143,6 @@ void HDSPMixerPresets::save_preset(int prst) {
basew->playbacks->strips[i]->data[card][speed][p]->dest = basew->playbacks->strips[i]->targets->selected;
basew->outputs->strips[i]->data[card][speed][p]->fader_pos = basew->outputs->strips[i]->fader->pos[0];
basew->outputs->strips[i]->data[card][speed][p]->loopback = basew->outputs->strips[i]->loopback->get();
}
/* Line outs */
basew->outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][p]->fader_pos = basew->outputs->strips[HDSP_MAX_CHANNELS]->fader->pos[0];
@ -189,7 +188,6 @@ void HDSPMixerPresets::restore_preset(int prst) {
basew->playbacks->strips[i]->targets->selected = basew->playbacks->strips[i]->data[card][speed][p]->dest;
basew->outputs->strips[i]->fader->pos[0] = basew->outputs->strips[i]->data[card][speed][p]->fader_pos;
basew->outputs->strips[i]->loopback->set(basew->outputs->strips[i]->data[card][speed][p]->loopback);
}
/* Line outs */
basew->outputs->strips[HDSP_MAX_CHANNELS]->fader->pos[0] = basew->outputs->strips[HDSP_MAX_CHANNELS+1]->data[card][speed][p]->fader_pos;

View file

@ -35,8 +35,8 @@ static void readregisters_cb(void *arg)
hdsp_peak_rms_t hdsp_peak_rms;
struct hdspm_peak_rms hdspm_peak_rms;
bool isMADI = false;
__u32 *input_peaks, *playback_peaks, *output_peaks;
__u64 *input_rms, *playback_rms, *output_rms;
uint32_t *input_peaks, *playback_peaks, *output_peaks;
uint64_t *input_rms, *playback_rms, *output_rms;
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
@ -353,25 +353,18 @@ void HDSPMixerWindow::save()
sizeof(inputs->strips[0]->data[0][0][0]->fader_pos) /
sizeof(inputs->strips[0]->data[0][0][0]->fader_pos[0]));
FILE *in,*out;
/* We want to append any existing extra data that might got written by a
* newer version to this file, therefore write our data to file_name.tmp
* and append the old data. Also this way we would not corrupt the file
* should we crash.
*/
std::string const tmp = file_name + std::string(".tmp");
char const * const tmpc = tmp.c_str();
FILE *file;
if ((out = fopen(tmpc, "w")) == NULL) {
fl_alert("Error opening file %s for saving", tmpc);
if ((file = fopen(file_name, "w")) == NULL) {
fl_alert("Error opening file %s for saving", file_name);
}
if (dirty) {
inputs->buttons->presets->save_preset(current_preset+1);
}
/* since hdspmixer 1.11, we also store the meter level settings. Indicate
* the new on-disk structure via a small header */
if (fwrite((void *)&header, sizeof(char), sizeof(header), out) !=
if (fwrite((void *)&header, sizeof(char), sizeof(header), file) !=
sizeof(header)) {
goto save_error;
}
@ -381,145 +374,99 @@ void HDSPMixerWindow::save()
for (int preset = 0; preset < 8; ++preset) {
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
/* inputs pans and volumes */
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, out) != pan_array_size) {
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto save_error;
}
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, out) != pan_array_size) {
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto save_error;
}
/* playbacks pans and volumes */
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, out) != pan_array_size) {
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto save_error;
}
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, out) != pan_array_size) {
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto save_error;
}
/* inputs mute/solo/dest */
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->mute), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->solo), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->dest), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->dest), sizeof(int), 1, file) != 1) {
goto save_error;
}
/* playbacks mute/solo/dest */
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->mute), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->solo), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->dest), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->dest), sizeof(int), 1, file) != 1) {
goto save_error;
}
/* outputs volumes */
if (fwrite((void *)&(outputs->strips[channel]->data[card][speed][preset]->fader_pos), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(outputs->strips[channel]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
goto save_error;
}
}
/* Lineouts */
if (fwrite((void *)&(outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][preset]->fader_pos), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(outputs->strips[HDSP_MAX_CHANNELS+1]->data[card][speed][preset]->fader_pos), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(outputs->strips[HDSP_MAX_CHANNELS+1]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
goto save_error;
}
/* Global settings */
if (fwrite((void *)&(data[card][speed][preset]->input), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->input), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->output), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->output), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->playback), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->playback), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->submix), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->submix), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->submix_value), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->submix_value), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->solo), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->mute), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->last_destination), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->last_destination), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->rmsplus3), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->rmsplus3), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->numbers), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->numbers), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->over), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->over), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->level), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->level), sizeof(int), 1, file) != 1) {
goto save_error;
}
if (fwrite((void *)&(data[card][speed][preset]->rate), sizeof(int), 1, out) != 1) {
if (fwrite((void *)&(data[card][speed][preset]->rate), sizeof(int), 1, file) != 1) {
goto save_error;
}
}
}
}
/* Output loopback data */
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
auto const strip = outputs->strips[channel];
for (int card = 0; card < MAX_CARDS; ++card) {
auto const data = strip->data[card];
for (int speed = 0; speed < 3; ++speed) {
auto const spd = data[speed];
for (int preset = 0; preset < 8; ++preset) {
auto const data = spd[preset];
if (fwrite((void *)&(data->loopback),
sizeof(int),
1,
out) != 1)
goto save_error;
}
}
}
}
/* If the file we want to write already exists it could be possible that it
* was saved with a newer version. If that is the case we just append its
* content to the new output file and that way ensure that we don't lose any
* data the new version wrote.
*/
if ((in = fopen(file_name, "r")) != NULL) {
if (!fseek(in, ftell(out), SEEK_SET)) {
char buff[512];
size_t read;
while ((read = fread(&buff, sizeof(char), sizeof(buff), in)) != 0)
fwrite(buff, sizeof(char), read, out);
if (ferror(in) || ferror(out))
fl_alert("Error appending %s to %s", file_name, tmpc);
}
fclose(in);
}
fclose(out);
if (rename(tmpc, file_name))
fl_alert("Error renaming %s to %s", tmpc, file_name);
::remove(tmpc);
fclose(file);
return;
save_error:
fclose(out);
fclose(file);
fl_alert("Error saving presets to file %s", file_name);
return;
}
@ -542,7 +489,6 @@ void HDSPMixerWindow::load()
bool ondisk_v1 = false;
int pan_array_size = 14; /* old (pre 1.0.24) HDSP_MAX_DEST */
int channels_per_card = 26; /* old (pre 1.0.24) HDSP_MAX_CHANNELS */
bool res = true;
if (fread(&buffer, sizeof(char), sizeof(buffer), file) != sizeof(buffer)) {
goto load_error;
@ -671,46 +617,6 @@ void HDSPMixerWindow::load()
}
}
}
/* Output loopback data */
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
auto const strip = outputs->strips[channel];
for (int card = 0; card < MAX_CARDS; ++card) {
auto const data = strip->data[card];
for (int speed = 0; speed < 3; ++speed) {
auto const spd = data[speed];
for (int preset = 0; preset < 8; ++preset) {
auto const data = spd[preset];
/* TODO: Somewhere we get a value of 5 from, investigate
* this another day. For now just reset it here and
* continue looping to reset the value.
*/
data->loopback = 0;
if (feof(file)) {
res = true;
continue;
}
if (ferror(file)) {
res = false;
continue;
}
if (fread((void *)&(data->loopback), sizeof(int), 1, file) != 1)
res = false;
}
}
}
}
if (!res)
goto load_error;
fclose(file);
setTitleWithFilename();
resetMixer();
@ -908,8 +814,6 @@ void HDSPMixerWindow::restoreDefaults(int card)
}
outputs->strips[i]->data[card][speed][preset]->fader_pos = (preset != 4) ? 137*CF : 0;
outputs->strips[i+1]->data[card][speed][preset]->fader_pos = (preset != 4) ? 137*CF : 0;
outputs->strips[i]->data[card][speed][preset]->loopback = 0;
outputs->strips[i+1]->data[card][speed][preset]->loopback = 0;
if (preset == 3 || preset == 7) {
inputs->strips[i]->data[card][speed][preset]->mute = 1;
inputs->strips[i+1]->data[card][speed][preset]->mute = 1;
@ -1117,8 +1021,6 @@ void HDSPMixerWindow::checkState()
/* Outputs row */
if (outputs->strips[i]->data[current_card][speed][p]->fader_pos != outputs->strips[i]->fader->pos[0])
corrupt++;
if (outputs->strips[i]->data[current_card][speed][p]->loopback != outputs->strips[i]->loopback->get())
corrupt++;
}
/* Global settings */

View file

@ -15,8 +15,6 @@ hdspmixer_SOURCES = \
HDSPMixerEmpty.h \
HDSPMixerOutput.cxx \
HDSPMixerOutput.h \
HDSPMixerLoopback.cxx \
HDSPMixerLoopback.h \
HDSPMixerIOMixer.cxx \
HDSPMixerIOMixer.h \
HDSPMixerSelector.cxx \

View file

@ -55,7 +55,7 @@ char channel_map_mf_ss[26] = {
16, 17, 18, 19, 20, 21, 22, 23, /* ADAT */
24, 25, /* SPDIF */
26, 27, /* Phones L+R, only a destination channel */
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1
-1, -1, -1, -1, -1, -1
};
// Digiface/Multiface
@ -65,13 +65,13 @@ char meter_map_ds[26] = {
16, 17, 18, 19, /* ADAT on Multiface, ADAT3 on Digiface */
24, 25, /* SPDIF */
26, 27, /* Headphones */
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
char channel_map_ds[26] = {
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
24, 25,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
char dest_map_ds[8] = {
@ -84,10 +84,10 @@ char dest_map_rpm[3] = {
};
char channel_map_rpm[26] = {
0, 1, 2, 3, 4, 5, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1
0, 1, 2, 3, 4, 5, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1
};
// HDSP 9652
@ -158,21 +158,21 @@ char channel_map_unity_ds[HDSPM_MAX_CHANNELS] = {
16, 18, 20, 22, 24, 26, 28, 30,
32, 34, 36, 38, 40, 42, 44, 46,
48, 50, 52, 54, 56, 58, 60, 62,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
};
char channel_map_unity_qs[HDSPM_MAX_CHANNELS] = {
0, 4, 8, 12, 16, 20, 24, 28,
32, 36, 40, 44, 48, 52, 56, 60,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
};
// HDSPe RayDAT
@ -208,10 +208,10 @@ char channel_map_raydat_ss[HDSPM_MAX_CHANNELS] = {
28, 29, 30, 31, 32, 33, 34, 35, /* ADAT 4 */
0, 1, /* AES */
2, 3, /* SPDIF */
(char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
-1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
};
char channel_map_raydat_ds[HDSPM_MAX_CHANNELS] = {
@ -221,12 +221,12 @@ char channel_map_raydat_ds[HDSPM_MAX_CHANNELS] = {
16, 17, 18, 19, /* ADAT 4 */
0, 1, /* AES */
2, 3, /* SPDIF */
(char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
-1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
};
char channel_map_raydat_qs[HDSPM_MAX_CHANNELS] = {
@ -236,13 +236,13 @@ char channel_map_raydat_qs[HDSPM_MAX_CHANNELS] = {
10, 11, /* ADAT 4 */
0, 1, /* AES */
2, 3, /* SPDIF */
(char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
-1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
};
// HDSPe AIO
@ -284,12 +284,12 @@ char channel_map_aio_in_ss[HDSPM_MAX_CHANNELS] = {
10, 11, /* spdif in */
12, 13, 14, 15, 16, 17, 18, 19, /* ADAT in */
2, 3, 4, 5, /* AEB */
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
-1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
};
char channel_map_aio_out_ss[HDSPM_MAX_CHANNELS] = {
@ -299,12 +299,12 @@ char channel_map_aio_out_ss[HDSPM_MAX_CHANNELS] = {
12, 13, 14, 15, 16, 17, 18, 19, /* ADAT out */
6, 7, /* phone out */
2, 3, 4, 5, /* AEB */
(char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
-1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
};
char channel_map_aio_in_ds[HDSPM_MAX_CHANNELS] = {
@ -313,13 +313,13 @@ char channel_map_aio_in_ds[HDSPM_MAX_CHANNELS] = {
10, 11, /* spdif in */
12, 14, 16, 18, /* adat in */
2, 3, 4, 5, /* AEB */
(char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1
-1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
char channel_map_aio_out_ds[HDSPM_MAX_CHANNELS] = {
@ -329,12 +329,12 @@ char channel_map_aio_out_ds[HDSPM_MAX_CHANNELS] = {
12, 14, 16, 18, /* adat out */
6, 7, /* phone out */
2, 3, 4, 5, /* AEB */
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
char channel_map_aio_in_qs[HDSPM_MAX_CHANNELS] = {
@ -343,13 +343,13 @@ char channel_map_aio_in_qs[HDSPM_MAX_CHANNELS] = {
10, 11, /* spdif in */
12, 16, /* adat in */
2, 3, 4, 5, /* AEB */
(char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1
-1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
char channel_map_aio_out_qs[HDSPM_MAX_CHANNELS] = {
@ -359,13 +359,13 @@ char channel_map_aio_out_qs[HDSPM_MAX_CHANNELS] = {
12, 16, /* adat out */
6, 7, /* phone out */
2, 3, 4, 5, /* AEB */
(char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1
-1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
// HDSP AES32 and HDSPe AES
@ -383,11 +383,11 @@ char channel_map_aes32[HDSPM_MAX_CHANNELS] = {
10, 11, /* AES 6 */
12, 13, /* AES 7 */
14, 15, /* AES 8 */
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};

View file

@ -34,7 +34,7 @@
#define STRIP_WIDTH 36
#define FULLSTRIP_HEIGHT 253
#define SMALLSTRIP_HEIGHT 224
#define SMALLSTRIP_HEIGHT 208
#define MENU_HEIGHT 20
#define MIN_WIDTH 2*STRIP_WIDTH

View file

@ -39,7 +39,7 @@ int main(int argc, char **argv)
{
HDSPMixerWindow *window;
HDSPMixerCard *hdsp_cards[3];
char *name = NULL, *shortname;
char *name, *shortname;
int card;
int cards = 0;

View file

@ -47,7 +47,6 @@
#include "../pixmaps/over.xpm"
#include "../pixmaps/peak.xpm"
#include "../pixmaps/solo.xpm"
#include "../pixmaps/loopback.xpm"
#include "../pixmaps/iomixer_r.xpm"
#include "../pixmaps/output_r.xpm"
#include "../pixmaps/matrix_black.xpm"

View file

@ -49,7 +49,6 @@ extern char const * output_xpm[];
extern char const * over_xpm[];
extern char const * peak_xpm[];
extern char const * solo_xpm[];
extern char const * loopback_xpm[];
extern char const * iomixer_r_xpm[];
extern char const * output_r_xpm[];
extern char const * matrix_white_xpm[];

View file

@ -1,5 +1,4 @@
# Process this file with automake to produce Makefile.in.
SUBDIRS = desktop
# # Process this file with automake to procude Makefile.in.
bin_SCRIPTS = hwmixvolume
#man_MANS =
EXTRA_DIST = gitcompile hwmixvolume

View file

@ -8,8 +8,7 @@ that use hardware mixing, i.e., those based on the following chips:
* Yamaha DS-1 (YMF-724/740/744/754) (driver: snd-ymfpci)
This tool requires Python, PyGObject, GTK+ 3.0 or later, and alsa-python 1.0.22
or later.
This tool requires Python, pygtk, and alsa-pyton 1.0.22 or later.
It is recommended to use at least Linux kernel 2.6.32 or alsa-driver 1.0.22;
otherwise, the name of the program that is using a stream cannot be shown.

View file

@ -4,4 +4,4 @@ AM_INIT_AUTOMAKE
AM_MAINTAINER_MODE([enable])
AC_CONFIG_SRCDIR([hwmixvolume])
AC_PROG_INSTALL
AC_OUTPUT([Makefile desktop/Makefile])
AC_OUTPUT([Makefile])

View file

@ -1,36 +0,0 @@
APPNAME = hwmixvolume
desktopdir = $(datadir)/applications
desktop_DATA = $(APPNAME).desktop
public_icons = \
hicolor_apps_256x256_$(APPNAME).png \
hicolor_apps_128x128_$(APPNAME).png \
hicolor_apps_48x48_$(APPNAME).png
EXTRA_DIST = \
$(public_icons) \
$(desktop_DATA)
install-icons:
for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \
$(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
uninstall-icons:
-for icon in $(public_icons); do \
THEME=`echo $$icon | cut -d_ -f1`; \
CONTEXT=`echo $$icon | cut -d_ -f2`; \
SIZE=`echo $$icon | cut -d_ -f3`; \
ICONFILE=`echo $$icon | cut -d_ -f4`; \
rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
done
install-data-local: install-icons
uninstall-local: uninstall-icons

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -1,9 +0,0 @@
[Desktop Entry]
Name=Hwmixvolume
GenericName=Control the volume of individual streams on sound cards that use hardware mixing
Exec=hwmixvolume
Icon=hwmixvolume
Terminal=false
Type=Application
Categories=AudioVideo;
Version=0.9.4

View file

@ -2,7 +2,6 @@
# hwmixvolume - ALSA hardware mixer volume control applet
# Copyright (c) 2009-2010 Clemens Ladisch
# Copyright (c) 2018 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
@ -16,10 +15,7 @@
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
import gi
gi.require_version('GLib', '2.0')
gi.require_version('Gtk', '3.0')
from gi.repository import GLib, Gtk
import gobject, gtk
from pyalsa import alsacard, alsahcontrol
INTF_PCM = alsahcontrol.interface_id['PCM']
@ -30,283 +26,285 @@ EVENT_INFO = alsahcontrol.event_mask['INFO']
EVENT_REMOVE = alsahcontrol.event_mask_remove
class Stream:
def __init__(self, element, parent):
self.element = element
self.element.set_callback(self)
self.parent = parent
self.label = None
self.scales = []
self.adjustments = []
self.callback(self.element, EVENT_INFO)
def __init__(self, element, parent):
self.element = element
self.element.set_callback(self)
self.parent = parent
self.label = None
self.scales = []
self.adjustments = []
self.callback(self.element, EVENT_INFO)
def destroy(self):
self.deactivate()
def destroy(self):
self.deactivate()
def callback(self, e, mask):
if mask == EVENT_REMOVE:
self.deactivate()
elif (mask & EVENT_INFO) != 0:
info = alsahcontrol.Info(self.element)
if info.is_inactive:
self.deactivate()
else:
self.activate()
elif (mask & EVENT_VALUE) != 0:
self.update_scales_from_ctl()
def callback(self, e, mask):
if mask == EVENT_REMOVE:
self.deactivate()
elif (mask & EVENT_INFO) != 0:
info = alsahcontrol.Info(self.element)
if info.is_inactive:
self.deactivate()
else:
self.activate()
elif (mask & EVENT_VALUE) != 0:
self.update_scales_from_ctl()
def activate(self):
if self.label:
return
info = alsahcontrol.Info(self.element)
value = alsahcontrol.Value(self.element)
value.read()
values = value.get_tuple(TYPE_INTEGER, info.count)
self.label = Gtk.Label.new(self.get_label(info))
self.label.set_single_line_mode(True)
self.parent.scales_vbox.add(self.label)
for i in range(info.count):
adj = Gtk.Adjustment(value=values[i],
lower=info.min, upper=info.max,
step_incr=1,
page_incr=(info.max-info.min+1)/8)
adj.connect('value-changed', self.update_ctl_from_scale, i)
scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adj)
scale.set_draw_value(False)
self.parent.scales_vbox.add(scale)
self.scales.append(scale)
self.adjustments.append(adj)
self.parent.scales_vbox.show_all()
self.parent.update_msg_label()
def activate(self):
if self.label:
return
info = alsahcontrol.Info(self.element)
value = alsahcontrol.Value(self.element)
value.read()
values = value.get_tuple(TYPE_INTEGER, info.count)
self.label = gtk.Label(self.get_label(info))
self.label.set_single_line_mode(True)
self.parent.scales_vbox.pack_start(self.label, expand=False)
for i in range(info.count):
adj = gtk.Adjustment(value=values[i],
lower=info.min, upper=info.max,
step_incr=1,
page_incr=(info.max-info.min+1)/8)
adj.connect('value-changed', self.update_ctl_from_scale, i)
scale = gtk.HScale(adj)
scale.set_draw_value(False)
self.parent.scales_vbox.pack_start(scale, expand=False)
self.scales.append(scale)
self.adjustments.append(adj)
self.parent.scales_vbox.show_all()
self.parent.update_msg_label()
def deactivate(self):
if not self.label:
return
self.label.destroy()
for s in self.scales:
s.destroy()
self.label = None
self.scales = []
self.adjustments = []
self.parent.update_msg_label()
def deactivate(self):
if not self.label:
return
self.label.destroy()
for s in self.scales:
s.destroy()
self.label = None
self.scales = []
self.adjustments = []
self.parent.update_msg_label()
def update_scales_from_ctl(self):
if not self.label:
return
count = len(self.adjustments)
value = alsahcontrol.Value(self.element)
value.read()
values = value.get_tuple(TYPE_INTEGER, count)
for i in range(count):
self.adjustments[i].set_value(values[i])
def update_scales_from_ctl(self):
if not self.label:
return
count = len(self.adjustments)
value = alsahcontrol.Value(self.element)
value.read()
values = value.get_tuple(TYPE_INTEGER, count)
for i in range(count):
self.adjustments[i].set_value(values[i])
def update_ctl_from_scale(self, adj, index):
scale_value = adj.get_value()
value_to_set = int(round(adj.get_value()))
count = len(self.adjustments)
value = alsahcontrol.Value(self.element)
if self.parent.lock_check.get_active():
values = [value_to_set for i in range(count)]
else:
value.read()
values = value.get_array(TYPE_INTEGER, count)
values[index] = value_to_set
value.set_array(TYPE_INTEGER, values)
value.write()
if value_to_set != scale_value:
adj.set_value(value_to_set)
def update_ctl_from_scale(self, adj, index):
scale_value = adj.get_value()
value_to_set = int(round(adj.get_value()))
count = len(self.adjustments)
value = alsahcontrol.Value(self.element)
if self.parent.lock_check.get_active():
values = [value_to_set for i in range(count)]
else:
value.read()
values = value.get_array(TYPE_INTEGER, count)
values[index] = value_to_set
value.set_array(TYPE_INTEGER, values)
value.write()
if value_to_set != scale_value:
adj.set_value(value_to_set)
def get_label(self, info):
pid = self.get_pid(info)
if pid:
cmdline = self.get_pid_cmdline(pid)
if cmdline:
return cmdline
else:
return "PID %d" % pid
else:
name = info.name
if name[-7:] == " Volume":
name = name[:-7]
if name[-9:] == " Playback":
name = name[:-9]
return name
def get_label(self, info):
pid = self.get_pid(info)
if pid:
cmdline = self.get_pid_cmdline(pid)
if cmdline:
return cmdline
else:
return "PID %d" % pid
else:
name = info.name
if name[-7:] == " Volume":
name = name[:-7]
if name[-9:] == " Playback":
name = name[:-9]
return name
def get_pid(self, info):
card = self.parent.current_card
device = info.device
subdevice = info.subdevice
if subdevice == 0:
subdevice = info.index
filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice)
try:
with open(filename, "r") as f:
for line in f:
if line[:9] == "owner_pid":
return int(line.split(':')[1].strip())
except IOError:
return None
return None
def get_pid(self, info):
card = self.parent.current_card
device = info.device
subdevice = info.subdevice
if subdevice == 0:
subdevice = info.index
filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice)
try:
f = open(filename, "r")
except IOError:
return None
try:
for line in f.readlines():
if line[:9] == "owner_pid":
return int(line.split(':')[1].strip())
finally:
f.close()
return None
def get_pid_cmdline(self, pid):
try:
with open("/proc/%d/cmdline" % pid, "r") as f:
cmdline = f.read()
except IOError:
return None
return cmdline.replace('\x00', ' ').strip()
def get_pid_cmdline(self, pid):
try:
f = open("/proc/%d/cmdline" % pid, "r")
except IOError:
return None
try:
cmdline = f.read()
finally:
f.close()
return cmdline.replace('\x00', ' ').strip()
class MixerWindow(Gtk.Window):
card_numbers = alsacard.card_list()
current_card = -1
hcontrol = None
scales_vbox = None
msg_label = None
streams = []
hctl_sources = []
class MixerWindow(gtk.Window):
card_numbers = alsacard.card_list()
current_card = -1
hcontrol = None
scales_vbox = None
msg_label = None
streams = []
hctl_sources = []
def __init__(self):
Gtk.Window.__init__(self)
self.connect('destroy', lambda w: Gtk.main_quit())
self.set_title("Hardware Mixer Volumes")
def __init__(self):
gtk.Window.__init__(self)
self.connect('destroy', lambda w: gtk.main_quit())
self.set_title("Hardware Mixer Volumes")
vbox = Gtk.Grid()
vbox.set_orientation(Gtk.Orientation.VERTICAL)
self.add(vbox)
vbox = gtk.VBox()
self.add(vbox)
hbox = Gtk.Grid()
vbox.add(hbox)
hbox = gtk.HBox()
vbox.pack_start(hbox, expand=False)
label = Gtk.Label.new_with_mnemonic("_Sound Card: ")
hbox.add(label)
label = gtk.Label("_Sound Card: ")
label.set_use_underline(True)
hbox.pack_start(label, expand=False)
combo = Gtk.ComboBoxText()
combo.set_hexpand(True)
for i in self.card_numbers:
str = "%d: %s" % (i, alsacard.card_get_name(i))
combo.append_text(str)
if len(self.card_numbers) > 0:
combo.set_active(0)
combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()]))
hbox.add(combo)
label.set_mnemonic_widget(combo)
combo = gtk.combo_box_new_text()
for i in self.card_numbers:
str = "%d: %s" % (i, alsacard.card_get_name(i))
combo.append_text(str)
if len(self.card_numbers) > 0:
combo.set_active(0)
combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()]))
hbox.pack_start(combo)
label.set_mnemonic_widget(combo)
self.lock_check = Gtk.CheckButton.new_with_mnemonic(label="_Lock Channels")
self.lock_check.set_active(True)
vbox.add(self.lock_check)
self.lock_check = gtk.CheckButton(label="_Lock Channels")
self.lock_check.set_active(True)
vbox.pack_start(self.lock_check, expand=False)
scrollwin = Gtk.ScrolledWindow()
scrollwin.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC)
scrollwin.set_shadow_type(Gtk.ShadowType.NONE)
scrollwin.set_vexpand(True)
vbox.add(scrollwin)
scrollwin = gtk.ScrolledWindow()
scrollwin.set_policy(hscrollbar_policy=gtk.POLICY_NEVER, vscrollbar_policy=gtk.POLICY_AUTOMATIC)
scrollwin.set_shadow_type(gtk.SHADOW_NONE)
vbox.pack_start(scrollwin)
self.scales_vbox = Gtk.Grid()
self.scales_vbox.set_orientation(Gtk.Orientation.VERTICAL)
scrollwin.add(self.scales_vbox)
self.scales_vbox = gtk.VBox()
scrollwin.add_with_viewport(self.scales_vbox)
label = Gtk.Label()
label.set_single_line_mode(True)
line_height = max(label.get_size_request().height, 0)
label.destroy()
scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL)
scale.set_draw_value(False)
line_height += max(scale.get_size_request().height, 0)
scale.destroy()
# always have space for at least four sliders
scrollwin.set_size_request(width=-1, height=line_height*4+4)
label = gtk.Label()
label.set_single_line_mode(True)
line_height = label.size_request()[1]
label.destroy()
scale = gtk.HScale()
scale.set_draw_value(False)
line_height += scale.size_request()[1]
scale.destroy()
# always have space for at least four sliders
scrollwin.set_size_request(width=-1, height=line_height*4+4)
# TODO: select the default card or the first card with stream controls
if len(self.card_numbers) > 0:
self.change_card(self.card_numbers[0])
self.update_msg_label()
# TODO: select the default card or the first card with stream controls
if len(self.card_numbers) > 0:
self.change_card(self.card_numbers[0])
self.update_msg_label()
self.show_all()
self.show_all()
def change_card(self, cardnum):
for s in self.hctl_sources:
GLib.source_remove(s)
self.hctl_sources = []
def change_card(self, cardnum):
for s in self.hctl_sources:
gobject.source_remove(s)
self.hctl_sources = []
self.hcontrol = self.open_hcontrol_for_card(cardnum)
self.hcontrol = self.open_hcontrol_for_card(cardnum)
for s in self.streams:
s.destroy()
self.streams = []
for s in self.streams:
s.destroy()
self.streams = []
self.current_card = cardnum
self.current_card = cardnum
if not self.hcontrol:
self.update_msg_label()
return
if not self.hcontrol:
self.update_msg_label()
return
for id in self.hcontrol.list():
if not self.is_stream_elem(id):
continue
elem = alsahcontrol.Element(self.hcontrol, id[0])
info = alsahcontrol.Info(elem)
if not self.is_stream_info(info):
continue
stream = Stream(elem, self)
self.streams.append(stream)
for id in self.hcontrol.list():
if not self.is_stream_elem(id):
continue
elem = alsahcontrol.Element(self.hcontrol, id[0])
info = alsahcontrol.Info(elem)
if not self.is_stream_info(info):
continue
stream = Stream(elem, self)
self.streams.append(stream)
for fd,condition in self.hcontrol.poll_fds:
self.hctl_sources.append(GLib.io_add_watch(fd, 0, GLib.IOCondition(condition), self.hctl_io_callback))
for fd,condition in self.hcontrol.poll_fds:
self.hctl_sources.append(gobject.io_add_watch(fd, condition, self.hctl_io_callback))
self.update_msg_label()
self.update_msg_label()
self.scales_vbox.show_all()
self.scales_vbox.show_all()
def update_msg_label(self):
needs_msg = len(self.scales_vbox.get_children()) < 2
has_msg = self.msg_label
if has_msg and not needs_msg:
self.msg_label.destroy()
self.msg_label = None
elif needs_msg:
if len(self.streams) > 0:
msg = "There are no open streams."
else:
msg = "This card does not have stream controls."
if not has_msg:
self.msg_label = Gtk.Label.new(msg)
self.msg_label.set_vexpand(True)
self.scales_vbox.add(self.msg_label)
self.scales_vbox.show_all()
elif self.msg_label.get_text() != msg:
self.msg_label.set_text(msg)
def update_msg_label(self):
needs_msg = len(self.scales_vbox.get_children()) < 2
has_msg = self.msg_label
if has_msg and not needs_msg:
self.msg_label.destroy()
self.msg_label = None
elif needs_msg:
if len(self.streams) > 0:
msg = "There are no open streams."
else:
msg = "This card does not have stream controls."
if not has_msg:
self.msg_label = gtk.Label(msg)
self.scales_vbox.pack_start(self.msg_label)
self.scales_vbox.show_all()
elif self.msg_label.get_text() != msg:
self.msg_label.set_text(msg)
def open_hcontrol_for_card(self, cardnum):
devname = "hw:CARD=" + str(cardnum)
try:
hc = alsahcontrol.HControl(name=devname,
mode=alsahcontrol.open_mode['NONBLOCK'])
except:
# TODO: alsa error msg
dlg = Gtk.MessageDialog(self,
Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
Gtk.MessageType.ERROR, Gtk.ButtonsType.OK,
"Cannot open sound card control device.")
dlg.run()
dlg.destroy()
return None
return hc
def open_hcontrol_for_card(self, cardnum):
devname = "hw:CARD=" + str(cardnum)
try:
hc = alsahcontrol.HControl(name=devname,
mode=alsahcontrol.open_mode['NONBLOCK'])
except:
# TODO: alsa error msg
dlg = gtk.MessageDialog(self,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
gtk.MESSAGE_ERROR, gtk.BUTTONS_OK,
"Cannot open sound card control device.")
dlg.run()
dlg.destroy()
return None
return hc
def is_stream_elem(self, id):
return ((id[1] == INTF_PCM and
id[4] in ("PCM Playback Volume", "EMU10K1 PCM Volume")) or
(id[1] == INTF_MIXER and
id[4] == "VIA DXS Playback Volume"))
def is_stream_elem(self, id):
return ((id[1] == INTF_PCM and
id[4] in ("PCM Playback Volume", "EMU10K1 PCM Volume")) or
(id[1] == INTF_MIXER and
id[4] == "VIA DXS Playback Volume"))
def is_stream_info(self, info):
return info.is_readable and info.is_writable and info.type == TYPE_INTEGER
def is_stream_info(self, info):
return info.is_readable and info.is_writable and info.type == TYPE_INTEGER
def hctl_io_callback(self, source, condition):
self.hcontrol.handle_events()
return True
def hctl_io_callback(self, source, condition):
self.hcontrol.handle_events()
return True
def main():
MixerWindow()
Gtk.main()
MixerWindow()
gtk.main()
main()

Some files were not shown because too many files have changed in this diff Show more