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; }