openshot-audio  0.1.2
juce_AudioFormatWriter.h
Go to the documentation of this file.
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2015 - ROLI Ltd.
6 
7  Permission is granted to use this software under the terms of either:
8  a) the GPL v2 (or any later version)
9  b) the Affero GPL v3
10 
11  Details of these licenses can be found at: www.gnu.org/licenses
12 
13  JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
14  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15  A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 
17  ------------------------------------------------------------------------------
18 
19  To release a closed-source product which uses JUCE, commercial licenses are
20  available: visit www.juce.com for more information.
21 
22  ==============================================================================
23 */
24 
25 #ifndef JUCE_AUDIOFORMATWRITER_H_INCLUDED
26 #define JUCE_AUDIOFORMATWRITER_H_INCLUDED
27 
28 
29 //==============================================================================
42 {
43 protected:
44  //==============================================================================
58  AudioFormatWriter (OutputStream* destStream,
59  const String& formatName,
60  double sampleRate,
61  unsigned int numberOfChannels,
62  unsigned int bitsPerSample);
63 
64 public:
66  virtual ~AudioFormatWriter();
67 
68  //==============================================================================
73  const String& getFormatName() const noexcept { return formatName; }
74 
75  //==============================================================================
94  virtual bool write (const int** samplesToWrite, int numSamples) = 0;
95 
105  virtual bool flush();
106 
107  //==============================================================================
118  bool writeFromAudioReader (AudioFormatReader& reader,
119  int64 startSample,
120  int64 numSamplesToRead);
121 
131  bool writeFromAudioSource (AudioSource& source,
132  int numSamplesToRead,
133  int samplesPerBlock = 2048);
134 
135 
137  bool writeFromAudioSampleBuffer (const AudioSampleBuffer& source,
138  int startSample, int numSamples);
139 
141  bool writeFromFloatArrays (const float* const* channels, int numChannels, int numSamples);
142 
143  //==============================================================================
145  double getSampleRate() const noexcept { return sampleRate; }
146 
148  int getNumChannels() const noexcept { return (int) numChannels; }
149 
151  int getBitsPerSample() const noexcept { return (int) bitsPerSample; }
152 
154  bool isFloatingPoint() const noexcept { return usesFloatingPointData; }
155 
156  //==============================================================================
162  {
163  public:
172  TimeSliceThread& backgroundThread,
173  int numSamplesToBuffer);
174 
176  ~ThreadedWriter();
177 
190  bool write (const float* const* data, int numSamples);
191 
193  {
194  public:
197 
198  virtual void reset (int numChannels, double sampleRate, int64 totalSamplesInSource) = 0;
199  virtual void addBlock (int64 sampleNumberInSource, const AudioSampleBuffer& newData,
200  int startOffsetInBuffer, int numSamples) = 0;
201  };
202 
210  void setDataReceiver (IncomingDataReceiver*);
211 
215  void setFlushInterval (int numSamplesPerFlush) noexcept;
216 
217  private:
218  class Buffer;
219  friend struct ContainerDeletePolicy<Buffer>;
220  ScopedPointer<Buffer> buffer;
221  };
222 
223 protected:
224  //==============================================================================
226  double sampleRate;
227 
229  unsigned int numChannels;
230 
232  unsigned int bitsPerSample;
233 
236 
239 
241  template <class DestSampleType, class SourceSampleType, class DestEndianness>
242  struct WriteHelper
243  {
246 
247  static void write (void* destData, int numDestChannels, const int* const* source,
248  int numSamples, const int sourceOffset = 0) noexcept
249  {
250  for (int i = 0; i < numDestChannels; ++i)
251  {
252  const DestType dest (addBytesToPointer (destData, i * DestType::getBytesPerSample()), numDestChannels);
253 
254  if (*source != nullptr)
255  {
256  dest.convertSamples (SourceType (*source + sourceOffset), numSamples);
257  ++source;
258  }
259  else
260  {
261  dest.clearSamples (numSamples);
262  }
263  }
264  }
265  };
266 
267 private:
268  String formatName;
269  friend class ThreadedWriter;
270 
272 };
273 
274 #endif // JUCE_AUDIOFORMATWRITER_H_INCLUDED
Definition: juce_AudioSampleBuffer.h:34
int getNumChannels() const noexcept
Definition: juce_AudioFormatWriter.h:148
Definition: juce_AudioSource.h:110
IncomingDataReceiver()
Definition: juce_AudioFormatWriter.h:195
unsigned int bitsPerSample
Definition: juce_AudioFormatWriter.h:232
#define noexcept
Definition: juce_CompilerSupport.h:141
Definition: juce_AudioDataConverters.h:355
double getSampleRate() const noexcept
Definition: juce_AudioFormatWriter.h:145
Definition: juce_AudioFormatWriter.cpp:192
Type * addBytesToPointer(Type *basePointer, IntegerType bytes) noexcept
Definition: juce_Memory.h:53
Definition: juce_String.h:43
virtual ~IncomingDataReceiver()
Definition: juce_AudioFormatWriter.h:196
#define JUCE_API
Definition: juce_StandardHeader.h:139
Definition: juce_AudioFormatWriter.h:242
Definition: juce_AudioFormatWriter.h:161
Definition: juce_AudioFormatWriter.h:41
unsigned int numChannels
Definition: juce_AudioFormatWriter.h:229
bool usesFloatingPointData
Definition: juce_AudioFormatWriter.h:235
Definition: juce_AudioFormatReader.h:38
void convertSamples(Pointer source, int numSamples) const noexcept
Definition: juce_AudioDataConverters.h:441
Definition: juce_ScopedPointer.h:70
Definition: juce_OutputStream.h:42
long long int64
Definition: juce_MathsFunctions.h:60
double sampleRate
Definition: juce_AudioFormatWriter.h:226
Definition: juce_ContainerDeletePolicy.h:44
Definition: juce_AudioFormatWriter.h:192
int getBitsPerSample() const noexcept
Definition: juce_AudioFormatWriter.h:151
bool isFloatingPoint() const noexcept
Definition: juce_AudioFormatWriter.h:154
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
Definition: juce_PlatformDefs.h:198
Definition: juce_TimeSliceThread.h:84
void clearSamples(int numSamples) const noexcept
Definition: juce_AudioDataConverters.h:483
static void write(void *destData, int numDestChannels, const int *const *source, int numSamples, const int sourceOffset=0) noexcept
Definition: juce_AudioFormatWriter.h:247
const String & getFormatName() const noexcept
Definition: juce_AudioFormatWriter.h:73
AudioData::Pointer< SourceSampleType, AudioData::NativeEndian, AudioData::NonInterleaved, AudioData::Const > SourceType
Definition: juce_AudioFormatWriter.h:245
AudioData::Pointer< DestSampleType, DestEndianness, AudioData::Interleaved, AudioData::NonConst > DestType
Definition: juce_AudioFormatWriter.h:244
OutputStream * output
Definition: juce_AudioFormatWriter.h:238