Compare commits

..

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

68 changed files with 1608 additions and 2155 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

View file

@ -1,4 +1,4 @@
VERSION = 1.2.14 VERSION = 1.1.6
TOP = . TOP = .
SUBDIRS = as10k1 envy24control hdsploader hdspconf hdspmixer \ SUBDIRS = as10k1 envy24control hdsploader hdspconf hdspmixer \
mixartloader pcxhrloader rmedigicontrol sb16_csp seq sscape_ctl \ mixartloader pcxhrloader rmedigicontrol sb16_csp seq sscape_ctl \

View file

@ -244,7 +244,6 @@ void asm_open(char *name)
struct stat st; struct stat st;
char *next; char *next;
int backup_line_num,backup_file_num; 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; 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); close(fd);
if (rsize != st.st_size)
as_exit("short read from input file\n");
#ifdef DEBUG #ifdef DEBUG
printf("File %s opened:\n",name); printf("File %s opened:\n",name);
@ -386,11 +383,10 @@ void output_tram_line(struct list_head *line_head, int type)
val = __cpu_to_le32(tram_sym->data.value); val = __cpu_to_le32(tram_sym->data.value);
fwrite(&val,sizeof(u32),1,fp); fwrite(&val,sizeof(u32),1,fp);
if(listing){ if(listing){
if(type==TYPE_TRAM_ADDR_READ) { if(type==TYPE_TRAM_ADDR_READ)
fprintf(listfile,"\tRead"); fprintf(listfile,"\tRead");
} else { else
fprintf(listfile,"\tWrite"); fprintf(listfile,"\tWrite");
}
fprintf(listfile,": 0x3%02x/0x2%02x (%s), offset 0x%07x\n",tram_sym->data.address,tram_sym->data.address, 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); (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; int gpr_constant_count=0;
char patch_name[PATCH_NAME_SIZE]="NO_NAME"; 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"types.h"
#include"proto.h" #include"proto.h"
#include"parse.h"
extern int dbg_opt; extern int dbg_opt;
extern FILE *listfile; extern FILE *listfile;
@ -46,6 +45,7 @@ void op(int op, int z,int w,int x,int y)
int w0, w1; int w0, w1;
extern int dsp_code[DSP_CODE_SIZE]; extern int dsp_code[DSP_CODE_SIZE];
extern int ip; extern int ip;
extern char op_codes[35][9];
extern char listtemp[60]; extern char listtemp[60];
if (ip >= 0x200) if (ip >= 0x200)
as_exit("to many instructions"); 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; extern int gpr_input_count,gpr_output_count,gpr_static_count,gpr_dynamic_count,gpr_control_count,gpr_constant_count;
struct sym *sym; struct sym *sym;
struct tram *tmp_ptr;
extern struct list_head sym_head; extern struct list_head sym_head;
extern struct delay tram_delay[MAX_TANK_ADDR]; extern struct delay tram_delay[MAX_TANK_ADDR];
extern struct lookup tram_lookup[MAX_TANK_ADDR]; extern struct lookup tram_lookup[MAX_TANK_ADDR];
@ -355,7 +356,9 @@ void add_symbol(char *name, u16 type, u16 address, u32 value)
else else
tram_delay[tmp].write++; tram_delay[tmp].write++;
}else{ }else{
tmp_ptr=(struct tram *)sym;
list_add_tail(&(((struct tram *)sym)->tram) , &(tram_lookup[tmp].tram) ); list_add_tail(&(((struct tram *)sym)->tram) , &(tram_lookup[tmp].tram) );
tmp_ptr=(struct tram *)sym;
if(type== TYPE_TRAM_ADDR_READ) if(type== TYPE_TRAM_ADDR_READ)
tram_lookup[tmp].read++; tram_lookup[tmp].read++;
else else

View file

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

View file

@ -18,7 +18,6 @@
#include<string.h> #include<string.h>
#include<stdio.h> #include<stdio.h>
#include"types.h" #include"types.h"
#define DECLARE_OP_CODES
#include"parse.h" #include"parse.h"
#include"proto.h" #include"proto.h"

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]= char op_codes[NUM_OPS+1][9]=
{ {
"MACS", "MACS",
@ -112,7 +110,6 @@ char op_codes[NUM_OPS+1][9]=
"con", "con",
"NotAnOp" "NotAnOp"
}; };
#endif
//extern int file_num,source_line_num //extern int file_num,source_line_num

View file

@ -629,7 +629,9 @@ gint DrawMixer(gpointer unused) {
int OutPeak[ECHO_MAXAUDIOOUTPUTS]; int OutPeak[ECHO_MAXAUDIOOUTPUTS];
int VirLevel[ECHO_MAXAUDIOOUTPUTS]; int VirLevel[ECHO_MAXAUDIOOUTPUTS];
int VirPeak[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; int i, o, dB;
GdkColor Grid={0x787878, 0, 0, 0}; GdkColor Grid={0x787878, 0, 0, 0};
GdkColor Labels={0x9694C4, 0, 0, 0}; GdkColor Labels={0x9694C4, 0, 0, 0};
@ -645,8 +647,13 @@ gint DrawMixer(gpointer unused) {
update_rect.height = Mixheight; update_rect.height = Mixheight;
GetVUmeters(InLevel, InPeak, OutLevel, OutPeak, VirLevel, VirPeak); GetVUmeters(InLevel, InPeak, OutLevel, OutPeak, VirLevel, VirPeak);
if (!gc) if (!gc) {
gc=gdk_gc_new(gtk_widget_get_parent_window(Mixdarea)); 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); gdk_draw_rectangle(Mixpixmap, Mixdarea->style->black_gc, TRUE, 0, 0, Mixwidth, Mixheight);
@ -1686,7 +1693,7 @@ void ToggleWindow(GtkWidget *widget, gpointer window) {
// Scan all controls and sets up the structures needed to access them. // Scan all controls and sets up the structures needed to access them.
int OpenControls(const char *card, const char *cardname) { int OpenControls(const char *card, const char *cardname) {
int err, i, o; int err, i, o;
int numid, items, item; int numid, count, items, item;
snd_hctl_t *handle; snd_hctl_t *handle;
snd_hctl_elem_t *elem; snd_hctl_elem_t *elem;
snd_ctl_elem_id_t *id; snd_ctl_elem_id_t *id;
@ -1719,6 +1726,7 @@ int OpenControls(const char *card, const char *cardname) {
continue; continue;
snd_hctl_elem_get_id(elem, id); snd_hctl_elem_get_id(elem, id);
numid=snd_ctl_elem_id_get_numid(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 (!strcmp("Monitor Mixer Volume", snd_ctl_elem_id_get_name(id))) {
if (!mixerId) { if (!mixerId) {
mixerId=numid; mixerId=numid;
@ -1871,7 +1879,7 @@ int main(int argc, char *argv[]) {
GtkWidget *label, *menu, *menuitem; GtkWidget *label, *menu, *menuitem;
GSList *bgroup; GSList *bgroup;
int err, i, o, n, cardnum, value; 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; snd_ctl_card_info_t *hw_info;
load=save=1; load=save=1;
@ -1892,8 +1900,8 @@ int main(int argc, char *argv[]) {
} }
if ((err=snd_ctl_card_info(ctlhandle, hw_info))>=0) { if ((err=snd_ctl_card_info(ctlhandle, hw_info))>=0) {
if (!strncmp(snd_ctl_card_info_get_driver(hw_info), "Echo_", 5)) { if (!strncmp(snd_ctl_card_info_get_driver(hw_info), "Echo_", 5)) {
strncpy(card, hwname, sizeof(hwname)-1); strncpy(card, hwname, 7);
card[sizeof(hwname)-1]=0; hwname[7]=0;
strncpy(cardname, snd_ctl_card_info_get_name(hw_info), 31); strncpy(cardname, snd_ctl_card_info_get_name(hw_info), 31);
cardname[31]=0; cardname[31]=0;
strncpy(cardId, snd_ctl_card_info_get_name(hw_info), 15); strncpy(cardId, snd_ctl_card_info_get_name(hw_info), 15);
@ -2097,7 +2105,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
for (i=0; i<ndmodes; i++) { for (i=0; i<ndmodes; i++) {
menuitem=gtk_menu_item_new_with_label(dmodeName[i]); menuitem=gtk_menu_item_new_with_label(dmodeName[i]);
gtk_widget_show(menuitem); 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_menu_append(GTK_MENU(menu), menuitem);
} }
gtk_option_menu_set_menu(GTK_OPTION_MENU(dmodeOpt), menu); gtk_option_menu_set_menu(GTK_OPTION_MENU(dmodeOpt), menu);
@ -2123,7 +2131,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
clocksrc_menuitem[i]=gtk_menu_item_new_with_label(clocksrcName[i]); clocksrc_menuitem[i]=gtk_menu_item_new_with_label(clocksrcName[i]);
gtk_widget_show(clocksrc_menuitem[i]); gtk_widget_show(clocksrc_menuitem[i]);
gtk_widget_set_sensitive(clocksrc_menuitem[i], FALSE); 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_menu_append(GTK_MENU(menu), clocksrc_menuitem[i]);
} }
gtk_option_menu_set_menu(GTK_OPTION_MENU(clocksrcOpt), menu); gtk_option_menu_set_menu(GTK_OPTION_MENU(clocksrcOpt), menu);
@ -2149,7 +2157,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
for (i=0; i<nspdifmodes; i++) { for (i=0; i<nspdifmodes; i++) {
menuitem=gtk_menu_item_new_with_label(spdifmodeName[i]); menuitem=gtk_menu_item_new_with_label(spdifmodeName[i]);
gtk_widget_show(menuitem); 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_menu_append(GTK_MENU(menu), menuitem);
} }
gtk_option_menu_set_menu(GTK_OPTION_MENU(spdifmodeOpt), menu); gtk_option_menu_set_menu(GTK_OPTION_MENU(spdifmodeOpt), menu);
@ -2174,7 +2182,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
ReadControl(&i, 1, PhantomPower.id, SND_CTL_ELEM_IFACE_MIXER); ReadControl(&i, 1, PhantomPower.id, SND_CTL_ELEM_IFACE_MIXER);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), i); 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; PhantomPower.Button=button;
} }
@ -2185,7 +2193,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
ReadControl(&i, 1, Automute.id, SND_CTL_ELEM_IFACE_CARD); ReadControl(&i, 1, Automute.id, SND_CTL_ELEM_IFACE_CARD);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), i); 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; Automute.Button=button;
} }
@ -2194,7 +2202,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
autoclockChkbutton=gtk_check_button_new_with_label("Autoclock"); autoclockChkbutton=gtk_check_button_new_with_label("Autoclock");
gtk_widget_show(autoclockChkbutton); gtk_widget_show(autoclockChkbutton);
gtk_box_pack_start(GTK_BOX(hbox), autoclockChkbutton, TRUE, FALSE, 0); 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; AutoClock=-1;
} }
} }
@ -2664,7 +2672,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_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), 1);
gtk_widget_show(button); 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 // Controls frame
frame=gtk_frame_new("Controls"); frame=gtk_frame_new("Controls");
@ -2679,7 +2687,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("VU"); button=gtk_toggle_button_new_with_label("VU");
gtk_widget_show(button); gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1); 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; VUw_geom.toggler=button;
if (VUw_geom.st==1) if (VUw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2689,7 +2697,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("Line"); button=gtk_toggle_button_new_with_label("Line");
gtk_widget_show(button); gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1); 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; LVw_geom.toggler=button;
if (LVw_geom.st==1) if (LVw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2699,7 +2707,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("Misc"); button=gtk_toggle_button_new_with_label("Misc");
gtk_widget_show(button); gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1); 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; Miscw_geom.toggler=button;
if (Miscw_geom.st==1) if (Miscw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2710,7 +2718,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("GrMix"); button=gtk_toggle_button_new_with_label("GrMix");
gtk_widget_show(button); gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1); 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; GMw_geom.toggler=button;
if (GMw_geom.st==1) if (GMw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2719,7 +2727,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("Mixer"); button=gtk_toggle_button_new_with_label("Mixer");
gtk_widget_show(button); gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1); 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; Mixerw_geom.toggler=button;
if (Mixerw_geom.st==1) if (Mixerw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2730,7 +2738,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("Vmixer"); button=gtk_toggle_button_new_with_label("Vmixer");
gtk_widget_show(button); gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1); 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; Vmixerw_geom.toggler=button;
if (Vmixerw_geom.st==1) if (Vmixerw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@ -2741,7 +2749,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
button=gtk_toggle_button_new_with_label("PCM"); button=gtk_toggle_button_new_with_label("PCM");
gtk_widget_show(button); gtk_widget_show(button);
gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1); 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; PVw_geom.toggler=button;
if (PVw_geom.st==1) if (PVw_geom.st==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);

