lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #include "NoteModel.h" lbajardsilogic@0: lbajardsilogic@0: NoteModel::PointList lbajardsilogic@0: NoteModel::getPoints(long start, long end) const lbajardsilogic@0: { lbajardsilogic@0: if (start > end) return PointList(); lbajardsilogic@0: QMutexLocker locker(&m_mutex); lbajardsilogic@0: lbajardsilogic@0: Note endPoint(end); lbajardsilogic@0: lbajardsilogic@0: PointListConstIterator endItr = m_points.upper_bound(endPoint); lbajardsilogic@0: lbajardsilogic@0: if (endItr != m_points.end()) ++endItr; lbajardsilogic@0: if (endItr != m_points.end()) ++endItr; lbajardsilogic@0: lbajardsilogic@0: PointList rv; lbajardsilogic@0: lbajardsilogic@0: for (PointListConstIterator i = endItr; i != m_points.begin(); ) { lbajardsilogic@0: --i; lbajardsilogic@0: if (i->frame < start) { lbajardsilogic@0: if (i->frame + long(i->duration) >= start) { lbajardsilogic@0: rv.insert(*i); lbajardsilogic@0: } lbajardsilogic@0: } else if (i->frame <= end) { lbajardsilogic@0: rv.insert(*i); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return rv; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: NoteModel::PointList lbajardsilogic@0: NoteModel::getPoints(long frame) const lbajardsilogic@0: { lbajardsilogic@0: QMutexLocker locker(&m_mutex); lbajardsilogic@0: lbajardsilogic@0: if (m_resolution == 0) return PointList(); lbajardsilogic@0: lbajardsilogic@0: long start = (frame / m_resolution) * m_resolution; lbajardsilogic@0: long end = start + m_resolution; lbajardsilogic@0: lbajardsilogic@0: Note endPoint(end); lbajardsilogic@0: lbajardsilogic@0: PointListConstIterator endItr = m_points.upper_bound(endPoint); lbajardsilogic@0: lbajardsilogic@0: PointList rv; lbajardsilogic@0: lbajardsilogic@0: for (PointListConstIterator i = endItr; i != m_points.begin(); ) { lbajardsilogic@0: --i; lbajardsilogic@0: if (i->frame < start) { lbajardsilogic@0: if (i->frame + long(i->duration) >= start) { lbajardsilogic@0: rv.insert(*i); lbajardsilogic@0: } lbajardsilogic@0: } else if (i->frame <= end) { lbajardsilogic@0: rv.insert(*i); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return rv; lbajardsilogic@0: }