Jamoma API  0.6.0.a19
j.dcblock.cpp
Go to the documentation of this file.
1 /** @file
2  *
3  * @ingroup implementationMaxExternalsAudioGraph
4  *
5  * @brief j.dcblock= : wraps the #TTDCBlock class as DC offset removing filter external for AudioGraph
6  *
7  * @details
8  *
9  * @authors Tim Place, Trond Lossius
10  *
11  * @copyright © 2008 by Timothy Place @n
12  * This code is licensed under the terms of the "New BSD License" @n
13  * http://creativecommons.org/licenses/BSD/
14  */
15 
16 
17 #include "maxAudioGraph.h"
18 
19 
20 // Data Structure for this object
21 typedef struct DCBlock {
22  t_object obj;
23  TTAudioGraphObjectBasePtr audioGraphObject;
24  TTPtr audioGraphOutlet;
25  long attrBypass;
26 };
27 typedef DCBlock* DCBlockPtr;
28 
29 
30 // Prototypes for methods
31 DCBlockPtr DCBlockNew(t_symbol* msg, long argc, t_atom* argv);
32 void DCBlockFree(DCBlockPtr self);
33 void DCBlockAssist(DCBlockPtr self, void* b, long msg, long arg, char* dst);
34 void DCBlockClear(DCBlockPtr self);
35 TTErr DCBlockReset(DCBlockPtr self);
36 TTErr DCBlockSetup(DCBlockPtr self);
37 TTErr DCBlockConnect(DCBlockPtr self, TTAudioGraphObjectBasePtr audioSourceObject, long sourceOutletNumber);
38 t_max_err DCBlockSetBypass(DCBlockPtr self, void* attr, long argc, t_atom* argv);
39 
40 
41 // Globals
42 static t_class* sDCBlockClass;
43 
44 
45 /************************************************************************************/
46 // Main() Function
47 
48 int C74_EXPORT main(void)
49 {
50  t_class* c;
51 
52  TTAudioGraphInit();
53  common_symbols_init();
54 
55  c = class_new("j.dcblock=", (method)DCBlockNew, (method)DCBlockFree, sizeof(DCBlock), (method)0L, A_GIMME, 0);
56 
57  class_addmethod(c, (method)DCBlockClear, "clear", 0);
58  class_addmethod(c, (method)DCBlockReset, "audio.reset", A_CANT, 0);
59  class_addmethod(c, (method)DCBlockSetup, "audio.setup", A_CANT, 0);
60  class_addmethod(c, (method)DCBlockConnect, "audio.connect", A_OBJ, A_LONG, 0);
61  class_addmethod(c, (method)MaxAudioGraphDrop, "audio.drop", A_CANT, 0);
62  class_addmethod(c, (method)MaxAudioGraphObject, "audio.object", A_CANT, 0);
63  class_addmethod(c, (method)DCBlockAssist, "assist", A_CANT, 0);
64  class_addmethod(c, (method)object_obex_dumpout, "dumpout", A_CANT, 0);
65 
66  CLASS_ATTR_LONG(c, "bypass", 0, DCBlock, attrBypass);
67  CLASS_ATTR_STYLE(c, "bypass", 0, "onoff");
68  CLASS_ATTR_ACCESSORS(c, "bypass", NULL, DCBlockSetBypass);
69 
70  class_register(_sym_box, c);
71  sDCBlockClass = c;
72  return 0;
73 }
74 
75 
76 /************************************************************************************/
77 // Object Creation Method
78 
79 DCBlockPtr DCBlockNew(t_symbol* msg, long argc, t_atom* argv)
80 {
81  DCBlockPtr self;
82  TTValue v;
83  TTErr err;
84 
85  self = (DCBlockPtr)object_alloc(sDCBlockClass);
86  if (self) {
87  object_obex_store((void*)self, _sym_dumpout, (t_object*)outlet_new(self, NULL));
88  self->audioGraphOutlet = outlet_new(self, "audio.connect");
89 
90  // TODO: we need to update objects to work with the correct number of channels when the network is configured
91  // Either that, or when we pull we just up the number of channels if when we need to ???
92  v.resize(2);
93  v[0] = "dcblock";
94  v[1] = 1;
95  err = TTObjectBaseInstantiate(TT("audio.object"), (TTObjectBasePtr*)&self->audioGraphObject, v);
96 
97  if (!self->audioGraphObject->getUnitGenerator().valid()) {
98  object_error(SELF, "cannot load JamomaDSP object");
99  return NULL;
100  }
101 
102  attr_args_process(self, argc, argv);
103  }
104  return self;
105 }
106 
107 // Memory Deallocation
108 void DCBlockFree(DCBlockPtr self)
109 {
110  if (self->audioGraphObject)
111  TTObjectBaseRelease((TTObjectBasePtr*)&self->audioGraphObject);
112 }
113 
114 
115 /************************************************************************************/
116 // Methods bound to input/inlets
117 
118 // Method for Assistance Messages
119 void DCBlockAssist(DCBlockPtr self, void* b, long msg, long arg, char* dst)
120 {
121  if (msg==1) // Inlets
122  strcpy(dst, "multichannel input and control messages");
123  else if (msg==2) { // Outlets
124  if (arg == 0)
125  strcpy(dst, "multichannel output");
126  else
127  strcpy(dst, "dumpout");
128  }
129 }
130 
131 
132 void DCBlockClear(DCBlockPtr self)
133 {
134  self->audioGraphObject->getUnitGenerator().send("clear");
135 }
136 
137 
138 // METHODS SPECIFIC TO AUDIO GRAPH EXTERNALS
139 
140 TTErr DCBlockReset(DCBlockPtr self)
141 {
142  return self->audioGraphObject->resetAudio();
143 }
144 
145 
146 TTErr DCBlockSetup(DCBlockPtr self)
147 {
148  t_atom a[2];
149 
150  atom_setobj(a+0, (t_object*)(self->audioGraphObject));
151  atom_setlong(a+1, 0);
152  outlet_anything(self->audioGraphOutlet, gensym("audio.connect"), 2, a);
153  return kTTErrNone;
154 }
155 
156 
157 TTErr DCBlockConnect(DCBlockPtr self, TTAudioGraphObjectBasePtr audioSourceObject, long sourceOutletNumber)
158 {
159  return self->audioGraphObject->connectAudio(audioSourceObject, sourceOutletNumber);
160 }
161 
162 
163 // ATTRIBUTE SETTERS
164 
165 t_max_err DCBlockSetBypass(DCBlockPtr self, void* attr, long argc, t_atom* argv)
166 {
167  if (argc) {
168  self->attrBypass = atom_getlong(argv);
169  self->audioGraphObject->getUnitGenerator().set("bypass", (TTBoolean)self->attrBypass);
170  }
171  return MAX_ERR_NONE;
172 }
173 
bool TTBoolean
Boolean flag, same as Boolean on the Mac.
Definition: TTBase.h:167
TTErr TTObjectBaseRelease(TTObjectBasePtr *anObject)
DEPRECATED.
Base class for all first-class Jamoma objects.
Definition: TTObjectBase.h:109
#define TT
This macro is defined as a shortcut for doing a lookup in the symbol table.
Definition: TTSymbol.h:155
void * TTPtr
A generic pointer.
Definition: TTBase.h:248
TTErr TTObjectBaseInstantiate(const TTSymbol className, TTObjectBasePtr *returnedObjectPtr, const TTValue arguments)
DEPRECATED.
A thin wrapper of Jamoma AudioGraph for use in the Cycling '74 Max/MSP environment.
TTErr MaxAudioGraphObject(t_object *x, TTAudioGraphObjectBasePtr *returnedAudioGraphObject)
Returns a pointer to the Jamoma Audio Graph object that is wrapped by this Max object.
int C74_EXPORT main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
Definition: j.dcblock.cpp:48
TTErr
Jamoma Error Codes Enumeration of error codes that might be returned by any of the TTBlue functions a...
Definition: TTBase.h:342
The TTAudioGraphObjectBase wraps a TTDSP object such that it is possible to build a dynamic graph of ...
TTErr MaxAudioGraphDrop(t_object *x, long inletNumber, t_object *sourceMaxObject, long sourceOutletNumber)
Method called when a connection from an upstream node is dropped.
No Error.
Definition: TTBase.h:343
void resize(size_type n)
Change the number of elements.
[doxygenAppendixC_copyExample]
Definition: TTValue.h:34