Skip to content

Commit c32781d

Browse files
committed
Added a realtime loudness reading to fixed term meter
1 parent 7434183 commit c32781d

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

include/FixedTermLoudnessMeter.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <chrono>
44
#include <cmath>
55
#include <span>
6+
#include <mutex>
67

78
#include "LiblufsAPI.h"
89
#include "DoubleBuffer.h"
@@ -25,7 +26,10 @@ class LIBLUFS_API FixedTermLoudnessMeter
2526
//This is not threadsafe with process calls
2627
void reset();
2728

28-
//This is threadsafe with process calls, but must only be called from a single thread at a time
29+
//This can only be called from the same thread as the process calls
30+
float getLoudnessRealtime();
31+
32+
//This is threadsafe with process calls
2933
float getLoudness() const;
3034

3135
private:
@@ -37,6 +41,7 @@ class LIBLUFS_API FixedTermLoudnessMeter
3741
const int blockLengthSamples;
3842
const float min;
3943

44+
mutable std::mutex channelProcessorsOfflineLock;
4045
DoubleBuffer<std::vector<ChannelProcessor>> channelProcessors;
4146

4247
size_t blockWritePos = 0;

src/FixedTermLoudnessMeter.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,33 @@ void FixedTermLoudnessMeter::reset()
6868
blockWritePos = 0;
6969
}
7070

71+
float FixedTermLoudnessMeter::getLoudnessRealtime()
72+
{
73+
const std::vector<ChannelProcessor>& processors = channelProcessors.realtimeAquire();
74+
75+
float accumulatedChannels = 0.0f;
76+
77+
std::for_each(processors.begin(), processors.end(), [&accumulatedChannels](const ChannelProcessor& processor)
78+
{
79+
accumulatedChannels += processor.getCurrentBlockMeanSquares() * processor.getWeighting();
80+
});
81+
82+
if(accumulatedChannels == 0.0f)
83+
{
84+
return min;
85+
}
86+
87+
float loudness = -0.691f + 10.0f * std::log10(accumulatedChannels);
88+
89+
channelProcessors.realtimeRelease();
90+
91+
return loudness;
92+
}
93+
7194
float FixedTermLoudnessMeter::getLoudness() const
7295
{
96+
std::scoped_lock<std::mutex> lock{channelProcessorsOfflineLock};
97+
7398
const std::vector<ChannelProcessor>& processors = channelProcessors.nonRealtimeRead();
7499

75100
float accumulatedChannels = 0.0f;

0 commit comments

Comments
 (0)