VulcanoLE/src/VulcanoLE/Audio/AudioGrabber.cpp

106 lines
3.0 KiB
C++
Raw Normal View History

2021-02-20 18:13:51 +01:00
#include <cmath>
#include <VulcanoLE/Audio/AudioGrabber.h>
#include <VUtils/Logging.h>
2021-05-02 17:25:03 +02:00
#include <VulcanoLE/Audio/JackClient.h>
2021-12-30 18:06:04 +01:00
#include "VUtils/Math.h"
2021-02-20 18:13:51 +01:00
AudioGrabber::AudioGrabber() = default;
AudioGrabber::~AudioGrabber() = default;
bool AudioGrabber::read(stereoSample *buffer, uint32_t bufferSize) {
2021-05-02 17:25:03 +02:00
auto &client = JackClient::get();
if (!client.isData())
return false;
availableData = client.getFrames();
client.fillSamples(buffer, availableData);
return true;
2021-02-20 18:13:51 +01:00
}
AudioGrabber *AudioGrabber::createAudioGrabber() {
2021-05-02 17:25:03 +02:00
JackClient::get().start();
2021-02-20 18:13:51 +01:00
auto *grabber = new AudioGrabber();
2021-05-02 17:25:03 +02:00
JackClient::get().grabber = grabber;
2021-02-20 18:13:51 +01:00
return grabber;
}
void AudioGrabber::init() {
m_buffer = static_cast<stereoSample *>(calloc(BUFFER_SIZE, sizeof(stereoSample)));
2021-02-20 18:13:51 +01:00
if (env != nullptr)
m_scale = env->getAsDouble("audio_scale", 1.0);
2021-12-30 18:06:04 +01:00
m_filter.scale = 1.0;
2021-02-20 18:13:51 +01:00
DBG("SET Audio Scale: %.3f", m_scale)
loudness = { 0.0, 0.0 };
2021-02-20 18:13:51 +01:00
}
void AudioGrabber::calculateRMS(stereoSample *pFrame) {
2021-12-30 18:06:04 +01:00
double squareL = 0, meanL;
double squareR = 0, meanR;
2021-05-02 17:25:03 +02:00
for (int i = 0; i < availableData; i++) {
2021-12-30 18:06:04 +01:00
squareL += std::pow(pFrame[i].l * m_scale, 2);
squareR += std::pow(pFrame[i].r * m_scale, 2);
2021-02-20 18:13:51 +01:00
}
2021-12-30 18:06:04 +01:00
meanL = (squareL / (float) (availableData));
meanR = (squareR / (float) (availableData));
loudness = { (float) std::sqrt(meanL), (float) std::sqrt(meanR) };
2021-02-20 18:13:51 +01:00
}
void AudioGrabber::calculatePEAK(stereoSample *pFrame) {
stereoSampleFrame max = { 0, 0 };
2021-05-02 17:25:03 +02:00
for (int i = 0; i < availableData; i++) {
2021-12-30 18:06:04 +01:00
auto left = (float) std::abs(pFrame[i].l * m_scale);
auto right = (float) std::abs(pFrame[i].r * m_scale);
if (left > max.l)
max.l = left;
if (right > max.r)
max.r = right;
2021-02-20 18:13:51 +01:00
}
loudness = max;
}
stereoSampleFrame AudioGrabber::getLoudness() {
2021-02-20 18:13:51 +01:00
std::unique_lock<std::mutex> lck(m_mtx);
return loudness;
2021-02-20 18:13:51 +01:00
}
bool AudioGrabber::work() {
2021-02-20 18:13:51 +01:00
std::unique_lock<std::mutex> lck(m_mtx);
if (this->read(m_buffer, BUFFER_SIZE)) {
2021-02-20 18:13:51 +01:00
switch (requestMode) {
case ReqMode::FFT:
2021-03-22 20:46:29 +01:00
fft.process(m_buffer, m_scale);
2021-02-20 18:13:51 +01:00
break;
case ReqMode::RMS:
calculateRMS(m_buffer);
2021-02-20 18:13:51 +01:00
break;
case ReqMode::PEAK:
calculatePEAK(m_buffer);
2021-02-20 18:13:51 +01:00
break;
2021-12-30 18:06:04 +01:00
case ReqMode::FILTER:
loudness = m_filter.work(m_buffer, availableData);
break;
2021-03-22 20:46:29 +01:00
default: {
calculateRMS(m_buffer);
calculatePEAK(m_buffer);
2021-03-22 20:46:29 +01:00
fft.process(m_buffer, m_scale);
}
2021-02-20 18:13:51 +01:00
}
return true;
} else {
return false;
}
}
2021-12-30 18:06:04 +01:00
Audio::FilterHelper &AudioGrabber::getFilter() {
return m_filter;
}
double AudioGrabber::getBass() {
auto fftData = fft.getData();
auto val = 0.0;
for (int i = 1; i < 4; ++i) {
auto avg = (fftData->leftChannel[i] + fftData->rightChannel[i]) / 2.0;
if (avg > val)
val = avg;
}
return VUtils::Math::clamp(val, 1, 255);
}