audio::PCM.totalSamples
This commit is contained in:
parent
70657d9e7b
commit
4d15ebb7de
@ -31,26 +31,29 @@ namespace audio {
|
||||
struct PCM {
|
||||
/// @brief May contain 8 bit and 16 bit PCM data
|
||||
std::vector<char> data;
|
||||
size_t totalSamples;
|
||||
uint8_t channels;
|
||||
uint8_t bitsPerSample;
|
||||
uint sampleRate;
|
||||
|
||||
PCM(
|
||||
PCM(
|
||||
std::vector<char> data,
|
||||
size_t totalSamples,
|
||||
uint8_t channels,
|
||||
uint8_t bitsPerSample,
|
||||
uint sampleRate
|
||||
) : data(std::move(data)),
|
||||
) : data(std::move(data)),
|
||||
totalSamples(totalSamples),
|
||||
channels(channels),
|
||||
bitsPerSample(bitsPerSample),
|
||||
sampleRate(sampleRate) {}
|
||||
|
||||
inline size_t countSamples() const {
|
||||
return data.size() / channels / (bitsPerSample / 8);
|
||||
inline size_t countSamplesMono() const {
|
||||
return totalSamples / channels;
|
||||
}
|
||||
|
||||
inline duration_t getDuration() const {
|
||||
return static_cast<duration_t>(countSamples()) /
|
||||
return static_cast<duration_t>(countSamplesMono()) /
|
||||
static_cast<duration_t>(sampleRate);
|
||||
}
|
||||
};
|
||||
|
||||
@ -31,6 +31,7 @@ audio::PCM* ogg::load_pcm(const std::filesystem::path& file, bool headerOnly) {
|
||||
vorbis_info* info = ov_info(&vf, -1);
|
||||
uint channels = info->channels;
|
||||
uint sampleRate = info->rate;
|
||||
size_t totalSamples = ov_pcm_total(&vf, -1);
|
||||
|
||||
if (!headerOnly) {
|
||||
const int bufferSize = 4096;
|
||||
@ -51,5 +52,5 @@ audio::PCM* ogg::load_pcm(const std::filesystem::path& file, bool headerOnly) {
|
||||
}
|
||||
|
||||
ov_clear(&vf);
|
||||
return new audio::PCM(std::move(data), channels, 16, sampleRate);
|
||||
return new audio::PCM(std::move(data), totalSamples, channels, 16, sampleRate);
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
|
||||
namespace audio {
|
||||
struct PCM;
|
||||
class Stream;
|
||||
}
|
||||
|
||||
namespace ogg {
|
||||
|
||||
@ -27,8 +27,6 @@ std::int32_t convert_to_int(char* buffer, std::size_t len){
|
||||
return a;
|
||||
}
|
||||
|
||||
#include <iostream>
|
||||
|
||||
audio::PCM* wav::load_pcm(const std::filesystem::path& file, bool headerOnly) {
|
||||
std::ifstream in(file, std::ios::binary);
|
||||
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");
|
||||
}
|
||||
int bitsPerSample = convert_to_int(buffer, 2);
|
||||
std::cout << "CHANN " << channels << std::endl;
|
||||
|
||||
// data chunk header "data"
|
||||
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;
|
||||
size_t totalSamples = size / (bitsPerSample / 8);
|
||||
if (!headerOnly) {
|
||||
data.resize(size);
|
||||
if (!in.read(data.data(), size)) {
|
||||
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);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user