]> git.sesse.net Git - kdenlive/blob - src/initeffects.cpp
text changes in other editor too
[kdenlive] / src / initeffects.cpp
1 /***************************************************************************
2                           initeffects.cpp  -  description
3                              -------------------
4     begin                :  Jul 2006
5     copyright            : (C) 2006 by Jean-Baptiste Mardelle
6     email                : jb@ader.ch
7     copyright            : (C) 2008 Marco Gittler
8     email                : g.marco@freenet.de
9  ***************************************************************************/
10
11 /***************************************************************************
12  *                                                                         *
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.                                   *
17  *                                                                         *
18  ***************************************************************************/
19
20
21 #include <QFile>
22 #include <qregexp.h>
23 #include <QDir>
24
25 #include <KDebug>
26 #include <kglobal.h>
27 #include <KStandardDirs>
28
29 #include "initeffects.h"
30
31 initEffects::initEffects()
32 {
33 }
34
35 initEffects::~initEffects()
36 {
37 }
38
39 //static
40 Mlt::Repository *initEffects::parseEffectFiles(EffectsList *audioEffectList, EffectsList *videoEffectList)
41 {
42     QStringList::Iterator more;
43     QStringList::Iterator it;
44     QStringList fileList;
45     QString itemName;
46
47
48     // Build effects. Retrieve the list of MLT's available effects first.
49     Mlt::Repository *repository = Mlt::Factory::init();
50     if (!repository){
51          kDebug() << "Repository did not finish init " ;
52          return NULL;
53     }
54     Mlt::Properties *filters = repository->filters();
55     QStringList filtersList;
56
57     for (int i=0 ; i <filters->count() ; i++){
58       filtersList << filters->get_name(i);
59     }
60
61     // Build effects. check producers first.
62
63     Mlt::Properties *producers = repository->producers();
64     QStringList producersList;
65     for (int i=0 ; i <producers->count() ; i++){
66       producersList << producers->get_name(i);
67     }
68     delete filters;
69     delete producers;
70
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");
76
77     kDebug()<<"//  INIT EFFECT SEARCH"<<endl;
78
79     QStringList direc = KGlobal::dirs()->findDirs("data", "kdenlive/effects");
80
81     QDir directory;
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;
89         }
90     }
91     return repository;
92 }
93
94 // static
95 void initEffects::parseEffectFile(EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList)
96 {
97     QDomDocument doc;
98     QFile file(name);
99     doc.setContent(&file, false);
100     QDomElement documentElement = doc.documentElement();
101     QDomNodeList effects = doc.elementsByTagName("effect");
102
103     if (effects.count() == 0) {
104         kDebug()<<"// EFFECT FILET: "<<name<<" IS BROKEN"<<endl;
105         return;
106     }
107     QString groupName;
108     if (doc.elementsByTagName("effectgroup").item(0).toElement().tagName() == "effectgroup") {
109         groupName = documentElement.attribute("name", QString::null);
110     }
111
112     int i = 0;
113
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;
121     }
122
123     // Parse effect file
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;
134         }
135         if (isAudioEffect) audioEffectList->append(documentElement);
136         else videoEffectList->append(documentElement);
137      }
138
139 /*
140         QDomNode n = documentElement.firstChild();
141         QString id, effectName, effectTag, paramType;
142         int paramCount = 0;
143         EFFECTTYPE type;
144
145         // Create Effect
146         EffectParamDescFactory effectDescParamFactory;
147         EffectDesc *effect = NULL;
148
149         // parse effect file
150         QDomNode namenode = documentElement.elementsByTagName("name").item(0);
151         if (!namenode.isNull()) effectName = i18n(namenode.toElement().text());
152         if (!groupName.isEmpty()) effectName.prepend("_" + groupName + "_");
153
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;
162         }
163
164         QString effectDescription;
165         QDomNode descnode = documentElement.elementsByTagName("description").item(0);
166         if (!descnode.isNull()) effectDescription = descnode.toElement().text() + "<br />";
167
168         QString effectAuthor;
169         QDomNode authnode = documentElement.elementsByTagName("author").item(0);
170         if (!authnode.isNull()) effectAuthor = authnode.toElement().text() + "<br />";
171
172         if (effectName.isEmpty() || id.isEmpty() || effectTag.isEmpty()) return;
173
174         effect = new EffectDesc(effectName, id, effectTag, effectDescription, effectAuthor, type);
175
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));
181         }
182         else for (int i = 0; i < paramList.count(); i++) {
183             QDomElement e = paramList.item(i).toElement();
184             if (!e.isNull()) {
185                 paramCount++;
186                 QDomNamedNodeMap attrs = e.attributes();
187                 int i = 0;
188                 QString value;
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);
201                     i++;
202                 }
203                 effect->addParameter(effectDescParamFactory.createParameter(e));
204             }
205         }
206         effectList->append(effect);
207         }*/
208         i++;
209     }
210 }
211
212 //static 
213 char* initEffects::ladspaEffectString(int ladspaId, QStringList params)
214 {
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);
223     else {
224         kDebug()<<"++++++++++  ASKING FOR UNKNOWN LADSPA EFFECT: "<<ladspaId<<endl;
225         return("<jackrack></jackrack>");
226     }
227 }
228
229 //static 
230 void initEffects::ladspaEffectFile(const QString & fname, int ladspaId, QStringList params)
231 {
232     char *filterString;
233     switch (ladspaId) {
234     case 1433: //Pitch
235         filterString = ladspaPitchEffectString(params);
236         break;
237     case 1905: //Vinyl
238         filterString = ladspaVinylEffectString(params);
239         break;
240     case 1216 : //Room Reverb
241         filterString = ladspaRoomReverbEffectString(params);
242         break;
243     case 1423: //Reverb
244         filterString = ladspaReverbEffectString(params);
245         break;
246     case 1195: //Declipper
247         filterString = ladspaDeclipEffectString(params);
248         break;
249     case 1901:  //Reverb
250         filterString = ladspaEqualizerEffectString(params);
251         break;
252     case 1913: // Limiter
253         filterString = ladspaLimiterEffectString(params);
254         break;
255     case 1193: // Pitch Shifter
256         filterString = ladspaPitchShifterEffectString(params);
257         break;
258     case 1417: // Rate Scaler
259         filterString = ladspaRateScalerEffectString(params);
260         break;
261     case 1217: // Phaser
262         filterString = ladspaPhaserEffectString(params);
263         break;
264     default: 
265         kDebug()<<"++++++++++  ASKING FOR UNKNOWN LADSPA EFFECT: "<<ladspaId<<endl;
266         return;
267         break;
268     }
269
270         QFile f( fname );
271         if ( f.open( QIODevice::WriteOnly ) ) 
272         {
273                 QTextStream stream( &f );
274                 stream << filterString;
275                 f.close();
276         }
277         else kDebug()<<"++++++++++  ERROR CANNOT WRITE TO: "<<KdenliveSettings::currenttmpfolder() +  fname<<endl;
278         delete filterString;
279 }
280
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>";
282
283
284 char* initEffects::ladspaDeclipEffectString(QStringList)
285 {
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());
287 }
288
289 /*
290 char* initEffects::ladspaVocoderEffectString(QStringList params)
291 {
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]));
293 }*/
294
295 char* initEffects::ladspaVinylEffectString(QStringList params)
296 {
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());
298 }
299
300 char* initEffects::ladspaPitchEffectString(QStringList params)
301 {
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());
303 }
304
305 char* initEffects::ladspaRoomReverbEffectString(QStringList params)
306 {
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());
308 }
309
310 char* initEffects::ladspaReverbEffectString(QStringList params)
311 {
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());
313 }
314
315 char* initEffects::ladspaEqualizerEffectString(QStringList params)
316 {
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());
318 }
319
320 char* initEffects::ladspaLimiterEffectString(QStringList params)
321 {
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());
323 }
324
325 char* initEffects::ladspaPitchShifterEffectString(QStringList params)
326 {
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());
328 }
329
330 char* initEffects::ladspaRateScalerEffectString(QStringList params)
331 {
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());
333 }
334
335 char* initEffects::ladspaPhaserEffectString(QStringList params)
336 {
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());
338 }
339
340
341