trunk 20080912
[gitenigma.git] / lib / driver / audiodynamic.cpp
blob228f57ff8eb45b1d15e829cfd77b4664af3494cf
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>
8 #include <unistd.h>
9 #include <fcntl.h>
10 #include <sys/ioctl.h>
11 #include <math.h>
13 int eAudioDynamicCompression::read_rms(int i)
15 struct arg_s arg;
16 arg.num = i;
17 arg.clear = 1;
18 if (ioctl(fd, 0, &arg))
19 return -1;
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;
27 if (last_ptr == 100)
28 last_ptr = 0;
30 int result = 0;
32 current_value = sum;
34 current_fast = current_value;
36 int i, maxval=0;
37 for (i=0; i<100; ++i)
38 if (last_val[i] > maxval)
39 maxval = last_val[i];
41 current_value = current_fast;
43 if (maxval < hyst_low)
45 result = +1;
46 } else if (current_fast > hyst_hi * 2)
48 result = -4;
49 } else if (current_fast > hyst_hi)
51 result = -1;
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);
65 if (fd < 0)
67 eWarning("can't open /dev/audio (%m) - disabling audio dynamic compression support.");
68 return;
71 // CONNECT(pollTimer.timeout, eAudioDynamicCompression::doPoll);
73 enabled = 0;
74 eConfig::getInstance()->getKey("/elitedvb/audio/dynamicadjust", enabled);
75 int val = 8000;;
76 eConfig::getInstance()->getKey("/ezap/audio/dynamicadjust_value", val);
77 setMax(val);
78 setEnable(enabled);
80 current_value = 0;
81 instance = this;
83 for (int i=0; i<100; ++i)
84 last_val[i] = 0;
85 last_ptr = 0;
88 void eAudioDynamicCompression::setEnable(int enable)
90 enabled = enable;
91 if (enabled)
92 pollTimer.start(100, 0);
93 else
94 pollTimer.stop();
97 eAudioDynamicCompression::~eAudioDynamicCompression()
99 if (fd >= 0)
100 ::close(fd);
101 instance = 0;
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");