lbajardsilogic@16: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@16: lbajardsilogic@16: /* lbajardsilogic@16: Sound Access lbajardsilogic@16: EASAIER client application. lbajardsilogic@16: Silogic 2007. Luc Barthélémy. lbajardsilogic@16: lbajardsilogic@16: This program is free software; you can redistribute it and/or lbajardsilogic@16: modify it under the terms of the GNU General Public License as lbajardsilogic@16: published by the Free Software Foundation; either version 2 of the lbajardsilogic@16: License, or (at your option) any later version. See the file lbajardsilogic@16: COPYING included with this distribution for more information. lbajardsilogic@16: */ lbajardsilogic@16: lbajardsilogic@16: lbajardsilogic@16: #include "system/System.h" lbajardsilogic@16: #include "model/IntervalModel.h" lbajardsilogic@16: lbajardsilogic@48: #include lbajardsilogic@16: lbajardsilogic@16: lbajardsilogic@16: TimeInterval::TimeInterval(long start, long end, float value): lbajardsilogic@16: m_start(start), m_end(end), m_value(value) lbajardsilogic@16: { lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: TimeInterval::TimeInterval(long start, long end, const QString& label, float value): lbajardsilogic@16: m_start(start), m_end(end), m_label(label), m_value(value) lbajardsilogic@16: { lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: TimeInterval::~TimeInterval() lbajardsilogic@16: { lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: QString lbajardsilogic@16: TimeInterval::toXmlString(QString indent , QString extraAttributes ) const lbajardsilogic@16: { lbajardsilogic@16: return QString("%1\n") lbajardsilogic@16: .arg(indent).arg(m_start).arg(m_end).arg(m_label) lbajardsilogic@16: .arg(m_value).arg(extraAttributes); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: QString lbajardsilogic@16: TimeInterval::toDelimitedDataString(const QString& delimiter, size_t sampleRate) const lbajardsilogic@16: { lbajardsilogic@16: QStringList list; lbajardsilogic@16: list << RealTime::frame2RealTime(m_start, sampleRate).toString().c_str(); lbajardsilogic@16: list << RealTime::frame2RealTime(m_end, sampleRate).toString().c_str(); lbajardsilogic@16: list << QString("%1").arg(m_value); lbajardsilogic@16: list << m_label; lbajardsilogic@16: lbajardsilogic@16: return list.join(delimiter); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: /** lbajardsilogic@16: * IntervalModel lbajardsilogic@16: */ lbajardsilogic@16: lbajardsilogic@16: IntervalModel::IntervalModel(size_t sampleRate, size_t resolution, bool notifyOnAdd) : lbajardsilogic@261: m_sampleRate(sampleRate), m_resolution(resolution), m_notifyOnAdd(notifyOnAdd), lbajardsilogic@261: m_meanValue(0.2) lbajardsilogic@16: { lbajardsilogic@16: lbajardsilogic@16: lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: IntervalModel::~IntervalModel() lbajardsilogic@16: { lbajardsilogic@16: lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: QString lbajardsilogic@16: IntervalModel::toDelimitedDataString(QString delimiter) const lbajardsilogic@16: { lbajardsilogic@16: QString s; lbajardsilogic@16: for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i) lbajardsilogic@16: { lbajardsilogic@16: s += (*i)->toDelimitedDataString(delimiter, m_sampleRate) + "\n"; lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: return s; lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@48: void lbajardsilogic@48: IntervalModel::toXml(QTextStream &out, lbajardsilogic@48: QString indent, lbajardsilogic@48: QString extraAttributes) const lbajardsilogic@16: { lbajardsilogic@48: out << Model::toXmlString lbajardsilogic@16: (indent, QString("type=\"interval\" dimensions=\"3\" resolution=\"%1\" notifyOnAdd=\"%2\" dataset=\"%3\" %4") lbajardsilogic@16: .arg(m_resolution) lbajardsilogic@16: .arg(m_notifyOnAdd ? "true" : "false") lbajardsilogic@16: .arg(getObjectExportId(&m_intervals)) lbajardsilogic@16: .arg(extraAttributes)); lbajardsilogic@16: lbajardsilogic@48: out << indent; lbajardsilogic@48: out << QString("\n") lbajardsilogic@16: .arg(getObjectExportId(&m_intervals)); lbajardsilogic@16: lbajardsilogic@16: for (IntervalListConstIterator i = m_intervals.begin(); i != m_intervals.end(); ++i) lbajardsilogic@16: { lbajardsilogic@48: out << (*i)->toXmlString(indent + " "); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@48: out << indent + "\n"; lbajardsilogic@48: } lbajardsilogic@48: lbajardsilogic@48: QString lbajardsilogic@48: IntervalModel::toXmlString(QString indent, lbajardsilogic@48: QString extraAttributes) const lbajardsilogic@48: { lbajardsilogic@48: QString s; lbajardsilogic@48: lbajardsilogic@48: { lbajardsilogic@48: QTextStream out(&s); lbajardsilogic@48: toXml(out, indent, extraAttributes); lbajardsilogic@48: } lbajardsilogic@16: lbajardsilogic@16: return s; lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: size_t lbajardsilogic@16: IntervalModel::getStartFrame() const lbajardsilogic@16: { lbajardsilogic@16: QMutexLocker locker(&m_mutex); lbajardsilogic@16: lbajardsilogic@16: size_t start= 0; lbajardsilogic@16: lbajardsilogic@16: if (m_intervals.size() > 0) lbajardsilogic@16: start = (*m_intervals.begin())->start(); lbajardsilogic@16: lbajardsilogic@16: for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i) lbajardsilogic@16: { lbajardsilogic@16: if (start > ((size_t) ((*i)->start()))) lbajardsilogic@16: start = (size_t) ((*i)->start()); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: return start; lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: size_t lbajardsilogic@16: IntervalModel::getEndFrame() const lbajardsilogic@16: { lbajardsilogic@16: QMutexLocker locker(&m_mutex); lbajardsilogic@16: lbajardsilogic@16: size_t end = 0; lbajardsilogic@16: lbajardsilogic@16: for (IntervalListConstIterator i = m_intervals.begin() ; i != m_intervals.end(); ++i) lbajardsilogic@16: { lbajardsilogic@16: if (end < ((size_t) ((*i)->end()))) lbajardsilogic@16: end = (size_t) ((*i)->end()); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: return end; lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: Model* lbajardsilogic@16: IntervalModel::clone() const lbajardsilogic@16: { lbajardsilogic@16: IntervalModel* model = new IntervalModel(m_sampleRate, m_resolution, m_notifyOnAdd); lbajardsilogic@16: model->m_intervals = m_intervals; lbajardsilogic@16: lbajardsilogic@16: return model; lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: void lbajardsilogic@16: IntervalModel::addInterval(long start, long end, const QString& label, float value) lbajardsilogic@16: { lbajardsilogic@16: QMutexLocker locker(&m_mutex); lbajardsilogic@16: lbajardsilogic@16: m_intervals.push_back(new TimeInterval(start, end, label, value)); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: void IntervalModel::addInterval(TimeIntervalPtr ti) lbajardsilogic@16: { lbajardsilogic@16: { lbajardsilogic@16: QMutexLocker locker(&m_mutex); lbajardsilogic@16: lbajardsilogic@16: m_intervals.push_back(ti); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: emit modelChanged(ti->start(), ti->end()); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: void IntervalModel::removeInterval(TimeIntervalPtr ti) lbajardsilogic@16: { lbajardsilogic@16: { lbajardsilogic@16: QMutexLocker locker(&m_mutex); lbajardsilogic@16: lbajardsilogic@16: m_intervals.remove(ti); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: emit modelChanged(ti->start(), ti->end()); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: void lbajardsilogic@16: IntervalModel::changeInterval(TimeIntervalPtr ti, long start, long end, float value, const QString& label) lbajardsilogic@16: { lbajardsilogic@16: lbajardsilogic@190: long startMin = MIN(start, ti->start()); lbajardsilogic@190: long endMax = MAX(end, ti->end()); lbajardsilogic@16: lbajardsilogic@16: { lbajardsilogic@16: QMutexLocker locker(&m_mutex); lbajardsilogic@16: lbajardsilogic@16: if (label != ti->label()) lbajardsilogic@16: ti->label(label); lbajardsilogic@16: ti->start(start); lbajardsilogic@16: ti->end(end); lbajardsilogic@16: ti->value(value); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: emit modelChanged(startMin, endMax); lbajardsilogic@16: } lbajardsilogic@16: lbajardsilogic@16: