From 7312e58d17e331d71d4f47e21bf15499609bace8 Mon Sep 17 00:00:00 2001 From: dieter kovacic Date: Tue, 9 Jul 2002 12:41:56 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r33, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/ext13/; revision=34 --- ossmixer.c | 327 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 ossmixer.c (limited to 'ossmixer.c') diff --git a/ossmixer.c b/ossmixer.c new file mode 100644 index 0000000..3770543 --- /dev/null +++ b/ossmixer.c @@ -0,0 +1,327 @@ +#include "ext13.h" +#include "m_pd.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef SOUND_MIXER_READ +# define SOUND_MIXER_READ(x) MIXER_READ(x) +#endif +#ifndef SOUND_MIXER_WRITE +# define SOUND_MIXER_WRITE(x) MIXER_WRITE(x) +#endif + + +/* -------------------------- ossmixer ------------------------------ */ +static t_class *ossmixer_class; + +typedef struct _ossmixer +{ + t_object x_obj; + int channel; + t_symbol* channel_name; + t_symbol* device; + t_outlet *x_out1; +} t_ossmixer; + +static void *ossmixer_new(t_floatarg f) +{ + char* devicename; + int fd = -1; + t_ossmixer *x = (t_ossmixer *)pd_new(ossmixer_class); + outlet_new(&x->x_obj, &s_bang); + x->x_out1 = outlet_new(&x->x_obj, &s_symbol); + sprintf(devicename,"/dev/mixer%d",(int)f); + x->device = gensym(devicename); +/* x->device = gensym ("/dev/mixer");*/ + fd = open(x->device->s_name, O_WRONLY); + if (fd < 0){ + post ("ossmixer: could not open %s",x->device->s_name); + x->device = gensym("/dev/mixer"); + close (fd); + }else{ + post ("ossmixer: device set to %s",devicename); + } + close(fd); + return (x); +} + +static void ossmixer_set_device(t_ossmixer *x, t_floatarg f) +{ + char* devicename; + int fd = -1; + sprintf(devicename,"/dev/mixer%d",(int)f); + x->device = gensym(devicename); + fd = open(x->device->s_name, O_WRONLY); + if (fd < 0){ + post ("ossmixer: could not open %s",x->device->s_name); + x->device = gensym("/dev/mixer"); + close (fd); + }else{ + post ("ossmixer: device set to %s",devicename); + } +} + +static void ossmixer_bang(t_ossmixer *x) +{ + post ("ossmixer: what should a mixer do with a bang?"); + +} + +static void ossmixer_get(t_ossmixer *x, t_symbol* s) +{ + int vol = -1; + x->channel = -1; + if (!strncmp(s->s_name,"main",4)) + x->channel = (int) SOUND_MIXER_VOLUME; + if (!strncmp(s->s_name,"treble",6)) + x->channel = (int) SOUND_MIXER_TREBLE; + if (!strncmp(s->s_name,"bass",4)) + x->channel = (int) SOUND_MIXER_BASS; + if (!strncmp(s->s_name,"synth",5)) + x->channel = (int) SOUND_MIXER_SYNTH; + if (!strncmp(s->s_name,"pcm",3)) + x->channel = (int) SOUND_MIXER_PCM; + if (!strncmp(s->s_name,"speaker",7)) + x->channel = (int) SOUND_MIXER_SPEAKER; + if (!strncmp(s->s_name,"line",4)) + x->channel = (int) SOUND_MIXER_LINE; + if (!strncmp(s->s_name,"line1",5)) + x->channel = (int) SOUND_MIXER_LINE1; + if (!strncmp(s->s_name,"line2",5)) + x->channel = (int) SOUND_MIXER_LINE2; + if (!strncmp(s->s_name,"line3",5)) + x->channel = (int) SOUND_MIXER_LINE3; + if (!strncmp(s->s_name,"mic",3)) + x->channel = (int) SOUND_MIXER_MIC; + if (!strncmp(s->s_name,"cd",2)) + x->channel = (int) SOUND_MIXER_CD; + if (!strncmp(s->s_name,"imix",4)) + x->channel = (int) SOUND_MIXER_IMIX; + if (!strncmp(s->s_name,"altpcm",6)) + x->channel = (int) SOUND_MIXER_ALTPCM; + if (!strncmp(s->s_name,"reclev",6)) + x->channel = (int) SOUND_MIXER_RECLEV; + if (!strncmp(s->s_name,"reclevel",8)) + x->channel = (int) SOUND_MIXER_RECLEV; + if (!strncmp(s->s_name,"igain",5)) + x->channel = (int) SOUND_MIXER_IGAIN; + if (!strncmp(s->s_name,"ogain",5)) + x->channel = (int) SOUND_MIXER_OGAIN; + +/* +braucht das wer? + #define SOUND_MIXER_DIGITAL1 17 + #define SOUND_MIXER_DIGITAL2 18 + #define SOUND_MIXER_DIGITAL3 19 + #define SOUND_MIXER_PHONEIN 20 + #define SOUND_MIXER_PHONEOUT 21 + #define SOUND_MIXER_VIDEO 22 + #define SOUND_MIXER_RADIO 23 + #define SOUND_MIXER_MONITOR 24 +*/ + + + if (x->channel > -1){ + int fd = -1; +/* fd = open("/dev/mixer0", O_RDONLY);*/ + fd = open(x->device->s_name, O_RDONLY); + if (fd > 0){ + int vol = 50; + if (ioctl(fd, SOUND_MIXER_READ( x->channel ), &vol)==-1){ + post("ossmixer: undefined mixer channel"); + }else{ + x->channel_name = s; + vol = vol & 255; + outlet_symbol (x->x_out1,s); + outlet_float(x->x_obj.ob_outlet,(t_float)vol); + } + close(fd); + }else{ + post ("ossmixer: could not open device %s",x->device->s_name); + } + } +} + +static void ossmixer_set(t_ossmixer *x, t_symbol* s, t_float f) +{ + int vol = (int) f; + if (vol < 0 ){ + post ("ossmixer: minimum volume: 0"); + vol = 0; + } + if (vol > 100 ){ + post ("ossmixer: maximum volume: 100"); + vol = 100; + } + x->channel = -1; + + if (!strncmp(s->s_name,"main",4)) + x->channel = (int) SOUND_MIXER_VOLUME; + if (!strncmp(s->s_name,"treble",6)) + x->channel = (int) SOUND_MIXER_TREBLE; + if (!strncmp(s->s_name,"bass",4)) + x->channel = (int) SOUND_MIXER_BASS; + if (!strncmp(s->s_name,"synth",5)) + x->channel = (int) SOUND_MIXER_SYNTH; + if (!strncmp(s->s_name,"pcm",3)) + x->channel = (int) SOUND_MIXER_PCM; + if (!strncmp(s->s_name,"speaker",7)) + x->channel = (int) SOUND_MIXER_SPEAKER; + if (!strncmp(s->s_name,"line",4)) + x->channel = (int) SOUND_MIXER_LINE; + if (!strncmp(s->s_name,"line1",5)) + x->channel = (int) SOUND_MIXER_LINE1; + if (!strncmp(s->s_name,"line2",5)) + x->channel = (int) SOUND_MIXER_LINE2; + if (!strncmp(s->s_name,"line3",5)) + x->channel = (int) SOUND_MIXER_LINE3; + if (!strncmp(s->s_name,"mic",3)) + x->channel = (int) SOUND_MIXER_MIC; + if (!strncmp(s->s_name,"cd",2)) + x->channel = (int) SOUND_MIXER_CD; + if (!strncmp(s->s_name,"imix",4)) + x->channel = (int) SOUND_MIXER_IMIX; + if (!strncmp(s->s_name,"altpcm",6)) + x->channel = (int) SOUND_MIXER_ALTPCM; + if (!strncmp(s->s_name,"reclev",6)) + x->channel = (int) SOUND_MIXER_RECLEV; + if (!strncmp(s->s_name,"reclevel",8)) + x->channel = (int) SOUND_MIXER_RECLEV; + if (!strncmp(s->s_name,"igain",5)) + x->channel = (int) SOUND_MIXER_IGAIN; + if (!strncmp(s->s_name,"ogain",5)) + x->channel = (int) SOUND_MIXER_OGAIN; + + + + if (x->channel > -1){ + int fd = -1; + fd = open(x->device->s_name, O_WRONLY); + if (fd > 0){ + vol = vol | (vol << 8); + if (ioctl(fd, SOUND_MIXER_WRITE( x->channel ), &vol)==-1){ + post("ossmixer: undefined mixer channel"); + }else{ + x->channel_name = s; + vol &= 255; + outlet_symbol (x->x_out1,s); + outlet_float(x->x_obj.ob_outlet,(t_float)vol); + } + close (fd); + }else{ + post ("ossmixer: could not open device %s",x->device->s_name); + } + } +} +static void ossmixer_get_source(t_ossmixer *x) +{ + int fd = -1; + int channel = -1; + fd = open(x->device->s_name, O_WRONLY); + if (fd > 0){ + if ( ioctl(fd, SOUND_MIXER_READ_RECSRC, &channel) ){ + post ("ossmixer: could not get recording source"); + }else{ + t_symbol* s_ch = gensym("no_source_found"); + if (channel & SOUND_MASK_VOLUME) s_ch = gensym("main"); + if (channel & SOUND_MASK_PCM) s_ch = gensym("pcm"); + if (channel & SOUND_MASK_MIC) s_ch = gensym("mic"); + if (channel & SOUND_MASK_CD) s_ch = gensym("cd"); + if (channel & SOUND_MASK_SYNTH) s_ch = gensym("synth"); + if (channel & SOUND_MASK_LINE) s_ch = gensym("line"); + if (channel & SOUND_MASK_LINE1) s_ch = gensym("line1"); + if (channel & SOUND_MASK_LINE2) s_ch = gensym("line2"); + if (channel & SOUND_MASK_LINE3) s_ch = gensym("line3"); + if (channel & SOUND_MASK_ALTPCM) s_ch = gensym("altpcm"); + + outlet_symbol (x->x_out1,s_ch); + outlet_symbol (x->x_obj.ob_outlet,gensym("source")); + } + close (fd); + }else{ + post ("ossmixer: could not open mixer device"); + } + +} + +static void ossmixer_set_source(t_ossmixer *x, t_symbol* s) +{ + int channel = -1; + if (!strncmp(s->s_name,"main",4)) + channel = (int) SOUND_MASK_VOLUME; + if (!strncmp(s->s_name,"treble",6)) + channel = (int) SOUND_MASK_TREBLE; + if (!strncmp(s->s_name,"bass",4)) + channel = (int) SOUND_MASK_BASS; + if (!strncmp(s->s_name,"synth",5)) + channel = (int) SOUND_MASK_SYNTH; + if (!strncmp(s->s_name,"pcm",3)) + channel = (int) SOUND_MASK_PCM; + if (!strncmp(s->s_name,"speaker",7)) + channel = (int) SOUND_MASK_SPEAKER; + if (!strncmp(s->s_name,"line",4)) + channel = (int) SOUND_MASK_LINE; + if (!strncmp(s->s_name,"line1",5)) + channel = (int) SOUND_MASK_LINE1; + if (!strncmp(s->s_name,"line2",5)) + channel = (int) SOUND_MASK_LINE2; + if (!strncmp(s->s_name,"line3",5)) + channel = (int) SOUND_MASK_LINE3; + if (!strncmp(s->s_name,"mic",3)) + channel = (int) SOUND_MASK_MIC; + if (!strncmp(s->s_name,"cd",2)) + channel = (int) SOUND_MASK_CD; + if (!strncmp(s->s_name,"imix",4)) + channel = (int) SOUND_MASK_IMIX; + if (!strncmp(s->s_name,"altpcm",6)) + channel = (int) SOUND_MASK_ALTPCM; + if (!strncmp(s->s_name,"reclev",6)) + channel = (int) SOUND_MASK_RECLEV; + if (!strncmp(s->s_name,"reclevel",8)) + channel = (int) SOUND_MASK_RECLEV; + if (!strncmp(s->s_name,"igain",5)) + channel = (int) SOUND_MASK_IGAIN; + if (!strncmp(s->s_name,"ogain",5)) + channel = (int) SOUND_MASK_OGAIN; + + if(channel > -1){ + int fd = -1; + fd = open(x->device->s_name, O_WRONLY); + if (fd > 0){ + if ( ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &channel) ){ + post ("ossmixer: could not set recordiing source"); + }else{ + ossmixer_get_source(x); + } + close (fd); + }else{ + post ("ossmixer: could not open mixer device %s",x->device->s_name); + } + }else{ + post ("ossmixer: channel unknown"); + } +} + +static void ossmixer_float(t_ossmixer *x, t_float f) +{ + ossmixer_set (x, x->channel_name, f); +} + + +void ossmixer_setup(void) +{ + ossmixer_class = class_new(gensym("ossmixer"), (t_newmethod)ossmixer_new, 0, sizeof(t_ossmixer), 0, A_DEFFLOAT, 0); + class_addbang(ossmixer_class, ossmixer_bang); + class_addfloat(ossmixer_class, ossmixer_float); + class_addmethod(ossmixer_class, (t_method) ossmixer_get, gensym("get"), A_DEFSYM, 0); + class_addmethod(ossmixer_class, (t_method) ossmixer_set, gensym("set"), A_DEFSYM, A_DEFFLOAT, 0); + class_addmethod(ossmixer_class, (t_method) ossmixer_get_source, gensym("get_source"), A_DEFSYM, 0); + class_addmethod(ossmixer_class, (t_method) ossmixer_set_source, gensym("set_source"), A_DEFSYM, 0); + class_addmethod(ossmixer_class, (t_method) ossmixer_set_device, gensym("set_device"), A_DEFFLOAT, 0); +} -- cgit v1.2.1