diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-09-25 12:05:06 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-09-25 12:05:06 +0000 |
| commit | 6b48eaf5918e54b4f6cc7e9366da72ee6fe416b6 (patch) | |
| tree | c9444416ff941a434fed97b7d2d786fa194088f9 /src | |
| parent | 9705552640a9c340df9c8a8b3c3ce07ede56c278 (diff) | |
| download | qmmp-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.c | 49 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/gain_analysis.h | 3 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscandialog.cpp | 18 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscaner.cpp | 51 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscaner.h | 8 |
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; }; |