View file

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

View file

@ -5,6 +5,6 @@ AC_HEADER_STDC
AM_INIT_AUTOMAKE AM_INIT_AUTOMAKE
AM_MAINTAINER_MODE([enable]) 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 desktop/Makefile)

View file

@ -19,7 +19,7 @@
#include "envy24control.h" #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_t *ctl = (snd_ctl_t *)data;
snd_ctl_event_t *ev; snd_ctl_event_t *ev;
@ -29,12 +29,12 @@ gboolean control_input_callback(GIOChannel *source, GIOCondition condition, gpoi
snd_ctl_event_alloca(&ev); snd_ctl_event_alloca(&ev);
if (snd_ctl_read(ctl, ev) < 0) if (snd_ctl_read(ctl, ev) < 0)
return TRUE; return;
name = snd_ctl_event_elem_get_name(ev); name = snd_ctl_event_elem_get_name(ev);
index = snd_ctl_event_elem_get_index(ev); index = snd_ctl_event_elem_get_index(ev);
mask = snd_ctl_event_elem_get_mask(ev); mask = snd_ctl_event_elem_get_mask(ev);
if (! (mask & (SND_CTL_EVENT_MASK_VALUE | SND_CTL_EVENT_MASK_INFO))) if (! (mask & (SND_CTL_EVENT_MASK_VALUE | SND_CTL_EVENT_MASK_INFO)))
return TRUE; return;
switch (snd_ctl_event_elem_get_interface(ev)) { switch (snd_ctl_event_elem_get_interface(ev)) {
case SND_CTL_ELEM_IFACE_MIXER: 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")) else if (!strcmp(name, "Input Sensitivity Switch"))
adc_sense_update(index); adc_sense_update(index);
break; break;
case SND_CTL_ELEM_IFACE_PCM:
if (!strcmp(name, "IEC958 Playback Default"))
spdif_output_update();
break;
default: default:
break; 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_mix_drawing;
extern GtkWidget *mixer_clear_peaks_button; extern GtkWidget *mixer_clear_peaks_button;
extern GtkWidget *mixer_drawing[20]; 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_vscale[20][2];
extern GtkWidget *mixer_solo_toggle[20][2]; extern GtkWidget *mixer_solo_toggle[20][2];
extern GtkWidget *mixer_mute_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_locking_check;
extern GtkWidget *hw_rate_reset_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_volume_change_spin;
extern GtkWidget *hw_spdif_profi_nonaudio_radio; 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_front_input;
extern GtkWidget *input_interface_rear_input; extern GtkWidget *input_interface_rear_input;
extern GtkWidget *input_interface_wavetable; extern GtkWidget *input_interface_wavetable;
extern GtkAdjustment *av_dac_volume_adj[]; extern GtkObject *av_dac_volume_adj[];
extern GtkAdjustment *av_adc_volume_adj[]; extern GtkObject *av_adc_volume_adj[];
extern GtkAdjustment *av_ipga_volume_adj[]; extern GtkObject *av_ipga_volume_adj[];
extern GtkLabel *av_dac_volume_label[]; extern GtkLabel *av_dac_volume_label[];
extern GtkLabel *av_adc_volume_label[]; extern GtkLabel *av_adc_volume_label[];
extern GtkLabel *av_ipga_volume_label[]; extern GtkLabel *av_ipga_volume_label[];
@ -163,7 +163,8 @@ extern GtkWidget *av_adc_sense_radio[][4];
/* flags */ /* flags */
extern int card_is_dmx6fire; 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); gint level_meters_timeout_callback(gpointer data);
void level_meters_reset_peaks(GtkButton *button, gpointer data); void level_meters_reset_peaks(GtkButton *button, gpointer data);
void level_meters_init(void); 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 dac_sense_toggled(GtkWidget *togglebutton, gpointer data);
void adc_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

@ -39,14 +39,7 @@ static inline int is_update_needed(void);
static int is_active(GtkWidget *widget) 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 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);
} }
void master_clock_update(void) void master_clock_update(void)
@ -177,7 +170,7 @@ gint master_clock_status_timeout_callback(gpointer data)
snd_ctl_elem_value_set_name(sw, "Word Clock Status"); snd_ctl_elem_value_set_name(sw, "Word Clock Status");
if ((err = snd_ctl_elem_read(ctl, sw)) < 0) if ((err = snd_ctl_elem_read(ctl, sw)) < 0)
g_print("Unable to determine word clock status: %s\n", snd_strerror(err)); g_print("Unable to determine word clock status: %s\n", snd_strerror(err));
label_set(hw_master_clock_status_label, gtk_label_set_text(GTK_LABEL(hw_master_clock_status_label),
snd_ctl_elem_value_get_boolean(sw, 0) ? "No signal" : "Locked"); snd_ctl_elem_value_get_boolean(sw, 0) ? "No signal" : "Locked");
return TRUE; 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; return TRUE;
} }
@ -361,7 +354,7 @@ void volume_change_rate_adj(GtkAdjustment *adj, gpointer data)
{ {
int err; 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) if ((err = snd_ctl_elem_write(ctl, volume_rate)) < 0)
g_print("Unable to write volume change rate: %s\n", snd_strerror(err)); 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; return;
iec958.status[1] &= ~IEC958_AES1_PRO_MODE; iec958.status[1] &= ~IEC958_AES1_PRO_MODE;
if (!strcmp(str, "NOTID")) { 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")) { } 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); snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write(); spdif_output_write();
@ -507,7 +500,7 @@ void consumer_copyright_toggled(GtkWidget *togglebutton, gpointer data)
if (!strcmp(str, "Copyright")) { if (!strcmp(str, "Copyright")) {
iec958.status[0] &= ~IEC958_AES0_CON_NOT_COPYRIGHT; iec958.status[0] &= ~IEC958_AES0_CON_NOT_COPYRIGHT;
} else if (!strcmp(str, "Permitted")) { } 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); snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write(); spdif_output_write();
@ -524,9 +517,9 @@ void consumer_copy_toggled(GtkWidget *togglebutton, gpointer data)
if (iec958.status[0] & IEC958_AES0_PROFESSIONAL) if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
return; return;
if (!strcmp(str, "1st")) { if (!strcmp(str, "1st")) {
iec958.status[1] &= ~IEC958_AES1_CON_ORIGINAL; iec958.status[0] |= IEC958_AES1_CON_ORIGINAL;
} else if (!strcmp(str, "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); snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write(); spdif_output_write();
@ -546,7 +539,7 @@ void consumer_emphasis_toggled(GtkWidget *togglebutton, gpointer data)
if (!strcmp(str, "No")) { if (!strcmp(str, "No")) {
iec958.status[0] |= IEC958_AES0_CON_EMPHASIS_NONE; iec958.status[0] |= IEC958_AES0_CON_EMPHASIS_NONE;
} else if (!strcmp(str, "5015")) { } 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); snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write(); spdif_output_write();
@ -562,15 +555,15 @@ void consumer_category_toggled(GtkWidget *togglebutton, gpointer data)
return; return;
if (iec958.status[0] & IEC958_AES0_PROFESSIONAL) if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
return; return;
iec958.status[1] &= ~IEC958_AES1_CON_CATEGORY; iec958.status[0] &= ~IEC958_AES1_CON_CATEGORY;
if (!strcmp(str, "DAT")) { if (!strcmp(str, "DAT")) {
iec958.status[1] |= IEC958_AES1_CON_DAT; iec958.status[0] |= IEC958_AES1_CON_DAT;
} else if (!strcmp(str, "PCM")) { } 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")) { } 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")) { } 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); snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
spdif_output_write(); spdif_output_write();
@ -605,7 +598,7 @@ void spdif_output_toggled(GtkWidget *togglebutton, gpointer data)
page = 1; page = 1;
} }
spdif_output_write(); 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(); spdif_output_update();
} }
} }

