template<typename T>
//audio data frame managing audio samples
class frame {};
/*
* t1, t2... tn classes are very different in the way they are processing audio
* data so can't have the same base type but they have some common functions such
* as process and reset.
*/
template<typename T>
class test1 {
public:
void reset() {}
int process(const frame<T>& in, frame<T>& out) {}
};
template<typename T>
class test2 {
public:
void reset() {}
int process(const frame<T>& in, frame<T>& out);
};
template<typename T>
class test3 {
public:
void reset() {}
int process(const frame<T>& in, frame<T>& out);
};
int main()
{
test1<int> *t1 = new test1<int>();
test2<int> *t2 = new test2<int>();
test3<int> *t3 = new test3<int>();
frame<int> iFrame;
frame<int> oFrame;
/* some code here to initialize audio processing blocks */
//snip
/*
* order of audio processing is important here.
* Is there any way to avoid writing below code
* for every processing block that gets added in
* future in c++11 perhaps??
*/
if (t1) {
t1->process(iFrame, oFrame);
iFrame = oFrame;
}
if (t2) {
t2->reset();
t2->process(iFrame, oFrame);
iFrame = oFrame;
}
if (t3) {
t3->process(iFrame, oFrame);
iFrame = oFrame;
}
}
dGVtcGxhdGU8dHlwZW5hbWUgVD4KLy9hdWRpbyBkYXRhIGZyYW1lIG1hbmFnaW5nIGF1ZGlvIHNhbXBsZXMKY2xhc3MgZnJhbWUge307CgovKiAKICogdDEsIHQyLi4uIHRuIGNsYXNzZXMgYXJlIHZlcnkgZGlmZmVyZW50IGluIHRoZSB3YXkgdGhleSBhcmUgcHJvY2Vzc2luZyBhdWRpbwogKiBkYXRhIHNvIGNhbid0IGhhdmUgdGhlIHNhbWUgYmFzZSB0eXBlIGJ1dCB0aGV5IGhhdmUgc29tZSBjb21tb24gZnVuY3Rpb25zIHN1Y2gKICogYXMgcHJvY2VzcyBhbmQgcmVzZXQuCiAqLwp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyB0ZXN0MSB7CnB1YmxpYzoJCgl2b2lkIHJlc2V0KCkge30KCWludCBwcm9jZXNzKGNvbnN0IGZyYW1lPFQ+JiBpbiwgZnJhbWU8VD4mIG91dCkge30KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIHRlc3QyIHsKcHVibGljOgoJdm9pZCByZXNldCgpIHt9CglpbnQgcHJvY2Vzcyhjb25zdCBmcmFtZTxUPiYgaW4sIGZyYW1lPFQ+JiBvdXQpOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgdGVzdDMgewpwdWJsaWM6Cgl2b2lkIHJlc2V0KCkge30KCWludCBwcm9jZXNzKGNvbnN0IGZyYW1lPFQ+JiBpbiwgZnJhbWU8VD4mIG91dCk7Cn07CgppbnQgbWFpbigpCnsKCXRlc3QxPGludD4gKnQxID0gbmV3IHRlc3QxPGludD4oKTsKCXRlc3QyPGludD4gKnQyID0gbmV3IHRlc3QyPGludD4oKTsKCXRlc3QzPGludD4gKnQzID0gbmV3IHRlc3QzPGludD4oKTsKCWZyYW1lPGludD4gaUZyYW1lOwoJZnJhbWU8aW50PiBvRnJhbWU7CgkKCS8qIHNvbWUgY29kZSBoZXJlIHRvIGluaXRpYWxpemUgYXVkaW8gcHJvY2Vzc2luZyBibG9ja3MgKi8KCS8vc25pcAoKCS8qCgkgKiBvcmRlciBvZiBhdWRpbyBwcm9jZXNzaW5nIGlzIGltcG9ydGFudCBoZXJlLgoJICogSXMgdGhlcmUgYW55IHdheSB0byBhdm9pZCB3cml0aW5nIGJlbG93IGNvZGUKCSAqIGZvciBldmVyeSBwcm9jZXNzaW5nIGJsb2NrIHRoYXQgZ2V0cyBhZGRlZCBpbgoJICogZnV0dXJlIGluIGMrKzExIHBlcmhhcHM/PwoJICovCglpZiAodDEpIHsKCQl0MS0+cHJvY2VzcyhpRnJhbWUsIG9GcmFtZSk7CgkJaUZyYW1lID0gb0ZyYW1lOwoJfQoJaWYgKHQyKSB7CgkJdDItPnJlc2V0KCk7CgkJdDItPnByb2Nlc3MoaUZyYW1lLCBvRnJhbWUpOwoJCWlGcmFtZSA9IG9GcmFtZTsKCX0KCWlmICh0MykgewoJCXQzLT5wcm9jZXNzKGlGcmFtZSwgb0ZyYW1lKTsKCQlpRnJhbWUgPSBvRnJhbWU7Cgl9CQp9