summaryrefslogtreecommitdiff
path: root/gtk2_ardour/logmeter.h
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-07-22 18:45:08 +0200
committerRobin Gareus <robin@gareus.org>2013-07-22 18:45:08 +0200
commit708edd586611c6b1132e4f25be4c2c0865ba4738 (patch)
tree501211154ef6f5cc06606874edfe3371f7049825 /gtk2_ardour/logmeter.h
parent72aa1cd86cf04964f08e7ca0557f73afd1c96e83 (diff)
implement new meter types
Diffstat (limited to 'gtk2_ardour/logmeter.h')
-rw-r--r--gtk2_ardour/logmeter.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/gtk2_ardour/logmeter.h b/gtk2_ardour/logmeter.h
index d861509080..c7b18ea6b9 100644
--- a/gtk2_ardour/logmeter.h
+++ b/gtk2_ardour/logmeter.h
@@ -34,6 +34,16 @@ alt_log_meter (float power)
}
#endif
+/* prototypes - avoid compiler warning */
+inline float log_meter (float db);
+inline float meter_deflect_ppm (float);
+inline float meter_deflect_din (float);
+inline float meter_deflect_nordic (float);
+inline float meter_deflect_vu (float);
+inline float meter_deflect_k (float, float);
+
+
+
inline float
log_meter (float db)
{
@@ -65,4 +75,71 @@ log_meter (float db)
return def/115.0f;
}
+inline float
+meter_deflect_ppm (float db)
+{
+ if (db < -30) {
+ // 2.258 == ((-30 + 32.0)/ 28.0) / 10^(-30 / 20);
+ return (dB_to_coefficient(db) * 2.258769757f);
+ } else {
+ const float rv = (db + 32.0f) / 28.0f;
+ if (rv < 1.0) {
+ return rv;
+ } else {
+ return 1.0;
+ }
+ }
+}
+
+inline float
+meter_deflect_din (float db)
+{
+ float rv = dB_to_coefficient(db);
+ rv = sqrtf (sqrtf (2.3676f * rv)) - 0.1803f;
+ if (rv >= 1.0) {
+ return 1.0;
+ } else {
+ return (rv > 0 ? rv : 0.0);
+ }
+}
+
+inline float
+meter_deflect_nordic (float db)
+{
+ if (db < -60) {
+ return 0.0;
+ } else {
+ const float rv = (db + 60.0f) / 54.0f;
+ if (rv < 1.0) {
+ return rv;
+ } else {
+ return 1.0;
+ }
+ }
+}
+
+inline float
+meter_deflect_vu (float db)
+{
+ const float rv = 6.77165f * dB_to_coefficient(db);
+ if (rv > 1.0) return 1.0;
+ return rv;
+}
+
+inline float
+meter_deflect_k (float db, float krange)
+{
+ db+=krange;
+ if (db < -40.0f) {
+ return (dB_to_coefficient(db) * 500.0f / (krange + 45.0f));
+ } else {
+ const float rv = (db + 45.0f) / (krange + 45.0f);
+ if (rv < 1.0) {
+ return rv;
+ } else {
+ return 1.0;
+ }
+ }
+}
+
#endif /* __ardour_gtk_log_meter_h__ */