11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
21PROMEKI_NAMESPACE_BEGIN
55 using Ptr = SharedPtr<AudioFile>;
71 PROMEKI_SHARED_BASE(Impl)
77 Impl(Operation op) : _operation(op) {}
86 bool isValid()
const {
return _operation != InvalidOperation; }
92 Operation operation()
const {
return _operation; }
98 const String &filename()
const {
return _filename; }
104 void setFilename(
const String &val) {
113 AudioDesc desc()
const {
return _desc; }
119 void setDesc(
const AudioDesc &val) {
128 IODevice *device()
const {
return _device; }
137 void setDevice(IODevice *dev) {
147 const String &formatHint()
const {
return _formatHint; }
153 void setFormatHint(
const String &val) {
162 virtual Error open();
165 virtual void close();
174 virtual Error read(PcmAudioPayload::Ptr &out,
size_t maxSamples);
181 virtual Error write(
const PcmAudioPayload &payload);
188 virtual Error seekToSample(
size_t sample);
194 virtual size_t sampleCount()
const;
197 Operation _operation;
200 IODevice *_device =
nullptr;
201 bool _ownsDevice =
false;
213 static AudioFile createForOperation(Operation op,
const String &filename);
225 static Result<AudioFile> createForOperation(Operation op, IODevice *device,
226 const String &formatHint =
"");
233 static AudioFile createReader(
const String &filename) {
return createForOperation(Reader, filename); }
240 static AudioFile createWriter(
const String &filename) {
return createForOperation(Writer, filename); }
243 AudioFile() : d(SharedPtr<Impl>::create(InvalidOperation)) {};
249 AudioFile(Impl *impl) : d(SharedPtr<Impl>::takeOwnership(impl)) {};
255 bool isValid()
const {
return d->isValid(); }
261 Operation operation()
const {
return d->operation(); }
267 const String &filename()
const {
return d->filename(); }
273 void setFilename(
const String &val) {
274 d.modify()->setFilename(val);
282 AudioDesc desc()
const {
return d->desc(); }
288 void setDesc(
const AudioDesc &val) {
289 d.modify()->setDesc(val);
297 IODevice *device()
const {
return d->device(); }
303 Error open() {
return d.modify()->open(); }
318 Error read(PcmAudioPayload::Ptr &out,
size_t maxSamples) {
return d.modify()->read(out, maxSamples); }
325 Error write(
const PcmAudioPayload &payload) {
return d.modify()->write(payload); }
332 Error seekToSample(
size_t sample) {
return d.modify()->seekToSample(sample); }
338 size_t sampleCount()
const {
return d->sampleCount(); }