Added a pass in for the logger to plugins, so they don't need to link with cAudio.dll to access logging capabilities.

Fixed a bug that prevented cAudio from getting plugin symbols correctly.
Fixed a bug where cPluginManager would be constructed multiple times.
This commit is contained in:
Joshua Jones 2010-02-10 04:46:00 +00:00
parent 011f4a9fc2
commit 48d264d0be
8 changed files with 33 additions and 28 deletions

View File

@ -2,10 +2,11 @@
#define CAUDIOPLUGIN_H_INCLUDED
#include "../include/IAudioPlugin.h"
#include "../include/ILogger.h"
namespace cAudio
{
typedef bool (*pluginInstallFunc)();
typedef bool (*pluginInstallFunc)(ILogger* logger);
typedef const char* (*pluginNameFunc)();
typedef void (*pluginUninstallFunc)();
@ -31,7 +32,7 @@ namespace cAudio
}
~cAudioPlugin() { }
virtual bool installPlugin();
virtual bool installPlugin(ILogger* logger);
virtual const char* getPluginName();
virtual void uninstallPlugin();

View File

@ -51,6 +51,12 @@ namespace cAudio
cPluginManager();
~cPluginManager();
static cPluginManager* Instance()
{
static cPluginManager theInstance;
return &theInstance;
}
virtual bool installPlugin(IAudioPlugin* plugin, const char* name);
virtual bool installPlugin(const char* filename, const char* name);
@ -67,8 +73,6 @@ namespace cAudio
std::map<std::string, IAudioPlugin*> RegisteredPlugins;
std::map<IAudioPlugin*, DYNLIB_HANDLE> DynamicallyLoadedPlugins;
};
static cPluginManager PluginManagerSingleton;
};
#endif //! CPLUGINMANAGER_H_INCLUDED

View File

@ -339,7 +339,7 @@ namespace cAudio
if(initializeDefault)
capture->initialize();
std::vector<IAudioPlugin*> plugins = PluginManagerSingleton.getPluginList();
std::vector<IAudioPlugin*> plugins = cPluginManager::Instance()->getPluginList();
for(unsigned int i = 0; i < plugins.size(); ++i)
{
plugins[i]->onCreateAudioCapture(capture);
@ -371,7 +371,7 @@ namespace cAudio
RunAudioCaptureThread = false;
AudioCaptureObjectsMutex.unlock();
#endif
std::vector<IAudioPlugin*> plugins = PluginManagerSingleton.getPluginList();
std::vector<IAudioPlugin*> plugins = cPluginManager::Instance()->getPluginList();
for(unsigned int i = 0; i < plugins.size(); ++i)
{
plugins[i]->onDestoryAudioCapture(capture);

View File

@ -497,7 +497,6 @@ namespace cAudio
{
cAudioMutexBasicLock lock(Mutex);
release();
decodermap.clear();
//Reset context to null
alcMakeContextCurrent(NULL);
//Delete the context
@ -609,7 +608,7 @@ namespace cAudio
manager->getAvailableDevices();
std::vector<IAudioPlugin*> plugins = PluginManagerSingleton.getPluginList();
std::vector<IAudioPlugin*> plugins = cPluginManager::Instance()->getPluginList();
for(unsigned int i = 0; i < plugins.size(); ++i)
{
plugins[i]->onCreateAudioManager(manager);
@ -641,13 +640,12 @@ namespace cAudio
RunAudioManagerThread = false;
AudioManagerObjectsMutex.unlock();
#endif
manager->shutDown();
std::vector<IAudioPlugin*> plugins = PluginManagerSingleton.getPluginList();
std::vector<IAudioPlugin*> plugins = cPluginManager::Instance()->getPluginList();
for(unsigned int i = 0; i < plugins.size(); ++i)
{
plugins[i]->onDestroyAudioManager(manager);
}
manager->shutDown();
delete manager;
manager = NULL;

View File

@ -3,10 +3,10 @@
namespace cAudio
{
bool cAudioPlugin::installPlugin()
bool cAudioPlugin::installPlugin(ILogger* logger)
{
if(initFunc)
return initFunc();
return initFunc(logger);
return false;
}

View File

@ -33,7 +33,7 @@ bool cPluginManager::installPlugin(IAudioPlugin* plugin, const char* name)
if(theName.empty())
theName = plugin->getPluginName();
if(plugin->installPlugin())
if(plugin->installPlugin(getLogger()))
{
RegisteredPlugins[theName] = plugin;
return true;

View File

@ -1,16 +1,17 @@
#ifndef IAUDIOPLUGIN_H_INCLUDED
#define IAUDIOPLUGIN_H_INCLUDED
class IAudioManager;
class IAudioCapture;
namespace cAudio
{
class IAudioManager;
class IAudioCapture;
class ILogger;
//Class that abstracts a particular plugin implementation
//Plugins must have the following functions:
/*
//Will be called on initial install of the plugin, use this for any first time initialization.
bool installPlugin();
//Will be called on initial install of the plugin, use this for any first time initialization. A reference to the logger is passed in for convenience.
bool installPlugin(ILogger* logger);
//Must return a unique name that identifies this plugin.
const char* getPluginName();
@ -39,7 +40,7 @@ namespace cAudio
IAudioPlugin() { }
~IAudioPlugin() { }
virtual bool installPlugin() = 0;
virtual bool installPlugin(ILogger* logger) = 0;
virtual const char* getPluginName() = 0;
virtual void uninstallPlugin() = 0;

View File

@ -2,41 +2,42 @@
#include "IAudioPlugin.h"
#include "cAudioDefines.h"
#include "IAudioManager.h"
#include "ILogger.h"
//Will be called on initial install of the plugin, use this for any first time initialization.
CAUDIO_API bool InstallPlugin()
extern "C" CAUDIO_API bool InstallPlugin(cAudio::ILogger* logger)
{
//This plugin has no first time initialization to do, so this is an easy function
return true;
}
//Must return a unique name that identifies this plugin.
CAUDIO_API const char* GetPluginName()
extern "C" CAUDIO_API const char* GetPluginName()
{
return "MP3Decoder";
}
//Will be called on when cAudio uninstalls this plugin, use this for any final cleanup.
CAUDIO_API void UninstallPlugin()
extern "C" CAUDIO_API void UninstallPlugin()
{
}
//Will be called when an Audio Manager is created. Use the passed in pointer to register any decoders or event handlers.
CAUDIO_API void OnCreateAudioManager(cAudio::IAudioManager* manager)
extern "C" CAUDIO_API void OnCreateAudioManager(cAudio::IAudioManager* manager)
{
cMP3DecoderFactory* factory = new cMP3DecoderFactory();
if(factory)
{
manager->registerAudioDecoder(factory, ".mp3");
manager->registerAudioDecoder(factory, "mp3");
}
}
CAUDIO_API void OnDestroyAudioManager(cAudio::IAudioManager* manager)
extern "C" CAUDIO_API void OnDestroyAudioManager(cAudio::IAudioManager* manager)
{
cAudio::IAudioDecoderFactory* factory = manager->getAudioDecoderFactory(".mp3");
manager->unRegisterAudioDecoder(".mp3");
cAudio::IAudioDecoderFactory* factory = manager->getAudioDecoderFactory("mp3");
manager->unRegisterAudioDecoder("mp3");
if(factory)
{