# HG changeset patch # User Chris Cannam # Date 1175275008 0 # Node ID fbd09fcda4695f31b3ccce3efaca951737bb4d88 # Parent 8d31c8e9c820b519b5e164fd5979b98c8385ebe1 * doc updates diff -r 8d31c8e9c820 -r fbd09fcda469 audioio/AudioCallbackPlaySource.cpp --- a/audioio/AudioCallbackPlaySource.cpp Thu Mar 15 16:13:59 2007 +0000 +++ b/audioio/AudioCallbackPlaySource.cpp Fri Mar 30 17:16:48 2007 +0000 @@ -195,7 +195,7 @@ m_audioGenerator->setTargetChannelCount(getTargetChannelCount()); if (!m_fillThread) { - m_fillThread = new AudioCallbackPlaySourceFillThread(*this); + m_fillThread = new FillThread(*this); m_fillThread->start(); } @@ -1382,7 +1382,7 @@ } void -AudioCallbackPlaySource::AudioCallbackPlaySourceFillThread::run() +AudioCallbackPlaySource::FillThread::run() { AudioCallbackPlaySource &s(m_source); diff -r 8d31c8e9c820 -r fbd09fcda469 audioio/AudioCallbackPlaySource.h --- a/audioio/AudioCallbackPlaySource.h Thu Mar 15 16:13:59 2007 +0000 +++ b/audioio/AudioCallbackPlaySource.h Fri Mar 30 17:16:48 2007 +0000 @@ -305,10 +305,10 @@ // Called from getSourceSamples. void applyAuditioningEffect(size_t count, float **buffers); - class AudioCallbackPlaySourceFillThread : public Thread + class FillThread : public Thread { public: - AudioCallbackPlaySourceFillThread(AudioCallbackPlaySource &source) : + FillThread(AudioCallbackPlaySource &source) : Thread(Thread::NonRTThread), m_source(source) { } @@ -320,7 +320,7 @@ QMutex m_mutex; QWaitCondition m_condition; - AudioCallbackPlaySourceFillThread *m_fillThread; + FillThread *m_fillThread; SRC_STATE *m_converter; SRC_STATE *m_crapConverter; // for use when playing very fast int m_resampleQuality; diff -r 8d31c8e9c820 -r fbd09fcda469 document/Document.h --- a/document/Document.h Thu Mar 15 16:13:59 2007 +0000 +++ b/document/Document.h Fri Mar 30 17:16:48 2007 +0000 @@ -37,20 +37,21 @@ * * The document manages: * - * -- A main data model, which provides the underlying sample rate and - * such like. This must be a wave file model. + * - A main data Model, which provides the underlying sample rate and + * such like. This must be a WaveFileModel. * - * -- Any number of imported models, which contain data without any + * - Any number of imported Model objects, which contain data without any * requirement to remember where the data came from or how to * regenerate it. * - * -- Any number of models generated by transforms such as feature - * extraction plugins. For these, we also record the source model and - * the name of the transform used to generate the model so that we can - * regenerate it (potentially from a different source) on demand. + * - Any number of Model objects that were generated by a Transform + * such as FeatureExtractionPluginTransform. For these, we also + * record the source model and the name of the transform used to + * generate the model so that we can regenerate it (potentially + * from a different source) on demand. * - * -- A flat list of layers. Elsewhere, the GUI may distribute these - * across any number of view widgets. A layer may be viewable on more + * - A flat list of Layer objects. Elsewhere, the GUI may distribute these + * across any number of View widgets. A layer may be viewable on more * than one view at once, in principle. A layer refers to one model, * but the same model can be in use in more than one layer. * diff -r 8d31c8e9c820 -r fbd09fcda469 document/SVFileReader.cpp --- a/document/SVFileReader.cpp Thu Mar 15 16:13:59 2007 +0000 +++ b/document/SVFileReader.cpp Fri Mar 30 17:16:48 2007 +0000 @@ -41,113 +41,6 @@ #include -/* - Some notes about the SV XML format. We're very lazy with our XML: - there's no schema or DTD, and we depend heavily on elements being - in a particular order. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - - SVFileReader::SVFileReader(Document *document, SVFileReaderPaneCallback &callback, QString location) : diff -r 8d31c8e9c820 -r fbd09fcda469 document/SVFileReader.h --- a/document/SVFileReader.h Thu Mar 15 16:13:59 2007 +0000 +++ b/document/SVFileReader.h Fri Mar 30 17:16:48 2007 +0000 @@ -37,6 +37,119 @@ virtual void addSelection(int start, int end) = 0; }; +/** + SVFileReader loads Sonic Visualiser XML files. (The SV file + format is bzipped XML.) + + Some notes about the SV XML format follow. We're very lazy with + our XML: there's no schema or DTD, and we depend heavily on + elements being in a particular order. + +\verbatim + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\endverbatim + */ + + class SVFileReader : public QXmlDefaultHandler { public: diff -r 8d31c8e9c820 -r fbd09fcda469 main/MainWindow.cpp --- a/main/MainWindow.cpp Thu Mar 15 16:13:59 2007 +0000 +++ b/main/MainWindow.cpp Fri Mar 30 17:16:48 2007 +0000 @@ -4711,7 +4711,7 @@ aboutText += tr("
With libsndfile © Erik de Castro Lopo"); #endif #endif -#ifdef HAVE_FFTW3 +#ifdef HAVE_FFTW3F #ifdef FFTW3_VERSION aboutText += tr("
With FFTW3 (v%1) © Matteo Frigo and MIT").arg(FFTW3_VERSION); #else diff -r 8d31c8e9c820 -r fbd09fcda469 main/main.cpp --- a/main/main.cpp Thu Mar 15 16:13:59 2007 +0000 +++ b/main/main.cpp Fri Mar 30 17:16:48 2007 +0000 @@ -35,6 +35,124 @@ #include #include +/*! \mainpage Sonic Visualiser + +\section interesting Summary of interesting classes + + - Data models: Model and subclasses, e.g. WaveFileModel + + - Graphical layers: Layer and subclasses, displayed on View and its + subclass widgets. + + - Main window class, document class, and file parser: MainWindow, + Document, SVFileReader + + - Turning one model (e.g. audio) into another (e.g. more audio, or a + curve extracted from it): Transform and subclasses + + - Creating the plugins used by transforms: RealTimePluginFactory, + FeatureExtractionPluginFactory + + - File reading and writing code: AudioFileReader and subclasses, + WavFileWriter, DataFileReader, SVFileReader + + - FFT calculation and cacheing: FFTModel, FFTDataServer + + - Widgets that show groups of editable properties: PropertyBox for + layer properties (contained in a PropertyStack), PluginParameterBox + for plugins (contained in a PluginParameterDialog) + + - Audio playback: AudioCallbackPlaySource and subclasses, + AudioCallbackPlayTarget and subclasses, AudioGenerator + +\section model Data sources: the Model hierarchy + + A Model is something containing, or knowing how to obtain, data. + + For example, WaveFileModel is a model that knows how to get data + from an audio file; SparseTimeValueModel is a model containing + editable "curve" data. + + Models typically subclass one of a number of abstract subclasses of + Model. For example, WaveFileModel subclasses DenseTimeValueModel, + which describes an interface for models that have a value at each + time point for a given sampling resolution. (Note that + WaveFileModel does not actually read the files itself: it uses + AudioFileReader classes for that. It just makes data from the + files available in a Model.) SparseTimeValueModel uses the + SparseModel template class, which provides most of the + implementation for models that contain a series of points of some + sort -- also used by NoteModel, TextModel, and + SparseOneDimensionalModel. + + Everything that goes on the screen originates from a model, via a + layer (see below). The models are contained in a Document object. + There is no containment hierarchy or ordering of models in the + document. One model is the main model, which defines the sample + rate for playback. + + A model may also be marked as a "derived" model, which means it was + generated from another model using some transform (feature + extraction or effect plugin, etc) -- the idea being that they can + be re-generated using the same transform if a new source model is + loaded. + +\section layer Things that can display data: the Layer hierarchy + + A Layer is something that knows how to draw parts of a model onto a + timeline. + + For example, WaveformLayer is a layer which draws waveforms, based + on WaveFileModel; TimeValueLayer draws curves, based on + SparseTimeValueModel; SpectrogramLayer draws spectrograms, based on + WaveFileModel (via FFTModel). + + The most basic functions of a layer are: to draw itself onto a + Pane, against a timeline on the x axis; and to permit user + interaction. If you were thinking of adding the capability to + display a new sort of something, then you would want to add a new + layer type. (You may also need a new model type, depending on + whether any existing model can capture the data you need.) + Depending on the sort of data in question, there are various + existing layers that might be appropriate to start from -- for + example, a layer that displays images that the user has imported + and associated with particular times might have something in common + with the existing TextLayer which displays pieces of text that are + associated with particular times. + + Although layers are visual objects, they are contained in the + Document in Sonic Visualiser rather than being managed together + with display widgets. The Sonic Visualiser file format has + separate data and layout sections, and the layers are defined in + the data section and then referred to in the layout section which + determines which layers may go on which panes (see Pane below). + + Once a layer class is defined, some basic data about it needs to be + set up in the LayerFactory class, and then it will appear in the + menus and so on on the main window. + +\section view Widgets that are used to show layers: The View hierarchy + + A View is a widget that displays a stack of layers. The most + important subclass is Pane, the widget that is used to show most of + the data in the main window of Sonic Visualiser. + + All a pane really does is contain a set of layers and get them to + render themselves (one on top of the other, with the topmost layer + being the one that is currently interacted with), cache the + results, negotiate user interaction with them, and so on. This is + generally fiddly, if not especially interesting. Panes are + strictly layout objects and are not stored in the Document class; + instead the MainWindow contains a PaneStack widget (the widget that + takes up most of Sonic Visualiser's main window) which contains a + set of panes stacked vertically. + + Another View subclass is Overview, which is the widget that + contains that green waveform showing the entire file at the bottom + of the window. + +*/ + static QMutex cleanupMutex; static void