View file

@ -19,13 +19,13 @@
#include "envy24control.h" #include "envy24control.h"
static GdkRGBA *penGreenShadow = NULL; static GdkGC *penGreenShadow[21] = { NULL, };
static GdkRGBA *penGreenLight = NULL; static GdkGC *penGreenLight[21] = { NULL, };
static GdkRGBA *penOrangeShadow = NULL; static GdkGC *penOrangeShadow[21] = { NULL, };
static GdkRGBA *penOrangeLight = NULL; static GdkGC *penOrangeLight[21] = { NULL, };
static GdkRGBA *penRedShadow = NULL; static GdkGC *penRedShadow[21] = { NULL, };
static GdkRGBA *penRedLight = NULL; static GdkGC *penRedLight[21] = { NULL, };
static int level[22] = { 0 }; static GdkPixmap *pixmap[21] = { NULL, };
static snd_ctl_elem_value_t *peaks; static snd_ctl_elem_value_t *peaks;
extern int input_channels, output_channels, pcm_output_channels, spdif_channels, view_spdif_playback; 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 = (GdkColor *)g_malloc(sizeof(GdkColor));
c->red = nRed / 65535.0; c->red = nRed;
c->green = nGreen / 65535.0; c->green = nGreen;
c->blue = nBlue / 65535.0; c->blue = nBlue;
c->alpha = 1.0; gdk_color_alloc(gdk_colormap_get_system(), c);
return 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; int result;
@ -76,7 +79,7 @@ static int get_index(const gchar *name)
return result; 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 stereo = idx == 0;
int segment_width = stereo ? (width / 2) - 8 : width - 12; 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 seg;
int segs_on1 = ((segments * level1) + 128) / 255; int segs_on1 = ((segments * level1) + 128) / 255;
int segs_on2 = ((segments * level2) + 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); // g_print("segs_on1 = %i (%i), segs_on2 = %i (%i)\n", segs_on1, level1, segs_on2, level2);
cairo_rectangle(cr, 0, 0, width, height); for (seg = 0; seg < green_segments; seg++) {
cairo_fill(cr); gdk_draw_rectangle(pixmap[idx],
segs_on1 > 0 ? penGreenLight[idx] : penGreenShadow[idx],
gdk_cairo_get_clip_rectangle(cr, &clip); TRUE,
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), 6, 3 + ((segments - seg - 1) * 4),
segment_width, segment_width,
3); 3);
cairo_fill(cr); if (stereo)
if (stereo) { gdk_draw_rectangle(pixmap[idx],
gdk_cairo_set_source_rgba(cr, segs_on2 > 0 ? penGreenLight[idx] : penGreenShadow[idx],
segs_on2 > 0 ? penGreenLight : penGreenShadow); TRUE,
cairo_rectangle(cr,
2 + (width / 2), 2 + (width / 2),
3 + ((segments - seg - 1) * 4), 3 + ((segments - seg - 1) * 4),
segment_width, segment_width,
3); 3);
cairo_fill(cr);
}
segs_on1--; segs_on1--;
segs_on2--; segs_on2--;
} }
for (; seg < green_segments + orange_segments && seg < end_seg; seg++) { for (seg = green_segments; seg < green_segments + orange_segments; seg++) {
gdk_cairo_set_source_rgba(cr, gdk_draw_rectangle(pixmap[idx],
segs_on1 > 0 ? penOrangeLight : penOrangeShadow); segs_on1 > 0 ? penOrangeLight[idx] : penOrangeShadow[idx],
cairo_rectangle(cr, TRUE,
6, 3 + ((segments - seg - 1) * 4), 6, 3 + ((segments - seg - 1) * 4),
segment_width, segment_width,
3); 3);
cairo_fill(cr); if (stereo)
if (stereo) { gdk_draw_rectangle(pixmap[idx],
gdk_cairo_set_source_rgba(cr, segs_on2 > 0 ? penOrangeLight[idx] : penOrangeShadow[idx],
segs_on2 > 0 ? penOrangeLight : penOrangeShadow); TRUE,
cairo_rectangle(cr,
2 + (width / 2), 2 + (width / 2),
3 + ((segments - seg - 1) * 4), 3 + ((segments - seg - 1) * 4),
segment_width, segment_width,
3); 3);
cairo_fill(cr);
}
segs_on1--; segs_on1--;
segs_on2--; segs_on2--;
} }
for (; seg < segments && seg < end_seg; seg++) { for (seg = green_segments + orange_segments; seg < segments; seg++) {
gdk_cairo_set_source_rgba(cr, gdk_draw_rectangle(pixmap[idx],
segs_on1 > 0 ? penRedLight : penRedShadow); segs_on1 > 0 ? penRedLight[idx] : penRedShadow[idx],
cairo_rectangle(cr, TRUE,
6, 3 + ((segments - seg - 1) * 4), 6, 3 + ((segments - seg - 1) * 4),
segment_width, segment_width,
3); 3);
cairo_fill(cr); if (stereo)
if (stereo) { gdk_draw_rectangle(pixmap[idx],
gdk_cairo_set_source_rgba(cr, segs_on2 > 0 ? penRedLight[idx] : penRedShadow[idx],
segs_on2 > 0 ? penRedLight : penRedShadow); TRUE,
cairo_rectangle(cr,
2 + (width / 2), 2 + (width / 2),
3 + ((segments - seg - 1) * 4), 3 + ((segments - seg - 1) * 4),
segment_width, segment_width,
3); 3);
cairo_fill(cr);
}
segs_on1--; segs_on1--;
segs_on2--; 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 idx = get_index(gtk_widget_get_name(widget));
int l1, l2; int l1, l2;
get_levels(idx, &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; 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) gint level_meters_timeout_callback(gpointer data)
{ {
int idx; GtkWidget *widget;
int idx, l1, l2;
update_peak_switch(); update_peak_switch();
for (idx = 0; idx <= pcm_output_channels; idx++) { 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) { if (view_spdif_playback) {
for (idx = MAX_PCM_OUTPUT_CHANNELS + 1; idx <= MAX_OUTPUT_CHANNELS + spdif_channels; idx++) { 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++) { 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; \ 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++) { 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; return TRUE;
} }
@ -256,13 +270,6 @@ void level_meters_init(void)
/* older ALSA driver, using MIXER type */ /* older ALSA driver, using MIXER type */
snd_ctl_elem_value_set_interface(peaks, snd_ctl_elem_value_set_interface(peaks,
SND_CTL_ELEM_IFACE_MIXER); 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) void level_meters_postinit(void)

View file

@ -243,7 +243,7 @@ int midi_init(char *appname, int channel, int midi_enhanced)
void mixer_adjust(GtkAdjustment *adj, gpointer data); void mixer_adjust(GtkAdjustment *adj, gpointer data);
void mixer_set_mute(int stream, int left, int right); 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; snd_seq_event_t *ev;
static GtkAdjustment *adj=0; static GtkAdjustment *adj=0;
@ -306,7 +306,6 @@ gboolean midi_process(GIOChannel *gio, GIOCondition condition, gpointer data)
snd_seq_free_event(ev); snd_seq_free_event(ev);
} }
while (snd_seq_event_input_pending(seq, 0) > 0); 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(); int midi_close();
void midi_maxstreams(int); void midi_maxstreams(int);
int midi_controller(int c, int v); 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); int midi_button(int b, int v);
#endif #endif

View file

@ -39,7 +39,7 @@ extern int input_channels, output_channels, pcm_output_channels, spdif_channels,
static int is_active(GtkWidget *widget) 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) 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 stereo = is_active(mixer_stereo_toggle[stream-1]) ? 1 : 0;
int vol[2] = { -1, -1 }; int vol[2] = { -1, -1 };
vol[button] = 96 - gtk_adjustment_get_value(adj); vol[button] = 96 - adj->value;
if (stereo) { if (stereo) {
gtk_adjustment_set_value(GTK_ADJUSTMENT(mixer_adj[stream-1][button ^ 1]), gtk_adjustment_get_value(adj)); gtk_adjustment_set_value(GTK_ADJUSTMENT(mixer_adj[stream-1][button ^ 1]), adj->value);
vol[button ^ 1] = 96 - gtk_adjustment_get_value(adj); vol[button ^ 1] = 96 - adj->value;
} }
set_volume1(stream, vol[0], vol[1]); 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; struct stat file_status;
/* memory for storage of function pointers from the signal handling routines */ /* memory for storage of function pointers from the signal handling routines */
void (*int_stat)(int); void (*int_stat)();
void (*quit_stat)(int); void (*quit_stat)();
void (*usr2_stat)(int); void (*usr2_stat)();
/* /*
* check command file * check command file

View file

@ -30,7 +30,7 @@ extern int output_channels, input_channels, pcm_output_channels, spdif_channels;
static int is_active(GtkWidget *widget) 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) static int get_toggle_index(int stream)

View file

@ -54,9 +54,9 @@ void subst_tilde_in_filename(char * const filename)
if ((pos_after_tilde = strchr(filename, '~')) != NULL) { if ((pos_after_tilde = strchr(filename, '~')) != NULL) {
pos_after_tilde++; pos_after_tilde++;
strncpy(new_filename, getenv("HOME"), sizeof(new_filename) - 1); strncpy(new_filename, getenv("HOME"), MAX_FILE_NAME_LENGTH);
strncpy(new_filename + strlen(new_filename), pos_after_tilde, sizeof(new_filename) - strlen(new_filename) - 1); strncpy(new_filename + strlen(new_filename), pos_after_tilde, MAX_FILE_NAME_LENGTH - strlen(new_filename));
new_filename[sizeof(new_filename) - 1] = '\0'; new_filename[MAX_FILE_NAME_LENGTH - 1] = '\0';
strncpy(filename, new_filename, MAX_FILE_NAME_LENGTH); strncpy(filename, new_filename, MAX_FILE_NAME_LENGTH);
} }
} }
@ -78,9 +78,7 @@ int which_cfgfile(char ** const cfgfile)
(inputFile = fopen(SYS_PROFILERC, "r")) == NULL) { (inputFile = fopen(SYS_PROFILERC, "r")) == NULL) {
res = -ENOENT; res = -ENOENT;
} else { } else {
if (inputFile != NULL) {
fclose(inputFile); fclose(inputFile);
}
*cfgfile = SYS_PROFILERC; *cfgfile = SYS_PROFILERC;
res = EXIT_SUCCESS; res = EXIT_SUCCESS;
} }
@ -96,9 +94,7 @@ int get_file_size(const char * const filename)
{ {
struct stat file_status; 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'; filename_without_tilde[MAX_FILE_NAME_LENGTH - 1] = '\0';
subst_tilde_in_filename(filename_without_tilde); subst_tilde_in_filename(filename_without_tilde);
if (stat(filename_without_tilde, &file_status) < 0) { 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; char place_holder;
int pos_card_begin, pos_card_end, pos_name_header; int pos_card_begin, pos_card_end, pos_name_header;
if ((pos_card_begin = get_card_begin(buffer, profile_number, card_number)) < 0) pos_card_begin = get_card_begin(buffer, profile_number, card_number);
return pos_card_begin;
pos_card_end = get_card_end(buffer, profile_number, card_number); pos_card_end = get_card_end(buffer, profile_number, card_number);
place_holder = PLACE_HOLDER_STR; place_holder = PLACE_HOLDER_STR;
strncpy(header, PROFILE_NAME_TEMPL, MAX_SEARCH_FIELD_LENGTH); 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 profile_number, card_number, card_number_max;
int res; 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; int pos_alsa_section_begin, pos_after_alsa_section;
char header[MAX_SEARCH_FIELD_LENGTH]; char header[MAX_SEARCH_FIELD_LENGTH];
void *buffer_copy = NULL; 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); 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'; header[MAX_SEARCH_FIELD_LENGTH - 1] = '\0';
snprintf(buffer_copy + strlen(buffer_copy), max_length - strlen(buffer_copy), "%s\n", header); 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 */ /* search max card number in profile */
card_number_max = get_max_card_number_in_profile(buffer, profile_number); card_number_max = get_max_card_number_in_profile(buffer, profile_number);
for (card_number = 0; card_number <= card_number_max; card_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) 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'; 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'; 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); fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number);
return -errno; return -errno;
} }
close(res);
unlink(cfgfile); unlink(cfgfile);
} else { } else {
close(res);
if ((res = open(cfgfile, O_RDWR | 0400000 /* O_NOFOLLOW */, FILE_CREA_MODE)) < 0) { 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 open configuration file '%s' for writing.\n", cfgfile);
fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number); fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number);
return -errno; return -errno;
} }
close(res);
} }
res = save_profile(profile_number, card_number, profile_name, cfgfile); res = save_profile(profile_number, card_number, profile_name, cfgfile);
} else if (!strcmp(operation, ALSACTL_OP_RESTORE)) { } else if (!strcmp(operation, ALSACTL_OP_RESTORE)) {

View file

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

View file

@ -48,7 +48,6 @@ int strstr_icase_blank(const char * const string1, const char * const string2)
char search_string[MAX_SEARCH_FIELD_LENGTH]; char search_string[MAX_SEARCH_FIELD_LENGTH];
char *pstr; char *pstr;
int pos_first_non_blank; int pos_first_non_blank;
size_t len;
strncpy(search_string, string2, MAX_SEARCH_FIELD_LENGTH); strncpy(search_string, string2, MAX_SEARCH_FIELD_LENGTH);
search_string[MAX_SEARCH_FIELD_LENGTH - 1] = '\0'; 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); strncpy(search_string, cmp_line, strlen(search_string));
if (len > sizeof(search_string) - 1)
len = sizeof(search_string) - 1;
strncpy(search_string, cmp_line, len);
search_string[len] = '\0';
position = 0; position = 0;
while (position < strlen(string1)) while (position < strlen(string1))

