From d7cc821e4219ad9f3e72b271e66a8f8004030cf8 Mon Sep 17 00:00:00 2001 From: musil Date: Thu, 14 May 2009 15:48:47 +0000 Subject: is not running yet svn path=/trunk/externals/iem/hdspm_mixer/; revision=11359 --- hdspm_mixer.c | 234 ++++++++++++++++++++++++++++++++++------------------------ hdspm_mixer.h | 3 + 2 files changed, 140 insertions(+), 97 deletions(-) diff --git a/hdspm_mixer.c b/hdspm_mixer.c index 4cc7039..f633d5a 100644 --- a/hdspm_mixer.c +++ b/hdspm_mixer.c @@ -1,5 +1,6 @@ /* Very simple Mixer for RME DSP-MADI and maybe other hammerfall dsp (C) 2003 IEM, Winfried Ritsch (ritsch at iem.at) + (c) 2008 iem, Thomas Musil (musil at iem.at) ... modified to a pd external Institute of Electronic Music and Acoustics GPL - see Licence.txt @@ -7,69 +8,133 @@ eg.:compile as program: cc -o hdspmmixer -DMAIN -lm -lc -lasound hdsdpmmixer.c */ + +#include "m_pd.h" #include #include #include #include #include - -/* #include */ - #include "hdspm_mixer.h" -/* #define QUIET (on cc commandline) */ -#ifndef VERBOSE - #define QUIET -#endif +static t_class *hdspm_mixer_class; -static char card_name[HDSPMM_MAX_CARDS][HDSPMM_MAX_NAME_LEN]; -static int cardid = 0; +typedef struct _hdspm_mixer +{ + t_object x_ob; + char x_card_name[HDSPMM_MAX_CARDS][HDSPMM_MAX_NAME_LEN]; + int x_card_id; +} t_hdspm_mixer; -int find_cards() +static int hdspm_mixer_find_cards(t_hdspm_mixer *x) { int i; char *name; int card = HDSPMM_ERROR_NO_CARD; int n = 0; - - -#ifndef QUIET - printf("Searching mixer for hdspm ...\n"); -#endif - - while (snd_card_next(&card) >= 0) { - if (card < 0) { + + while (snd_card_next(&card) >= 0) // searching mixer for hdspm ... + { + if(card < 0) + { break; - } else { - + } + else + { snd_card_get_name(card, &name); - -#ifdef DEBUG - printf("Card %d : %s\n", card, name); -#endif - - if (strncmp(name, "HDSPM MADI", 9) == 0) { - - snprintf(card_name[n], 6, "hw:%i", n); - -#ifndef QUIET - printf("HDSP MADI as card %d (%s) found !\n",n,card_name[n]); -#endif - n++; - if(n >= HDSPMM_MAX_CARDS) - break; + if(strncmp(name, "HDSPM MADI", 9) == 0) + { + snprintf(x->x_card_name[n], 6, "hw:%i", n); // printf("HDSP MADI as card %d (%s) found !\n", n, card_name[n]); + n++; + if(n >= HDSPMM_MAX_CARDS) + break; } } } - - if (!n) + + if(!n) return HDSPMM_ERROR_NO_CARD; + + for(i = n; i < HDSPMM_MAX_CARDS; i++) + { + x->card_name[i][0] = '\0'; + } + + return n; +} - for (i = n; i < HDSPMM_MAX_CARDS; i++) { - card_name[i][0] = '\0'; +int main(int argc, char *argv[]) +{ + int err = 0; + + int src; + int dst; + int val; + + /* + int i; + + for(i=0; i < argc; i++) + printf(" %s ", argv[i]); + printf("\n"); + */ + /* + if((err =find_cards()) < 0) + return err; + */ + + if(argc < 4){ + printf("\nusage %s [value] \n\n" + " devnr ... ALSA-Device eg. for hw:0 is 0 \n" + " src ... inputs 0-63 playback 64-127\n" + " dst ... out channel 0-63\n" + "\noptional if wanting to set a value:\n\n" + " value ... gain 0=0 (mute), 32768=1 (unitGain), 65535 = max\n\n", + argv[0]); + + if(find_cards() < 0) + puts("No Hammerfall DSP MADI card found."); + puts(""); + printf("Version %s, 2003 - IEM, winfried ritsch\n",HDSPMM_VERSION); + return -1; } + + cardid = atoi(argv[1]); + snprintf(card_name[cardid], 6, "hw:%i", cardid); + + src = atoi(argv[2]); + dst = atoi(argv[3]); + + if(argc == 4){ + + printf(" Get Mixer from %d to %d : %d \n",src,dst, + get_gain(cardid,src,dst)); + + return 0; + } + + /* arg is 5 */ + val = atoi(argv[4]); + + if((err = set_gain(cardid,src,dst,val)) < 0 ) + printf("Error: Could not set mixer from %d to %d gain %d:%s \n", + src,dst,val,snd_strerror(err)); + else + printf("Set Mixer from %d to %d : %d \n",src,dst,val); + + + return err; +} - return n; +static void hdspm_mixer_set_card_id(t_hdspm_mixer *x, t_floatarg fcard_id) // card_id = devnr ... ALSA-Device eg. for hw:0 is 0 +{ + if (fcard_id < 0.0) + fcard_id = 0.0; + x->x_card_id = (int)fcard_id; + if(x->x_card_id < HDSPMM_MAX_CARDS) + snprintf(x->x_card_name[x->x_card_id], 6, "hw:%i", x->x_card_id); + else + post("hdspm_mixer: ALSA-Device-Number greater than 2 (0/1/2)"); } int set_gain(int idx, int src, int dst, int val) @@ -162,70 +227,45 @@ int get_gain(int idx, int src, int dst) snd_ctl_close(handle); return val; + + SETFLOAT(x->x_at+1, delta); + SETFLOAT(x->x_at+2, phi); + outlet_list(x->x_out_para, &s_list, 3, x->x_at); + outlet_anything(x->x_obj.ob_outlet, s, x->x_size2d+1, x->x_at); } -#ifdef MAIN - -int main(int argc, char *argv[]) -{ - int err = 0; - - int src; - int dst; - int val; - - /* - int i; - for(i=0; i < argc; i++) - printf(" %s ", argv[i]); - printf("\n"); - */ - /* - if((err =find_cards()) < 0) - return err; - */ - if(argc < 4){ - printf("\nusage %s [value] \n\n" - " devnr ... ALSA-Device eg. for hw:0 is 0 \n" - " src ... inputs 0-63 playback 64-127\n" - " dst ... out channel 0-63\n" - "\noptional if wanting to set a value:\n\n" - " value ... gain 0=0 (mute), 32768=1 (unitGain), 65535 = max\n\n", - argv[0]); - if(find_cards() < 0) - puts("No Hammerfall DSP MADI card found."); - puts(""); - printf("Version %s, 2003 - IEM, winfried ritsch\n",HDSPMM_VERSION); - return -1; - } - cardid = atoi(argv[1]); - snprintf(card_name[cardid], 6, "hw:%i", cardid); - - src = atoi(argv[2]); - dst = atoi(argv[3]); - - if(argc == 4){ - - printf(" Get Mixer from %d to %d : %d \n",src,dst, - get_gain(cardid,src,dst)); - - return 0; +static void hdspm_mixer_get_matrix_element(t_hdspm_mixer *x, t_symbol *s, int argc, t_atom *argv) +{ + int col; + int help_col, src_index, n=x->x_n_src; + + if((argc >= 2)&&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1)) + { + src_index = (int)atom_getintarg(0, argc, argv) - 1; } +} - /* arg is 5 */ - val = atoi(argv[4]); - - if((err = set_gain(cardid,src,dst,val)) < 0 ) - printf("Error: Could not set mixer from %d to %d gain %d:%s \n", - src,dst,val,snd_strerror(err)); - else - printf("Set Mixer from %d to %d : %d \n",src,dst,val); - +static void *hdspm_mixer_new(void) +{ + t_hdspm_mixer *x = (t_hdspm_mixer *)pd_new(hdspm_mixer_class); + + if(hdspm_mixer_find_cards(x) < 0) + post("hdspm_mixe: No Hammerfall DSP MADI card found!"); + x->x_card_id = 0; + outlet_new(&x->x_ob, &s_list); + return (x); +} - return err; +void hdspm_mixer_setup(void) +{ + hdspm_mixer_class = class_new(gensym("hdspm_mixer"), (t_newmethod)hdspm_mixer_new, 0, sizeof(t_hdspm_mixer), 0, 0); + class_addmethod(hdspm_mixer_class, (t_method)hdspm_mixer_get_matrix_element, gensym("get_matrix_element"), A_GIMME, 0); + class_addmethod(hdspm_mixer_class, (t_method)hdspm_mixer_set_matrix_element, gensym("set_matrix_element"), A_GIMME, 0); + class_addmethod(hdspm_mixer_class, (t_method)hdspm_mixer_set_card_id, gensym("set_card_id"), A_FLOAT, 0); + post("hdspm_mixer (V-%s) loaded! (c) Winfried Ritsch, Thomas Musil 11.2008", HDSPMM_VERSION); + post(" ritsch%ciem.at, musil%ciem.at iem KUG Graz Austria", '@', '@'); } -#endif diff --git a/hdspm_mixer.h b/hdspm_mixer.h index 93e5418..cf9439d 100644 --- a/hdspm_mixer.h +++ b/hdspm_mixer.h @@ -1,5 +1,6 @@ /* Very simple Mixer for RME DSP-MADI and maybe other hammerfall dsp (C) 2003 IEM, Winfried Ritsch (ritsch at iem.at) + (c) 2008 iem, Thomas Musil (musil at iem.at) ... modified to a pd external Institute of Electronic Music and Acoustics GPL - see Licence.txt @@ -12,6 +13,8 @@ #define HDSPMM_MAX_CARDS 3 #define HDSPMM_MAX_NAME_LEN 128 +#define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) + /* Protos */ -- cgit v1.2.1