aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hdspm_mixer.c234
-rw-r--r--hdspm_mixer.h3
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 <string.h>
#include <stdlib.h>
#include <math.h>
#include <sys/ioctl.h>
#include <alsa/asoundlib.h>
-
-/* #include <sound/hdsp.h> */
-
#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 <devnr> <src> <dst> [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 <devnr> <src> <dst> [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 */