1 #include <lib/base/ebase.h>
2 #include <lib/base/eerror.h>
3 #include <lib/system/init.h>
4 #include <lib/system/init_num.h>
5 #include <lib/driver/eavswitch.h>
6 #include <lib/driver/audiodynamic.h>
7 #include <lib/system/econfig.h>
10 #include <sys/ioctl.h>
13 int eAudioDynamicCompression::read_rms(int i
)
18 if (ioctl(fd
, 0, &arg
))
20 return (int)(sqrt(arg
.dst
/ arg
.dst_n
) * 100000 / (17794890));
23 void eAudioDynamicCompression::doPoll()
25 int sum
= read_rms(0) + read_rms(1) + read_rms(4) + read_rms(5);
26 last_val
[last_ptr
++] = sum
;
34 current_fast
= current_value
;
38 if (last_val
[i
] > maxval
)
41 current_value
= current_fast
;
43 if (maxval
< hyst_low
)
46 } else if (current_fast
> hyst_hi
* 2)
49 } else if (current_fast
> hyst_hi
)
54 // eDebug("%d, %d (%d %d) %d %d", sum, result, hyst_low, hyst_hi, maxval, current_fast);
55 eAVSwitch
*avsw
=eAVSwitch::getInstance();
56 if (avsw
&& result
&& enabled
&& !avsw
->getMute())
57 avsw
->changeVolume(0, -result
);
60 eAudioDynamicCompression
*eAudioDynamicCompression::instance
;
62 eAudioDynamicCompression::eAudioDynamicCompression(): pollTimer(eApp
)
64 fd
= ::open("/dev/audio", O_RDWR
);
67 eWarning("can't open /dev/audio (%m) - disabling audio dynamic compression support.");
71 // CONNECT(pollTimer.timeout, eAudioDynamicCompression::doPoll);
74 eConfig::getInstance()->getKey("/elitedvb/audio/dynamicadjust", enabled
);
76 eConfig::getInstance()->getKey("/ezap/audio/dynamicadjust_value", val
);
83 for (int i
=0; i
<100; ++i
)
88 void eAudioDynamicCompression::setEnable(int enable
)
92 pollTimer
.start(100, 0);
97 eAudioDynamicCompression::~eAudioDynamicCompression()
102 eConfig::getInstance()->setKey("/elitedvb/audio/dynamicadjust", enabled
);
103 eConfig::getInstance()->setKey("/ezap/audio/dynamicadjust_value", hyst_hi
);
106 eAutoInitP0
<eAudioDynamicCompression
> init_eAudioDynamicCompression(eAutoInitNumbers::dvb
, "eAudioDynamicCompression");