audio::PCM.totalSamples

This commit is contained in:
MihailRis
2024-02-28 23:14:28 +03:00
parent 70657d9e7b
commit 4d15ebb7de
4 changed files with 13 additions and 10 deletions
+6 -3
View File
@@ -31,26 +31,29 @@ namespace audio {
struct PCM { struct PCM {
/// @brief May contain 8 bit and 16 bit PCM data /// @brief May contain 8 bit and 16 bit PCM data
std::vector<char> data; std::vector<char> data;
size_t totalSamples;
uint8_t channels; uint8_t channels;
uint8_t bitsPerSample; uint8_t bitsPerSample;
uint sampleRate; uint sampleRate;
PCM( PCM(
std::vector<char> data, std::vector<char> data,
size_t totalSamples,
uint8_t channels, uint8_t channels,
uint8_t bitsPerSample, uint8_t bitsPerSample,
uint sampleRate uint sampleRate
) : data(std::move(data)), ) : data(std::move(data)),
totalSamples(totalSamples),
channels(channels), channels(channels),
bitsPerSample(bitsPerSample), bitsPerSample(bitsPerSample),
sampleRate(sampleRate) {} sampleRate(sampleRate) {}
inline size_t countSamples() const { inline size_t countSamplesMono() const {
return data.size() / channels / (bitsPerSample / 8); return totalSamples / channels;
} }
inline duration_t getDuration() const { inline duration_t getDuration() const {
return static_cast<duration_t>(countSamples()) / return static_cast<duration_t>(countSamplesMono()) /
static_cast<duration_t>(sampleRate); static_cast<duration_t>(sampleRate);
} }
}; };
+2 -1
View File
@@ -31,6 +31,7 @@ audio::PCM* ogg::load_pcm(const std::filesystem::path& file, bool headerOnly) {
vorbis_info* info = ov_info(&vf, -1); vorbis_info* info = ov_info(&vf, -1);
uint channels = info->channels; uint channels = info->channels;
uint sampleRate = info->rate; uint sampleRate = info->rate;
size_t totalSamples = ov_pcm_total(&vf, -1);
if (!headerOnly) { if (!headerOnly) {
const int bufferSize = 4096; const int bufferSize = 4096;
@@ -51,5 +52,5 @@ audio::PCM* ogg::load_pcm(const std::filesystem::path& file, bool headerOnly) {
} }
ov_clear(&vf); ov_clear(&vf);
return new audio::PCM(std::move(data), channels, 16, sampleRate); return new audio::PCM(std::move(data), totalSamples, channels, 16, sampleRate);
} }
+1
View File
@@ -5,6 +5,7 @@
namespace audio { namespace audio {
struct PCM; struct PCM;
class Stream;
} }
namespace ogg { namespace ogg {
+2 -4
View File
@@ -27,8 +27,6 @@ std::int32_t convert_to_int(char* buffer, std::size_t len){
return a; return a;
} }
#include <iostream>
audio::PCM* wav::load_pcm(const std::filesystem::path& file, bool headerOnly) { audio::PCM* wav::load_pcm(const std::filesystem::path& file, bool headerOnly) {
std::ifstream in(file, std::ios::binary); std::ifstream in(file, std::ios::binary);
if(!in.is_open()){ if(!in.is_open()){
@@ -85,7 +83,6 @@ audio::PCM* wav::load_pcm(const std::filesystem::path& file, bool headerOnly) {
throw std::runtime_error("could not read bits per sample"); throw std::runtime_error("could not read bits per sample");
} }
int bitsPerSample = convert_to_int(buffer, 2); int bitsPerSample = convert_to_int(buffer, 2);
std::cout << "CHANN " << channels << std::endl;
// data chunk header "data" // data chunk header "data"
if(!in.read(buffer, 4)){ if(!in.read(buffer, 4)){
@@ -110,11 +107,12 @@ audio::PCM* wav::load_pcm(const std::filesystem::path& file, bool headerOnly) {
} }
std::vector<char> data; std::vector<char> data;
size_t totalSamples = size / (bitsPerSample / 8);
if (!headerOnly) { if (!headerOnly) {
data.resize(size); data.resize(size);
if (!in.read(data.data(), size)) { if (!in.read(data.data(), size)) {
throw std::runtime_error("could not load wav data of '"+file.u8string()+"'"); throw std::runtime_error("could not load wav data of '"+file.u8string()+"'");
} }
} }
return new audio::PCM(std::move(data), channels, bitsPerSample, sampleRate); return new audio::PCM(std::move(data), totalSamples, channels, bitsPerSample, sampleRate);
} }