Eric Oulashin's C++ Audio Mixer 1.0
FLACFile.h
Go to the documentation of this file.
1#ifndef __EO_UTILS_FLACFILE_H__
2#define __EO_UTILS_FLACFILE_H__
3
4#include <cstdint>
5
6#include "AudioFile.h"
7#include "FLACFileInfo.h"
9#include "EOUtils.h"
10
11#include <string>
12#include <fstream>
13#include <vector>
14
15namespace EOUtils
16{
17 class FLACFile : public AudioFile
18 {
19 public:
26 FLACFile(const std::string& pFilename);
27
35 FLACFile(const std::string& pFilenam, uint32_t pCompressionLevel);
36
43 FLACFile(const std::string& pFilename, const FLACFileInfo& pFLACFileInfo);
44
50 FLACFile(const std::string& pFilename, AudioFileModes pFileMode);
51
55 FLACFile(const FLACFile& pFLACFile);
56
60 FLACFile(FLACFile&& pFLACFile) noexcept;
61
62 ~FLACFile();
63
67 void setAudioFileInfo(const AudioFileInfo& pAudioFileInfo) override;
68
72 uint32_t CompressionLevel() const;
73
79 void CompressionLevel(uint32_t pCompressionLevel);
80
87 AudioFileResultType open(AudioFileModes pOpenMode) override;
88
92 void close() override;
93
97 bool isOpen() const override;
98
102 const FLACFileInfo& getFileInfo() const;
103
112 AudioFileResultType getNextSample_int64(int64_t& pAudioSample) override;
113
123 AudioFileResultType writeSample_int64(int64_t pAudioSample) override;
124
133 AudioFileResultType getHighestSampleValue_int64(int64_t& pHighestAudioSample) override;
134
139
143 size_t numSamples() const override;
144
148 int64_t maxValueForSampleSize() const override;
149
153 void seekOutputToSampleNum(size_t pSampleNum) override;
154
158 AudioFileInfo getAudioFileInfo() const override;
159
164 std::fstream* stream = nullptr;
166 std::vector<std::vector<int32_t>>* readBuffer = nullptr;
167 size_t* readChannel = nullptr;
168 size_t* readSample = nullptr;
170 };
171
172 private:
173 FLACFileInfo mFLACFileInfo;
174
175 // FLAC decoder/encoder state (opaque pointers, avoid including FLAC headers in .h)
176 void* mDecoder = nullptr;
177 void* mEncoder = nullptr;
178
179 // Sample buffer for reading (decoder outputs frames, we output samples one-by-one)
180 // FLAC uses 32-bit signed samples; we store channels separately
181 std::vector<std::vector<int32_t>> mReadBuffer;
182 size_t mReadBufferChannel;
183 size_t mReadBufferSample;
184
185 // Write buffer for encoding (encoder expects interleaved blocks)
186 std::vector<int32_t> mWriteBuffer;
187
188 // For seeking in read mode
189 uint64_t mDecodePosition;
190
191 // Persistent client data for FLAC decoder callbacks (must outlive open())
192 DecoderClientData mDecoderClientData;
193 };
194}
195
196#endif
Definition AudioFileInfo.h:14
Definition AudioFileResultType.h:13
Definition AudioFile.h:22
Holds metadata for FLAC audio files.
Definition FLACFileInfo.h:17
Definition FLACFile.h:18
AudioFileInfo getAudioFileInfo() const override
Returns an AudioFile object with information about the audio file.
Definition FLACFile.cpp:650
FLACFile(const std::string &pFilename)
Constructor for opening an existing FLAC file for reading, which just takes the filename.
uint32_t CompressionLevel() const
Returns the compression level currently set for the FLAC file.
Definition FLACFile.cpp:206
void close() override
Closes the FLAC file.
Definition FLACFile.cpp:380
int64_t maxValueForSampleSize() const override
Returns the maximum possible positive value of the audio file's sample size.
Definition FLACFile.cpp:618
FLACFile(const std::string &pFilenam, uint32_t pCompressionLevel)
Constructor for opening an existing FLAC file for reading, which takes the filename and a compression...
const FLACFileInfo & getFileInfo() const
Returns a FLACFileInfo object with information about the FLAC file.
Definition FLACFile.cpp:409
AudioFileResultType open(AudioFileModes pOpenMode) override
Opens the audio file in the given mode (read, write, or read/write)
Definition FLACFile.cpp:216
void seekOutputToSampleNum(size_t pSampleNum) override
Returns the maximum possible positive value of the audio file's sample size.
Definition FLACFile.cpp:635
AudioFileResultType getHighestSampleValue_int64(int64_t &pHighestAudioSample) override
Gets the highest audio sample value from the file, cast to a 64-bit integer.
Definition FLACFile.cpp:542
void setAudioFileInfo(const AudioFileInfo &pAudioFileInfo) override
Sets the audio file info for the FLAC file.
Definition FLACFile.cpp:201
FLACFile(const std::string &pFilename, const FLACFileInfo &pFLACFileInfo)
Constructor for opening an existing FLAC file for reading.
~FLACFile()
Definition FLACFile.cpp:196
AudioFileResultType goToAudioDataPos() override
Goes to the audio data position in the audio file.
Definition FLACFile.cpp:578
FLACFile(const std::string &pFilename, AudioFileModes pFileMode)
Constructor for opening a FLAC file for reading or writing.
bool isOpen() const override
Returns whether the FLAC file is open (and also has its encoder and/or decoder initialized)
Definition FLACFile.cpp:363
AudioFileResultType writeSample_int64(int64_t pAudioSample) override
Writes an audio sample to the file. The parameter is a 64-bit integer but will be cast to the bitness...
Definition FLACFile.cpp:489
AudioFileResultType getNextSample_int64(int64_t &pAudioSample) override
Gets the next sample from the file, cast to a 64-bit integer.
Definition FLACFile.cpp:414
size_t numSamples() const override
Returns the number of audio samples in the audio file.
Definition FLACFile.cpp:602
Definition StringUtils.cpp:6
AudioFileModes
Definition AudioFile.h:15
Used by FLAC decoder callbacks (same layout as FLAC client data)
Definition FLACFile.h:163
AudioFileResultType * result
Definition FLACFile.h:169
size_t * readChannel
Definition FLACFile.h:167
std::vector< std::vector< int32_t > > * readBuffer
Definition FLACFile.h:166
size_t * readSample
Definition FLACFile.h:168
std::fstream * stream
Definition FLACFile.h:164
FLACFileInfo * fileInfo
Definition FLACFile.h:165