View file

@ -217,7 +217,7 @@ void dac_volume_adjust(GtkAdjustment *adj, gpointer data)
{ {
int idx = (int)(long)data; int idx = (int)(long)data;
snd_ctl_elem_value_t *val; snd_ctl_elem_value_t *val;
int err, ival = -(int)gtk_adjustment_get_value(adj); int err, ival = -(int)adj->value;
char text[16]; char text[16];
snd_ctl_elem_value_alloca(&val); snd_ctl_elem_value_alloca(&val);
@ -235,7 +235,7 @@ void adc_volume_adjust(GtkAdjustment *adj, gpointer data)
{ {
int idx = (int)(long)data; int idx = (int)(long)data;
snd_ctl_elem_value_t *val; snd_ctl_elem_value_t *val;
int err, ival = -(int)gtk_adjustment_get_value(adj); int err, ival = -(int)adj->value;
char text[16]; char text[16];
snd_ctl_elem_value_alloca(&val); snd_ctl_elem_value_alloca(&val);
@ -253,7 +253,7 @@ void ipga_volume_adjust(GtkAdjustment *adj, gpointer data)
{ {
int idx = (int)(long)data; int idx = (int)(long)data;
snd_ctl_elem_value_t *val; snd_ctl_elem_value_t *val;
int err, ival = -(int)gtk_adjustment_get_value(adj); int err, ival = -(int)adj->value;
char text[16]; char text[16];
snd_ctl_elem_value_alloca(&val); snd_ctl_elem_value_alloca(&val);

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 ) http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf )
* Parser hints * 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* scriptfile = NULL;
static gchar* errorfile = NULL; static gchar* errorfile = NULL;
struct soundserver {
enum {
PULSEAUDIO,
PIPEWIRE
} type;
gboolean was_killed;
gchar *user;
};
static GQuark quark() static GQuark quark()
{ {
return g_quark_from_static_string("hda-jack-retask-error"); return g_quark_from_static_string("hda-jack-retask-error");
@ -134,39 +125,21 @@ static gchar* get_pulseaudio_client_conf()
return fname; return fname;
} }
static gboolean call_systemctl(gchar* user, gchar* operation, gchar *unit, GError **err) static gboolean kill_pulseaudio(gboolean* was_killed, int card, 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)
{ {
gchar* fuser = NULL, *fuser2 = NULL; gchar* fuser = NULL, *fuser2 = NULL;
gchar* s = NULL; gchar* s = NULL;
gchar* clientconf = NULL; gchar* clientconf = NULL;
gboolean ok; gboolean ok;
char *p; *was_killed = FALSE;
state->type = PULSEAUDIO;
state->was_killed = FALSE;
state->user = NULL;
/* Is PA having a lock on the sound card? */ /* Is PA having a lock on the sound card? */
s = g_strdup_printf("fuser -v /dev/snd/controlC%d", 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. */ /* 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))) if (!(ok = g_spawn_command_line_sync(s, &fuser, &fuser2, NULL, err)))
goto cleanup; goto cleanup;
if (strstr(fuser, "pulseaudio") != NULL || strstr(fuser2, "pulseaudio") != NULL) { if ((ok = strstr(fuser, "pulseaudio") == NULL && strstr(fuser2, "pulseaudio") == NULL))
goto cleanup; // PulseAudio not locking the sound card
clientconf = get_pulseaudio_client_conf(); clientconf = get_pulseaudio_client_conf();
if (!(ok = !g_file_test(clientconf, G_FILE_TEST_EXISTS))) { if (!(ok = !g_file_test(clientconf, G_FILE_TEST_EXISTS))) {
g_set_error(err, quark(), 0, "Cannot block PulseAudio from respawning:\n" g_set_error(err, quark(), 0, "Cannot block PulseAudio from respawning:\n"
@ -176,31 +149,9 @@ static gboolean kill_soundserver(struct soundserver* state, int card, GError** e
if (!(ok = g_file_set_contents(clientconf, "autospawn=no\n", -1, err))) if (!(ok = g_file_set_contents(clientconf, "autospawn=no\n", -1, err)))
goto cleanup; goto cleanup;
state->was_killed = TRUE;
*was_killed = TRUE;
ok = g_spawn_command_line_sync("pulseaudio -k", NULL, NULL, NULL, err); 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;
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
}
cleanup: cleanup:
g_free(clientconf); g_free(clientconf);
@ -210,34 +161,16 @@ cleanup:
return ok; 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 = get_pulseaudio_client_conf();
gchar* clientconf; if (was_killed && g_unlink(clientconf) != 0) {
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_set_error(err, quark(), 0, "%s", g_strerror(errno));
g_free(clientconf); g_free(clientconf);
goto cleanup; return FALSE;
} }
g_free(clientconf); g_free(clientconf);
ok = TRUE; return TRUE;
break;
case PIPEWIRE:
if (state->was_killed)
ok = call_systemctl(state->user, "start", "wireplumber.service", err);
else
ok = TRUE;
break;
}
cleanup:
g_free(state->user);
state->user = NULL;
return ok;
} }
gboolean apply_changes_reconfig(pin_configs_t* pins, int entries, int card, int device, 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; gboolean result = FALSE;
// gchar* script_name = NULL; // gchar* script_name = NULL;
struct soundserver state = { 0 }; gboolean pa_killed = FALSE;
/* Check for users of the sound card */ /* Check for users of the sound card */
/* Kill pulseaudio if necessary (and possible) */ /* Kill pulseaudio if necessary (and possible) */
if (!kill_soundserver(&state, card, err)) if (!kill_pulseaudio(&pa_killed, card, err))
goto cleanup; goto cleanup;
/* Create script */ /* Create script */
if (!create_reconfig_script(pins, entries, card, device, model, hints, err)) 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; goto cleanup;
result = TRUE; result = TRUE;
cleanup: cleanup:
if (!restore_soundserver(&state, result ? err : NULL)) { if (!restore_pulseaudio(pa_killed, result ? err : NULL)) {
result = FALSE; result = FALSE;
} }
// g_free(script_name); // 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, gboolean apply_changes_boot(pin_configs_t* pins, int entries, int card, int device,
const char* model, const char* hints, GError** err); const char* model, const char* hints, GError** err);
gboolean reset_changes_boot(GError ** err); gboolean reset_changes_boot();
#endif #endif

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 neww = screen ? (gdk_screen_get_width(screen)*3)/4 : 800;
int newh = screen ? (gdk_screen_get_height(screen)*3)/4 : 600; 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); gtk_dialog_run(dlg);

View file

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

View file

@ -21,7 +21,7 @@
#pragma implementation #pragma implementation
#include "HC_Aeb.h" #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; int err;
char card_name[6]; char card_name[6];

View file

@ -21,7 +21,7 @@
#pragma implementation #pragma implementation
#include "HC_SpdifOut.h" #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; int err;
char card_name[6]; char card_name[6];

View file

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

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 */ /* XPM */
char const * output_xpm[] = { char const * output_xpm[] = {
"36 224 55 1", "36 208 9 1",
" c None", " c #595966",
". c #595966", ". c #2E3038",
"+ c #2E3038", "+ c #000000",
"@ c #000000", "@ c #474951",
"# c #474951", "# c #404044",
"$ c #404044", "$ c #7A7A8F",
"% c #7A7A8F", "% c #27272B",
"& c #27272B", "& c #616176",
"* c #616176", "* c #737384",
"= 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++.",
"...................................."};

View file

@ -1,282 +1,220 @@
/* XPM */ /* XPM */
char const * output_r_xpm[] = { char const * output_r_xpm[] = {
"36 224 55 1", "36 208 9 1",
" c None", " c #595966",
". c #595966", ". c #2E3038",
"+ c #2E3038", "+ c #000000",
"@ c #000000", "@ c #474951",
"# c #474951", "# c #404044",
"$ c #404044", "$ c #7A7A8F",
"% c #7A7A8F", "% c #27272B",
"& c #27272B", "& c #616176",
"* c #616176", "* c #737384",
"= 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++.",
"...................................."};

View file

@ -231,8 +231,6 @@ void HDSPMixerCard::adjustSettings() {
/* should never happen */ /* should never happen */
break; break;
} }
max_channels = sizeof(channel_map_mf_ss);
} }
if (type == Digiface) { if (type == Digiface) {
@ -255,8 +253,6 @@ void HDSPMixerCard::adjustSettings() {
/* should never happen */ /* should never happen */
break; break;
} }
max_channels = sizeof(channel_map_df_ss);
} }
if (type == RPM) { if (type == RPM) {
@ -267,8 +263,6 @@ void HDSPMixerCard::adjustSettings() {
channel_map_input = channel_map_playback = channel_map_rpm; channel_map_input = channel_map_playback = channel_map_rpm;
dest_map = dest_map_rpm; dest_map = dest_map_rpm;
meter_map_input = meter_map_playback = channel_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 */ /* should never happen */
break; break;
} }
max_channels = sizeof(channel_map_df_ss);
} }
if (type == H9632) { if (type == H9632) {
@ -320,8 +312,6 @@ void HDSPMixerCard::adjustSettings() {
meter_map_input = meter_map_playback = channel_map_h9632_qs; meter_map_input = meter_map_playback = channel_map_h9632_qs;
break; break;
} }
max_channels = sizeof(channel_map_h9632_ss);
} }
if (HDSPeMADI == type) { if (HDSPeMADI == type) {
@ -351,7 +341,6 @@ void HDSPMixerCard::adjustSettings() {
break; break;
} }
max_channels = sizeof(channel_map_unity_ss);
} }
if (HDSPeAIO == type) { if (HDSPeAIO == type) {
@ -390,7 +379,6 @@ void HDSPMixerCard::adjustSettings() {
break; break;
} }
max_channels = sizeof(channel_map_aio_out_ss);
} }
if (HDSP_AES == type) { if (HDSP_AES == type) {
@ -406,7 +394,6 @@ void HDSPMixerCard::adjustSettings() {
meter_map_input = channel_map_aes32; meter_map_input = channel_map_aes32;
meter_map_playback = channel_map_aes32; meter_map_playback = channel_map_aes32;
max_channels = sizeof(channel_map_aes32);
} }
if (HDSPeRayDAT == type) { if (HDSPeRayDAT == type) {
@ -439,7 +426,6 @@ void HDSPMixerCard::adjustSettings() {
break; break;
} }
max_channels = sizeof(channel_map_raydat_ss);
} }
window_width = (channels_playback+2)*STRIP_WIDTH; window_width = (channels_playback+2)*STRIP_WIDTH;
@ -559,23 +545,3 @@ int HDSPMixerCard::initializeCard(HDSPMixerWindow *w)
return 0; 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); HDSPMixerCard(int cardtype, int id, char *shortname);
int channels_input, channels_playback, window_width, window_height, card_id; int channels_input, channels_playback, window_width, window_height, card_id;
int channels_output; int channels_output;
int max_channels;
int type; int type;
int last_preset; /* Last activated preset before switching to another card */ int last_preset; /* Last activated preset before switching to another card */
int last_dirty; /* Last dirty flag before switching to another card */ int last_dirty; /* Last dirty flag before switching to another card */
@ -69,7 +68,6 @@ public:
void adjustSettings(); void adjustSettings();
void getAeb(); void getAeb();
hdsp_9632_aeb_t h9632_aeb; hdsp_9632_aeb_t h9632_aeb;
int supportsLoopback() const;
}; };
#endif #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", "AES.L", "AES.R",
"A 1", "A 2", "A 3", "A 4", "A 1", "A 2", "A 3", "A 4",
"A 5", "A 6", "A 7", "A 8", "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] = { 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); peak = new HDSPMixerPeak(x+3, y+4, 0);
gain = new HDSPMixerGain(x+3, y+175, 0); gain = new HDSPMixerGain(x+3, y+175, 0);
meter = new HDSPMixerMeter(x+20, y+27, false, peak); meter = new HDSPMixerMeter(x+20, y+27, false, peak);
loopback = new HDSPMixerLoopback(x+1, y+208, out_num);
end(); end();
} }

