libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
audiofilemediaio.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/audiodesc.h>
14#include <promeki/audiofile.h>
16#include <promeki/framenumber.h>
17#include <promeki/framerate.h>
19#include <promeki/namespace.h>
20
21PROMEKI_NAMESPACE_BEGIN
22
47class AudioFileMediaIO : public DedicatedThreadMediaIO {
48 PROMEKI_OBJECT(AudioFileMediaIO, DedicatedThreadMediaIO)
49 public:
51 AudioFileMediaIO(ObjectBase *parent = nullptr);
52
54 ~AudioFileMediaIO() override;
55
56 Error proposeInput(const MediaDesc &offered, MediaDesc *preferred) const override;
57
58 protected:
59 Error executeCmd(MediaIOCommandOpen &cmd) override;
60 Error executeCmd(MediaIOCommandClose &cmd) override;
61 Error executeCmd(MediaIOCommandRead &cmd) override;
62 Error executeCmd(MediaIOCommandWrite &cmd) override;
63 Error executeCmd(MediaIOCommandSeek &cmd) override;
64
65 private:
66 // Returns the AudioFormat::ID libsndfile prefers for
67 // @p filename's extension, picking the closest form to
68 // @p source so the inserted SRC bridge does not drop bit
69 // depth (e.g. 24-bit source stays 24-bit through a BWF
70 // write).
71 AudioFormat::ID preferredWriterDataType(const String &filename, AudioFormat::ID source) const;
72
73 AudioFile _audioFile;
74 FrameRate _frameRate;
75 AudioDesc _audioDesc;
76 bool _isOpen = false;
77 bool _isWrite = false;
78 size_t _samplesPerFrame = 0;
79 FrameNumber _currentFrame{0};
80 FrameCount _totalFrames{0};
81};
82
87class AudioFileFactory : public MediaIOFactory {
88 public:
89 AudioFileFactory() = default;
90
91 String name() const override { return String("AudioFile"); }
92 String displayName() const override { return String("Audio File"); }
93 String description() const override {
94 return String("Audio file formats via libsndfile (WAV, BWF, AIFF, OGG)");
95 }
96 StringList extensions() const override {
97 return {String("wav"), String("bwf"), String("aiff"), String("aif"), String("ogg")};
98 }
99
100 bool canBeSource() const override { return true; }
101 bool canBeSink() const override { return true; }
102
103 bool canHandleDevice(IODevice *device) const override;
104 Config::SpecMap configSpecs() const override;
105 Metadata defaultMetadata() const override;
106
107 MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const override;
108};
109
110PROMEKI_NAMESPACE_END
111
112#endif // PROMEKI_ENABLE_PROAV