diff data/fileio/CSVFormat.h @ 1527:710e6250a401 zoom

Merge from default branch
author Chris Cannam
date Mon, 17 Sep 2018 13:51:14 +0100
parents 64ef24ebb19c
children 9570ef94eaa3
line wrap: on
line diff
--- a/data/fileio/CSVFormat.h	Mon Dec 12 15:18:52 2016 +0000
+++ b/data/fileio/CSVFormat.h	Mon Sep 17 13:51:14 2018 +0100
@@ -13,8 +13,8 @@
     COPYING included with this distribution for more information.
 */
 
-#ifndef _CSV_FORMAT_H_
-#define _CSV_FORMAT_H_
+#ifndef SV_CSV_FORMAT_H
+#define SV_CSV_FORMAT_H
 
 #include <QString>
 #include <QStringList>
@@ -25,23 +25,24 @@
 {
 public:
     enum ModelType {
-	OneDimensionalModel,
-	TwoDimensionalModel,
+        OneDimensionalModel,
+        TwoDimensionalModel,
         TwoDimensionalModelWithDuration,
         TwoDimensionalModelWithDurationAndPitch,
-	ThreeDimensionalModel
+        ThreeDimensionalModel,
+        WaveFileModel
     };
     
     enum TimingType {
-	ExplicitTiming,
-	ImplicitTiming
+        ExplicitTiming,
+        ImplicitTiming
     };
 
     enum TimeUnits {
-	TimeSeconds,
+        TimeSeconds,
         TimeMilliseconds,
-	TimeAudioFrames,
-	TimeWindows,
+        TimeAudioFrames,
+        TimeWindows,
     };
 
     enum ColumnPurpose {
@@ -55,14 +56,23 @@
     };
 
     enum ColumnQuality {
-        ColumnNumeric    = 1,
-        ColumnIntegral   = 2,
-        ColumnIncreasing = 4,
-        ColumnLarge      = 8,
-        ColumnNearEmpty  = 16,
+        ColumnNumeric    = 1,   // No non-numeric values were seen in sample
+        ColumnIntegral   = 2,   // All sampled values were integers
+        ColumnIncreasing = 4,   // Sampled values were monotonically increasing
+        ColumnSmall      = 8,   // All sampled values had magnitude < 1
+        ColumnLarge      = 16,  // Values "quickly" grew to over 1000
+        ColumnSigned     = 32,  // Some negative values were seen
+        ColumnNearEmpty  = 64,  // Nothing in this column beyond first row
     };
     typedef unsigned int ColumnQualities;
 
+    enum AudioSampleRange {
+        SampleRangeSigned1 = 0, //     -1 .. 1
+        SampleRangeUnsigned255, //      0 .. 255
+        SampleRangeSigned32767, // -32768 .. 32767
+        SampleRangeOther        // Other/unknown: Normalise on load
+    };
+
     CSVFormat() : // arbitrary defaults
         m_modelType(TwoDimensionalModel),
         m_timingType(ExplicitTiming),
@@ -72,6 +82,7 @@
         m_windowSize(1024),
         m_columnCount(0),
         m_variableColumnCount(false),
+        m_audioSampleRange(SampleRangeOther),
         m_allowQuoting(true),
         m_maxExampleCols(0)
     { }
@@ -84,8 +95,21 @@
      * string, the separator character will also be guessed; otherwise
      * the current separator will be used.  The other properties of
      * this object will be set according to guesses from the file.
+     *
+     * The properties that are guessed from the file contents are:
+     * separator, column count, variable-column-count flag, audio
+     * sample range, timing type, time units, column qualities, column
+     * purposes, and model type. The sample rate and window size
+     * cannot be guessed and will not be changed by this function.
+     * Note also that this function will never guess WaveFileModel for
+     * the model type.
+     *
+     * Return false if there is some fundamental error, e.g. the file
+     * could not be opened at all. Return true otherwise. Note that
+     * this function returns true even if the file doesn't appear to
+     * make much sense as a data format.
      */
-    void guessFormatFor(QString path);
+    bool guessFormatFor(QString path);
  
     ModelType    getModelType()     const { return m_modelType;     }
     TimingType   getTimingType()    const { return m_timingType;    }
@@ -93,6 +117,7 @@
     sv_samplerate_t getSampleRate() const { return m_sampleRate;    }
     int          getWindowSize()    const { return m_windowSize;    }
     int          getColumnCount()   const { return m_columnCount;   }
+    AudioSampleRange getAudioSampleRange() const { return m_audioSampleRange; }
     bool         getAllowQuoting()  const { return m_allowQuoting;  }
     QChar        getSeparator()     const { 
         if (m_separator == "") return ' ';
@@ -106,6 +131,7 @@
     void setSampleRate(sv_samplerate_t r) { m_sampleRate   = r; }
     void setWindowSize(int s)             { m_windowSize   = s; }
     void setColumnCount(int c)            { m_columnCount  = c; }
+    void setAudioSampleRange(AudioSampleRange r) { m_audioSampleRange = r; }
     void setAllowQuoting(bool q)          { m_allowQuoting = q; }
 
     QList<ColumnPurpose> getColumnPurposes() const { return m_columnPurposes; }
@@ -116,12 +142,17 @@
     void setColumnPurpose(int i, ColumnPurpose p);
     
     // read-only; only valid if format has been guessed:
-    QList<ColumnQualities> getColumnQualities() const { return m_columnQualities; }
+    const QList<ColumnQualities> &getColumnQualities() const {
+        return m_columnQualities;
+    }
 
     // read-only; only valid if format has been guessed:
-    QList<QStringList> getExample() const { return m_example; }
+    const QList<QStringList> &getExample() const {
+        return m_example;
+    }
+    
     int getMaxExampleCols() const { return m_maxExampleCols; }
-	
+        
 protected:
     ModelType    m_modelType;
     TimingType   m_timingType;
@@ -136,6 +167,8 @@
     QList<ColumnQualities> m_columnQualities;
     QList<ColumnPurpose> m_columnPurposes;
 
+    AudioSampleRange m_audioSampleRange;
+
     QList<float> m_prevValues;
 
     bool m_allowQuoting;
@@ -146,9 +179,7 @@
     void guessSeparator(QString line);
     void guessQualities(QString line, int lineno);
     void guessPurposes();
-
-    void guessFormatFor_Old(QString path);
- 
+    void guessAudioSampleRange();
 };
 
 #endif