Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
audio_file.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <vector>
5#include <cstdint>
6#include <functional>
7#include <iosfwd>
8#include <optional>
9
10namespace pulp::audio {
11
12// Audio file metadata
14 uint32_t sample_rate = 0;
15 uint32_t num_channels = 0;
16 uint64_t num_frames = 0;
17 uint32_t bits_per_sample = 0;
18 std::string format; // "WAV", "FLAC", "OGG", "MP3"
19 double duration_seconds = 0;
20};
21
22// Read an audio file into float buffers (uses CHOC internally)
23// Returns deinterleaved float channels
25 std::vector<std::vector<float>> channels;
26 uint32_t sample_rate = 0;
27
28 uint32_t num_channels() const { return static_cast<uint32_t>(channels.size()); }
29 uint64_t num_frames() const { return channels.empty() ? 0 : channels[0].size(); }
30 bool empty() const { return channels.empty() || channels[0].empty(); }
31};
32
33// Read audio file info without loading data
34std::optional<AudioFileInfo> read_audio_file_info(const std::string& path);
35
36// Read entire audio file into memory
37std::optional<AudioFileData> read_audio_file(const std::string& path);
38
39// Read an audio file through one open: `admit` sees the header the decoder is
40// about to size its output from, and a false return refuses the file before
41// anything is allocated. A separate info read followed by a decode would
42// check one open's header and allocate from another's.
43std::optional<AudioFileData>
44read_audio_file(const std::string& path, const std::function<bool(const AudioFileInfo&)>& admit);
45
46// WAV sample format for writing. Int16 is the compact default (≈ −96 dBFS
47// noise floor); Int24 is a middle ground (≈ −144 dBFS floor, integer, universal
48// DAW/tool compatibility, 75% the size of float); Float32 preserves the full
49// render — needed when the downstream analysis cares about residuals below the
50// int24 floor or about samples beyond ±1.0 (no hard clip on write).
51enum class WavBitDepth { Int16, Int24, Float32 };
52
53// Write audio data to a WAV file (int16).
54bool write_wav_file(const std::string& path, const AudioFileData& data);
55
56// Write audio data to a WAV file at the given sample format.
57bool write_wav_file(const std::string& path, const AudioFileData& data,
58 WavBitDepth bit_depth);
59
60// Write audio data to an already-open seekable stream. The caller retains
61// ownership and is responsible for durably syncing/closing its backing file.
62bool write_wav_stream(std::ostream& output, const AudioFileData& data, WavBitDepth bit_depth);
63
64// ── Sample format conversion ─────────────────────────────────────────────
65
66// Convert int16 samples to float (-1.0 to 1.0)
67void int16_to_float(const int16_t* src, float* dst, size_t count);
68
69// Convert int24 (packed 3 bytes) to float
70void int24_to_float(const uint8_t* src, float* dst, size_t count);
71
72// Convert int32 samples to float
73void int32_to_float(const int32_t* src, float* dst, size_t count);
74
75// Convert float to int16
76void float_to_int16(const float* src, int16_t* dst, size_t count);
77
78// Convert float to int32
79void float_to_int32(const float* src, int32_t* dst, size_t count);
80
81} // namespace pulp::audio
Definition analyzer_provider.hpp:12
std::optional< AudioFileInfo > read_audio_file_info(const std::string &path)
void float_to_int16(const float *src, int16_t *dst, size_t count)
std::optional< AudioFileData > read_audio_file(const std::string &path)
void float_to_int32(const float *src, int32_t *dst, size_t count)
void int24_to_float(const uint8_t *src, float *dst, size_t count)
void int32_to_float(const int32_t *src, float *dst, size_t count)
WavBitDepth
Definition audio_file.hpp:51
@ Float32
Definition audio_file.hpp:51
@ Int16
Definition audio_file.hpp:51
@ Int24
Definition audio_file.hpp:51
void int16_to_float(const int16_t *src, float *dst, size_t count)
bool write_wav_stream(std::ostream &output, const AudioFileData &data, WavBitDepth bit_depth)
bool write_wav_file(const std::string &path, const AudioFileData &data)
Definition audio_file.hpp:24
uint64_t num_frames() const
Definition audio_file.hpp:29
std::vector< std::vector< float > > channels
Definition audio_file.hpp:25
bool empty() const
Definition audio_file.hpp:30
uint32_t num_channels() const
Definition audio_file.hpp:28
uint32_t sample_rate
Definition audio_file.hpp:26
Definition audio_file.hpp:13
std::string format
Definition audio_file.hpp:18
uint32_t num_channels
Definition audio_file.hpp:15
uint64_t num_frames
Definition audio_file.hpp:16
uint32_t bits_per_sample
Definition audio_file.hpp:17
double duration_seconds
Definition audio_file.hpp:19
uint32_t sample_rate
Definition audio_file.hpp:14