libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
audiofile.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <promeki/namespace.h>
14#include <promeki/sharedptr.h>
15#include <promeki/string.h>
16#include <promeki/error.h>
17#include <promeki/audiodesc.h>
19#include <promeki/iodevice.h>
20
21PROMEKI_NAMESPACE_BEGIN
22
52class AudioFile {
53 public:
55 using Ptr = SharedPtr<AudioFile>;
56
58 enum Operation {
59 InvalidOperation = 0,
60 Reader,
61 Writer
62 };
63
70 class Impl {
71 PROMEKI_SHARED_BASE(Impl)
72 public:
77 Impl(Operation op) : _operation(op) {}
78
80 virtual ~Impl();
81
86 bool isValid() const { return _operation != InvalidOperation; }
87
92 Operation operation() const { return _operation; }
93
98 const String &filename() const { return _filename; }
99
104 void setFilename(const String &val) {
105 _filename = val;
106 return;
107 }
108
113 AudioDesc desc() const { return _desc; }
114
119 void setDesc(const AudioDesc &val) {
120 _desc = val;
121 return;
122 }
123
128 IODevice *device() const { return _device; }
129
137 void setDevice(IODevice *dev) {
138 _device = dev;
139 _ownsDevice = false;
140 return;
141 }
142
147 const String &formatHint() const { return _formatHint; }
148
153 void setFormatHint(const String &val) {
154 _formatHint = val;
155 return;
156 }
157
162 virtual Error open();
163
165 virtual void close();
166
174 virtual Error read(PcmAudioPayload::Ptr &out, size_t maxSamples);
175
181 virtual Error write(const PcmAudioPayload &payload);
182
188 virtual Error seekToSample(size_t sample);
189
194 virtual size_t sampleCount() const;
195
196 protected:
197 Operation _operation;
198 String _filename;
199 AudioDesc _desc;
200 IODevice *_device = nullptr;
201 bool _ownsDevice = false;
202 String _formatHint;
203 };
204
213 static AudioFile createForOperation(Operation op, const String &filename);
214
225 static Result<AudioFile> createForOperation(Operation op, IODevice *device,
226 const String &formatHint = "");
227
233 static AudioFile createReader(const String &filename) { return createForOperation(Reader, filename); }
234
240 static AudioFile createWriter(const String &filename) { return createForOperation(Writer, filename); }
241
243 AudioFile() : d(SharedPtr<Impl>::create(InvalidOperation)) {};
244
249 AudioFile(Impl *impl) : d(SharedPtr<Impl>::takeOwnership(impl)) {};
250
255 bool isValid() const { return d->isValid(); }
256
261 Operation operation() const { return d->operation(); }
262
267 const String &filename() const { return d->filename(); }
268
273 void setFilename(const String &val) {
274 d.modify()->setFilename(val);
275 return;
276 }
277
282 AudioDesc desc() const { return d->desc(); }
283
288 void setDesc(const AudioDesc &val) {
289 d.modify()->setDesc(val);
290 return;
291 }
292
297 IODevice *device() const { return d->device(); }
298
303 Error open() { return d.modify()->open(); }
304
306 void close() {
307 d.modify()->close();
308 return;
309 }
310
318 Error read(PcmAudioPayload::Ptr &out, size_t maxSamples) { return d.modify()->read(out, maxSamples); }
319
325 Error write(const PcmAudioPayload &payload) { return d.modify()->write(payload); }
326
332 Error seekToSample(size_t sample) { return d.modify()->seekToSample(sample); }
333
338 size_t sampleCount() const { return d->sampleCount(); }
339
340 private:
341 SharedPtr<Impl> d;
342};
343
344PROMEKI_NAMESPACE_END
345
346#endif // PROMEKI_ENABLE_PROAV