sfizz/external/st_audiofile/src/st_audiofile.hpp
Paul Fd 803052b552 Parse <sample> with base64 data
Also added the necessary plumbing to load from RAM
It's missing AIFF since the API is file-based for now.
2021-11-24 12:04:41 +01:00

176 lines
4.1 KiB
C++

// SPDX-License-Identifier: BSD-2-Clause
// This code is part of the sfizz library and is licensed under a BSD 2-clause
// license. You should have receive a LICENSE.md file along with the code.
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
#pragma once
#include "st_audiofile.h"
class ST_AudioFile {
public:
constexpr ST_AudioFile() noexcept;
~ST_AudioFile() noexcept;
ST_AudioFile(ST_AudioFile&&) noexcept;
ST_AudioFile& operator=(ST_AudioFile&&) noexcept;
ST_AudioFile(const ST_AudioFile&) = delete;
ST_AudioFile& operator=(const ST_AudioFile&) = delete;
explicit operator bool() const noexcept;
void reset(st_audio_file* new_af = nullptr) noexcept;
bool open_file(const char* filename);
#if defined(_WIN32)
bool open_file_w(const wchar_t* filename);
#endif
bool open_memory(const void* memory, size_t length);
int get_type() const noexcept;
const char* get_type_string() const noexcept;
static const char* type_string(int type) noexcept;
uint32_t get_channels() const noexcept;
float get_sample_rate() const noexcept;
uint64_t get_frame_count() const noexcept;
bool seek(uint64_t frame) noexcept;
uint64_t read_s16(int16_t* buffer, uint64_t count) noexcept;
uint64_t read_f32(float* buffer, uint64_t count) noexcept;
st_audio_file* get_handle() const noexcept;
#if defined(ST_AUDIO_FILE_USE_SNDFILE)
void* get_sndfile_handle() const noexcept;
int get_sndfile_format() const noexcept;
#endif
private:
st_audio_file* af_ = nullptr;
};
//------------------------------------------------------------------------------
inline constexpr ST_AudioFile::ST_AudioFile() noexcept
{
}
inline ST_AudioFile::~ST_AudioFile() noexcept
{
reset();
}
ST_AudioFile::ST_AudioFile(ST_AudioFile&& other) noexcept
: af_(other.af_)
{
other.af_ = nullptr;
}
ST_AudioFile& ST_AudioFile::operator=(ST_AudioFile&& other) noexcept
{
if (this != &other) {
if (af_)
st_close(af_);
af_ = other.af_;
other.af_ = nullptr;
}
return *this;
}
inline ST_AudioFile::operator bool() const noexcept
{
return af_ != nullptr;
}
inline void ST_AudioFile::reset(st_audio_file* new_af) noexcept
{
if (af_ != new_af) {
if (af_)
st_close(af_);
af_ = new_af;
}
}
bool ST_AudioFile::open_file(const char* filename)
{
st_audio_file* new_af = st_open_file(filename);
reset(new_af);
return new_af != nullptr;
}
bool ST_AudioFile::open_memory(const void* memory, size_t length)
{
st_audio_file* new_af = st_open_memory(memory, length);
reset(new_af);
return new_af != nullptr;
}
#if defined(_WIN32)
inline bool ST_AudioFile::open_file_w(const wchar_t* filename)
{
st_audio_file* new_af = st_open_file_w(filename);
reset(new_af);
return new_af != nullptr;
}
#endif
inline int ST_AudioFile::get_type() const noexcept
{
return st_get_type(af_);
}
inline const char* ST_AudioFile::get_type_string() const noexcept
{
return st_get_type_string(af_);
}
inline const char* ST_AudioFile::type_string(int type) noexcept
{
return st_type_string(type);
}
inline uint32_t ST_AudioFile::get_channels() const noexcept
{
return st_get_channels(af_);
}
inline float ST_AudioFile::get_sample_rate() const noexcept
{
return st_get_sample_rate(af_);
}
inline uint64_t ST_AudioFile::get_frame_count() const noexcept
{
return st_get_frame_count(af_);
}
inline bool ST_AudioFile::seek(uint64_t frame) noexcept
{
return st_seek(af_, frame);
}
inline uint64_t ST_AudioFile::read_s16(int16_t* buffer, uint64_t count) noexcept
{
return st_read_s16(af_, buffer, count);
}
inline uint64_t ST_AudioFile::read_f32(float* buffer, uint64_t count) noexcept
{
return st_read_f32(af_, buffer, count);
}
inline st_audio_file* ST_AudioFile::get_handle() const noexcept
{
return af_;
}
#if defined(ST_AUDIO_FILE_USE_SNDFILE)
inline void* ST_AudioFile::get_sndfile_handle() const noexcept
{
return st_get_sndfile_handle(af_);
}
int ST_AudioFile::get_sndfile_format() const noexcept
{
return st_get_sndfile_format(af_);
}
#endif