ardour
export_format_base.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 Paul Davis
3  Author: Sakari Bergen
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program; if not, write to the Free Software
17  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 
19 */
20 
21 #ifndef __ardour_export_format_base_h__
22 #define __ardour_export_format_base_h__
23 
24 #include <set>
25 #include <string>
26 
27 #include <boost/shared_ptr.hpp>
28 
29 #include <sndfile.h>
30 #include <samplerate.h>
31 
32 #include "pbd/signals.h"
34 #include "ardour/types.h"
35 
36 #include "audiographer/general/sample_format_converter.h"
37 
38 namespace ARDOUR
39 {
40 
42  public:
43 
44  enum Type {
45  T_None = 0,
46  T_Sndfile
47  };
48 
49  enum FormatId {
50  F_None = 0,
51  F_WAV = SF_FORMAT_WAV,
52  F_W64 = SF_FORMAT_W64,
53  F_CAF = SF_FORMAT_CAF,
54  F_AIFF = SF_FORMAT_AIFF,
55  F_AU = SF_FORMAT_AU,
56  F_IRCAM = SF_FORMAT_IRCAM,
57  F_RAW = SF_FORMAT_RAW,
58  F_FLAC = SF_FORMAT_FLAC,
59  F_Ogg = SF_FORMAT_OGG
60  };
61 
62  enum Endianness {
63  E_FileDefault = SF_ENDIAN_FILE, /* Default file endian-ness. */
64  E_Little = SF_ENDIAN_LITTLE, /* Force little endian-ness. */
65  E_Big = SF_ENDIAN_BIG, /* Force big endian-ness. */
66  E_Cpu = SF_ENDIAN_CPU /* Force CPU endian-ness. */
67  };
68 
69  enum SampleFormat {
70  SF_None = 0,
71  SF_8 = SF_FORMAT_PCM_S8,
72  SF_16 = SF_FORMAT_PCM_16,
73  SF_24 = SF_FORMAT_PCM_24,
74  SF_32 = SF_FORMAT_PCM_32,
75  SF_U8 = SF_FORMAT_PCM_U8,
76  SF_Float = SF_FORMAT_FLOAT,
77  SF_Double = SF_FORMAT_DOUBLE,
78  SF_Vorbis = SF_FORMAT_VORBIS
79  };
80 
81  enum DitherType {
82  D_None = AudioGrapher::D_None,
83  D_Rect = AudioGrapher::D_Rect,
84  D_Tri = AudioGrapher::D_Tri,
85  D_Shaped = AudioGrapher::D_Shaped
86  };
87 
88  enum Quality {
89  Q_None = 0,
93  Q_LossyCompression
94  };
95 
96  enum SampleRate {
97  SR_None = 0,
98  SR_Session = 1,
99  SR_8 = 8000,
100  SR_22_05 = 22050,
101  SR_44_1 = 44100,
102  SR_48 = 48000,
103  SR_88_2 = 88200,
104  SR_96 = 96000,
105  SR_192 = 192000
106  };
107 
108  enum SRCQuality {
109  SRC_SincBest = SRC_SINC_BEST_QUALITY,
110  SRC_SincMedium = SRC_SINC_MEDIUM_QUALITY,
111  SRC_SincFast = SRC_SINC_FASTEST,
112  SRC_ZeroOrderHold = SRC_ZERO_ORDER_HOLD,
113  SRC_Linear = SRC_LINEAR
114  };
115 
118  public:
120  : _selected (false), _compatible (true) { }
122 
123  PBD::Signal1<void,bool> SelectChanged;
124  PBD::Signal1<void,bool> CompatibleChanged;
125 
126  bool selected () const { return _selected; }
127  bool compatible () const { return _compatible; }
128  std::string name () const { return _name; }
129 
130  void set_selected (bool value);
131  void set_compatible (bool value);
132 
133  protected:
134  void set_name (std::string name) { _name = name; }
135 
136  private:
137  bool _selected;
139 
140  std::string _name;
141  };
142 
143  public:
144 
145  ExportFormatBase ();
146  ExportFormatBase (ExportFormatBase const & other);
147 
148  virtual ~ExportFormatBase ();
149 
150  boost::shared_ptr<ExportFormatBase> get_intersection (ExportFormatBase const & other) const;
151  boost::shared_ptr<ExportFormatBase> get_union (ExportFormatBase const & other) const;
152 
153  bool endiannesses_empty () const { return endiannesses.empty (); }
154  bool sample_formats_empty () const { return sample_formats.empty (); }
155  bool sample_rates_empty () const { return sample_rates.empty (); }
156  bool formats_empty () const { return format_ids.empty (); }
157  bool qualities_empty () const { return qualities.empty (); }
158 
159  bool has_endianness (Endianness endianness) const { return endiannesses.find (endianness) != endiannesses.end() ; }
160  bool has_sample_format (SampleFormat format) const { return sample_formats.find (format) != sample_formats.end(); }
161  bool has_sample_rate (SampleRate rate) const { return sample_rates.find (rate) != sample_rates.end(); }
162  bool has_format (FormatId format) const { return format_ids.find (format) != format_ids.end(); }
163  bool has_quality (Quality quality) const { return qualities.find (quality) != qualities.end(); }
164 
165  void set_extension (std::string const & extension) { _extension = extension; }
166  std::string const & extension () const { return _extension; }
167 
168  static SampleRate nearest_sample_rate (framecnt_t sample_rate);
169 
170  protected:
171 
172  friend class HasSampleFormat;
173  typedef std::set<SampleFormat> SampleFormatSet;
174  SampleFormatSet sample_formats;
175 
176  protected:
177  typedef std::set<Endianness> EndianSet;
178  typedef std::set<SampleRate> SampleRateSet;
179  typedef std::set<FormatId> FormatSet;
180  typedef std::set<Quality> QualitySet;
181 
182  EndianSet endiannesses;
183  SampleRateSet sample_rates;
184  FormatSet format_ids;
185  QualitySet qualities;
186 
187  private:
188 
189  std::string _extension;
190 
193  SetIntersection
194  };
195 
196  boost::shared_ptr<ExportFormatBase> do_set_operation (ExportFormatBase const & other, SetOperation operation) const;
197 };
198 
199 } // namespace ARDOUR
200 
201 #endif /* __ardour_export_format_base_h__ */
void set_extension(std::string const &extension)
std::set< Quality > QualitySet
std::set< SampleRate > SampleRateSet
bool has_quality(Quality quality) const
std::set< Endianness > EndianSet
int64_t framecnt_t
Definition: types.h:76
Definition: amp.h:29
bool has_endianness(Endianness endianness) const
std::set< FormatId > FormatSet
Class to be inherited by export formats that have a selectable sample format.
Class for managing selection and compatibility states.
#define LIBARDOUR_API
const char * name
bool has_sample_rate(SampleRate rate) const
bool has_format(FormatId format) const
bool has_sample_format(SampleFormat format) const
std::string const & extension() const
std::set< SampleFormat > SampleFormatSet