You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pa-calculator/source/csong.cpp

139 lines
3.2 KiB
C++

#include "csong.h"
#include <QFileInfo>
#include "getLoudness.h"
#include "getLoudness_terminate.h"
#include "rt_nonfinite.h"
#include "coder_array.h"
#include <cmath>
csong::csong()
{
m_path="";
m_loudness=0;
m_peakLevel=0;
m_widgetItem=new QTableWidgetItem[5];
setWidgetProperties();
}
csong::csong(QString path)
{
m_path=path;
m_widgetItem=new QTableWidgetItem[5];
setWidgetProperties();
}
csong::~csong()
{
delete [] m_widgetItem;
}
void csong::analyze(float preferedLoudness)
{
using namespace nqr;
NyquistIO loader;
std::shared_ptr<AudioData> fileData = std::make_shared<AudioData>();
auto memory= ReadFile(m_path.toStdString());
QFileInfo fi(m_path);
loader.Load(fileData.get(),fi.suffix().toStdString(),memory.buffer);
coder::array<float, 2U> loudness;
loudness.set_size(1,1);
coder::array<float, 2U> data;
data.set_size(fileData->samples.size()/2,fileData->channelCount);
for (int idx0{0}; idx0 < data.size(0); idx0++) {
for (int idx1{0}; idx1 < data.size(1); idx1++) {
data[idx0 + data.size(0) * idx1] = fileData->samples[idx1+data.size(1)*idx0];
}
}
getLoudness(data,fileData->sampleRate,loudness);
getLoudness_terminate();
m_loudness=loudness[0];
m_widgetItem[1].setText(QString::number(m_loudness));
m_peakLevel=0;
for (unsigned int i=0;i<fileData->samples.size();i++){
if (abs(fileData->samples[i])>m_peakLevel){
m_peakLevel=abs(fileData->samples[i]);
}
}
m_peakLevel=linToDb(m_peakLevel);
if (m_peakLevel>0){
m_peakLevel=0;
}
m_widgetItem[2].setText(QString::number(m_peakLevel));
m_correction=preferedLoudness-m_loudness;
m_widgetItem[4].setText(QString::number(m_correction));
m_correctedPeakLevel=m_peakLevel+m_correction;
m_widgetItem[3].setText(QString::number(m_correctedPeakLevel));
if (m_correctedPeakLevel>0){
m_widgetItem[3].setBackground(Qt::red);
}else {
m_widgetItem[3].setBackground(Qt::white);
}
}
void csong::setNewPreferedLoudness(float preferedLoudness)
{
m_correction=preferedLoudness-m_loudness;
m_widgetItem[4].setText(QString::number(m_correction));
m_correctedPeakLevel=m_peakLevel+m_correction;
m_widgetItem[3].setText(QString::number(m_correctedPeakLevel));
if (m_correctedPeakLevel>0){
m_widgetItem[3].setBackground(Qt::red);
}else {
m_widgetItem[3].setBackground(Qt::white);
}
}
void csong::setPath(QString path)
{
m_path=path;
m_widgetItem[0].setText(m_path);
}
float csong::get_PeakLevel() const
{
return m_peakLevel;
}
float csong::get_Loudness() const
{
return m_loudness;
}
float csong::get_correctedPeakLevel() const
{
return m_correctedPeakLevel;
}
float csong::get_correction() const
{
return m_correction;
}
float csong::linToDb(float linValue)
{
return 20*std::log10f(linValue);
}
void csong::setWidgetProperties()
{
for (int i=0;i<5;i++){
m_widgetItem[i].setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
m_widgetItem[i].setTextAlignment(Qt::AlignCenter);
}
m_widgetItem[0].setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
}
QString csong::get_path() const{
return m_path;
}