View file

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

View file

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

View file

@ -32,8 +32,6 @@ HDSPMixerOutputs::HDSPMixerOutputs(int x, int y, int w, int h, int nchans):Fl_Gr
strips[i+1]->fader->relative = strips[i]->fader; strips[i+1]->fader->relative = strips[i]->fader;
strips[i]->fader->gain = strips[i]->gain; strips[i]->fader->gain = strips[i]->gain;
strips[i+1]->fader->gain = strips[i+1]->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); 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; over = 3;
level = 0; level = 0;
rate = 1; rate = 1;
loopback = 0;
} }

View file

@ -38,7 +38,6 @@ public:
int over; int over;
int rate; int rate;
int rmsplus3; int rmsplus3;
int loopback;
HDSPMixerPresetData(); 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->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]->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 */ /* Line outs */
basew->outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][p]->fader_pos = basew->outputs->strips[HDSP_MAX_CHANNELS]->fader->pos[0]; 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->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]->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 */ /* Line outs */
basew->outputs->strips[HDSP_MAX_CHANNELS]->fader->pos[0] = basew->outputs->strips[HDSP_MAX_CHANNELS+1]->data[card][speed][p]->fader_pos; 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; hdsp_peak_rms_t hdsp_peak_rms;
struct hdspm_peak_rms hdspm_peak_rms; struct hdspm_peak_rms hdspm_peak_rms;
bool isMADI = false; bool isMADI = false;
__u32 *input_peaks, *playback_peaks, *output_peaks; uint32_t *input_peaks, *playback_peaks, *output_peaks;
__u64 *input_rms, *playback_rms, *output_rms; uint64_t *input_rms, *playback_rms, *output_rms;
HDSPMixerWindow *w = (HDSPMixerWindow *)arg; 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) /
sizeof(inputs->strips[0]->data[0][0][0]->fader_pos[0])); 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 FILE *file;
* 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();
if ((out = fopen(tmpc, "w")) == NULL) { if ((file = fopen(file_name, "w")) == NULL) {
fl_alert("Error opening file %s for saving", tmpc); fl_alert("Error opening file %s for saving", file_name);
} }
if (dirty) { if (dirty) {
inputs->buttons->presets->save_preset(current_preset+1); inputs->buttons->presets->save_preset(current_preset+1);
} }
/* since hdspmixer 1.11, we also store the meter level settings. Indicate /* since hdspmixer 1.11, we also store the meter level settings. Indicate
* the new on-disk structure via a small header */ * 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)) { sizeof(header)) {
goto save_error; goto save_error;
} }
@ -381,145 +374,99 @@ void HDSPMixerWindow::save()
for (int preset = 0; preset < 8; ++preset) { for (int preset = 0; preset < 8; ++preset) {
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) { for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
/* inputs pans and volumes */ /* 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; 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; goto save_error;
} }
/* playbacks pans and volumes */ /* 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; 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; goto save_error;
} }
/* inputs mute/solo/dest */ /* 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; 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; 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; goto save_error;
} }
/* playbacks mute/solo/dest */ /* 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; 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; 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; goto save_error;
} }
/* outputs volumes */ /* 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; goto save_error;
} }
} }
/* Lineouts */ /* 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; 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; goto save_error;
} }
/* Global settings */ /* 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; 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; 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; 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; 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; 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; 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; 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; 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; 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; 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; 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; 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; goto save_error;
} }
} }
} }
} }
fclose(file);
/* 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);
return; return;
save_error: save_error:
fclose(out); fclose(file);
fl_alert("Error saving presets to file %s", file_name); fl_alert("Error saving presets to file %s", file_name);
return; return;
} }
@ -542,7 +489,6 @@ void HDSPMixerWindow::load()
bool ondisk_v1 = false; bool ondisk_v1 = false;
int pan_array_size = 14; /* old (pre 1.0.24) HDSP_MAX_DEST */ 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 */ 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)) { if (fread(&buffer, sizeof(char), sizeof(buffer), file) != sizeof(buffer)) {
goto load_error; 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); fclose(file);
setTitleWithFilename(); setTitleWithFilename();
resetMixer(); 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]->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+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) { if (preset == 3 || preset == 7) {
inputs->strips[i]->data[card][speed][preset]->mute = 1; inputs->strips[i]->data[card][speed][preset]->mute = 1;
inputs->strips[i+1]->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 */ /* Outputs row */
if (outputs->strips[i]->data[current_card][speed][p]->fader_pos != outputs->strips[i]->fader->pos[0]) if (outputs->strips[i]->data[current_card][speed][p]->fader_pos != outputs->strips[i]->fader->pos[0])
corrupt++; corrupt++;
if (outputs->strips[i]->data[current_card][speed][p]->loopback != outputs->strips[i]->loopback->get())
corrupt++;
} }
/* Global settings */ /* Global settings */

