aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-09-25 12:05:06 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-09-25 12:05:06 +0000
commit6b48eaf5918e54b4f6cc7e9366da72ee6fe416b6 (patch)
treec9444416ff941a434fed97b7d2d786fa194088f9 /src
parent9705552640a9c340df9c8a8b3c3ce07ede56c278 (diff)
downloadqmmp-6b48eaf5918e54b4f6cc7e9366da72ee6fe416b6.tar.gz
qmmp-6b48eaf5918e54b4f6cc7e9366da72ee6fe416b6.tar.bz2
qmmp-6b48eaf5918e54b4f6cc7e9366da72ee6fe416b6.zip
rgscan: added album gain calculation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3723 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/General/rgscan/gain_analysis.c49
-rw-r--r--src/plugins/General/rgscan/gain_analysis.h3
-rw-r--r--src/plugins/General/rgscan/rgscandialog.cpp18
-rw-r--r--src/plugins/General/rgscan/rgscaner.cpp51
-rw-r--r--src/plugins/General/rgscan/rgscaner.h8
5 files changed, 91 insertions, 38 deletions
diff --git a/src/plugins/General/rgscan/gain_analysis.c b/src/plugins/General/rgscan/gain_analysis.c
index 9829537f5..a3535d5fd 100644
--- a/src/plugins/General/rgscan/gain_analysis.c
+++ b/src/plugins/General/rgscan/gain_analysis.c
@@ -136,7 +136,7 @@ struct GainHandle
int freqindex;
int first;
Uint32_t A [(size_t)(STEPS_per_dB * MAX_dB)];
- Uint32_t B [(size_t)(STEPS_per_dB * MAX_dB)];
+// Uint32_t B [(size_t)(STEPS_per_dB * MAX_dB)];
};
// for each filter:
@@ -293,7 +293,7 @@ InitGainAnalysis (GainHandle_t **handle, long samplefreq )
(*handle)->lout = (*handle)->loutbuf + MAX_ORDER;
(*handle)->rout = (*handle)->routbuf + MAX_ORDER;
- memset((*handle)->B, 0, sizeof((*handle)->B));
+ //memset((*handle)->B, 0, sizeof((*handle)->B));
return INIT_GAIN_ANALYSIS_OK;
}
@@ -445,43 +445,42 @@ int AnalyzeSamples (GainHandle_t *handle, const Float_t* left_samples, const Flo
}
-static Float_t
-analyzeResult ( Uint32_t* Array, size_t len )
+static Float_t analyzeResult (Uint32_t* Array, size_t len)
{
- Uint32_t elems;
+ Uint32_t elems = 0;
Int32_t upper;
size_t i;
elems = 0;
- for ( i = 0; i < len; i++ )
+ for (i = 0; i < len; i++)
elems += Array[i];
- if ( elems == 0 )
+ if (elems == 0)
return GAIN_NOT_ENOUGH_SAMPLES;
upper = (Int32_t) ceil (elems * (1. - RMS_PERCENTILE));
- for ( i = len; i-- > 0; ) {
- if ( (upper -= Array[i]) <= 0 )
+ for (i = len; i-- > 0; )
+ {
+ if ((upper -= Array[i]) <= 0)
break;
}
return (Float_t) ((Float_t)PINK_REF - (Float_t)i / (Float_t)STEPS_per_dB);
}
-
Float_t GetTitleGain(GainHandle_t *handle)
{
Float_t retval;
int i = 0;
- retval = analyzeResult (handle->A, sizeof(handle->A)/sizeof(*handle->A) );
+ retval = analyzeResult (handle->A, sizeof(handle->A)/sizeof(*handle->A));
- for (i = 0; i < (int)(sizeof(handle->A)/sizeof(*handle->A)); i++ )
+ /*for (i = 0; i < (int)(sizeof(handle->A)/sizeof(*handle->A)); i++ )
{
handle->B[i] += handle->A[i];
handle->A[i] = 0;
- }
+ }*/
- for ( i = 0; i < MAX_ORDER; i++ )
+ for (i = 0; i < MAX_ORDER; i++ )
{
handle->linprebuf[i] = handle->lstepbuf[i] = handle->loutbuf[i] = 0.f;
handle->rinprebuf[i] = handle->rstepbuf[i] = handle->routbuf[i] = 0.f;
@@ -492,11 +491,27 @@ Float_t GetTitleGain(GainHandle_t *handle)
return retval;
}
+Float_t GetAlbumGain(GainHandle_t **handle, int count)
+{
+ Uint32_t B [(size_t)(STEPS_per_dB * MAX_dB)];
+ memset (B, 0, sizeof(B));
+
+ int i = 0, j = 0;
+
+ for(i = 0; i < count; ++i)
+ {
+ for(j = 0; j < sizeof(handle[i]->A)/sizeof(*handle[i]->A); ++j)
+ {
+ B[j] += handle[i]->A[j];
+ }
+ }
+ return analyzeResult(B, sizeof(B)/sizeof(*B));
+}
-Float_t GetAlbumGain(GainHandle_t *handle)
+/*Float_t GetAlbumGain(GainHandle_t *handle)
{
return analyzeResult (handle->B, sizeof(handle->B)/sizeof(*handle->B));
-}
+}*/
void DeinitGainAbalysis(GainHandle_t *handle)
{
@@ -507,3 +522,5 @@ void DeinitGainAbalysis(GainHandle_t *handle)
+
+
diff --git a/src/plugins/General/rgscan/gain_analysis.h b/src/plugins/General/rgscan/gain_analysis.h
index a6d8b6193..0e75c3074 100644
--- a/src/plugins/General/rgscan/gain_analysis.h
+++ b/src/plugins/General/rgscan/gain_analysis.h
@@ -49,7 +49,8 @@ int InitGainAnalysis (GainHandle_t **handle, long samplefreq);
int AnalyzeSamples (GainHandle_t *handle, const Float_t* left_samples, const Float_t* right_samples, size_t num_samples, int num_channels);
int ResetSampleFrequency (GainHandle_t *handle, long samplefreq);
Float_t GetTitleGain(GainHandle_t *handle);
-Float_t GetAlbumGain(GainHandle_t *handle);
+//Float_t GetAlbumGain(GainHandle_t *handle);
+Float_t GetAlbumGain(GainHandle_t **handle, int count);
void DeinitGainAbalysis(GainHandle_t *handle);
#ifdef __cplusplus
diff --git a/src/plugins/General/rgscan/rgscandialog.cpp b/src/plugins/General/rgscan/rgscandialog.cpp
index 35c46502d..a55d4882b 100644
--- a/src/plugins/General/rgscan/rgscandialog.cpp
+++ b/src/plugins/General/rgscan/rgscandialog.cpp
@@ -25,6 +25,7 @@
#include <qmmpui/metadataformatter.h>
#include <qmmpui/filedialog.h>
#include "rgscaner.h"
+#include "gain_analysis.h"
#include "rgscandialog.h"
RGScanDialog::RGScanDialog(QList <PlayListTrack *> tracks, QWidget *parent) : QDialog(parent)
@@ -96,6 +97,23 @@ void RGScanDialog::onScanFinished(QString url)
{
qDebug("RGScanDialog: all threads finished");
QThreadPool::globalInstance()->waitForDone();
+
+
+ GainHandle_t **a = (GainHandle_t **) malloc(m_scaners.count()*sizeof(GainHandle_t *));
+
+ for(int i = 0; i < m_scaners.count(); ++i)
+ {
+ a[i] = m_scaners.at(i)->handle();
+ }
+
+ double album_gain = GetAlbumGain(a, m_scaners.count());
+ free(a);
+
+ for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i)
+ {
+ m_ui.tableWidget->setItem(i, 3, new QTableWidgetItem(QString::number(album_gain)));
+ }
+
qDeleteAll(m_scaners);
m_scaners.clear();
}
diff --git a/src/plugins/General/rgscan/rgscaner.cpp b/src/plugins/General/rgscan/rgscaner.cpp
index 1fda543e0..fc46142e9 100644
--- a/src/plugins/General/rgscan/rgscaner.cpp
+++ b/src/plugins/General/rgscan/rgscaner.cpp
@@ -19,34 +19,41 @@
***************************************************************************/
#include <stdio.h>
+#include <stdint.h>
#include <QStringList>
-#include <QDesktopServices>
+#include <QThread>
#include <qmmp/inputsourcefactory.h>
#include <qmmp/decoderfactory.h>
-#include <qmmp/metadatamanager.h>
-#include <qmmpui/metadataformatter.h>
-#include <QtEndian>
-#include <QThread>
-#include <taglib/fileref.h>
-#include <taglib/tag.h>
-#include <taglib/mpegfile.h>
-#include <stdio.h>
-#include <stdint.h>
-#include "gain_analysis.h"
#include "rgscaner.h"
-#define QStringToTString_qt4(s) TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8)
-
RGScaner::RGScaner()
{
m_gain = 0.;
m_user_stop = false;
m_is_running = false;
+ m_handle = 0;
+ m_decoder = 0;
+ m_source = 0;
}
RGScaner::~RGScaner()
{
stop();
+ if(m_handle)
+ {
+ DeinitGainAbalysis(m_handle);
+ m_handle = 0;
+ }
+ if(m_decoder)
+ {
+ delete m_decoder;
+ m_decoder = 0;
+ }
+ if(m_source)
+ {
+ delete m_source;
+ m_source = 0;
+ }
}
bool RGScaner::prepare(const QString &url)
@@ -116,6 +123,11 @@ double RGScaner::gain()
return m_gain;
}
+GainHandle_t *RGScaner::handle()
+{
+ return m_handle;
+}
+
void RGScaner::run()
{
m_is_running = true;
@@ -134,10 +146,13 @@ void RGScaner::run()
double out_right[buf_size/4];
- GainHandle_t *handle = 0;
-
- InitGainAnalysis(&handle, 44100);
+ if(m_handle)
+ {
+ DeinitGainAbalysis(m_handle);
+ m_handle = 0;
+ }
+ InitGainAnalysis(&m_handle, 44100);
forever
{
@@ -155,7 +170,7 @@ void RGScaner::run()
out_left[i] = ((short *) output_buf)[i*2];
out_right[i] = ((short *) output_buf)[i*2+1];
}
- AnalyzeSamples(handle, out_left, out_right, len/4, 2);
+ AnalyzeSamples(m_handle, out_left, out_right, len/4, 2);
output_at = 0;
}
@@ -171,7 +186,7 @@ void RGScaner::run()
m_mutex.unlock();
}
- m_gain = GetTitleGain(handle);
+ m_gain = GetTitleGain(m_handle);
qDebug("RGScaner: thread %ld finished", QThread::currentThreadId());
m_is_running = false;
emit progress(100);
diff --git a/src/plugins/General/rgscan/rgscaner.h b/src/plugins/General/rgscan/rgscaner.h
index c9014ddd1..b08794097 100644
--- a/src/plugins/General/rgscan/rgscaner.h
+++ b/src/plugins/General/rgscan/rgscaner.h
@@ -27,10 +27,13 @@
#include <stdio.h>
#include <qmmp/decoder.h>
#include <qmmp/inputsource.h>
+#include "gain_analysis.h"
+
/**
@author Ilya Kotov <forkotov02@hotmail.ru>
*/
+
class RGScaner : public QObject, public QRunnable
{
Q_OBJECT
@@ -42,13 +45,11 @@ public:
void stop();
bool isRunning();
double gain();
-
+ GainHandle_t *handle();
signals:
void progress(int percent);
void finished(const QString &url);
- //void desriptionChanged(QString text);
- //void error(QString text);
private:
void run();
@@ -59,6 +60,7 @@ private:
bool m_is_running;
QString m_url;
double m_gain;
+ GainHandle_t *m_handle;
};