Listing 1
program.cpp // This is the main program
#include <dlfcn.h>
int main(int argc, char** argv)
{
// Open the libLowPass shared library
void* library = dlopen("libLowPass.so", RTLD_NOW);
// Get the loadFilter function, for loading objects
void* loadFilter = dlsym(library, "loadFilter");
// Get a new filter object
void* filter_vp = (*loadFilter)();
Filter* filter = reinterpret_cast<Filter*>(filter_vp);
// Gets a frame of audio data, and processes it through
// the LowPassFilter object.
char* data = getAudio();
filter->processAudio(data);
// Get the deleteFilter function and delete the filter
void* deleteFilter = dlsym(library, "deleteFilter");
(*deleteFilter)(filter_vp);
}
//filter.cpp
// The superclass, known to the program that is doing the dynamic loading.
class Filter
{
public:
virtual void processAudio(char* data) = 0;
};
// The LowPassFilter class can be compiled into a shared object
// library, along with library.cpp, and then loaded by the program.
class LowPassFilter : public Filter
{
public:
virtual void processAudio(char* data)
{
/* Process the received audio data */
}
};
//library.cpp
extern "C"
{
// loadFilter function creates new LowPassFilter object and returns it.
void* loadFilter(void)
{
return reinterpret_cast<void*>(new LowPassFilter);
}
// The deleteFilter function deletes the LowPassFilter that is passed
// to it. This isn't a very safe function, since there's no
// way to ensure that the object provided is indeed a LowPassFilter.
void deleteFilter(void* obj)
{
delete reinterpret_cast<LowPassFilter*>(obj);
}
}