X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudiosignal.cpp;h=30471e0bf288b078a183cf2406e3d6a567d647dd;hb=a3e1f9d24f3e4b4337b483aaa0b710308cadc152;hp=e277a9a36aa23aa810fcf074f228057ceb87b3f5;hpb=75881aec269354112a10b2aff6dc912b68fe0f3b;p=kdenlive diff --git a/src/audiosignal.cpp b/src/audiosignal.cpp index e277a9a3..30471e0b 100644 --- a/src/audiosignal.cpp +++ b/src/audiosignal.cpp @@ -18,7 +18,7 @@ ***************************************************************************/ #include "audiosignal.h" -#include "kdenlivesettings.h" +#include "math.h" #include @@ -42,14 +42,36 @@ AudioSignal::AudioSignal(QWidget *parent): QWidget(parent) col << Qt::darkYellow << Qt::darkYellow << Qt::darkYellow; col << Qt::red << Qt::red; setContextMenuPolicy(Qt::ActionsContextMenu); - QAction *showSignal = new QAction(i18n("Monitor audio signal"), this); - showSignal->setCheckable(true); - showSignal->setChecked(KdenliveSettings::monitor_audio()); - connect(showSignal, SIGNAL(toggled(bool)), this, SLOT(slotSwitchAudioMonitoring(bool))); - addAction(showSignal); + m_aMonitoringEnabled = new QAction(i18n("Monitor audio signal"), this); + m_aMonitoringEnabled->setCheckable(true); + connect(m_aMonitoringEnabled, SIGNAL(toggled(bool)), this, SLOT(slotSwitchAudioMonitoring(bool))); + addAction(m_aMonitoringEnabled); } +AudioSignal::~AudioSignal() +{ + delete m_aMonitoringEnabled; +} + +bool AudioSignal::monitoringEnabled() const +{ + return m_aMonitoringEnabled->isChecked(); +} +void AudioSignal::slotReceiveAudio(const QVector& data, int, int num_channels, int samples){ + + int num_samples = samples > 200 ? 200 : samples; + + QByteArray channels; + for (int i = 0; i < num_channels; i++) { + long val = 0; + for (int s = 0; s < num_samples; s ++) { + val += abs(data[i+s*num_channels] / 128); + } + channels.append(val / num_samples); + } + showAudio(channels); +} void AudioSignal::showAudio(const QByteArray arr) { channels = arr; @@ -68,16 +90,35 @@ void AudioSignal::showAudio(const QByteArray arr) } update(); } + +double AudioSignal::valueToPixel(double in,bool db) +{ + if (db) + { + // ratio db(in)/db(0.01) (means: min db value = -40.0 ) + return 1.0- log10( in)/log10(0.01); + } + else + { + return in; + } +} + void AudioSignal::paintEvent(QPaintEvent* /*e*/) { + if (!m_aMonitoringEnabled->isChecked()) { + return; + } QPainter p(this); //p.begin(); //p.fillRect(0,0,(unsigned char)channels[0]*width()/255,height()/2,QBrush(Qt::SolidPattern)); //p.fillRect(0,height()/2,(unsigned char)channels[1]*width()/255,height()/2,QBrush(Qt::SolidPattern)); int numchan = channels.size(); + bool db=true; // show values in db(i) bool horiz=width() > height(); for (int i = 0; i < numchan; i++) { - int maxx= (unsigned char)channels[i] * (horiz ? width() : height() ) / 127; + //int maxx= (unsigned char)channels[i] * (horiz ? width() : height() ) / 127; + int maxx= (horiz ? width() : height() ) * valueToPixel((double)(unsigned char)channels[i]/127.0,db); int xdelta=(horiz ? width():height() ) /20 ; int _y2= (horiz ? height() :width () ) / numchan - 1 ; int _y1=(horiz ? height():width() ) *i/numchan; @@ -91,15 +132,14 @@ void AudioSignal::paintEvent(QPaintEvent* /*e*/) maxx -= xdelta; } } - int xp=peeks.at(i)*(horiz?width():height())/127-2; + int xp=valueToPixel((double)peeks.at(i)/127.0,db)*(horiz?width():height())-2; p.fillRect(horiz?xp:_y1,horiz?_y1:height()-xdelta-xp,horiz?3:_y2,horiz?_y2:3,QBrush(Qt::black,Qt::SolidPattern)); } p.end(); } -void AudioSignal::slotSwitchAudioMonitoring(bool isOn) +void AudioSignal::slotSwitchAudioMonitoring(bool) { - KdenliveSettings::setMonitor_audio(isOn); emit updateAudioMonitoring(); }