~ubuntu-branches/ubuntu/trusty/pd-smlib/trusty

« back to all changes in this revision

Viewing changes to vlavg.c

  • Committer: Bazaar Package Importer
  • Author(s): Hans-Christoph Steiner
  • Date: 2010-11-10 15:17:58 UTC
  • Revision ID: james.westby@ubuntu.com-20101110151758-3acjf69kiudo3gh4
Tags: upstream-0.12.1
ImportĀ upstreamĀ versionĀ 0.12.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "defines.h"
 
2
 
 
3
/*--------------- vlavg -----------------------*/
 
4
/* leaky average of each element in a list     */
 
5
/* arguments: [halfdecay] */
 
6
 
 
7
static t_class *vlavg_class;
 
8
 
 
9
typedef struct _vlavg
 
10
{
 
11
    t_object x_obj;
 
12
        float m_c_leak;
 
13
        float m_leak;
 
14
        float *m_avg;
 
15
        int m_n;
 
16
} t_vlavg;
 
17
 
 
18
 
 
19
static void vlavg_perform(t_vlavg *x, t_symbol *s, int argc, t_atom *argv)
 
20
{
 
21
        int i;
 
22
        t_atom *ap,*app;
 
23
        float *fp;
 
24
        float m_leak;
 
25
        float m_c_leak;
 
26
        m_leak=x->m_leak;
 
27
        m_c_leak=x->m_c_leak;
 
28
 
 
29
        if (argc!=x->m_n)
 
30
        {
 
31
                int i;
 
32
                if (x->m_avg)
 
33
                        freebytes(x->m_avg,x->m_n);
 
34
                x->m_avg=(float*)getbytes(argc*sizeof(float));
 
35
                for(i=0;i<argc;i++)
 
36
                        x->m_avg[i]=0.0f;
 
37
                x->m_n=argc;
 
38
        }
 
39
 
 
40
        fp=x->m_avg;
 
41
    ap = (t_atom *)getbytes(sizeof(t_atom)*argc);
 
42
        app=ap;
 
43
        for (i = 0; i < argc; i++)
 
44
        {
 
45
                float f=atom_getfloat(argv++);
 
46
                *fp = *fp * m_c_leak + f * m_leak;
 
47
                SETFLOAT(app, *fp);
 
48
                app++;
 
49
                fp++;
 
50
        }
 
51
        outlet_list(x->x_obj.ob_outlet,gensym("list"),argc,ap);
 
52
    freebytes(ap,argc);
 
53
}
 
54
 
 
55
static void vlavg_setHalfDecay(t_vlavg *x, t_floatarg halfDecayTime)
 
56
{
 
57
        x->m_c_leak=(float)powf(.5,(1.0f/halfDecayTime));
 
58
        x->m_leak=1.0f-x->m_c_leak;
 
59
}
 
60
 
 
61
static void *vlavg_new(t_float halfDecayTime)
 
62
{
 
63
        t_vlavg *x=(t_vlavg *)pd_new(vlavg_class);
 
64
        outlet_new(&x->x_obj, gensym("list"));
 
65
        vlavg_setHalfDecay(x, halfDecayTime);
 
66
        x->m_n=0;
 
67
        x->m_avg=0;
 
68
        return (void *)x;
 
69
}
 
70
 
 
71
static void vlavg_free(t_vlavg *x)
 
72
{
 
73
        freebytes(x->m_avg,x->m_n);
 
74
}
 
75
 
 
76
void vlavg_setup(void)
 
77
{
 
78
    vlavg_class = class_new(gensym("vlavg"),
 
79
        (t_newmethod)vlavg_new, (t_method)vlavg_free,
 
80
                sizeof(t_vlavg), 
 
81
                CLASS_DEFAULT,
 
82
            A_DEFFLOAT, 0);
 
83
        class_addmethod(vlavg_class, (t_method)vlavg_setHalfDecay,
 
84
        gensym("decay"), A_DEFFLOAT, NULL);
 
85
    class_addlist(vlavg_class, (t_method)vlavg_perform);
 
86
}