View file

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

View file

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

View file

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

View file

@ -47,7 +47,6 @@
#include "../pixmaps/over.xpm" #include "../pixmaps/over.xpm"
#include "../pixmaps/peak.xpm" #include "../pixmaps/peak.xpm"
#include "../pixmaps/solo.xpm" #include "../pixmaps/solo.xpm"
#include "../pixmaps/loopback.xpm"
#include "../pixmaps/iomixer_r.xpm" #include "../pixmaps/iomixer_r.xpm"
#include "../pixmaps/output_r.xpm" #include "../pixmaps/output_r.xpm"
#include "../pixmaps/matrix_black.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 * over_xpm[];
extern char const * peak_xpm[]; extern char const * peak_xpm[];
extern char const * solo_xpm[]; extern char const * solo_xpm[];
extern char const * loopback_xpm[];
extern char const * iomixer_r_xpm[]; extern char const * iomixer_r_xpm[];
extern char const * output_r_xpm[]; extern char const * output_r_xpm[];
extern char const * matrix_white_xpm[]; extern char const * matrix_white_xpm[];

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) * 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 This tool requires Python, pygtk, and alsa-pyton 1.0.22 or later.
or later.
It is recommended to use at least Linux kernel 2.6.32 or alsa-driver 1.0.22; 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. otherwise, the name of the program that is using a stream cannot be shown.

View file

