1 /***************************************************************************
2 initeffects.cpp - description
5 copyright : (C) 2006 by Jean-Baptiste Mardelle
7 copyright : (C) 2008 Marco Gittler
8 email : g.marco@freenet.de
9 ***************************************************************************/
11 /***************************************************************************
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
18 ***************************************************************************/
27 #include <KStandardDirs>
29 #include "initeffects.h"
31 initEffects::initEffects()
35 initEffects::~initEffects()
40 Mlt::Repository *initEffects::parseEffectFiles(EffectsList *audioEffectList, EffectsList *videoEffectList)
42 QStringList::Iterator more;
43 QStringList::Iterator it;
48 // Build effects. Retrieve the list of MLT's available effects first.
49 Mlt::Repository *repository = Mlt::Factory::init();
51 kDebug() << "Repository did not finish init " ;
54 Mlt::Properties *filters = repository->filters();
55 QStringList filtersList;
57 for (int i=0 ; i <filters->count() ; i++){
58 filtersList << filters->get_name(i);
61 // Build effects. check producers first.
63 Mlt::Properties *producers = repository->producers();
64 QStringList producersList;
65 for (int i=0 ; i <producers->count() ; i++){
66 producersList << producers->get_name(i);
71 KGlobal::dirs()->addResourceType("ladspa_plugin", "lib/ladspa");
72 KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/lib/ladspa");
73 KGlobal::dirs()->addResourceDir("ladspa_plugin", "/usr/local/lib/ladspa");
74 KGlobal::dirs()->addResourceDir("ladspa_plugin", "/opt/lib/ladspa");
75 KGlobal::dirs()->addResourceDir("ladspa_plugin", "/opt/local/lib/ladspa");
77 kDebug()<<"// INIT EFFECT SEARCH"<<endl;
79 QStringList direc = KGlobal::dirs()->findDirs("data", "kdenlive/effects");
82 for ( more = direc.begin() ; more != direc.end() ; ++more ) {
83 directory = QDir(*more);
84 fileList = directory.entryList( QDir::Files );
85 for ( it = fileList.begin() ; it != fileList.end() ; ++it ){
86 itemName = KUrl(*more + *it).path();
87 parseEffectFile(audioEffectList, videoEffectList, itemName, filtersList, producersList);
88 // kDebug()<<"// FOUND EFFECT FILE: "<<itemName<<endl;
95 void initEffects::parseEffectFile(EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList)
99 doc.setContent(&file, false);
100 QDomElement documentElement = doc.documentElement();
101 QDomNodeList effects = doc.elementsByTagName("effect");
103 if (effects.count() == 0) {
104 kDebug()<<"// EFFECT FILET: "<<name<<" IS BROKEN"<<endl;
108 if (doc.elementsByTagName("effectgroup").item(0).toElement().tagName() == "effectgroup") {
109 groupName = documentElement.attribute("name", QString::null);
114 while (!effects.item(i).isNull()) {
115 documentElement = effects.item(i).toElement();
116 QString tag = documentElement.attribute("tag", QString::null);
117 bool ladspaOk = true;
118 if (tag == "ladspa") {
119 QString library = documentElement.attribute("library", QString::null);
120 if (KStandardDirs::locate("ladspa_plugin", library).isEmpty()) ladspaOk = false;
124 if ((filtersList.contains(tag) || producersList.contains(tag)) && ladspaOk) {
125 bool isAudioEffect = false;
126 QDomNode propsnode = documentElement.elementsByTagName("properties").item(0);
127 if (!propsnode.isNull()) {
128 QDomElement propselement = propsnode.toElement();
129 // id = propselement.attribute("id", QString::null);
130 // effectTag = propselement.attribute("tag", QString::null);
131 if (propselement.attribute("type", QString::null) == "audio") isAudioEffect = true;
132 //else if (propselement.attribute("type", QString::null) == "custom") type = CUSTOMEFFECT;
133 //else type = VIDEOEFFECT;
135 if (isAudioEffect) audioEffectList->append(documentElement);
136 else videoEffectList->append(documentElement);
140 QDomNode n = documentElement.firstChild();
141 QString id, effectName, effectTag, paramType;
146 EffectParamDescFactory effectDescParamFactory;
147 EffectDesc *effect = NULL;
150 QDomNode namenode = documentElement.elementsByTagName("name").item(0);
151 if (!namenode.isNull()) effectName = i18n(namenode.toElement().text());
152 if (!groupName.isEmpty()) effectName.prepend("_" + groupName + "_");
154 QDomNode propsnode = documentElement.elementsByTagName("properties").item(0);
155 if (!propsnode.isNull()) {
156 QDomElement propselement = propsnode.toElement();
157 id = propselement.attribute("id", QString::null);
158 effectTag = propselement.attribute("tag", QString::null);
159 if (propselement.attribute("type", QString::null) == "audio") type = AUDIOEFFECT;
160 else if (propselement.attribute("type", QString::null) == "custom") type = CUSTOMEFFECT;
161 else type = VIDEOEFFECT;
164 QString effectDescription;
165 QDomNode descnode = documentElement.elementsByTagName("description").item(0);
166 if (!descnode.isNull()) effectDescription = descnode.toElement().text() + "<br />";
168 QString effectAuthor;
169 QDomNode authnode = documentElement.elementsByTagName("author").item(0);
170 if (!authnode.isNull()) effectAuthor = authnode.toElement().text() + "<br />";
172 if (effectName.isEmpty() || id.isEmpty() || effectTag.isEmpty()) return;
174 effect = new EffectDesc(effectName, id, effectTag, effectDescription, effectAuthor, type);
176 QDomNodeList paramList = documentElement.elementsByTagName("parameter");
177 if (paramList.count() == 0) {
178 QDomElement fixed = doc.createElement("parameter");
179 fixed.setAttribute("type", "fixed");
180 effect->addParameter(effectDescParamFactory.createParameter(fixed));
182 else for (int i = 0; i < paramList.count(); i++) {
183 QDomElement e = paramList.item(i).toElement();
186 QDomNamedNodeMap attrs = e.attributes();
189 while (!attrs.item(i).isNull()) {
190 QDomNode n = attrs.item(i);
191 value = n.nodeValue();
192 if (value.find("MAX_WIDTH") != -1)
193 value.replace("MAX_WIDTH", QString::number(KdenliveSettings::defaultwidth()));
194 if (value.find("MID_WIDTH") != -1)
195 value.replace("MID_WIDTH", QString::number(KdenliveSettings::defaultwidth() / 2));
196 if (value.find("MAX_HEIGHT") != -1)
197 value.replace("MAX_HEIGHT", QString::number(KdenliveSettings::defaultheight()));
198 if (value.find("MID_HEIGHT") != -1)
199 value.replace("MID_HEIGHT", QString::number(KdenliveSettings::defaultheight() / 2));
200 n.setNodeValue(value);
203 effect->addParameter(effectDescParamFactory.createParameter(e));
206 effectList->append(effect);
213 char* initEffects::ladspaEffectString(int ladspaId, QStringList params)
215 if (ladspaId == 1433 ) //Pitch
216 return ladspaPitchEffectString(params);
217 else if (ladspaId == 1216 ) //Room Reverb
218 return ladspaRoomReverbEffectString(params);
219 else if (ladspaId == 1423 ) //Reverb
220 return ladspaReverbEffectString(params);
221 else if (ladspaId == 1901 ) //Reverb
222 return ladspaEqualizerEffectString(params);
224 kDebug()<<"++++++++++ ASKING FOR UNKNOWN LADSPA EFFECT: "<<ladspaId<<endl;
225 return("<jackrack></jackrack>");
230 void initEffects::ladspaEffectFile(const QString & fname, int ladspaId, QStringList params)
235 filterString = ladspaPitchEffectString(params);
238 filterString = ladspaVinylEffectString(params);
240 case 1216 : //Room Reverb
241 filterString = ladspaRoomReverbEffectString(params);
244 filterString = ladspaReverbEffectString(params);
246 case 1195: //Declipper
247 filterString = ladspaDeclipEffectString(params);
250 filterString = ladspaEqualizerEffectString(params);
252 case 1913: // Limiter
253 filterString = ladspaLimiterEffectString(params);
255 case 1193: // Pitch Shifter
256 filterString = ladspaPitchShifterEffectString(params);
258 case 1417: // Rate Scaler
259 filterString = ladspaRateScalerEffectString(params);
262 filterString = ladspaPhaserEffectString(params);
265 kDebug()<<"++++++++++ ASKING FOR UNKNOWN LADSPA EFFECT: "<<ladspaId<<endl;
271 if ( f.open( QIODevice::WriteOnly ) )
273 QTextStream stream( &f );
274 stream << filterString;
277 else kDebug()<<"++++++++++ ERROR CANNOT WRITE TO: "<<KdenliveSettings::currenttmpfolder() + fname<<endl;
281 QString jackString = "<?xml version=\"1.0\"?><!DOCTYPE jackrack SYSTEM \"http://purge.bash.sh/~rah/jack_rack_1.2.dtd\"><jackrack><channels>2</channels><samplerate>48000</samplerate><plugin><id>";
284 char* initEffects::ladspaDeclipEffectString(QStringList)
286 return qstrdup(QString(jackString + "1195</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><lockall>true</lockall></plugin></jackrack>").toUtf8());
290 char* initEffects::ladspaVocoderEffectString(QStringList params)
292 return qstrdup( QString(jackString + "1441</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><lockall>true</lockall><controlrow><lock>true</lock><value>0.000000</value><value>0.000000</value></controlrow><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow><controlrow><lock>true</lock><value>%2</value><value>%2</value></controlrow><controlrow><lock>true</lock><value>%2</value><value>%2</value></controlrow><controlrow><lock>true</lock><value>%2</value><value>%2</value></controlrow><controlrow><lock>true</lock><value>%2</value><value>%2</value></controlrow><controlrow><lock>true</lock><value>%3</value><value>%3</value></controlrow><controlrow><lock>true</lock><value>%3</value><value>%3</value></controlrow><controlrow><lock>true</lock><value>%3</value><value>%3</value></controlrow><controlrow><lock>true</lock><value>%3</value><value>%3</value></controlrow><controlrow><lock>true</lock><value>%4</value><value>%4</value></controlrow><controlrow><lock>true</lock><value>%4</value><value>%4</value></controlrow><controlrow><lock>true</lock><value>%4</value><value>%4</value></controlrow><controlrow><lock>true</lock><value>%4</value><value>%4</value></controlrow></plugin></jackrack>").arg(params[0]).arg(params[1]).arg(params[2]).arg(params[3]));
295 char* initEffects::ladspaVinylEffectString(QStringList params)
297 return qstrdup( QString(jackString + "1905</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><controlrow><value>%1</value></controlrow><controlrow><value>%2</value></controlrow><controlrow><value>%3</value></controlrow><controlrow><value>%4</value></controlrow><controlrow><value>%5</value></controlrow></plugin></jackrack>").arg(params[0]).arg(params[1]).arg(params[2]).arg(params[3]).arg(params[4]).toUtf8());
300 char* initEffects::ladspaPitchEffectString(QStringList params)
302 return qstrdup( QString(jackString + "1433</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.0</value><value>1.0</value></wet_dry_values><lockall>true</lockall><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow><controlrow><lock>true</lock><value>4.000000</value><value>4.000000</value></controlrow></plugin></jackrack>").arg(params[0]).toUtf8());
305 char* initEffects::ladspaRoomReverbEffectString(QStringList params)
307 return qstrdup( QString(jackString + "1216</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><lockall>true</lockall><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow><controlrow><lock>true</lock><value>%2</value><value>%2</value></controlrow><controlrow><lock>true</lock><value>%3</value><value>%3</value></controlrow><controlrow><lock>true</lock><value>0.750000</value><value>0.750000</value></controlrow><controlrow><lock>true</lock><value>-70.000000</value><value>-70.000000</value></controlrow><controlrow><lock>true</lock><value>0.000000</value><value>0.000000</value></controlrow><controlrow><lock>true</lock><value>-17.500000</value><value>-17.500000</value></controlrow></plugin></jackrack>").arg(params[0]).arg(params[1]).arg(params[2]).toUtf8());
310 char* initEffects::ladspaReverbEffectString(QStringList params)
312 return qstrdup( QString(jackString + "1423</id><enabled>true</enabled> <wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked> <wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values> <lockall>true</lockall><controlrow><lock>true</lock><value>%1</value> <value>%1</value></controlrow><controlrow><lock>true</lock><value>%2</value><value>%2</value></controlrow><controlrow><lock>true</lock><value>0.250000</value><value>0.250000</value></controlrow></plugin></jackrack>").arg(params[0]).arg(params[1]).toUtf8());
315 char* initEffects::ladspaEqualizerEffectString(QStringList params)
317 return qstrdup( QString(jackString + "1901</id><enabled>true</enabled> <wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked> <wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><controlrow><value>%1</value></controlrow><controlrow><value>%2</value></controlrow> <controlrow><value>%3</value></controlrow></plugin></jackrack>").arg(params[0]).arg(params[1]).arg(params[2]).toUtf8());
320 char* initEffects::ladspaLimiterEffectString(QStringList params)
322 return qstrdup( QString(jackString + "1913</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><controlrow><value>%1</value></controlrow><controlrow><value>%2</value></controlrow><controlrow><value>%3</value></controlrow></plugin></jackrack>").arg(params[0]).arg(params[1]).arg(params[2]).toUtf8());
325 char* initEffects::ladspaPitchShifterEffectString(QStringList params)
327 return qstrdup( QString(jackString + "1193</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><lockall>true</lockall><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow></plugin></jackrack>").arg(params[0]).toUtf8());
330 char* initEffects::ladspaRateScalerEffectString(QStringList params)
332 return qstrdup( QString(jackString + "1417</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><lockall>true</lockall><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow></plugin></jackrack>").arg(params[0]).toUtf8());
335 char* initEffects::ladspaPhaserEffectString(QStringList params)
337 return qstrdup( QString(jackString + "1217</id><enabled>true</enabled><wet_dry_enabled>false</wet_dry_enabled><wet_dry_locked>true</wet_dry_locked><wet_dry_values><value>1.000000</value><value>1.000000</value></wet_dry_values><lockall>true</lockall><controlrow><lock>true</lock><value>%1</value><value>%1</value></controlrow><controlrow><lock>true</lock><value>%2</value><value>%2</value></controlrow><controlrow><lock>true</lock><value>%3</value><value>%3</value></controlrow><controlrow><lock>true</lock><value>%4</value><value>%4</value></controlrow></plugin></jackrack>").arg(params[0]).arg(params[1]).arg(params[2]).arg(params[3]).toUtf8());