2 // C++ Implementation: fxpluginhandler
7 // Author: Robert Vogl <voglrobe@lapislazuli>, (C) 2004
9 // Copyright: See COPYING file that comes with this distribution
14 #include <QtCore/QDir>
18 #include <kstandarddirs.h>
20 #include <kmessagebox.h>
22 // App specific includes
23 #include "fxpluginhandler.h"
24 #include "ksayit_fxplugin.h"
25 #include "ksayit_ttsplugin.h"
27 FXPluginHandler::FXPluginHandler(QObject
*parent
, const char *name
, KConfig
*config
)
28 : QObject(parent
, name
), m_config(config
)
33 FXPluginHandler::~FXPluginHandler()
35 QMap
<QString
, fx_struct
>::Iterator mit
;
37 for (mit
=pmap
.begin(); mit
!=pmap
.end(); ++mit
){
39 (*mit
).pdestroy( (*mit
).p
);
40 (*mit
).handle
->unload();
47 void FXPluginHandler::searchPlugins()
49 kDebug(100200) << "FXPluginHandler::searchPlugins()";
52 QStringList plist
, tmplist
;
53 QStringList::Iterator fit
, it
;
59 // get .so-files of all KSayIt plugin directories
60 QStringList global_dirs
= KGlobal::dirs()->resourceDirs("data");
61 for (fit
=global_dirs
.begin(); fit
!=global_dirs
.end(); ++fit
){ // for each dir
62 ppath
= *fit
+ "ksayit/fxplugins";
63 // kDebug(100200) << "Plugin-Directory: " << ppath;
64 pdir
.setPath( ppath
);
65 tmplist
= pdir
.entryList("*.so", QDir::Files
); // list of all .so-files of dir
66 for (it
=tmplist
.begin(); it
!=tmplist
.end(); ++it
){ // for each .so-file of dir
67 if( !plist
.contains(*it
) ){ // .so-file already in list?
68 if ( initPluginMap( ppath
+ '/' + *it
) ){
69 plist
.append(*it
); // append if plugin scuccessfully opened.
78 bool FXPluginHandler::initPluginMap(const QString
&libpath
)
80 // kDebug(100200) << "FXPluginHandler::initPluginMap() " << libpath;
84 plugin
.handle
= new QLibrary( libpath
);
85 if ( !plugin
.handle
->load() ){
86 kDebug(100200) << "OOPS: Cannot load library!";
90 create_fxpi createPlugin
= (create_fxpi
) plugin
.handle
->resolve("createPlugin");
91 destroy_fxpi destroyPlugin
= (destroy_fxpi
) plugin
.handle
->resolve("destroyPlugin");
92 if ( createPlugin
&& destroyPlugin
){ // it is a KSayIt plugin
93 FXPlugin
*p
= createPlugin( KApplication::kApplication() );
94 plugin
.name
= p
->getName_KS();
95 plugin
.description
= p
->getDescription_KS();
97 kDebug(100200) << "FX-Plugin " << plugin
.name
<< " Handle: " << plugin
.handle
<< " registered.";
100 // add to list of available plugins
101 pmap
[plugin
.name
] = plugin
;
102 if ( !plugin
.handle
->unload() ){
103 kDebug(100200) << "Unload plugin failed.";
105 } else { // not a KSayIt plugin
106 kDebug(100200) << "Malformed plugin found!";
107 plugin
.handle
->unload(); // no KSayIt plugin: unload & destroy
108 delete plugin
.handle
;
115 void FXPluginHandler::readConfiguration()
117 kDebug(100200) << "+++ entering FXPluginHandler::readConfiguration()";
119 QMap
<QString
, fx_struct
>::Iterator mit
;
121 create_fxpi createPlugin
;
122 destroy_fxpi destroyPlugin
;
124 // unload all plugins and destroy the effect objects
125 for (mit
=activePlugins
.begin(); mit
!=activePlugins
.end(); ++mit
){ // for all active plugins
127 if ((plugin
.p
!= NULL
) && (plugin
.EffectID
== 0)){ // check if really exits and not in use
128 plugin
.pdestroy(plugin
.p
); // delete plugin object
129 plugin
.p
= NULL
; // mark as deleted
130 plugin
.handle
->unload(); // unload SO
131 plugin
.handle
= NULL
;
132 plugin
.pcreate
= NULL
; // no longer valid
133 plugin
.pdestroy
= NULL
; // no longer valid
135 plugin
.description
.clear();
140 // load active plugins and create effect objects
141 activePlugins
.clear();
142 m_config
->setGroup("Effect Stack Configuration");
143 QStringList conf_active
= m_config
->readEntry("Activated",QStringList());
144 QStringList::Iterator it
;
145 for (it
=conf_active
.begin(); it
!=conf_active
.end(); ++it
){ // for all names in config
146 mit
= pmap
.find(*it
);
147 if( mit
!=pmap
.end() ){
148 // plugin found in list of registered plugins
150 // resolve factory functions
151 createPlugin
= (create_fxpi
) plugin
.handle
->resolve("createPlugin");
152 destroyPlugin
= (destroy_fxpi
) plugin
.handle
->resolve("destroyPlugin");
153 if ( createPlugin
&& destroyPlugin
){
154 plugin
.pcreate
= createPlugin
;
155 plugin
.pdestroy
= destroyPlugin
;
156 plugin
.p
= createPlugin( KApplication::kApplication() );
157 // append to list of active plugins
158 activePlugins
[plugin
.name
] = plugin
;
159 kDebug(100200) << "FXPluginHandler: FX-Plugin " << plugin
.name
<< " active.";
162 kDebug(100200) << "Fatal error. Conflict with configuration file.";
165 kDebug(100200) << "--- leaving FXPluginHandler::readConfiguration()";
170 void FXPluginHandler::showEffectGUI(const QString
&pname
)
172 kDebug(100200) << "FXPluginHandler::showEffectGUI(): " << pname
;
174 QMap
<QString
, fx_struct
>::Iterator mit
;
176 // find plugin with name==pname in active list and show its GUI
177 mit
= activePlugins
.find(pname
);
178 if ( mit
!= activePlugins
.end() ){
179 if ( (*mit
).p
!=NULL
){
180 // named and active plugin found
181 (*mit
).p
->showGUI_KS();
186 // Not found in active list. Check if an effect with the given name is installed
187 mit
= pmap
.find(pname
);
188 if ( mit
== pmap
.end() ){
189 kDebug(100200) << "Sorry. Effect with name " << pname
<< " is not installed.";
193 // plugin exists, but effect is not active yet
195 create_fxpi createPlugin
;
196 destroy_fxpi destroyPlugin
;
198 kDebug(100200) << "Effect not active yet. Loading...";
200 // resolve factory functions
201 createPlugin
= (create_fxpi
) plugin
.handle
->resolve("createPlugin");
202 destroyPlugin
= (destroy_fxpi
) plugin
.handle
->resolve("destroyPlugin");
203 if ( createPlugin
&& destroyPlugin
){
204 plugin
.pcreate
= createPlugin
;
205 plugin
.pdestroy
= destroyPlugin
;
206 plugin
.p
= createPlugin( KApplication::kApplication() );
207 // append to list of active plugins
208 activePlugins
[plugin
.name
] = plugin
;
209 kDebug(100200) << "FX-Plugin " << plugin
.name
<< " now active.";
210 plugin
.p
->showGUI_KS();
215 void FXPluginHandler::getPlugins(QStringList
&pluginlist
)
217 // kDebug(100200) << "FXPluginHandler::getPlugins";
221 QMap
<QString
, fx_struct
>::Iterator mit
;
222 for (mit
=pmap
.begin(); mit
!=pmap
.end(); ++mit
){
223 pluginlist
.append( (*mit
).name
);
228 void FXPluginHandler::activateEffect(const QString
&pname
,
230 StereoEffectStack
*fx_stack
)
232 kDebug(100200) << "FXPluginHandler::activateEffect: " << pname
;
234 QMap
<QString
, fx_struct
>::Iterator mit
;
236 // find plugin with name==pname
237 mit
= activePlugins
.find(pname
);
238 if ( mit
==activePlugins
.end() || (*mit
).p
==NULL
){
239 kDebug(100200) << "Effect " << pname
<< " not found or inactive.";
242 (*mit
).EffectID
= (*mit
).p
->activate_KS(server
, fx_stack
);
246 void FXPluginHandler::deactivateEffects(StereoEffectStack
*fx_stack
)
248 kDebug(100200) << "FXPluginHandler::deactivateEffects.";
250 QMap
<QString
, fx_struct
>::Iterator mit
;
251 for (mit
=activePlugins
.begin(); mit
!=activePlugins
.end(); ++mit
){
252 if ( ((*mit
).EffectID
!=0) && ((*mit
).p
!=NULL
) ) {
253 // effect active and on stack
254 (*mit
).p
->deactivate_KS(fx_stack
, (*mit
).EffectID
);
255 kDebug(100200) << (*mit
).name
<< " with Effect ID " << (*mit
).EffectID
<< " removed.";
265 #include "fxpluginhandler.moc"