@ -1,8 +1,7 @@
#!/usr/bin/env python #!/usr/bin/python2
# hwmixvolume - ALSA hardware mixer volume control applet # hwmixvolume - ALSA hardware mixer volume control applet
# Copyright (c) 2009-2010 Clemens Ladisch # 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 # Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above # 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 # OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE. # PERFORMANCE OF THIS SOFTWARE.
import gi import gobject, gtk
gi.require_version('GLib', '2.0')
gi.require_version('Gtk', '3.0')
from gi.repository import GLib, Gtk
from pyalsa import alsacard, alsahcontrol from pyalsa import alsacard, alsahcontrol
INTF_PCM = alsahcontrol.interface_id['PCM'] INTF_PCM = alsahcontrol.interface_id['PCM']
@ -61,18 +57,18 @@ class Stream:
value = alsahcontrol.Value(self.element) value = alsahcontrol.Value(self.element)
value.read() value.read()
values = value.get_tuple(TYPE_INTEGER, info.count) values = value.get_tuple(TYPE_INTEGER, info.count)
self.label = Gtk.Label.new(self.get_label(info)) self.label = gtk.Label(self.get_label(info))
self.label.set_single_line_mode(True) self.label.set_single_line_mode(True)
self.parent.scales_vbox.add(self.label) self.parent.scales_vbox.pack_start(self.label, expand=False)
for i in range(info.count): for i in range(info.count):
adj = Gtk.Adjustment(value=values[i], adj = gtk.Adjustment(value=values[i],
lower=info.min, upper=info.max, lower=info.min, upper=info.max,
step_incr=1, step_incr=1,
page_incr=(info.max-info.min+1)/8) page_incr=(info.max-info.min+1)/8)
adj.connect('value-changed', self.update_ctl_from_scale, i) adj.connect('value-changed', self.update_ctl_from_scale, i)
scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adj) scale = gtk.HScale(adj)
scale.set_draw_value(False) scale.set_draw_value(False)
self.parent.scales_vbox.add(scale) self.parent.scales_vbox.pack_start(scale, expand=False)
self.scales.append(scale) self.scales.append(scale)
self.adjustments.append(adj) self.adjustments.append(adj)
self.parent.scales_vbox.show_all() self.parent.scales_vbox.show_all()
@ -139,23 +135,29 @@ class Stream:
subdevice = info.index subdevice = info.index
filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice) filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice)
try: try:
with open(filename, "r") as f: f = open(filename, "r")
for line in f:
if line[:9] == "owner_pid":
return int(line.split(':')[1].strip())
except IOError: except IOError:
return None return None
try:
for line in f.readlines():
if line[:9] == "owner_pid":
return int(line.split(':')[1].strip())
finally:
f.close()
return None return None
def get_pid_cmdline(self, pid): def get_pid_cmdline(self, pid):
try: try:
with open("/proc/%d/cmdline" % pid, "r") as f: f = open("/proc/%d/cmdline" % pid, "r")
cmdline = f.read()
except IOError: except IOError:
return None return None
try:
cmdline = f.read()
finally:
f.close()
return cmdline.replace('\x00', ' ').strip() return cmdline.replace('\x00', ' ').strip()
class MixerWindow(Gtk.Window): class MixerWindow(gtk.Window):
card_numbers = alsacard.card_list() card_numbers = alsacard.card_list()
current_card = -1 current_card = -1
hcontrol = None hcontrol = None
@ -165,52 +167,49 @@ class MixerWindow(Gtk.Window):
hctl_sources = [] hctl_sources = []
def __init__(self): def __init__(self):
Gtk.Window.__init__(self) gtk.Window.__init__(self)
self.connect('destroy', lambda w: Gtk.main_quit()) self.connect('destroy', lambda w: gtk.main_quit())
self.set_title("Hardware Mixer Volumes") self.set_title("Hardware Mixer Volumes")
vbox = Gtk.Grid() vbox = gtk.VBox()
vbox.set_orientation(Gtk.Orientation.VERTICAL)
self.add(vbox) self.add(vbox)
hbox = Gtk.Grid() hbox = gtk.HBox()
vbox.add(hbox) vbox.pack_start(hbox, expand=False)
label = Gtk.Label.new_with_mnemonic("_Sound Card: ") label = gtk.Label("_Sound Card: ")
hbox.add(label) label.set_use_underline(True)
hbox.pack_start(label, expand=False)
combo = Gtk.ComboBoxText() combo = gtk.combo_box_new_text()
combo.set_hexpand(True)
for i in self.card_numbers: for i in self.card_numbers:
str = "%d: %s" % (i, alsacard.card_get_name(i)) str = "%d: %s" % (i, alsacard.card_get_name(i))
combo.append_text(str) combo.append_text(str)
if len(self.card_numbers) > 0: if len(self.card_numbers) > 0:
combo.set_active(0) combo.set_active(0)
combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()])) combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()]))
hbox.add(combo) hbox.pack_start(combo)
label.set_mnemonic_widget(combo) label.set_mnemonic_widget(combo)
self.lock_check = Gtk.CheckButton.new_with_mnemonic(label="_Lock Channels") self.lock_check = gtk.CheckButton(label="_Lock Channels")
self.lock_check.set_active(True) self.lock_check.set_active(True)
vbox.add(self.lock_check) vbox.pack_start(self.lock_check, expand=False)
scrollwin = Gtk.ScrolledWindow() scrollwin = gtk.ScrolledWindow()
scrollwin.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC) scrollwin.set_policy(hscrollbar_policy=gtk.POLICY_NEVER, vscrollbar_policy=gtk.POLICY_AUTOMATIC)
scrollwin.set_shadow_type(Gtk.ShadowType.NONE) scrollwin.set_shadow_type(gtk.SHADOW_NONE)
scrollwin.set_vexpand(True) vbox.pack_start(scrollwin)
vbox.add(scrollwin)
self.scales_vbox = Gtk.Grid() self.scales_vbox = gtk.VBox()
self.scales_vbox.set_orientation(Gtk.Orientation.VERTICAL) scrollwin.add_with_viewport(self.scales_vbox)
scrollwin.add(self.scales_vbox)
label = Gtk.Label() label = gtk.Label()
label.set_single_line_mode(True) label.set_single_line_mode(True)
line_height = max(label.get_size_request().height, 0) line_height = label.size_request()[1]
label.destroy() label.destroy()
scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL) scale = gtk.HScale()
scale.set_draw_value(False) scale.set_draw_value(False)
line_height += max(scale.get_size_request().height, 0) line_height += scale.size_request()[1]
scale.destroy() scale.destroy()
# always have space for at least four sliders # always have space for at least four sliders
scrollwin.set_size_request(width=-1, height=line_height*4+4) scrollwin.set_size_request(width=-1, height=line_height*4+4)
@ -224,7 +223,7 @@ class MixerWindow(Gtk.Window):
def change_card(self, cardnum): def change_card(self, cardnum):
for s in self.hctl_sources: for s in self.hctl_sources:
GLib.source_remove(s) gobject.source_remove(s)
self.hctl_sources = [] self.hctl_sources = []
self.hcontrol = self.open_hcontrol_for_card(cardnum) self.hcontrol = self.open_hcontrol_for_card(cardnum)
@ -250,7 +249,7 @@ class MixerWindow(Gtk.Window):
self.streams.append(stream) self.streams.append(stream)
for fd,condition in self.hcontrol.poll_fds: 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)) self.hctl_sources.append(gobject.io_add_watch(fd, condition, self.hctl_io_callback))
self.update_msg_label() self.update_msg_label()
@ -268,9 +267,8 @@ class MixerWindow(Gtk.Window):
else: else:
msg = "This card does not have stream controls." msg = "This card does not have stream controls."
if not has_msg: if not has_msg:
self.msg_label = Gtk.Label.new(msg) self.msg_label = gtk.Label(msg)
self.msg_label.set_vexpand(True) self.scales_vbox.pack_start(self.msg_label)
self.scales_vbox.add(self.msg_label)
self.scales_vbox.show_all() self.scales_vbox.show_all()
elif self.msg_label.get_text() != msg: elif self.msg_label.get_text() != msg:
self.msg_label.set_text(msg) self.msg_label.set_text(msg)
@ -282,9 +280,9 @@ class MixerWindow(Gtk.Window):
mode=alsahcontrol.open_mode['NONBLOCK']) mode=alsahcontrol.open_mode['NONBLOCK'])
except: except:
# TODO: alsa error msg # TODO: alsa error msg
dlg = Gtk.MessageDialog(self, dlg = gtk.MessageDialog(self,
Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK,
"Cannot open sound card control device.") "Cannot open sound card control device.")
dlg.run() dlg.run()
dlg.destroy() dlg.destroy()
@ -306,7 +304,7 @@ class MixerWindow(Gtk.Window):
def main(): def main():
MixerWindow() MixerWindow()
Gtk.main() gtk.main()
main() main()

View file

@ -4,7 +4,6 @@ AC_CONFIG_MACRO_DIR([m4])
AM_MAINTAINER_MODE([enable]) AM_MAINTAINER_MODE([enable])
AC_CONFIG_HEADERS(config.h) AC_CONFIG_HEADERS(config.h)
AC_USE_SYSTEM_EXTENSIONS
AC_PROG_CC AC_PROG_CC
AC_PROG_LD AC_PROG_LD
AC_PROG_INSTALL AC_PROG_INSTALL

View file

@ -354,7 +354,7 @@ int dump_load(int audigy, char *file_name)
fctrl = (ld10k1_ctl_dump_t *)ptr; fctrl = (ld10k1_ctl_dump_t *)ptr;
memset(ctrl, 0, sizeof(emu10k1_fx8010_control_gpr_t) * header->ctl_count); memset(ctrl, 0, sizeof(emu10k1_fx8010_control_gpr_t) * header->ctl_count);
for (i = 0; i < header->ctl_count; i++) { for (i = 0; i < header->ctl_count; i++) {
strcpy((char *)ctrl[i].id.name, fctrl[i].name); strcpy(ctrl[i].id.name, fctrl[i].name);
ctrl[i].id.iface = EMU10K1_CTL_ELEM_IFACE_MIXER; ctrl[i].id.iface = EMU10K1_CTL_ELEM_IFACE_MIXER;
ctrl[i].id.index = fctrl[i].index; ctrl[i].id.index = fctrl[i].index;
ctrl[i].vcount = fctrl[i].vcount; ctrl[i].vcount = fctrl[i].vcount;

View file

@ -77,7 +77,7 @@ void error(const char *fmt, ...)
va_end(va); va_end(va);
} }
static void alog(const char *fmt, ...) static void log(const char *fmt, ...)
{ {
va_list va; va_list va;
@ -116,7 +116,7 @@ static void cleanup()
{ {
if (pidpath[0]) if (pidpath[0])
unlink(pidpath); unlink(pidpath);
alog("Exiting daemon"); log("Exiting daemon");
} }
static void term_handler(int i) static void term_handler(int i)
@ -247,7 +247,7 @@ int main(int argc, char *argv[])
pidfile = fopen(pidpath, "wt"); pidfile = fopen(pidpath, "wt");
if (!pidfile) { if (!pidfile) {
alog("%s: pidfile (%s)\n", strerror(errno), pidpath); log("%s: pidfile (%s)\n", strerror(errno), pidpath);
return 1; return 1;
} }
@ -263,7 +263,7 @@ int main(int argc, char *argv[])
dup2(fileno(logfile), fileno(stdout)); dup2(fileno(logfile), fileno(stdout));
} }
alog("Starting daemon"); log("Starting daemon");
} }
params.type = uses_pipe ? COMM_TYPE_LOCAL : COMM_TYPE_IP; params.type = uses_pipe ? COMM_TYPE_LOCAL : COMM_TYPE_IP;

