Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
format_registry.hpp
Go to the documentation of this file.
1#pragma once
2
3// Audio format codec registry — register readers/writers by extension/MIME type.
4// Provides unified audio file I/O across all supported formats.
5
7#include <cstdint>
8#include <string>
9#include <string_view>
10#include <vector>
11#include <functional>
12#include <memory>
13
14namespace pulp::audio {
15
27 std::uint64_t max_frames = 1ull << 30;
28 std::uint32_t max_channels = 64u;
29 std::uint64_t max_output_bytes = 4ull * 1024u * 1024u * 1024u;
30
33 DecodeLimits limits;
34 limits.max_frames = 0u;
35 limits.max_channels = 0u;
36 limits.max_output_bytes = 0u;
37 return limits;
38 }
39};
40
43public:
44 virtual ~FormatReader() = default;
45
47 virtual std::optional<AudioFileInfo> read_info(const std::string& path) = 0;
48
50 virtual std::optional<AudioFileData> read(const std::string& path) = 0;
51
55 virtual std::optional<AudioFileData> read(const std::string& path, const DecodeLimits& limits) {
56 (void)limits;
57 return read(path);
58 }
59
61 virtual bool supports_extension(std::string_view ext) const = 0;
62
64 virtual std::string format_name() const = 0;
65};
66
69public:
70 virtual ~FormatWriter() = default;
71
73 virtual bool write(const std::string& path, const AudioFileData& data) = 0;
74
76 virtual bool supports_extension(std::string_view ext) const = 0;
77
79 virtual std::string format_name() const = 0;
80};
81
83class FormatRegistry {
84public:
86 static FormatRegistry& instance();
87
89 void register_reader(std::unique_ptr<FormatReader> reader);
90
92 void register_writer(std::unique_ptr<FormatWriter> writer);
93
95 FormatReader* find_reader(std::string_view extension) const;
96
98 FormatWriter* find_writer(std::string_view extension) const;
99
101 std::optional<AudioFileInfo> read_info(const std::string& path) const;
102 std::optional<AudioFileData> read(const std::string& path) const;
103
107 std::optional<AudioFileData> read(const std::string& path, const DecodeLimits& limits) const;
108
110 bool write(const std::string& path, const AudioFileData& data) const;
111
113 std::vector<std::string> supported_read_extensions() const;
114
116 std::vector<std::string> supported_write_extensions() const;
117
118private:
119 FormatRegistry();
120 std::vector<std::unique_ptr<FormatReader>> readers_;
121 std::vector<std::unique_ptr<FormatWriter>> writers_;
122};
123
124} // namespace pulp::audio
Audio format reader interface.
Definition format_registry.hpp:42
virtual bool supports_extension(std::string_view ext) const =0
Whether this reader supports the given file extension (e.g., ".flac").
virtual std::optional< AudioFileInfo > read_info(const std::string &path)=0
Read file info (metadata only).
virtual std::string format_name() const =0
Format name (e.g., "FLAC", "MP3").
virtual std::optional< AudioFileData > read(const std::string &path)=0
Read entire file into memory.
virtual std::optional< AudioFileData > read(const std::string &path, const DecodeLimits &limits)
Read entire file into memory, refusing output beyond limits.
Definition format_registry.hpp:55
virtual ~FormatReader()=default
void register_writer(std::unique_ptr< FormatWriter > writer)
Register a custom writer.
FormatReader * find_reader(std::string_view extension) const
Find a reader for the given file extension.
static FormatRegistry & instance()
Get the global singleton registry (pre-populated with built-in formats).
std::vector< std::string > supported_read_extensions() const
List all supported read extensions.
void register_reader(std::unique_ptr< FormatReader > reader)
Register a custom reader.
std::optional< AudioFileData > read(const std::string &path, const DecodeLimits &limits) const
Read with explicit decode ceilings.
std::optional< AudioFileInfo > read_info(const std::string &path) const
Read any supported audio file (dispatches to the right reader).
std::optional< AudioFileData > read(const std::string &path) const
FormatWriter * find_writer(std::string_view extension) const
Find a writer for the given file extension.
std::vector< std::string > supported_write_extensions() const
List all supported write extensions.
bool write(const std::string &path, const AudioFileData &data) const
Write audio data (dispatches to the right writer based on extension).
Audio format writer interface.
Definition format_registry.hpp:68
virtual bool write(const std::string &path, const AudioFileData &data)=0
Write audio data to a file.
virtual bool supports_extension(std::string_view ext) const =0
Whether this writer supports the given file extension.
virtual std::string format_name() const =0
Format name.
virtual ~FormatWriter()=default
Definition analyzer_provider.hpp:12
Definition audio_file.hpp:24
Resource ceilings a reader enforces on decoded output.
Definition format_registry.hpp:26
std::uint64_t max_output_bytes
Definition format_registry.hpp:29
std::uint32_t max_channels
Definition format_registry.hpp:28
std::uint64_t max_frames
Definition format_registry.hpp:27
static DecodeLimits unbounded()
No ceilings at all: every field zero.
Definition format_registry.hpp:32