Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
尘离序散
obs-studio
提交
defceeef
O
obs-studio
项目概览
尘离序散
/
obs-studio
与 Fork 源项目一致
从无法访问的项目Fork
通知
30
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
obs-studio
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
defceeef
编写于
7月 14, 2014
作者:
J
Jim
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #169 from hwdro/master
Simple volume meter widget
上级
5425f1e1
6b284d9e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
111 addition
and
38 deletion
+111
-38
libobs/obs-source.c
libobs/obs-source.c
+9
-2
obs/volume-control.cpp
obs/volume-control.cpp
+88
-32
obs/volume-control.hpp
obs/volume-control.hpp
+14
-4
未找到文件。
libobs/obs-source.c
浏览文件 @
defceeef
...
...
@@ -565,8 +565,15 @@ static void calc_volume_levels(struct obs_source *source, float *array,
max_val
=
fmaxf
(
max_val
,
val_pow2
);
}
rms_val
=
to_db
(
sqrtf
(
sum_val
/
(
float
)
count
*
volume
));
max_val
=
to_db
(
sqrtf
(
max_val
*
volume
));
/*
We want the volume meters scale linearly in respect to current
volume, so, no need to apply volume here.
*/
UNUSED_PARAMETER
(
volume
);
rms_val
=
to_db
(
sqrtf
(
sum_val
/
(
float
)
count
));
max_val
=
to_db
(
sqrtf
(
max_val
));
if
(
max_val
>
source
->
vol_max
)
source
->
vol_max
=
max_val
;
...
...
obs/volume-control.cpp
浏览文件 @
defceeef
...
...
@@ -5,6 +5,7 @@
#include <QVBoxLayout>
#include <QSlider>
#include <QLabel>
#include <QPainter>
#include <string>
#include <math.h>
...
...
@@ -13,6 +14,12 @@ using namespace std;
#define VOL_MIN -96.0f
#define VOL_MAX 0.0f
/*
VOL_MIN_LOG = DBToLog(VOL_MIN)
VOL_MAX_LOG = DBToLog(VOL_MAX)
... just in case someone wants to use a smaller scale
*/
#define VOL_MIN_LOG -2.0086001717619175
#define VOL_MAX_LOG -0.77815125038364363
...
...
@@ -40,18 +47,14 @@ void VolControl::OBSVolumeChanged(void *data, calldata_t calldata)
void
VolControl
::
OBSVolumeLevel
(
void
*
data
,
calldata_t
calldata
)
{
VolControl
*
volControl
=
static_cast
<
VolControl
*>
(
data
);
float
level
=
calldata_float
(
calldata
,
"level"
);
float
mag
=
calldata_float
(
calldata
,
"magnitude"
);
/*
* TODO: an actual volume control that can process level, mag, peak.
*
* for the time being, just average level and magnitude.
*/
float
result
=
(
level
+
mag
)
*
0.5
f
;
float
peak
=
calldata_float
(
calldata
,
"level"
);
float
mag
=
calldata_float
(
calldata
,
"magnitude"
);
float
peakHold
=
calldata_float
(
calldata
,
"peak"
);
QMetaObject
::
invokeMethod
(
volControl
,
"VolumeLevel"
,
Q_ARG
(
float
,
result
));
Q_ARG
(
float
,
mag
),
Q_ARG
(
float
,
peak
),
Q_ARG
(
float
,
peakHold
));
}
void
VolControl
::
VolumeChanged
(
int
vol
)
...
...
@@ -61,22 +64,21 @@ void VolControl::VolumeChanged(int vol)
signalChanged
=
true
;
}
void
VolControl
::
VolumeLevel
(
float
level
)
void
VolControl
::
VolumeLevel
(
float
mag
,
float
peak
,
float
peakHold
)
{
uint64_t
curMeterTime
=
os_gettime_ns
()
/
1000000
;
levelTotal
+=
level
;
levelCount
+=
1.0
f
;
/*
Add again peak averaging?
*/
/* only update after a certain amount of time */
if
((
curMeterTime
-
lastMeterTime
)
>
UPDATE_INTERVAL_MS
)
{
float
vol
=
(
float
)
slider
->
value
()
*
0.01
f
;
lastMeterTime
=
curMeterTime
;
float
finalLevel
=
levelTotal
/
levelCount
;
volMeter
->
setValue
(
int
(
DBToLinear
(
finalLevel
)
*
10000.0
f
));
levelTotal
=
0.0
f
;
levelCount
=
0.0
f
;
volMeter
->
setLevels
(
DBToLinear
(
mag
)
*
vol
,
DBToLinear
(
peak
)
*
vol
,
DBToLinear
(
peakHold
)
*
vol
);
}
}
...
...
@@ -118,7 +120,7 @@ VolControl::VolControl(OBSSource source_)
nameLabel
=
new
QLabel
();
volLabel
=
new
QLabel
();
volMeter
=
new
QProgressBa
r
();
volMeter
=
new
VolumeMete
r
();
slider
=
new
QSlider
(
Qt
::
Horizontal
);
QFont
font
=
nameLabel
->
font
();
...
...
@@ -133,18 +135,6 @@ VolControl::VolControl(OBSSource source_)
slider
->
setValue
(
vol
);
// slider->setMaximumHeight(13);
volMeter
->
setMaximumHeight
(
1
);
volMeter
->
setMinimum
(
0
);
volMeter
->
setMaximum
(
10000
);
volMeter
->
setTextVisible
(
false
);
/* [Danni] Temporary color. */
QString
testColor
=
"QProgressBar "
"{border: 0px} "
"QProgressBar::chunk "
"{width: 1px; background-color: #AA0000;}"
;
volMeter
->
setStyleSheet
(
testColor
);
textLayout
->
setContentsMargins
(
0
,
0
,
0
,
0
);
textLayout
->
addWidget
(
nameLabel
);
textLayout
->
addWidget
(
volLabel
);
...
...
@@ -177,3 +167,69 @@ VolControl::~VolControl()
signal_handler_disconnect
(
obs_source_signalhandler
(
source
),
"volume_level"
,
OBSVolumeLevel
,
this
);
}
VolumeMeter
::
VolumeMeter
(
QWidget
*
parent
)
:
QWidget
(
parent
)
{
setMinimumSize
(
1
,
3
);
bkColor
.
setRgb
(
0xDD
,
0xDD
,
0xDD
);
magColor
.
setRgb
(
0x20
,
0x7D
,
0x17
);
peakColor
.
setRgb
(
0x3E
,
0xF1
,
0x2B
);
peakHoldColor
.
setRgb
(
0x00
,
0x00
,
0x00
);
setLevels
(
0.0
f
,
0.0
f
,
0.0
f
);
}
void
VolumeMeter
::
setLevels
(
float
nmag
,
float
npeak
,
float
npeakHold
)
{
mag
=
nmag
;
peak
=
npeak
;
peakHold
=
npeakHold
;
update
();
}
void
VolumeMeter
::
paintEvent
(
QPaintEvent
*
event
)
{
UNUSED_PARAMETER
(
event
);
QPainter
painter
(
this
);
QLinearGradient
gradient
;
int
width
=
size
().
width
();
int
height
=
size
().
height
();
int
scaledMag
=
int
((
float
)
width
*
mag
);
int
scaledPeak
=
int
((
float
)
width
*
peak
);
int
scaledPeakHold
=
int
((
float
)
width
*
peakHold
);
gradient
.
setStart
(
qreal
(
scaledMag
),
0
);
gradient
.
setFinalStop
(
qreal
(
scaledPeak
),
0
);
gradient
.
setColorAt
(
0
,
magColor
);
gradient
.
setColorAt
(
1
,
peakColor
);
// RMS
painter
.
fillRect
(
0
,
0
,
scaledMag
,
height
,
magColor
);
// RMS - Peak gradient
painter
.
fillRect
(
scaledMag
,
0
,
scaledPeak
-
scaledMag
+
1
,
height
,
QBrush
(
gradient
));
// Background
painter
.
fillRect
(
scaledPeak
,
0
,
width
-
scaledPeak
,
height
,
bkColor
);
// Peak hold
if
(
peakHold
==
1.0
f
)
scaledPeakHold
--
;
painter
.
setPen
(
peakHoldColor
);
painter
.
drawLine
(
scaledPeakHold
,
0
,
scaledPeakHold
,
height
);
}
obs/volume-control.hpp
浏览文件 @
defceeef
...
...
@@ -2,9 +2,19 @@
#include <obs.hpp>
#include <QWidget>
#include <QProgressBar>
/* TODO: Make a real volume control that isn't terrible */
class
VolumeMeter
:
public
QWidget
{
Q_OBJECT
private:
float
mag
,
peak
,
peakHold
;
QColor
bkColor
,
magColor
,
peakColor
,
peakHoldColor
;
public:
explicit
VolumeMeter
(
QWidget
*
parent
=
0
);
void
setLevels
(
float
nmag
,
float
npeak
,
float
npeakHold
);
protected:
void
paintEvent
(
QPaintEvent
*
event
);
};
class
QLabel
;
class
QSlider
;
...
...
@@ -16,7 +26,7 @@ private:
OBSSource
source
;
QLabel
*
nameLabel
;
QLabel
*
volLabel
;
QProgressBar
*
volMeter
;
VolumeMeter
*
volMeter
;
QSlider
*
slider
;
bool
signalChanged
;
uint64_t
lastMeterTime
;
...
...
@@ -28,7 +38,7 @@ private:
private
slots
:
void
VolumeChanged
(
int
vol
);
void
VolumeLevel
(
float
level
);
void
VolumeLevel
(
float
mag
,
float
peak
,
float
peakHold
);
void
SliderChanged
(
int
vol
);
public:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录