audio::PCM.totalSamples
This commit is contained in:
+8
-5
@@ -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
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
namespace audio {
|
namespace audio {
|
||||||
struct PCM;
|
struct PCM;
|
||||||
|
class Stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ogg {
|
namespace ogg {
|
||||||
|
|||||||
+2
-4
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user