Add library: st_audiofile
This commit is contained in:
parent
a654458c55
commit
ff1d749ee7
12 changed files with 699 additions and 0 deletions
4
.gitmodules
vendored
4
.gitmodules
vendored
|
|
@ -19,3 +19,7 @@
|
|||
path = editor/external/vstgui4
|
||||
url = https://github.com/sfztools/vstgui.git
|
||||
shallow = true
|
||||
[submodule "external/st_audiofile/thirdparty/dr_libs"]
|
||||
path = external/st_audiofile/thirdparty/dr_libs
|
||||
url = https://github.com/mackron/dr_libs.git
|
||||
shallow = true
|
||||
|
|
|
|||
37
external/st_audiofile/CMakeLists.txt
vendored
Normal file
37
external/st_audiofile/CMakeLists.txt
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
cmake_minimum_required(VERSION 3.5)
|
||||
project(st_audiofile)
|
||||
|
||||
option(ST_AUDIO_FILE_USE_SNDFILE "Use sndfile" OFF)
|
||||
set(ST_AUDIO_FILE_EXTERNAL_SNDFILE "" CACHE STRING "Name of external sndfile target")
|
||||
|
||||
add_library(st_audiofile STATIC
|
||||
"src/st_audiofile.c"
|
||||
"src/st_audiofile_common.c"
|
||||
"src/st_audiofile_libs.c"
|
||||
"src/st_audiofile_sndfile.c")
|
||||
target_include_directories(st_audiofile
|
||||
PUBLIC "src"
|
||||
PUBLIC "thirdparty/dr_libs")
|
||||
|
||||
add_executable(st_info
|
||||
"src/st_info.c")
|
||||
target_link_libraries(st_info
|
||||
PRIVATE st_audiofile)
|
||||
|
||||
if(ST_AUDIO_FILE_USE_SNDFILE)
|
||||
target_compile_definitions(st_audiofile
|
||||
PUBLIC "ST_AUDIO_FILE_USE_SNDFILE=1")
|
||||
if(ST_AUDIO_FILE_EXTERNAL_SNDFILE)
|
||||
target_link_libraries(st_audiofile
|
||||
PRIVATE "${ST_AUDIO_FILE_EXTERNAL_SNDFILE}")
|
||||
else()
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(Sndfile "sndfile" REQUIRED)
|
||||
target_include_directories(st_audiofile
|
||||
PUBLIC ${Sndfile_INCLUDE_DIRS})
|
||||
target_link_libraries(st_audiofile
|
||||
PUBLIC ${Sndfile_LIBRARIES})
|
||||
link_directories(
|
||||
${Sndfile_LIBRARY_DIRS})
|
||||
endif()
|
||||
endif()
|
||||
25
external/st_audiofile/LICENSE.md
vendored
Normal file
25
external/st_audiofile/LICENSE.md
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2020, Jean-Pierre Cimalando
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
206
external/st_audiofile/src/st_audiofile.c
vendored
Normal file
206
external/st_audiofile/src/st_audiofile.c
vendored
Normal file
|
|
@ -0,0 +1,206 @@
|
|||
// 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
|
||||
|
||||
#include "st_audiofile.h"
|
||||
#if !defined(ST_AUDIO_FILE_USE_SNDFILE)
|
||||
#include "st_audiofile_libs.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
struct st_audio_file {
|
||||
int type;
|
||||
union {
|
||||
drwav *wav;
|
||||
drflac *flac;
|
||||
};
|
||||
};
|
||||
|
||||
enum {
|
||||
st_audio_file_null = -1,
|
||||
};
|
||||
|
||||
st_audio_file* st_open_file(const char* filename)
|
||||
{
|
||||
st_audio_file* af = (st_audio_file*)malloc(sizeof(st_audio_file));
|
||||
if (!af)
|
||||
return NULL;
|
||||
|
||||
af->type = st_audio_file_null;
|
||||
|
||||
if (af->type == st_audio_file_null) {
|
||||
af->wav = (drwav*)malloc(sizeof(drwav));
|
||||
if (!af->wav) {
|
||||
free(af);
|
||||
return NULL;
|
||||
}
|
||||
if (!drwav_init_file(af->wav, filename, NULL))
|
||||
free(af->wav);
|
||||
else
|
||||
af->type = st_audio_file_wav;
|
||||
}
|
||||
|
||||
if (af->type == st_audio_file_null) {
|
||||
af->flac = drflac_open_file(filename, NULL);
|
||||
if (af->flac)
|
||||
af->type = st_audio_file_flac;
|
||||
}
|
||||
|
||||
if (af->type == st_audio_file_null) {
|
||||
free(af);
|
||||
af = NULL;
|
||||
}
|
||||
|
||||
return af;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
st_audio_file* st_open_file_w(const wchar_t* filename)
|
||||
{
|
||||
st_audio_file* af = (st_audio_file*)malloc(sizeof(st_audio_file));
|
||||
if (!af)
|
||||
return NULL;
|
||||
|
||||
af->type = st_audio_file_null;
|
||||
|
||||
if (af->type == st_audio_file_null) {
|
||||
af->wav = (drwav*)malloc(sizeof(drwav));
|
||||
if (!af->wav) {
|
||||
free(af);
|
||||
return NULL;
|
||||
}
|
||||
if (!drwav_init_file_w(af->wav, filename, NULL))
|
||||
free(af->wav);
|
||||
else
|
||||
af->type = st_audio_file_wav;
|
||||
}
|
||||
|
||||
if (af->type == st_audio_file_null) {
|
||||
af->flac = drflac_open_file_w(filename, NULL);
|
||||
if (af->flac)
|
||||
af->type = st_audio_file_flac;
|
||||
}
|
||||
|
||||
if (af->type == st_audio_file_null) {
|
||||
free(af);
|
||||
af = NULL;
|
||||
}
|
||||
|
||||
return af;
|
||||
}
|
||||
#endif
|
||||
|
||||
void st_close(st_audio_file* af)
|
||||
{
|
||||
switch (af->type) {
|
||||
case st_audio_file_wav:
|
||||
drwav_uninit(af->wav);
|
||||
free(af->wav);
|
||||
break;
|
||||
case st_audio_file_flac:
|
||||
drflac_close(af->flac);
|
||||
break;
|
||||
}
|
||||
|
||||
af->type = st_audio_file_null;
|
||||
}
|
||||
|
||||
int st_get_type(st_audio_file* af)
|
||||
{
|
||||
return af->type;
|
||||
}
|
||||
|
||||
uint32_t st_get_channels(st_audio_file* af)
|
||||
{
|
||||
uint32_t channels = 0;
|
||||
|
||||
switch (af->type) {
|
||||
case st_audio_file_wav:
|
||||
channels = af->wav->channels;
|
||||
break;
|
||||
case st_audio_file_flac:
|
||||
channels = af->flac->channels;
|
||||
break;
|
||||
}
|
||||
|
||||
return channels;
|
||||
}
|
||||
|
||||
float st_get_sample_rate(st_audio_file* af)
|
||||
{
|
||||
float sample_rate = 0;
|
||||
|
||||
switch (af->type) {
|
||||
case st_audio_file_wav:
|
||||
sample_rate = af->wav->sampleRate;
|
||||
break;
|
||||
case st_audio_file_flac:
|
||||
sample_rate = af->flac->sampleRate;
|
||||
break;
|
||||
}
|
||||
|
||||
return sample_rate;
|
||||
}
|
||||
|
||||
uint64_t st_get_frame_count(st_audio_file* af)
|
||||
{
|
||||
uint64_t frames = 0;
|
||||
|
||||
switch (af->type) {
|
||||
case st_audio_file_wav:
|
||||
frames = af->wav->totalPCMFrameCount;
|
||||
break;
|
||||
case st_audio_file_flac:
|
||||
frames = af->flac->totalPCMFrameCount;
|
||||
break;
|
||||
}
|
||||
|
||||
return frames;
|
||||
}
|
||||
|
||||
bool st_seek(st_audio_file* af, uint64_t frame)
|
||||
{
|
||||
bool success = false;
|
||||
|
||||
switch (af->type) {
|
||||
case st_audio_file_wav:
|
||||
success = drwav_seek_to_pcm_frame(af->wav, frame);
|
||||
break;
|
||||
case st_audio_file_flac:
|
||||
success = drflac_seek_to_pcm_frame(af->flac, frame);
|
||||
break;
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
uint64_t st_read_s16(st_audio_file* af, int16_t* buffer, uint64_t count)
|
||||
{
|
||||
switch (af->type) {
|
||||
case st_audio_file_wav:
|
||||
count = drwav_read_pcm_frames_s16(af->wav, count, buffer);
|
||||
break;
|
||||
case st_audio_file_flac:
|
||||
count = drflac_read_pcm_frames_s16(af->flac, count, buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
uint64_t st_read_f32(st_audio_file* af, float* buffer, uint64_t count)
|
||||
{
|
||||
switch (af->type) {
|
||||
case st_audio_file_wav:
|
||||
count = drwav_read_pcm_frames_f32(af->wav, count, buffer);
|
||||
break;
|
||||
case st_audio_file_flac:
|
||||
count = drflac_read_pcm_frames_f32(af->flac, count, buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
#endif // !defined(ST_AUDIO_FILE_USE_SNDFILE)
|
||||
52
external/st_audiofile/src/st_audiofile.h
vendored
Normal file
52
external/st_audiofile/src/st_audiofile.h
vendored
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
// 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
|
||||
#if defined(ST_AUDIO_FILE_USE_SNDFILE)
|
||||
#include <sndfile.h>
|
||||
#endif
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#if defined(_WIN32)
|
||||
#include <wchar.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct st_audio_file st_audio_file;
|
||||
|
||||
typedef enum st_audio_file_type {
|
||||
st_audio_file_wav,
|
||||
st_audio_file_flac,
|
||||
st_audio_file_ogg,
|
||||
st_audio_file_other,
|
||||
} st_audio_file_type;
|
||||
|
||||
st_audio_file* st_open_file(const char* filename);
|
||||
#if defined(_WIN32)
|
||||
st_audio_file* st_open_file_w(const wchar_t* filename);
|
||||
#endif
|
||||
void st_close(st_audio_file* af);
|
||||
int st_get_type(st_audio_file* af);
|
||||
const char* st_get_type_string(st_audio_file* af);
|
||||
const char* st_type_string(int type);
|
||||
uint32_t st_get_channels(st_audio_file* af);
|
||||
float st_get_sample_rate(st_audio_file* af);
|
||||
uint64_t st_get_frame_count(st_audio_file* af);
|
||||
bool st_seek(st_audio_file* af, uint64_t frame);
|
||||
uint64_t st_read_s16(st_audio_file* af, int16_t* buffer, uint64_t count);
|
||||
uint64_t st_read_f32(st_audio_file* af, float* buffer, uint64_t count);
|
||||
|
||||
#if defined(ST_AUDIO_FILE_USE_SNDFILE)
|
||||
SNDFILE* st_get_sndfile_handle(st_audio_file* af);
|
||||
int st_get_sndfile_format(st_audio_file* af);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
168
external/st_audiofile/src/st_audiofile.hpp
vendored
Normal file
168
external/st_audiofile/src/st_audiofile.hpp
vendored
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
// 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
|
||||
|
||||
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;
|
||||
}
|
||||
#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
|
||||
35
external/st_audiofile/src/st_audiofile_common.c
vendored
Normal file
35
external/st_audiofile/src/st_audiofile_common.c
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
// 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
|
||||
|
||||
#include "st_audiofile.h"
|
||||
#include <stddef.h>
|
||||
|
||||
const char* st_get_type_string(st_audio_file* af)
|
||||
{
|
||||
return st_type_string(st_get_type(af));
|
||||
}
|
||||
|
||||
const char* st_type_string(int type)
|
||||
{
|
||||
const char *type_string = NULL;
|
||||
|
||||
switch (type) {
|
||||
case st_audio_file_wav:
|
||||
type_string = "WAV";
|
||||
break;
|
||||
case st_audio_file_flac:
|
||||
type_string = "FLAC";
|
||||
break;
|
||||
case st_audio_file_ogg:
|
||||
type_string = "OGG";
|
||||
break;
|
||||
case st_audio_file_other:
|
||||
type_string = "other";
|
||||
break;
|
||||
}
|
||||
|
||||
return type_string;
|
||||
}
|
||||
9
external/st_audiofile/src/st_audiofile_libs.c
vendored
Normal file
9
external/st_audiofile/src/st_audiofile_libs.c
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// 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
|
||||
|
||||
#define DR_WAV_IMPLEMENTATION
|
||||
#define DR_FLAC_IMPLEMENTATION
|
||||
#include "st_audiofile_libs.h"
|
||||
9
external/st_audiofile/src/st_audiofile_libs.h
vendored
Normal file
9
external/st_audiofile/src/st_audiofile_libs.h
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// 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 "dr_wav.h"
|
||||
#include "dr_flac.h"
|
||||
120
external/st_audiofile/src/st_audiofile_sndfile.c
vendored
Normal file
120
external/st_audiofile/src/st_audiofile_sndfile.c
vendored
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
// 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
|
||||
|
||||
#include "st_audiofile.h"
|
||||
#if defined(ST_AUDIO_FILE_USE_SNDFILE)
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
|
||||
#endif
|
||||
#include <sndfile.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
struct st_audio_file {
|
||||
SNDFILE* snd;
|
||||
SF_INFO info;
|
||||
};
|
||||
|
||||
st_audio_file* st_open_file(const char* filename)
|
||||
{
|
||||
st_audio_file* af = (st_audio_file*)malloc(sizeof(st_audio_file));
|
||||
if (!af)
|
||||
return NULL;
|
||||
|
||||
af->snd = sf_open(filename, SFM_READ, &af->info);
|
||||
if (!af->snd) {
|
||||
free(af);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return af;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
st_audio_file* st_open_file_w(const wchar_t* filename)
|
||||
{
|
||||
st_audio_file* af = (st_audio_file*)malloc(sizeof(st_audio_file));
|
||||
if (!af)
|
||||
return NULL;
|
||||
|
||||
af->snd = sf_wchar_open(filename, SFM_READ, &af->info);
|
||||
if (!af->snd) {
|
||||
free(af);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return af;
|
||||
}
|
||||
#endif
|
||||
|
||||
void st_close(st_audio_file* af)
|
||||
{
|
||||
if (af->snd) {
|
||||
sf_close(af->snd);
|
||||
af->snd = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int st_get_type(st_audio_file* af)
|
||||
{
|
||||
int type = st_audio_file_other;
|
||||
|
||||
switch (af->info.format & SF_FORMAT_TYPEMASK) {
|
||||
case SF_FORMAT_WAV:
|
||||
type = st_audio_file_wav;
|
||||
break;
|
||||
case SF_FORMAT_FLAC:
|
||||
type = st_audio_file_flac;
|
||||
break;
|
||||
case SF_FORMAT_OGG:
|
||||
type = st_audio_file_ogg;
|
||||
break;
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
uint32_t st_get_channels(st_audio_file* af)
|
||||
{
|
||||
return af->info.channels;
|
||||
}
|
||||
|
||||
float st_get_sample_rate(st_audio_file* af)
|
||||
{
|
||||
return af->info.samplerate;
|
||||
}
|
||||
|
||||
uint64_t st_get_frame_count(st_audio_file* af)
|
||||
{
|
||||
return af->info.frames;
|
||||
}
|
||||
|
||||
bool st_seek(st_audio_file* af, uint64_t frame)
|
||||
{
|
||||
return sf_seek(af->snd, frame, SEEK_SET) != -1;
|
||||
}
|
||||
|
||||
uint64_t st_read_s16(st_audio_file* af, int16_t* buffer, uint64_t count)
|
||||
{
|
||||
return sf_readf_short(af->snd, buffer, count);
|
||||
}
|
||||
|
||||
uint64_t st_read_f32(st_audio_file* af, float* buffer, uint64_t count)
|
||||
{
|
||||
return sf_readf_float(af->snd, buffer, count);
|
||||
}
|
||||
|
||||
SNDFILE* st_get_sndfile_handle(st_audio_file* af)
|
||||
{
|
||||
return af->snd;
|
||||
}
|
||||
|
||||
int st_get_sndfile_format(st_audio_file* af)
|
||||
{
|
||||
return af->info.format;
|
||||
}
|
||||
|
||||
#endif // defined(ST_AUDIO_FILE_USE_SNDFILE)
|
||||
33
external/st_audiofile/src/st_info.c
vendored
Normal file
33
external/st_audiofile/src/st_info.c
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
// 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
|
||||
|
||||
#include "st_audiofile.h"
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "Please indicate a sound file.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
const char* filename = argv[1];
|
||||
|
||||
st_audio_file* af = st_open_file(filename);
|
||||
if (!af) {
|
||||
fprintf(stderr, "Could not open the sound file.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("File name : %s\n", filename);
|
||||
printf("File type : %s\n", st_get_type_string(af));
|
||||
printf("Channels : %u\n", st_get_channels(af));
|
||||
printf("Sample rate : %f\n", st_get_sample_rate(af));
|
||||
printf("Frames : %" PRIu64 "\n", st_get_frame_count(af));
|
||||
|
||||
return 0;
|
||||
}
|
||||
1
external/st_audiofile/thirdparty/dr_libs
vendored
Submodule
1
external/st_audiofile/thirdparty/dr_libs
vendored
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit cac1785cee4abb455817b43d5dee33b49d61be2f
|
||||
Loading…
Add table
Reference in a new issue