1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00
qTox/src/widget/tool/micfeedbackwidget.cpp

100 lines
2.5 KiB
C++
Raw Normal View History

/*
Copyright © 2015 by The qTox Project
This file is part of qTox, a Qt-based graphical interface for Tox.
qTox is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
qTox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with qTox. If not, see <http://www.gnu.org/licenses/>.
*/
#include "micfeedbackwidget.h"
#include "src/audio/audio.h"
#include <QPainter>
#include <QLinearGradient>
2015-08-05 23:42:10 +08:00
MicFeedbackWidget::MicFeedbackWidget(QWidget *parent)
: QWidget(parent)
, timerId(0)
{
setFixedHeight(20);
}
void MicFeedbackWidget::paintEvent(QPaintEvent*)
{
2015-11-17 06:57:57 +08:00
const int w = width();
const int h = height();
QPainter painter(this);
2015-11-17 06:57:57 +08:00
painter.setPen(QPen(Qt::gray));
painter.drawRoundedRect(QRect(0, 0, w - 1, h - 1), 3., 3.);
2015-11-17 06:57:57 +08:00
int gradientWidth = qMax(0, qRound(w * current) - 4);
2015-08-05 20:45:02 +08:00
2015-11-17 06:57:57 +08:00
QRect gradientRect(2, 2, gradientWidth, h - 4);
2015-11-17 06:57:57 +08:00
QPainterPath path;
QLinearGradient gradient(0, 0, w, 0);
gradient.setColorAt(0.0, Qt::green);
gradient.setColorAt(0.5, Qt::yellow);
2015-11-17 06:57:57 +08:00
gradient.setColorAt(1.0, Qt::red);
path.addRoundedRect(gradientRect, 2.0, 2.0);
painter.fillPath(path, gradient);
2015-11-17 06:57:57 +08:00
float slice = w / 5.f;
int padding = slice / 2;
for (int i = 0; i < 5; ++i)
{
float pos = slice * i + padding;
2015-11-17 06:57:57 +08:00
painter.drawLine(pos, 2, pos, h - 4);
}
}
void MicFeedbackWidget::timerEvent(QTimerEvent*)
{
2015-09-28 05:16:40 +08:00
const int framesize = AUDIO_FRAME_SAMPLE_COUNT * AUDIO_CHANNELS;
int16_t buff[framesize] = {0};
2015-09-28 05:16:40 +08:00
if (Audio::getInstance().tryCaptureSamples(buff, AUDIO_FRAME_SAMPLE_COUNT))
{
double max = 0;
2015-09-28 05:16:40 +08:00
for (int i = 0; i < framesize; ++i)
max = std::max(max, fabs(buff[i] / 32767.0));
2015-08-05 20:45:02 +08:00
if (max > current)
current = max;
else
2015-08-05 20:45:02 +08:00
current -= 0.05;
update();
}
else if (current > 0)
{
current -= 0.01;
}
}
2015-08-05 20:45:02 +08:00
void MicFeedbackWidget::showEvent(QShowEvent*)
{
2015-08-05 23:42:10 +08:00
timerId = startTimer(60);
2015-08-05 20:45:02 +08:00
}
void MicFeedbackWidget::hideEvent(QHideEvent*)
{
2015-08-05 23:42:10 +08:00
if (timerId != 0)
{
killTimer(timerId);
timerId = 0;
}
2015-08-05 20:45:02 +08:00
}