+1999-08-04 Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
+
+ * probe.c: fixed multi haven element problem.
+
+1999-08-03 Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
+
+ * catch.c: fixed mux lock.
+
+1999-07-30 Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
+
+ * conf_w.c: fixed case of cards[i].mixer[j].ee_n = 0.
+
1999-07-19 Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
* probe.c: fixed multi mixerdevices.
--- /dev/null
+GTK ALSA audio mixer gamix by Fumihiko Murata <fmurata@p1.tcnet.ne.jp>
+ DaiCom Software
+
+This is a mixer application for ALSA using GTK.
+
+If you wait to use internationalized version (supported only Japanese).
+Check
+ http://www1.tcnet.ne.jp/fmurata/linux/down/
+and download lastest gamix-*.tar.gz. * is version no.
}
static void element_callback(void *pd,int cmd,snd_mixer_eid_t *eid) {
- int i,j,k;
+ int i,j;
gint ccc;
s_group *group;
s_element *e;
}
*/
//printf("hoe '%s',%d,%d\n",eid->name,eid->index,eid->type);
+ for( i=0 ; i < mixer->ee_n ; i++ ) {
+ ee=&mixer->ee[i];
+ if( strcmp(ee->e.e.eid.name,eid->name)==0 &&
+ ee->e.e.eid.index==eid->index ) {
+ snd_mixer_element_read(mixer->handle,&ee->e.e);
+ if( ee->enabled ) {
+ ccc=ee->chain;
+ ee->chain=FALSE;
+ s_e_chk(&ee->e);
+ ee->chain=ccc;
+ }
+ return;
+ }
+ }
for( i=0 ; i<mixer->groups.groups ; i++ ) {
group=&mixer->group[i];
for( j=0 ; j<group->g.elements ; j++ ) {
}
}
}
- for( i=0 ; i < mixer->ee_n ; i++ ) {
- ee=&mixer->ee[i];
- if( strcmp(ee->e.e.eid.name,eid->name)==0 &&
- ee->e.e.eid.index==eid->index ) {
- snd_mixer_element_read(mixer->handle,&ee->e.e);
- if( ee->enabled ) {
- ccc=ee->chain;
- ee->chain=FALSE;
- s_e_chk(&ee->e);
- ee->chain=ccc;
- }
- return;
- }
- }
printf("elem hoe %d %s %d %d\n",cmd,eid->name,eid->index,eid->type);
for( i=0 ; i<card_num ; i++ ) {
for( j=0 ; j<cards[i].info.mixerdevs ; j++ ) {
cb_mix.private_data=(void *)&cards[i].mixer[j];
- snd_mixer_read(cards[i].mixer[j].handle,&cb_mix);
+ err=snd_mixer_read(cards[i].mixer[j].handle,&cb_mix);
}
}
return 1;
}
void s_e_chk( s_element *e ) {
- int i,j,err;
+ int i,j;
switch( e->e.eid.type ) {
case SND_MIXER_ETYPE_VOLUME1:
for( i=0 ; i<e->e.data.volume1.voices; i++ ) {
GtkWidget *b;
GtkWidget *vbox,*box,*frame,*hbox,*hhbox,*box1,*box2;
GtkWidget *nb,*n_label;
- unsigned char gname[256];
+ unsigned char gname[40];
GSList *gp;
ok_pushed=FALSE;
gtk_widget_show(b);
if( k==0 ) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),
TRUE);
+
gp=gtk_radio_button_group(GTK_RADIO_BUTTON(b));
b=gtk_radio_button_new_with_label(gp,_("space"));
l++;
gtk_widget_show(hbox);
}
- ccard[i].m[j].ee_en=(gint *)g_malloc(cards[i].mixer[j].ee_n *
- sizeof(gint));
- if( cards[i].mixer[j].ee_n && ccard[i].m[j].ee_en == NULL) {
- fprintf(stderr,nomem_msg);
- g_free(ccard[i].m[j].g_en);
- g_free(ccard[i].m);
- g_free(ccard);
- return -1;
- }
- for( k=0 ; k<cards[i].mixer[j].ee_n ; k++ ) {
- ccard[i].m[j].ee_en[k]=cards[i].mixer[j].ee[k].enable;
- hbox=gtk_hbox_new(FALSE,2);
- b=gtk_toggle_button_new();
- gtk_widget_set_usize(b,10,10);
- gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),
- ccard[i].m[j].ee_en[k]);
- gtk_signal_connect(GTK_OBJECT(b),"toggled",
- GTK_SIGNAL_FUNC(tb_callback),
- (gpointer)&ccard[i].m[j].ee_en[k]);
- gtk_widget_show(b);
- if( cards[i].mixer[j].ee[k].e.e.eid.index > 0 ) {
- sprintf(gname,"%s %d",
- cards[i].mixer[j].ee[k].e.e.eid.name,
- cards[i].mixer[j].ee[k].e.e.eid.index);
- } else {
- strcpy(gname,cards[i].mixer[j].ee[k].e.e.eid.name);
+ if( cards[i].mixer[j].ee_n ) {
+ ccard[i].m[j].ee_en=(gint *)g_malloc(cards[i].mixer[j].ee_n *
+ sizeof(gint));
+ if( ccard[i].m[j].ee_en == NULL ) {
+ fprintf(stderr,nomem_msg);
+ g_free(ccard[i].m[j].g_en);
+ g_free(ccard[i].m);
+ g_free(ccard);
+ return -1;
}
- n_label=gtk_label_new(gname);
- gtk_box_pack_start(GTK_BOX(hbox),n_label,FALSE,FALSE,0);
- gtk_widget_show(n_label);
- if( (l&1) ) {
- gtk_box_pack_start(GTK_BOX(box2),hbox,FALSE,FALSE,0);
- } else {
- gtk_box_pack_start(GTK_BOX(box1),hbox,FALSE,FALSE,0);
+ for( k=0 ; k<cards[i].mixer[j].ee_n ; k++ ) {
+ ccard[i].m[j].ee_en[k]=cards[i].mixer[j].ee[k].enable;
+ hbox=gtk_hbox_new(FALSE,2);
+ b=gtk_toggle_button_new();
+ gtk_widget_set_usize(b,10,10);
+ gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),
+ ccard[i].m[j].ee_en[k]);
+ gtk_signal_connect(GTK_OBJECT(b),"toggled",
+ GTK_SIGNAL_FUNC(tb_callback),
+ (gpointer)&ccard[i].m[j].ee_en[k]);
+ gtk_widget_show(b);
+ if( cards[i].mixer[j].ee[k].e.e.eid.index > 0 ) {
+ sprintf(gname,"%s %d",
+ cards[i].mixer[j].ee[k].e.e.eid.name,
+ cards[i].mixer[j].ee[k].e.e.eid.index);
+ } else {
+ strcpy(gname,cards[i].mixer[j].ee[k].e.e.eid.name);
+ }
+ n_label=gtk_label_new(gname);
+ gtk_box_pack_start(GTK_BOX(hbox),n_label,FALSE,FALSE,0);
+ gtk_widget_show(n_label);
+ if( (l&1) ) {
+ gtk_box_pack_start(GTK_BOX(box2),hbox,FALSE,FALSE,0);
+ } else {
+ gtk_box_pack_start(GTK_BOX(box1),hbox,FALSE,FALSE,0);
+ }
+ l++;
+ gtk_widget_show(hbox);
}
- l++;
- gtk_widget_show(hbox);
}
+
gtk_widget_show(box1);
gtk_widget_show(box2);
gtk_widget_show(hhbox);
static void chk_cfile( void ) {
int i,j,k,err;
- FILE *fp;
- DIR *dp;
gchar *name;
k=strlen(g_get_home_dir());
}
int main( int argc , char **argv ) {
- int i,j;
+ int i;
gchar *dirname,*filename;
i=probe_mixer();
}
static void sel_mctype(GtkWidget *w,gpointer n) {
- int i,j;
+ int i;
GtkRequisition rq;
i=(int)n;
int disp_mixer( void ) {
int i,j;
GtkWidget *n_label;
- GtkWidget *sep,*frame;
+ GtkWidget *frame;
GtkRequisition rq;
switch( conf.wmode ) {
static gint mk_element(s_element *,GtkBox *);
static void close_callback(GtkWidget *w,s_mixer *mixer) {
- int i,j,err;
+ int i;
s_group *g;
s_eelements *ee;
}
static void switch1_callback(GtkToggleButton *b,s_element *e ) {
- int i,j,k,err;
+ int i,j;
for( i=0 ; i<e->e.data.switch1.sw; i++ ) {
if( b == (GtkToggleButton *)e->w[i] ) break;
int err;
e->e.data.switch2.sw=b->active;
- snd_mixer_element_write(cards[e->card].mixer[e->mdev].handle,&e->e);
+ err=snd_mixer_element_write(cards[e->card].mixer[e->mdev].handle,&e->e);
}
static void chain_callback(GtkToggleButton *b,s_group *g ) {
e->mux[no].index == e->e.data.mux1.poutput[ch].index &&
e->mux[no].type == e->e.data.mux1.poutput[ch].type ) return;
- if( e->chain ) {
+ if( *e->chain ) {
for( i=0 ; i<e->e.data.mux1.output ; i++ ) {
e->e.data.mux1.poutput[i]=e->mux[no];
if( ch != i ) gtk_option_menu_set_history(
}
static void mux2_callback(GtkItem *item,s_element *e ) {
- int i,no,err;
+ int no,err;
no=(int)gtk_object_get_data(GTK_OBJECT(item),"no");
}
GtkWidget *make_mixer( gint c_n , gint m_n ) {
- int i,j,k,l,err;
+ int i,j,err;
GtkWidget *mv_box,*m_name;
GtkWidget *s_win;
GtkWidget *mh_box;
GtkWidget *iv_box;
GtkWidget *ih_box;
GtkWidget *c_l;
- char gname[128];
+ char gname[40];
s_mixer *mixer;
- s_group *group;
+ s_group *group=NULL;
s_element *e;
s_eelements *ee;
}
gint mk_element(s_element *e,GtkBox *iv_box) {
- int i,j,k,err;
+ int i,j,k;
GtkWidget *ih_box;
GtkWidget *menu,*c_l,*item;
int card_num,mdev_num;
s_card *cards;
+static int search_es(snd_mixer_eid_t *,snd_mixer_elements_t *);
static gint ab_chk( s_mixer *,snd_mixer_eid_t * );
static int s_element_build(snd_mixer_t *,s_element *,snd_mixer_elements_t *,
snd_mixer_eid_t ,int , int);
static gint mk_mux_lst(snd_mixer_t *,snd_mixer_elements_t *,snd_mixer_element_info_t *,snd_mixer_eid_t **);
gint probe_mixer( void ) {
- int err,i,j,k,l;
+ int err,i,j,k,l,m;
snd_ctl_t *p_handle;
snd_mixer_t *m_handle;
snd_mixer_elements_t es;
- snd_mixer_element_t ee;
s_mixer *mixer;
s_group *group;
+ int *es_nums;
card_num=snd_cards();
cards=(s_card *)g_malloc(sizeof(s_card)*card_num);
snd_mixer_close(m_handle);
return -1;
}
+ es_nums = (int *)g_malloc(es.elements * sizeof(int));
+ if( es_nums == NULL ) {
+ fprintf(stderr,nomem_msg);
+ snd_ctl_close(p_handle);
+ snd_mixer_close(m_handle);
+ return -1;
+ }
+ bzero(es_nums,es.elements * sizeof(int));
//printf("Card %d mixer %d\n",i,j);
for( k=0 ; k<mixer->groups.groups ; k++ ) {
group=&mixer->group[k];
return -1;
}
for( l=0 ; l<group->g.elements ; l++ ) {
+ m=search_es( &group->g.pelements[l],&es );
+ if( m>-1 ) {
+ if( es_nums[m] ) group->g.pelements[l].type=0;
+ es_nums[m]++;
+ }
err=s_element_build(m_handle,&group->e[l],&es,
group->g.pelements[l],i,j);
if( err<0 ) {
}
}
}
+ for( k=0 ; k<es.elements ; k++ ) {
+ if( es_nums[k] > 1 ) {
+ for( l=0 ; l<mixer->groups.groups ; l++ ) {
+ group=&mixer->group[l];
+ for( m=0 ; m<group->g.elements; m++ ) {
+ if( strcmp( es.pelements[k].name,group->g.pelements[m].name)==0 &&
+ es.pelements[k].index == group->g.pelements[m].index &&
+ es.pelements[k].type == group->g.pelements[m].type ) {
+ group->e[m].e.eid.type=0;
+ group->e[m].info.eid.type=0;
+ l=mixer->groups.groups;
+ break;
+ }
+
+ }
+ }
+ }
+ }
l=0;
for( k=0 ; k<es.elements ; k++ ) {
/*
mixer->es.pelements[k].index,
mixer->es.pelements[k].type);
*/
- //if( mixer->es.pelements[k].type > 99 ) {
- if( ab_chk(mixer,&es.pelements[k]) ) {
- l++;
- /*
- printf("Element '%s',%d,%d\n",
- es.pelements[k].name,
- es.pelements[k].index,
- es.pelements[k].type);
- */
+ if( es_nums[k] == 0 || es_nums[k]>1 ) {
+ if( ab_chk(mixer,&es.pelements[k]) ) {
+ l++;
+ /*
+ printf("Element '%s',%d,%d\n",
+ es.pelements[k].name,
+ es.pelements[k].index,
+ es.pelements[k].type);
+ */
+ } else es_nums[k]=1;
}
}
mixer->ee_n=l;
k=0;
while(l>0) {
l--;
- while( !ab_chk(mixer,&es.pelements[k]) ) k++;
+ while( es_nums[k]==1 ) k++;
err=s_element_build(m_handle,&mixer->ee[l].e,&es,
es.pelements[k],i,j);
}
}
g_free(es.pelements);
+ g_free(es_nums);
snd_mixer_close(m_handle);
}
snd_ctl_close(p_handle);
-
}
return 0;
}
+static int search_es(snd_mixer_eid_t *eid,snd_mixer_elements_t *es) {
+ int i;
+ for( i=0 ; i<es->elements ; i++ ) {
+ if( strcmp( es->pelements[i].name , eid->name ) == 0 &&
+ es->pelements[i].index == eid->index &&
+ es->pelements[i].type == eid->type ) return i;
+ }
+ return -1;
+}
+
static gint ab_chk( s_mixer *mixer,snd_mixer_eid_t *eid ) {
- int i,j;
switch( eid->type ) {
case SND_MIXER_ETYPE_SWITCH1:
default:
return FALSE;
}
-
- for( i=0 ; i<mixer->groups.groups ; i++ ) {
- if( strncmp(mixer->groups.pgroups[i].name,eid->name,2) == 0 ) {
- for( j=0 ; j<mixer->group[i].g.elements ; j++ ) {
- if( strcmp(mixer->group[i].e[j].e.eid.name , eid->name) == 0 &&
- mixer->group[i].e[j].e.eid.index == eid->index &&
- mixer->group[i].e[j].e.eid.type == eid->type ) return FALSE;
- }
- }
- }
return TRUE;
}
e->e.eid = eid;
e->info.eid = eid;
if( eid.type != SND_MIXER_ETYPE_SWITCH1 &&
- eid.type != SND_MIXER_ETYPE_SWITCH2 ) {
+ eid.type != SND_MIXER_ETYPE_SWITCH2 &&
+ eid.type > 0 ) {
err=snd_mixer_element_info_build(handle,&e->info);
if( err<0 ) {
preid(eid);