annotate sv/document/SVFileReader.h @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 7bd5773d4372
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam and QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #ifndef _SV_FILE_READER_H_
lbajardsilogic@0 17 #define _SV_FILE_READER_H_
lbajardsilogic@0 18
lbajardsilogic@0 19 #include "layer/LayerFactory.h"
lbajardsilogic@0 20 #include "transform/Transform.h"
lbajardsilogic@0 21 #include "transform/PluginTransform.h"
lbajardsilogic@0 22
lbajardsilogic@0 23 #include <QXmlDefaultHandler>
lbajardsilogic@0 24
lbajardsilogic@0 25 #include <map>
lbajardsilogic@0 26
lbajardsilogic@0 27 class Pane;
lbajardsilogic@0 28 class Model;
lbajardsilogic@0 29 class Document;
lbajardsilogic@0 30 class PlayParameters;
lbajardsilogic@0 31
lbajardsilogic@0 32 class SVFileReaderPaneCallback
lbajardsilogic@0 33 {
lbajardsilogic@0 34 public:
lbajardsilogic@0 35 virtual ~SVFileReaderPaneCallback();
lbajardsilogic@0 36 virtual Pane *addPane() = 0;
lbajardsilogic@0 37 virtual void setWindowSize(int width, int height) = 0;
lbajardsilogic@0 38 virtual void addSelection(int start, int end) = 0;
lbajardsilogic@0 39 };
lbajardsilogic@0 40
lbajardsilogic@0 41 /**
lbajardsilogic@0 42 SVFileReader loads Sonic Visualiser XML files. (The SV file
lbajardsilogic@0 43 format is bzipped XML.)
lbajardsilogic@0 44
lbajardsilogic@0 45 Some notes about the SV XML format follow. We're very lazy with
lbajardsilogic@0 46 our XML: there's no schema or DTD, and we depend heavily on
lbajardsilogic@0 47 elements being in a particular order.
lbajardsilogic@0 48
lbajardsilogic@0 49 \verbatim
lbajardsilogic@0 50
lbajardsilogic@0 51 <sv>
lbajardsilogic@0 52
lbajardsilogic@0 53 <data>
lbajardsilogic@0 54
lbajardsilogic@0 55 <!-- The data section contains definitions of both models and
lbajardsilogic@0 56 visual layers. Layers are considered data in the document;
lbajardsilogic@0 57 the structure of views that displays the layers is not. -->
lbajardsilogic@0 58
lbajardsilogic@0 59 <!-- id numbers are unique within the data type (i.e. no two
lbajardsilogic@0 60 models can have the same id, but a model can have the same
lbajardsilogic@0 61 id as a layer, etc). SV generates its id numbers just for
lbajardsilogic@0 62 the purpose of cross-referencing within the current file;
lbajardsilogic@0 63 they don't necessarily have any meaning once the file has
lbajardsilogic@0 64 been loaded. -->
lbajardsilogic@0 65
lbajardsilogic@0 66 <model id="0" name="..." type="..." ... />
lbajardsilogic@0 67 <model id="1" name="..." type="..." ... />
lbajardsilogic@0 68
lbajardsilogic@0 69 <!-- Models that have data associated with them store it
lbajardsilogic@0 70 in a neighbouring dataset element. The dataset must follow
lbajardsilogic@0 71 the model and precede any derivation or layer elements that
lbajardsilogic@0 72 refer to the model. -->
lbajardsilogic@0 73
lbajardsilogic@0 74 <model id="2" name="..." type="..." dataset="0" ... />
lbajardsilogic@0 75
lbajardsilogic@0 76 <dataset id="0" type="...">
lbajardsilogic@0 77 <point frame="..." value="..." ... />
lbajardsilogic@0 78 </dataset>
lbajardsilogic@0 79
lbajardsilogic@0 80 <!-- Where one model is derived from another via a transform,
lbajardsilogic@0 81 it has an associated derivation element. This must follow
lbajardsilogic@0 82 both the source and target model elements. The source and
lbajardsilogic@0 83 model attributes give the source model id and target model
lbajardsilogic@0 84 id respectively. A model can have both dataset and
lbajardsilogic@0 85 derivation elements; if it does, dataset must appear first.
lbajardsilogic@0 86 If the model's data are not stored, but instead the model
lbajardsilogic@0 87 is to be regenerated completely from the transform when
lbajardsilogic@0 88 the session is reloaded, then the model should have _only_
lbajardsilogic@0 89 a derivation element, and no model element should appear
lbajardsilogic@0 90 for it at all. -->
lbajardsilogic@0 91
lbajardsilogic@0 92 <derivation source="0" model="2" transform="..." ...>
lbajardsilogic@0 93 <plugin id="..." ... />
lbajardsilogic@0 94 </derivation>
lbajardsilogic@0 95
lbajardsilogic@0 96 <!-- The playparameters element lists playback settings for
lbajardsilogic@0 97 a model. -->
lbajardsilogic@0 98
lbajardsilogic@0 99 <playparameters mute="false" pan="0" gain="1" model="1" ... />
lbajardsilogic@0 100
lbajardsilogic@0 101 <!-- Layer elements. The models must have already been defined.
lbajardsilogic@0 102 The same model may appear in more than one layer (of more
lbajardsilogic@0 103 than one type). -->
lbajardsilogic@0 104
lbajardsilogic@0 105 <layer id="1" type="..." name="..." model="0" ... />
lbajardsilogic@0 106 <layer id="2" type="..." name="..." model="1" ... />
lbajardsilogic@0 107
lbajardsilogic@0 108 </data>
lbajardsilogic@0 109
lbajardsilogic@0 110
lbajardsilogic@0 111 <display>
lbajardsilogic@0 112
lbajardsilogic@0 113 <!-- The display element contains visual structure for the
lbajardsilogic@0 114 layers. It's simpler than the data section. -->
lbajardsilogic@0 115
lbajardsilogic@0 116 <!-- Overall preferred window size for this session. -->
lbajardsilogic@0 117
lbajardsilogic@0 118 <window width="..." height="..."/>
lbajardsilogic@0 119
lbajardsilogic@0 120 <!-- List of view elements to stack up. Each one contains
lbajardsilogic@0 121 a list of layers in stacking order, back to front. -->
lbajardsilogic@0 122
lbajardsilogic@0 123 <view type="pane" ...>
lbajardsilogic@0 124 <layer id="1"/>
lbajardsilogic@0 125 <layer id="2"/>
lbajardsilogic@0 126 </view>
lbajardsilogic@0 127
lbajardsilogic@0 128 <!-- The layer elements just refer to layers defined in the
lbajardsilogic@0 129 data section, so they don't have to have any attributes
lbajardsilogic@0 130 other than the id. For sort-of-historical reasons SV
lbajardsilogic@0 131 actually does repeat the other attributes here, but
lbajardsilogic@0 132 it doesn't need to. -->
lbajardsilogic@0 133
lbajardsilogic@0 134 <view type="pane" ...>
lbajardsilogic@0 135 <layer id="2"/>
lbajardsilogic@0 136 <view>
lbajardsilogic@0 137
lbajardsilogic@0 138 </display>
lbajardsilogic@0 139
lbajardsilogic@0 140
lbajardsilogic@0 141 <!-- List of selected regions by audio frame extents. -->
lbajardsilogic@0 142
lbajardsilogic@0 143 <selections>
lbajardsilogic@0 144 <selection start="..." end="..."/>
lbajardsilogic@0 145 </selections>
lbajardsilogic@0 146
lbajardsilogic@0 147
lbajardsilogic@0 148 </sv>
lbajardsilogic@0 149
lbajardsilogic@0 150 \endverbatim
lbajardsilogic@0 151 */
lbajardsilogic@0 152
lbajardsilogic@0 153
lbajardsilogic@0 154 class SVFileReader : public QXmlDefaultHandler
lbajardsilogic@0 155 {
lbajardsilogic@0 156 public:
lbajardsilogic@0 157 SVFileReader(Document *document,
lbajardsilogic@0 158 SVFileReaderPaneCallback &callback,
lbajardsilogic@0 159 QString location = ""); // for audio file locate mechanism
lbajardsilogic@0 160 virtual ~SVFileReader();
lbajardsilogic@0 161
lbajardsilogic@0 162 void parse(const QString &xmlData);
lbajardsilogic@0 163 void parse(QXmlInputSource &source);
lbajardsilogic@0 164
lbajardsilogic@0 165 bool isOK();
lbajardsilogic@0 166 QString getErrorString() const { return m_errorString; }
lbajardsilogic@0 167
lbajardsilogic@0 168 // For loading a single layer onto an existing pane
lbajardsilogic@0 169 void setCurrentPane(Pane *pane) { m_currentPane = pane; }
lbajardsilogic@0 170
lbajardsilogic@0 171 virtual bool startElement(const QString &namespaceURI,
lbajardsilogic@0 172 const QString &localName,
lbajardsilogic@0 173 const QString &qName,
lbajardsilogic@0 174 const QXmlAttributes& atts);
lbajardsilogic@0 175
lbajardsilogic@0 176 virtual bool characters(const QString &);
lbajardsilogic@0 177
lbajardsilogic@0 178 virtual bool endElement(const QString &namespaceURI,
lbajardsilogic@0 179 const QString &localName,
lbajardsilogic@0 180 const QString &qName);
lbajardsilogic@0 181
lbajardsilogic@0 182 bool error(const QXmlParseException &exception);
lbajardsilogic@0 183 bool fatalError(const QXmlParseException &exception);
lbajardsilogic@0 184
lbajardsilogic@0 185 protected:
lbajardsilogic@0 186 bool readWindow(const QXmlAttributes &);
lbajardsilogic@0 187 bool readModel(const QXmlAttributes &);
lbajardsilogic@0 188 bool readView(const QXmlAttributes &);
lbajardsilogic@0 189 bool readLayer(const QXmlAttributes &);
lbajardsilogic@0 190 bool readDatasetStart(const QXmlAttributes &);
lbajardsilogic@0 191 bool addBinToDataset(const QXmlAttributes &);
lbajardsilogic@0 192 bool addPointToDataset(const QXmlAttributes &);
lbajardsilogic@0 193 bool addRowToDataset(const QXmlAttributes &);
lbajardsilogic@47 194 bool addIntervalToDataset(const QXmlAttributes &);
lbajardsilogic@0 195 bool readRowData(const QString &);
lbajardsilogic@0 196 bool readDerivation(const QXmlAttributes &);
lbajardsilogic@0 197 bool readPlayParameters(const QXmlAttributes &);
lbajardsilogic@0 198 bool readPlugin(const QXmlAttributes &);
lbajardsilogic@0 199 bool readSelection(const QXmlAttributes &);
lbajardsilogic@0 200 void addUnaddedModels();
lbajardsilogic@0 201
lbajardsilogic@0 202 Document *m_document;
lbajardsilogic@0 203 SVFileReaderPaneCallback &m_paneCallback;
lbajardsilogic@0 204 QString m_location;
lbajardsilogic@0 205 Pane *m_currentPane;
lbajardsilogic@0 206 std::map<int, Layer *> m_layers;
lbajardsilogic@0 207 std::map<int, Model *> m_models;
lbajardsilogic@0 208 std::set<Model *> m_addedModels;
lbajardsilogic@0 209 std::map<int, int> m_awaitingDatasets; // map dataset id -> model id
lbajardsilogic@0 210 Model *m_currentDataset;
lbajardsilogic@0 211 Model *m_currentDerivedModel;
lbajardsilogic@0 212 int m_currentDerivedModelId;
lbajardsilogic@0 213 PlayParameters *m_currentPlayParameters;
lbajardsilogic@0 214 QString m_currentTransform;
lbajardsilogic@0 215 Model *m_currentTransformSource;
lbajardsilogic@0 216 PluginTransform::ExecutionContext m_currentTransformContext;
lbajardsilogic@0 217 QString m_currentTransformConfiguration;
lbajardsilogic@0 218 QString m_datasetSeparator;
lbajardsilogic@0 219 bool m_inRow;
lbajardsilogic@0 220 bool m_inView;
lbajardsilogic@0 221 bool m_inData;
lbajardsilogic@0 222 bool m_inSelections;
lbajardsilogic@0 223 int m_rowNumber;
lbajardsilogic@0 224 QString m_errorString;
lbajardsilogic@0 225 bool m_ok;
lbajardsilogic@0 226 };
lbajardsilogic@0 227
lbajardsilogic@0 228 #endif