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