]> git.alsa-project.org Git - alsa-utils.git/commitdiff
Mux fixes...
authorJaroslav Kysela <perex@perex.cz>
Thu, 5 Aug 1999 15:10:23 +0000 (15:10 +0000)
committerJaroslav Kysela <perex@perex.cz>
Thu, 5 Aug 1999 15:10:23 +0000 (15:10 +0000)
gamix/ChangeLog
gamix/README [new file with mode: 0644]
gamix/catch.c
gamix/conf_w.c
gamix/main.c
gamix/mkmixer.c
gamix/probe.c

index 09d5dc02ca00e97b83fafcd26dfbc6660690d41c..ab249b93ec21ed3effe6669d4a3820078576bedf 100644 (file)
@@ -1,3 +1,15 @@
+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.
diff --git a/gamix/README b/gamix/README
new file mode 100644 (file)
index 0000000..282c39d
--- /dev/null
@@ -0,0 +1,9 @@
+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.
index 889d5986b63e9f53b2ac58b62b18812317c5e607..7d6219cc11fb828d452e66aa4c0b964df68d32d6 100644 (file)
@@ -13,7 +13,7 @@ static void cb_rb(void *pd ) {
 }
 
 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;
@@ -30,6 +30,20 @@ static void element_callback(void *pd,int cmd,snd_mixer_eid_t *eid) {
        }
        */
        //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++ ) {
@@ -47,20 +61,6 @@ static void element_callback(void *pd,int cmd,snd_mixer_eid_t *eid) {
                        }
                }
        }
-       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);
@@ -80,14 +80,14 @@ gint time_callback(gpointer data) {
        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++ ) {
index 001ca40f49c097c06496ec6e2bad0f89ef9fd7bf..ba3b2673c33a80f430901e40d1f568c9b9a92665 100644 (file)
@@ -84,7 +84,7 @@ gint conf_win( void ) {
        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;
@@ -199,6 +199,7 @@ gint conf_win( void ) {
                        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"));
@@ -262,45 +263,48 @@ gint conf_win( void ) {
                                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);
@@ -596,8 +600,6 @@ void conf_write(void) {
 
 static void chk_cfile( void ) {
        int i,j,k,err;
-       FILE *fp;
-       DIR *dp;
        gchar *name;
 
        k=strlen(g_get_home_dir());
index 0fdb7b471ce096b94d1b9bb2da2de5d6ed2efb6d..11f275162032a28795fcf9c8555b6a4923852643 100644 (file)
@@ -19,7 +19,7 @@ static void exit_gtk(GtkWidget *w,gpointer data) {
 }
 
 int main( int argc , char **argv ) {
-       int i,j;
+       int i;
        gchar *dirname,*filename;
 
        i=probe_mixer();
@@ -141,7 +141,7 @@ void disp_toolbar(void) {
 }
 
 static void sel_mctype(GtkWidget *w,gpointer n) {
-       int i,j;
+       int i;
        GtkRequisition rq;
 
        i=(int)n;
@@ -157,7 +157,7 @@ static void sel_mctype(GtkWidget *w,gpointer n) {
 int disp_mixer( void ) {
        int i,j;
        GtkWidget *n_label;
-       GtkWidget *sep,*frame;
+       GtkWidget *frame;
        GtkRequisition rq;
 
        switch( conf.wmode ) {
index 73d01c8b200468fb3b934b5ea8ee0a2154a30cd4..f216be9e75d21a11d3e4123adef7d2472c47c9cc 100644 (file)
@@ -19,7 +19,7 @@ static void chain_callback2(GtkToggleButton *,s_eelements *);
 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;
 
@@ -85,7 +85,7 @@ static void volume1_callback(GtkAdjustment *adj,s_element *e) {
 }
 
 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;
@@ -108,7 +108,7 @@ static void switch2_callback(GtkToggleButton *b,s_element *e ) {
        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 ) {
@@ -150,7 +150,7 @@ static void mux1_callback(GtkItem *item,s_element *e ) {
                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(
@@ -166,7 +166,7 @@ static void mux1_callback(GtkItem *item,s_element *e ) {
 }
 
 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");
 
@@ -238,7 +238,7 @@ static void chain_callback2(GtkToggleButton *b,s_eelements *ee ) {
 }
 
 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;
@@ -246,9 +246,9 @@ GtkWidget *make_mixer( gint c_n , gint m_n ) {
        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;
 
@@ -440,7 +440,7 @@ GtkWidget *make_mixer( gint c_n , gint m_n ) {
   }
 
 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;
 
index 4ff8be6e544544216d0165ae00975da084bd5730..f7d63464ed85b62665d473546b83af0fd7ab8b76 100644 (file)
@@ -4,19 +4,20 @@
 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);
@@ -121,6 +122,14 @@ gint probe_mixer( void ) {
                                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];
@@ -162,6 +171,11 @@ gint probe_mixer( void ) {
                                        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 ) {
@@ -171,6 +185,24 @@ gint probe_mixer( void ) {
                                        }
                                }
                        }
+                       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++ ) {
                                /*
@@ -179,15 +211,16 @@ gint probe_mixer( void ) {
                                  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;
@@ -203,7 +236,7 @@ gint probe_mixer( void ) {
                                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);
 
@@ -213,16 +246,25 @@ gint probe_mixer( void ) {
                                }
                        }
                        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:
@@ -238,16 +280,6 @@ static gint ab_chk( s_mixer *mixer,snd_mixer_eid_t *eid ) {
        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;
 }
 
@@ -260,7 +292,8 @@ static int s_element_build(snd_mixer_t *handle,s_element *e,
        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);