Listing 4
// Filter class -- this class should be in a shared library, so it
// can be linked with both the program, and dynamically loadable library
// Filter.h
#include "DynamicObject.h"
class Filter : public DynamicObject
{
public:
Filter(void (*delObj)(void*));
virtual ~Filter(void);
virtual void processAudio(int size, unsigned char* buffer) = 0;
};
//Filter.cpp
#include "Filter.h"
Filter::Filter(void (*delObj)(void*))
: DynamicObject(delObj)
{
}
Filter::~Filter(void)
{
}
==============================================
// HighPassFilter class -- A high pass filter, which is a concrete
// implementation of Filter. It should be placed in a shared library,
// to be dynamically loaded.
// HighPassFilter.cpp
class HighPassFilter : public Filter
{
public:
HighPassFilter(void (*delObj)(void*));
virtual ~HighPassFilter(void);
virtual void processAudio(int size, unsigned char* buffer);
};
HighPassFilter::HighPassFilter(void (*delObj)(void*))
: Filter(delObj)
{
}
HighPassFilter::~HighPassFilter(void)
{
}
void
HighPassFilter::processAudio(int size, unsigned char* buffer)
{
// apply a high pass filter to the buffer
}
// The Dynamic library should also contain the following external C
// function definitions
extern "C"
{
void deleteObject(void* obj) {
delete reinterpret_cast<DynamicObject*>(obj);
}
void* loadObject(const char* name, int argc, void** argv) {
if(strncmp(name, "HighPassFilter", strlen(name) < 14
? strlen(name)
: 14) == 0) {
return new HighPassFilter(deleteObject);
}
}
}
============================
// The following is the main program, it will load the shared library to
// get the high-pass filter class, read in some audio, process that audio
// with the filter, and then output the modified audio
// AudioProcessor.cpp
#include "DynamicLibrary.h"
#include "DynamicObject.h"
#include <iostream>
int main(int argc, char** argv)
{
// Load the dynamic library with the high-pass filter class
DynamicLibrary* dynLibrary =
DynamicLoader::loadObjectFile("libHighPass.so", RTLD_NOW);
if(dynLibrary == NULL) {
cerr << "Couldn't load the dynamic library." << endl;
return -1;
}
// Load a HighPassFilter object
Filter* filter =
dynamic_cast<Filter*>(dynLibrary->newObject("HighPassFilter", 0, NULL));
if(filter == NULL) {
cerr << "Couldn't create filter object." << endl;
return -1;
}
// A buffer for storing audio
int bufLen;
unsigned char* buffer;
/* LOAD AUDIO INTO A BUFFER */
filter->processAudio(bufLen, buffer);
/* PLAY BACK THE PROCESSED AUDIO */
// Get rid of the filter object
filter->deleteSelf();
filter = NULL;
// Close the dynamic library
delete dynLibrary;
// Exit the program
return 0;
}