View file

@ -199,7 +199,7 @@ int ld10k1_update_driver(ld10k1_dsp_mgr_t *dsp_mgr)
if (!add_ctrl) if (!add_ctrl)
return LD10K1_ERR_NO_MEM; return LD10K1_ERR_NO_MEM;
for (i = 0, item = dsp_mgr->add_ctl_list; item != NULL; item = item->next, i++) { for (i = 0, item = dsp_mgr->add_ctl_list; item != NULL; item = item->next, i++) {
strcpy((char *)add_ctrl[i].id.name, item->ctl.name); strcpy(add_ctrl[i].id.name, item->ctl.name);
add_ctrl[i].id.iface = EMU10K1_CTL_ELEM_IFACE_MIXER; add_ctrl[i].id.iface = EMU10K1_CTL_ELEM_IFACE_MIXER;
add_ctrl[i].id.index = item->ctl.index; add_ctrl[i].id.index = item->ctl.index;
add_ctrl[i].vcount = item->ctl.vcount; add_ctrl[i].vcount = item->ctl.vcount;
@ -225,7 +225,7 @@ int ld10k1_update_driver(ld10k1_dsp_mgr_t *dsp_mgr)
if (!del_ids) if (!del_ids)
return LD10K1_ERR_NO_MEM; return LD10K1_ERR_NO_MEM;
for (i = 0, item = dsp_mgr->del_ctl_list; item != NULL; item = item->next, i++) { for (i = 0, item = dsp_mgr->del_ctl_list; item != NULL; item = item->next, i++) {
strcpy((char *)del_ids[i].name, item->ctl.name); strcpy(del_ids[i].name, item->ctl.name);
del_ids[i].iface = EMU10K1_CTL_ELEM_IFACE_MIXER; del_ids[i].iface = EMU10K1_CTL_ELEM_IFACE_MIXER;
del_ids[i].index = item->ctl.index; del_ids[i].index = item->ctl.index;
} }

View file

@ -2152,7 +2152,7 @@ int ld10k1_conn_point_add(ld10k1_dsp_mgr_t *dsp_mgr, ld10k1_conn_point_t *point,
int allocgprcount = 0; int allocgprcount = 0;
int allocinstrcount = 0; int allocinstrcount = 0;
unsigned int reserved[2]; unsigned int reserved[2];
int res[2]; unsigned int res[2];
int reservedcount = 0; int reservedcount = 0;
int usedreserved = 0; int usedreserved = 0;

View file

@ -179,7 +179,7 @@ int main_loop(comm_param *param, int audigy, const char *card_id, int tram_size,
{ {
fd_set active_fd_set/*, read_fd_set*/; fd_set active_fd_set/*, read_fd_set*/;
int i, j, res = 0; int i, j, res = 0;
sighandler_t old_sig_pipe; __sighandler_t old_sig_pipe;
int main_sock = 0; int main_sock = 0;
int data_sock = 0; int data_sock = 0;
@ -792,9 +792,12 @@ int ld10k1_fnc_name_find(int data_conn, int op, int size)
int ld10k1_fnc_name_rename(int data_conn, int op, int size) int ld10k1_fnc_name_rename(int data_conn, int op, int size)
{ {
ld10k1_fnc_name_t name_info; ld10k1_fnc_name_t name_info;
int ret;
int err; int err;
ld10k1_patch_t *patch; ld10k1_patch_t *patch;
ret = -1;
if ((err = receive_msg_data(data_conn, &name_info, sizeof(ld10k1_fnc_name_t))) < 0) if ((err = receive_msg_data(data_conn, &name_info, sizeof(ld10k1_fnc_name_t))) < 0)
return err; return err;

View file

@ -473,9 +473,8 @@ static int transfer_patch(int udin, char *ctrl_opt, liblo10k1_emu_patch_t *ep, l
if (*ctrl_opt != ',') { if (*ctrl_opt != ',') {
error("wrong ctrl option format - wrong separator beetwen subfunctions"); error("wrong ctrl option format - wrong separator beetwen subfunctions");
return 1; return 1;
} else { } else
ctrl_opt++; *ctrl_opt++;
}
} }
} }
@ -692,9 +691,8 @@ static int transfer_native_patch(liblo10k1_dsp_patch_t *p, char *ctrl_opt)
if (*ctrl_opt != ',') { if (*ctrl_opt != ',') {
error("wrong ctrl option format - wrong separator beetwen subfunctions"); error("wrong ctrl option format - wrong separator beetwen subfunctions");
return 1; return 1;
} else { } else
ctrl_opt++; *ctrl_opt++;
}
} }
} }
@ -1468,6 +1466,7 @@ int main(int argc, char *argv[])
int opt_list; int opt_list;
int opt_setup; int opt_setup;
int opt_info;
int opt_add; int opt_add;
int opt_del; int opt_del;
int opt_con_add; int opt_con_add;
@ -1527,6 +1526,7 @@ int main(int argc, char *argv[])
opt_add = 0; opt_add = 0;
opt_del = 0; opt_del = 0;
opt_list_patch = NULL; opt_list_patch = NULL;
opt_info = 0;
opt_con_add = 0; opt_con_add = 0;
opt_con_del = 0; opt_con_del = 0;
opt_debug = 0; opt_debug = 0;
@ -1618,7 +1618,7 @@ int main(int argc, char *argv[])
opt_list_patch = optarg; opt_list_patch = optarg;
break; break;
case 'i': case 'i':
/* nothing */ opt_info = 1;
break; break;
case 'q': case 'q':
opt_con_add = 1; opt_con_add = 1;

View file

@ -89,8 +89,7 @@ static int get_file_name(const char *key, unsigned int idx, char *fname)
for (p = buf + len; *p && isspace(*p); p++) for (p = buf + len; *p && isspace(*p); p++)
; ;
if (*p == '/') { if (*p == '/') {
strncpy(fname, p, MAX_PATH - 1); strncpy(fname, p, MAX_PATH);
fname[MAX_PATH - 1] = '\0';
} else { } else {
snprintf(fname, MAX_PATH, "%s/%s", DATAPATH, p); snprintf(fname, MAX_PATH, "%s/%s", DATAPATH, p);
} }

View file

@ -89,8 +89,7 @@ static int get_file_name(const char *key, unsigned int idx, char *fname)
for (p = buf + len; *p && isspace(*p); p++) for (p = buf + len; *p && isspace(*p); p++)
; ;
if (*p == '/') { if (*p == '/') {
strncpy(fname, p, MAX_PATH - 1); strncpy(fname, p, MAX_PATH);
fname[MAX_PATH - 1] = '\0';
} else { } else {
snprintf(fname, MAX_PATH, "%s/%s", DATAPATH, p); snprintf(fname, MAX_PATH, "%s/%s", DATAPATH, p);
} }

View file

@ -29,7 +29,7 @@ void destroy(GtkWidget *widget,gpointer data)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int card; int card;
char name[16],*err; char name[8],*err;
snd_ctl_card_info_t *hw_info; snd_ctl_card_info_t *hw_info;
card_type_t type; card_type_t type;

View file

@ -225,8 +225,7 @@ static int get_file_name(const char *key, unsigned int idx, char *fname)
for (p = buf + len; *p && isspace(*p); p++) for (p = buf + len; *p && isspace(*p); p++)
; ;
if (*p == '/') { if (*p == '/') {
strncpy(fname, p, MAX_PATH - 1); strncpy(fname, p, MAX_PATH);
fname[MAX_PATH - 1] = '\0';
} else { } else {
snprintf(fname, MAX_PATH, "%s/%s", DATAPATH, p); snprintf(fname, MAX_PATH, "%s/%s", DATAPATH, p);
} }

View file

@ -214,8 +214,7 @@ static int get_file_name(const char *key, unsigned int idx, char *fname)
for (p = buf + len; *p && isspace(*p); p++) for (p = buf + len; *p && isspace(*p); p++)
; ;
if (*p == '/') { if (*p == '/') {
strncpy(fname, p, MAX_PATH - 1); strncpy(fname, p, MAX_PATH);
fname[MAX_PATH - 1] = '\0';
} else { } else {
snprintf(fname, MAX_PATH, "%s/%s", DATAPATH, p); snprintf(fname, MAX_PATH, "%s/%s", DATAPATH, p);
} }