Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
audio_file.h
1// SPDX-FileCopyrightText: © 2023-2024 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#ifndef __IO_AUDIO_FILE_H__
5#define __IO_AUDIO_FILE_H__
6
7#include "zrythm-config.h"
8
9#include <memory>
10#include <utility>
11
12#include "utils/audio.h"
13
14namespace zrythm::utils::audio
15{
16
17struct AudioFileMetadata
18{
19 /* Rule of 0 */
20 AudioFileMetadata () = default;
21
22 AudioFileMetadata (const std::string &path);
23
24 int samplerate = 0;
25 int channels = 0;
26
28 int64_t length = 0;
29
32 int64_t num_frames = 0;
33
34 int bit_rate = 0;
35 int bit_depth = 0;
36
38 float bpm = 0.f;
39
41 bool filled = false;
42};
43
47class AudioFile
48{
49public:
50 AudioFile () = default;
51
58 AudioFile (fs::path filepath, bool for_writing = false)
59 : filepath_ (std::move (filepath)), for_writing_ (for_writing)
60 {
61 }
62
63 AudioFile (AudioFile &&other) noexcept = default;
64 AudioFile &operator= (AudioFile &&other) noexcept = default;
65
72
86 bool in_parts,
87 float * samples,
88 size_t start_from,
89 size_t num_frames_to_read);
90
105 std::optional<size_t> samplerate);
106
107private:
113 void ensure_file_is_open ();
114
115public:
117 fs::path filepath_;
118
119 AudioFileMetadata metadata_;
120
121 std::unique_ptr<juce::AudioFormatReader> reader_;
122 std::unique_ptr<juce::AudioFormatWriter> writer_;
123
124 bool for_writing_ = false;
125};
126
127}; // namespace zrythm::utils::audio
128
129#endif
RAII class to read and write audio files (or their metadata).
Definition audio_file.h:48
AudioFileMetadata read_metadata()
Reads the metadata for the specified file.
fs::path filepath_
Absolute path.
Definition audio_file.h:117
AudioFile(fs::path filepath, bool for_writing=false)
Creates a new instance of an AudioFile for the given path.
Definition audio_file.h:58
void read_samples_interleaved(bool in_parts, float *samples, size_t start_from, size_t num_frames_to_read)
Reads the file into an internal float array (interleaved).
void read_full(zrythm::utils::audio::AudioBuffer &buffer, std::optional< size_t > samplerate)
Simple blocking API for reading and optionally resampling audio files.
bool filled
Whether metadata are already filled (valid).
Definition audio_file.h:41
int64_t num_frames
Total number of frames (eg.
Definition audio_file.h:32
float bpm
BPM if detected, or 0.
Definition audio_file.h:38