2016-06-22 8 views
0

erhalten Spitzenpegel von Kanälen:wie glatte Ebene (peak) Zähler mit Qt machen

BASS_ChannelGetLevelEx(chan, levels, 0.02, BASS_LEVEL_STEREO ); 

Diese Funktion i mit derselben Frequenz in Thread aufrufen

void Thread::run() 
{ 

while(!m_abort) 
    { 

     emit SetLevels(); 
     QThread::msleep(20); 
    } 
} 

Pegelmesser draw über QPainter

das ist was passiert

enter image description here

läuft wie verrückt, macht scharfe Sprünge. aber muss glatt sein

wie machen es reibungslos?

+1

Sie müssen die Spitzenpegel interpolieren, um eine flüssigere Animation zu erzielen. Schauen Sie sich die 'QPropertyAnimation' Klasse an, sie tut was Sie brauchen. –

+0

kann mehr über Interpolation? –

+0

Sicher: https://en.wikipedia.org/wiki/Interpolation, aber Qt implementiert es bereits: http://doc.qt.io/qt-5/qeasingcurve.html –

Antwort

0

Wenn Ihr neuer Spitzenwert größer als der aktuelle Spitzenwert ist, dann weisen Sie einfach den neuen Wert zu. Wenn es weniger ist dann wie so den aktuellen Wert in einer logarithmischen Weise verringern ..

float factor = 0.10; 
cur_left_value = cur_left_value - factor * (cur_left_value - new_left_value); 

Je größer der Faktor ist, desto schneller Peak-Meter wird „fallen“. Sie müssen einen Timer oder Thread haben kontinuierlich zuweisen die neuesten (neuen) Spitzenwerte mit der oben erläuterten Logik.