#ifndef IAUDIOPLUGIN_H_INCLUDED
#define IAUDIOPLUGIN_H_INCLUDED

#include "IRefCounted.h"
#include "IAudioManager.h"
#include "IAudioCapture.h"
#include "ILogger.h"

namespace cAudio
{
	//! Interface for all plugins in cAudio.
	class IAudioPlugin : public IRefCounted
	{
	public:
		IAudioPlugin() { }
		~IAudioPlugin() { }

		//! Called to initialize the plugin.  Use this for any initial setup that needs to be done.
		/** 
		\param logger: Pointer to the logger singleton.
		\return True if plugin initialization was successful, false if there was an error. */
		virtual bool installPlugin(ILogger* logger) = 0;

		//! Called to retrieve a name to register this plugin under if the user didn't specify one (or the plugin was auto-loaded).
		/**
		\return Name of the plugin. */
		virtual const char* getPluginName() = 0;

		//! Called to shutdown the plugin and do any final cleanup.  This is the last function call cAudio will give you before your plugin is completely removed.
		virtual void uninstallPlugin() = 0;

		//! Called on creation of an Audio Playback Manager.
		/** Use this to register any decoders or event handlers that you'd like to add to the engine.
		\param manager: Pointer to the newly created manager. */
		virtual void onCreateAudioManager(IAudioManager* manager) { }

		//! Called on creation of an Audio Capture Manager.
		/** Use this to register any event handlers that you'd like to add to the engine.
		\param capture: Pointer to the newly created capture interface. */
		virtual void onCreateAudioCapture(IAudioCapture* capture) { }

		//! Called on destruction of an Audio Playback Manager.
		/** Use this to remove anything you added to the playback manger earlier.
		\param manager: Pointer to the soon to be destroyed playback interface. */
		virtual void onDestroyAudioManager(IAudioManager* manager) { }

		//! Called on destruction of an Audio Capture Manager.
		/** Use this to remove anything you added to a capture manger earlier.
		\param capture: Pointer to the soon to be destroyed capture interface. */
		virtual void onDestoryAudioCapture(IAudioCapture* capture) { }
	};
};

#endif //! IAUDIOPLUGIN_H_INCLUDED