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:
parent
011f4a9fc2
commit
48d264d0be
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -3,10 +3,10 @@
|
|||
namespace cAudio
|
||||
{
|
||||
|
||||
bool cAudioPlugin::installPlugin()
|
||||
bool cAudioPlugin::installPlugin(ILogger* logger)
|
||||
{
|
||||
if(initFunc)
|
||||
return initFunc();
|
||||
return initFunc(logger);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue