4
#include <dynamicrequest.h>
8
#include <soundserver.h>
9
#include <noatunarts.h>
10
#include <ktempfile.h>
12
#include <netaccess.h>
14
#include <qtextstream.h>
20
#define EQ napp->equalizer()
21
#define EQBACK napp->player()->engine()->equalizer()
25
static QString makePresetFile()
27
QString basedir=kapp->dirs()->localkdedir()+"/share/apps/noatun/eq.preset/";
28
// now append a filename that doens't exist
29
KStandardDirs::makeDir(basedir);
35
fullpath=basedir+"preset."+QString::number(num);
37
fullpath=basedir+"preset";
40
while (QFile(fullpath).exists());
44
Preset::Preset(const QString &file) : mFile(file)
47
Preset::Preset() : mFile(makePresetFile())
50
QString Preset::name() const
53
if (!file.open(IO_ReadOnly)) return 0;
55
QDomDocument doc("noatunequalizer");
56
if (!doc.setContent(&file)) return 0;
58
QDomElement docElem = doc.documentElement();
59
if (docElem.tagName()!="noatunequalizer") return 0;
60
bool standard=docElem.attribute("default", "0")=="0";
61
QString n=docElem.attribute("name", 0);
64
{ // All the translations for the presets
74
n=i18n(n.local8Bit());
79
bool Preset::setName(const QString &name)
81
QList<Preset> presets=EQ->presets();
82
for (Preset *i=presets.first(); i!=0; i=presets.next())
84
if (i==this) continue;
90
if (!file.open(IO_ReadOnly)) return 0;
92
QDomDocument doc("noatunequalizer");
93
if (!doc.setContent(&file)) return 0;
95
QDomElement docElem = doc.documentElement();
96
if (docElem.tagName()!="noatunequalizer") return 0;
98
docElem.setAttribute("name", name);
100
emit EQ->renamed(this);
102
file.open(IO_ReadWrite | IO_Truncate);
103
QTextStream s(&file);
110
bool Preset::save() const
112
return EQ->save(mFile, name());
117
bool b=EQ->load(mFile);
118
if (b) emit EQ->changed(this);
122
void Preset::remove()
124
KConfig *config=kapp->config();
125
config->setGroup("Equalizer");
126
QStringList items=config->readListEntry("presets");
130
emit EQ->removed(this);
132
if (mFile.find(kapp->dirs()->localkdedir())==0)
134
QFile(mFile).remove();
138
QString Preset::file() const
144
Band::Band(int start, int end) : mLevel(0), mStart(start), mEnd(end)
149
emit EQ->changed(this);
162
void Band::setLevel(int l)
167
emit EQ->changed(this);
170
int Band::start() const
175
int Band::end() const
180
int Band::center() const
182
return (mStart+mEnd)/2;
185
static QString formatFreq(int f, bool withHz)
189
format=QString::number(f);
191
format=QString::number((int)((f+500)/1000.0))+"k";
199
QString Band::formatStart(bool withHz) const
201
return formatFreq(mStart, withHz);
204
QString Band::formatEnd(bool withHz) const
206
return formatFreq(mEnd, withHz);
209
QString Band::format(bool withHz) const
211
return formatFreq(center(), withHz);
218
729 1621 811-2431 1620
219
2187 4661 2432-7290 4858
220
6561 13645 7291+ 12708
223
Equalizer::Equalizer() : mUpdates(true)
227
void Equalizer::init()
229
for (Band *i=mBands.first(); i!=0; i=mBands.next())
233
enableUpdates(false);
238
new Band(2432, 7290);
239
new Band(7291, 19999);
246
load(napp->dirs()->saveLocation("data", "noatun/") + "equalizer");
248
KConfig *config=kapp->config();
249
config->setGroup("Equalizer");
250
setEnabled(config->readBoolEntry("enabled", false));
253
QList<Preset> Equalizer::presets() const
255
KConfig *conf=KGlobal::config();
256
conf->setGroup("Equalizer");
259
if (conf->hasKey("presets"))
261
list=conf->readListEntry("presets");
265
list=kapp->dirs()->findAllResources("data", "noatun/eq.preset/*");
266
conf->writeEntry("presets", list);
270
QList<Preset> presets;
272
for (QStringList::Iterator i = list.begin(); i!=list.end(); ++i)
275
if (!file.open(IO_ReadOnly)) continue;
277
QDomDocument doc("noatunequalizer");
278
if (!doc.setContent(&file)) continue;
280
QDomElement docElem = doc.documentElement();
281
if (docElem.tagName()!="noatunequalizer") continue;
283
presets.append(new Preset(*i));
288
Preset *Equalizer::preset(const QString &file)
290
KConfig *conf=KGlobal::config();
291
conf->setGroup("Equalizer");
292
QStringList list=kapp->config()->readListEntry("presets");
293
if (list.contains(file))
294
return new Preset(file);
298
bool Equalizer::presetExists(const QString &name) const
300
QList<Preset> list=presets();
301
for (Preset *i=list.first(); i!=0; i=list.next())
309
Preset *Equalizer::createPreset(const QString &name, bool smart)
311
if (presetExists(name) && !smart) return 0;
312
QString nameReal=name;
315
while (presetExists(nameReal))
317
nameReal=name+" ("+QString::number(number)+')';
322
Preset *preset=new Preset;
325
save(preset->file(), nameReal);
326
KConfig *config=kapp->config();
327
config->setGroup("Equalizer");
328
QStringList list=config->readListEntry("presets");
329
list+=preset->file();
330
config->writeEntry("presets", list);
333
emit created(preset);
338
Equalizer::~Equalizer()
340
save(napp->dirs()->saveLocation("data", "noatun/") + "equalizer", "auto");
341
for (Band *i=mBands.first(); i!=0; i=mBands.next())
345
const QList<Band> &Equalizer::bands() const
350
Band *Equalizer::band(int num) const
352
// can't use QList::at since it sets current
354
QListIterator<Band> item(mBands);
355
item+=(unsigned int)num;
359
int Equalizer::bandCount() const
361
return (int)mBands.count();
364
int Equalizer::preamp() const
369
bool Equalizer::isEnabled() const
371
return (bool)EQBACK->enabled();
375
void Equalizer::setPreamp(int p)
378
EQBACK->preamp(pow(2,(float)p/100.0));
380
emit preampChanged();
381
emit preampChanged(p);
384
void Equalizer::enable()
389
void Equalizer::disable()
394
void Equalizer::setEnabled(bool e)
396
EQBACK->enabled((long)e);
397
KConfig *config=kapp->config();
398
config->setGroup("Equalizer");
399
config->writeEntry("enabled", e);
409
bool Equalizer::save(const KURL &filename, const QString &name) const
411
QDomDocument doc("noatunequalizer");
412
doc.setContent(QString("<!DOCTYPE NoatunEqualizer><noatunequalizer/>"));
413
QDomElement docElem = doc.documentElement();
416
docElem.setAttribute("level", preamp());
417
docElem.setAttribute("name", name);
418
docElem.setAttribute("version", napp->version());
421
for (QListIterator<Band> i(mBands); i.current(); ++i)
423
QDomElement elem = doc.createElement("band");
424
elem.setAttribute("start", (*i)->start());
425
elem.setAttribute("end", (*i)->end());
426
elem.setAttribute("level", (*i)->level());
428
docElem.appendChild(elem);
433
*(file.textStream()) << doc.toString();
436
return KIO::NetAccess::upload(file.name(), filename);
441
bool Equalizer::load(const KURL &filename)
444
if(KIO::NetAccess::download(filename, dest))
447
if (!file.open(IO_ReadOnly))
450
QDomDocument doc("noatunequalizer");
451
if (!doc.setContent(&file))
454
QDomElement docElem = doc.documentElement();
455
if (docElem.tagName()!="noatunequalizer")
458
enableUpdates(false);
460
// blockSignals(true);
461
setPreamp(docElem.attribute("level", "0").toInt());
462
Band *bandIter=mBands.first();
463
for (QDomNode n = docElem.firstChild(); !n.isNull(); n = n.nextSibling())
465
QDomElement e = n.toElement();
466
if(e.isNull()) continue;
467
if (e.tagName()!="band") continue;
469
// int start=e.attribute("start","0").toInt();
470
// int end=e.attribute("end", "108").toInt();
471
int level=e.attribute("level", "0").toInt();
472
bandIter->setLevel(level);
473
bandIter=mBands.next();
476
// blockSignals(false);
484
void Equalizer::add(Band *b)
489
void Equalizer::remove(Band *b)
494
void Equalizer::update(bool full)
499
vector<float> levels;
501
vector<float> widths;
503
for (Band *i=mBands.first(); i!=0; i=mBands.next())
505
levels.push_back(pow(2, (float)i->mLevel/50.0));
508
int mid=i->mStart+i->mEnd;
509
mids.push_back(((float)mid)*0.5);
510
widths.push_back((float)(i->mEnd-i->mStart));
514
EQBACK->set(levels, mids, widths);
516
EQBACK->levels(levels);
519
void Equalizer::enableUpdates(bool on)
527
#include "equalizer.moc"