|
@@ -6,6 +6,87 @@
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
+
|
|
|
+/* --------------------------------------------------------------------------------
|
|
|
+ * 音量设置相关参数
|
|
|
+ * -------------------------------------------------------------------------------- */
|
|
|
+StVolumeParam::StVolumeParam()
|
|
|
+{
|
|
|
+ Init();
|
|
|
+}
|
|
|
+
|
|
|
+void StVolumeParam::Init()
|
|
|
+{
|
|
|
+ m_bSilentSwitch = false;
|
|
|
+ m_iSilentThreshold = 0;
|
|
|
+ m_iSilentDuration = 0;
|
|
|
+ m_nSilentSensitivity = 80;
|
|
|
+
|
|
|
+ m_bOverloadSwitch = false;
|
|
|
+ m_iOverloadThreshold = 0;
|
|
|
+ m_iOverloadDuration = 0;
|
|
|
+ // 100% 全部过载才表示过载
|
|
|
+ m_nOverloadSensitivity = 40;
|
|
|
+
|
|
|
+ m_bPhaseSwitch = false;
|
|
|
+ m_iPhaseThreshold = 0.0;
|
|
|
+ m_iPhaseDuration = 0;
|
|
|
+ m_iPhaseSensitivity = 40;
|
|
|
+}
|
|
|
+
|
|
|
+StVolumeParam::StVolumeParam(const StVolumeParam& obj)
|
|
|
+{
|
|
|
+ *this = obj;
|
|
|
+}
|
|
|
+
|
|
|
+StVolumeParam& StVolumeParam::operator=(const StVolumeParam& obj)
|
|
|
+{
|
|
|
+ m_bSilentSwitch = obj.m_bSilentSwitch;
|
|
|
+ m_iSilentThreshold = obj.m_iSilentThreshold;
|
|
|
+ m_iSilentDuration = obj.m_iSilentDuration;
|
|
|
+ m_nSilentSensitivity = obj.m_nSilentSensitivity;
|
|
|
+
|
|
|
+ m_bOverloadSwitch = obj.m_bOverloadSwitch;
|
|
|
+ m_iOverloadThreshold = obj.m_iOverloadThreshold;
|
|
|
+ m_iOverloadDuration = obj.m_iOverloadDuration;
|
|
|
+ m_nOverloadSensitivity = obj.m_nOverloadSensitivity;
|
|
|
+
|
|
|
+ m_bPhaseSwitch = obj.m_bPhaseSwitch;
|
|
|
+ m_iPhaseThreshold = obj.m_iPhaseThreshold;
|
|
|
+ m_iPhaseDuration = obj.m_iPhaseDuration;
|
|
|
+ m_iPhaseSensitivity = obj.m_iPhaseSensitivity;
|
|
|
+
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+int StVolumeParam::GetSilentNum() const
|
|
|
+{
|
|
|
+ // return m_iSilentDuration * GInfo.silentSensitivity();
|
|
|
+ return m_iSilentDuration * m_nSilentSensitivity;
|
|
|
+}
|
|
|
+
|
|
|
+int StVolumeParam::GetOverloadNum() const
|
|
|
+{
|
|
|
+ // return m_iOverloadDuration * GInfo.overloadSensitivity();
|
|
|
+ return m_iOverloadDuration * m_nOverloadSensitivity;
|
|
|
+}
|
|
|
+
|
|
|
+int StVolumeParam::GetPhaseNum() const
|
|
|
+{
|
|
|
+ // return m_iPhaseDuration * GInfo.iPhaseSensitivity();
|
|
|
+ return m_iPhaseDuration * m_iPhaseSensitivity;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
StAudioNum::StAudioNum()
|
|
|
{
|
|
|
nTotal = 0;
|
|
@@ -402,65 +483,64 @@ void CaculateDBData::setOffset(long offset)
|
|
|
* @param avgDBSeconds 计算静音的平均音量秒数
|
|
|
* @param startPos 开始位置
|
|
|
* @param endPos 结束位置
|
|
|
- * @return true
|
|
|
- * @return false
|
|
|
+ * @return true 静音
|
|
|
+ * @return false 非静音
|
|
|
*/
|
|
|
-bool CaculateDBData::calculateSilent(const StVolumeParam& param, const int avgDBSeconds, int& startPos, int& endPos)
|
|
|
+bool CaculateDBData::calculateSilent(const StVolumeParam& param, int& startPos, int& endPos)
|
|
|
{
|
|
|
startPos = -1;
|
|
|
endPos = -1;
|
|
|
- if(param.GetSilentSwitch())
|
|
|
+ if(!param.GetSilentSwitch())
|
|
|
{
|
|
|
- const int silentDuration = param.GetSilentDuration();
|
|
|
- if (silentDuration >= CACHE_DATA_SECOND_MAX)
|
|
|
- {
|
|
|
- SPDLOG_WARN("静音持续时间({})不能大于等于最大缓存{}秒", silentDuration, CACHE_DATA_SECOND_MAX);
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (ringQueue.QueueSize() < (silentDuration + m_offset) || silentDuration <= 0)
|
|
|
- {
|
|
|
- SPDLOG_INFO("队列中数据暂不满足静音持续时间检测({})的要求,当前队列大小为{}", silentDuration + m_offset, ringQueue.QueueSize());
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (silentDuration >= avgDBSeconds)
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ const int silentDuration = param.GetSilentDuration();
|
|
|
+ if (silentDuration >= CACHE_DATA_SECOND_MAX)
|
|
|
+ {
|
|
|
+ SPDLOG_WARN("静音持续时间 {}秒 不能大于等于最大缓存{}秒", silentDuration, CACHE_DATA_SECOND_MAX);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (ringQueue.QueueSize() < (silentDuration + m_offset) || silentDuration <= 0)
|
|
|
+ {
|
|
|
+ SPDLOG_DEBUG("队列中数据暂不满足静音持续时间检测 {}秒 的要求,当前队列大小为{}秒", silentDuration + m_offset, ringQueue.QueueSize());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // if (silentDuration >= avgDBSeconds)
|
|
|
+ // {
|
|
|
+ // SPDLOG_WARN("静音持续时间({})不能大于等于{}秒", silentDuration, avgDBSeconds);
|
|
|
+ // return false;
|
|
|
+ // }
|
|
|
+ int nNum = 0;
|
|
|
+ /* 计算起始位置,获取最新的需要用到的silentDuration个数据,环形队列数据永远从0开始获取,
|
|
|
+ * 如果需要获取最新的数据,那么需要从队列的尾部开始获取
|
|
|
+ * 如果有偏移,那么起始点就是如下计算方式 */
|
|
|
+ int queueSize = ringQueue.QueueSize();
|
|
|
+ int startIndex = queueSize - silentDuration - m_offset;
|
|
|
+ for(int j = startIndex; j < queueSize; ++j)
|
|
|
+ {
|
|
|
+ OneSecondData *data = ringQueue[j];
|
|
|
+ if(data == nullptr)
|
|
|
{
|
|
|
- SPDLOG_WARN("静音持续时间({})不能大于等于{}秒", silentDuration, avgDBSeconds);
|
|
|
- return false;
|
|
|
+ continue;
|
|
|
}
|
|
|
- int nNum = 0;
|
|
|
- /* 计算起始位置,获取最新的需要用到的silentDuration个数据,环形队列数据永远从0开始获取,
|
|
|
- * 如果需要获取最新的数据,那么需要从队列的尾部开始获取
|
|
|
- * 如果有偏移,那么起始点就是如下计算方式 */
|
|
|
- int queueSize = ringQueue.QueueSize();
|
|
|
- int startIndex = queueSize - silentDuration - m_offset;
|
|
|
- for(int j = startIndex; j < queueSize; ++j)
|
|
|
+ if (data->CalcDBOneSecond(param))
|
|
|
{
|
|
|
- OneSecondData *data = ringQueue[j];
|
|
|
- if(data == nullptr)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- if (data->CalcDBOneSecond(param))
|
|
|
+ endPos = j;
|
|
|
+ if (startPos < 0)
|
|
|
{
|
|
|
- endPos = j;
|
|
|
- if (startPos < 0)
|
|
|
- {
|
|
|
- startPos = j;
|
|
|
- }
|
|
|
- ++nNum;
|
|
|
+ startPos = j;
|
|
|
}
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- nNum = nNum * 100;
|
|
|
- if (nNum >= param.GetSilentNum())
|
|
|
- {
|
|
|
- return true;
|
|
|
+ ++nNum;
|
|
|
}
|
|
|
}
|
|
|
- return false;
|
|
|
+ nNum = nNum * 100;
|
|
|
+ // SPDLOG_TRACE("num: {}, threhold: {}, startPos: {}, endPos: {}", nNum, param.GetSilentNum(), startPos, endPos);
|
|
|
+ if (nNum >= param.GetSilentNum())
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -474,7 +554,7 @@ bool CaculateDBData::calculateSilent(const StVolumeParam& param, const int avgDB
|
|
|
* @return true
|
|
|
* @return false
|
|
|
*/
|
|
|
-bool CaculateDBData::calculateOverload(const StVolumeParam& param, const int avgDBSeconds, int& startPos, int& endPos, bool bLastOverload)
|
|
|
+bool CaculateDBData::calculateOverload(const StVolumeParam& param, int& startPos, int& endPos, bool bLastOverload)
|
|
|
{
|
|
|
startPos = -1;
|
|
|
endPos = -1;
|
|
@@ -487,20 +567,20 @@ bool CaculateDBData::calculateOverload(const StVolumeParam& param, const int avg
|
|
|
|
|
|
if (calculateDuration >= CACHE_DATA_SECOND_MAX)
|
|
|
{
|
|
|
- SPDLOG_WARN("过载持续时间({})不能大于等于最大缓存{}秒", calculateDuration, CACHE_DATA_SECOND_MAX);
|
|
|
+ SPDLOG_WARN("过载持续时间 {}秒 不能大于等于最大缓存 {}秒", calculateDuration, CACHE_DATA_SECOND_MAX);
|
|
|
return false;
|
|
|
}
|
|
|
/* 判断队列中数据数量是否满足计算需要的数目 */
|
|
|
if(ringQueue.QueueSize() < calculateDuration || calculateDuration <= 0)
|
|
|
{
|
|
|
- SPDLOG_INFO("队列中数据暂不满足过载持续时间检测({})的要求,当前队列大小为{}", calculateDuration, ringQueue.QueueSize());
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (calculateDuration >= avgDBSeconds)
|
|
|
- {
|
|
|
- SPDLOG_WARN("过载持续时间({})不能大于等于{}秒", calculateDuration, avgDBSeconds);
|
|
|
+ SPDLOG_DEBUG("队列中数据暂不满足过载持续时间检测 {}秒 的要求,当前队列大小为 {}秒", calculateDuration, ringQueue.QueueSize());
|
|
|
return false;
|
|
|
}
|
|
|
+ // if (calculateDuration >= avgDBSeconds)
|
|
|
+ // {
|
|
|
+ // SPDLOG_WARN("过载持续时间({})不能大于等于{}秒", calculateDuration, avgDBSeconds);
|
|
|
+ // return false;
|
|
|
+ // }
|
|
|
|
|
|
/* 计算起始位置,获取最新的需要用到的 overloadDuration 个数据,环形队列数据永远从0开始获取,
|
|
|
* 如果需要获取最新的数据,那么需要从队列的尾部开始获取 */
|
|
@@ -553,13 +633,13 @@ bool CaculateDBData::calculateOverload(const StVolumeParam& param, const int avg
|
|
|
if (nOverloadNum >= param.GetOverloadNum())
|
|
|
{
|
|
|
return true;
|
|
|
+ }else {
|
|
|
+ return false;
|
|
|
}
|
|
|
-
|
|
|
- return false;
|
|
|
}
|
|
|
|
|
|
/* 计算反相 */
|
|
|
-bool CaculateDBData::calculatePhase(const StVolumeParam& param, const int avgDBSeconds, int& startPos, int& endPos, bool isLastReversed)
|
|
|
+bool CaculateDBData::calculatePhase(const StVolumeParam& param, int& startPos, int& endPos, bool isLastReversed)
|
|
|
{
|
|
|
startPos = -1;
|
|
|
endPos = -1;
|
|
@@ -572,20 +652,20 @@ bool CaculateDBData::calculatePhase(const StVolumeParam& param, const int avgDBS
|
|
|
const int calculateDuration = param.GetPhaseDuration();
|
|
|
if (calculateDuration >= CACHE_DATA_SECOND_MAX)
|
|
|
{
|
|
|
- SPDLOG_WARN("反相持续时间({})不能大于等于最大缓存{}秒", calculateDuration, CACHE_DATA_SECOND_MAX);
|
|
|
+ SPDLOG_WARN("反相持续时间 {}秒 不能大于等于最大缓存{}秒", calculateDuration, CACHE_DATA_SECOND_MAX);
|
|
|
return false;
|
|
|
}
|
|
|
/* 判断队列中数据数量是否满足计算需要的数目 */
|
|
|
if(ringQueue.QueueSize() < calculateDuration || calculateDuration <= 0)
|
|
|
{
|
|
|
- SPDLOG_INFO("队列中数据暂不满足反相持续时间检测({})的要求,当前队列大小为{}", calculateDuration, ringQueue.QueueSize());
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (calculateDuration >= avgDBSeconds)
|
|
|
- {
|
|
|
- SPDLOG_WARN("反相持续时间({})不能大于等于{}秒", calculateDuration, avgDBSeconds);
|
|
|
+ SPDLOG_DEBUG("队列中数据暂不满足反相持续时间检测 {}秒 的要求,当前队列大小为 {}秒", calculateDuration, ringQueue.QueueSize());
|
|
|
return false;
|
|
|
}
|
|
|
+ // if (calculateDuration >= avgDBSeconds)
|
|
|
+ // {
|
|
|
+ // SPDLOG_WARN("反相持续时间({})不能大于等于{}秒", calculateDuration, avgDBSeconds);
|
|
|
+ // return false;
|
|
|
+ // }
|
|
|
|
|
|
StPhase phaseData;
|
|
|
|