volume is now log.scale in driver
[enigma2.git] / lib / dvb / volume.cpp
1 #include <lib/dvb/volume.h>
2 #include <stdio.h>
3 #include <fcntl.h>
4 #include <sys/ioctl.h>
5 #include <unistd.h>
6
7 #if HAVE_DVB_API_VERSION < 3
8 #define VIDEO_DEV "/dev/dvb/card0/video0"
9 #define AUDIO_DEV "/dev/dvb/card0/audio0"
10 #include <ost/audio.h>
11 #include <ost/video.h>
12 #else
13 #define VIDEO_DEV "/dev/dvb/adapter0/video0"
14 #define AUDIO_DEV "/dev/dvb/adapter0/audio0"
15 #include <linux/dvb/audio.h>
16 #include <linux/dvb/video.h>
17 #endif
18
19 eDVBVolumecontrol* eDVBVolumecontrol::instance = NULL;
20
21 eDVBVolumecontrol* eDVBVolumecontrol::getInstance()
22 {
23         if (instance == NULL)
24                 instance = new eDVBVolumecontrol;
25         return instance;
26 }
27
28 eDVBVolumecontrol::eDVBVolumecontrol()
29 {
30         volumeUnMute();
31         setVolume(100, 100);
32 }
33
34 int eDVBVolumecontrol::openMixer()
35 {
36         return open( AUDIO_DEV, O_RDWR );
37 }
38
39 void eDVBVolumecontrol::closeMixer(int fd)
40 {
41         close(fd);
42 }
43
44 void eDVBVolumecontrol::volumeUp(int left, int right)
45 {
46         printf("[volume.cpp] Volume up\n");
47         setVolume(leftVol + left, rightVol + right);
48 }
49
50 void eDVBVolumecontrol::volumeDown(int left, int right)
51 {
52         printf("[volume.cpp] Volume down\n");
53         setVolume(leftVol - left, rightVol - right);
54 }
55
56 int eDVBVolumecontrol::checkVolume(int vol)
57 {
58         if (vol < 0)
59                 vol = 0;
60         else if (vol > 100)
61                 vol = 100;
62         return vol;
63 }
64
65 void eDVBVolumecontrol::setVolume(int left, int right)
66 {
67                 /* left, right is 0..100 */
68         leftVol = checkVolume(left);
69         rightVol = checkVolume(right);
70         
71                 /* convert to -1dB steps */
72         left = 63 - leftVol * 63 / 100;
73         right = 63 - rightVol * 63 / 100;
74                 /* now range is 63..0, where 0 is loudest */
75
76 #if HAVE_DVB_API_VERSION < 3
77         audioMixer_t mixer;
78 #else
79         audio_mixer_t mixer;
80 #endif
81
82 #if HAVE_DVB_API_VERSION < 3
83                 /* convert to linear scale. 0 = loudest, ..63 */
84         mixer.volume_left = 63.0-pow(1.068241, 63-left);
85         mixer.volume_right = 63.0-pow(1.068241, 63-right);
86 #else
87         mixer.volume_left = left;
88         mixer.volume_right = right;
89 #endif
90
91         printf("Setvolume: %d %d (raw)\n", leftVol, rightVol);
92         printf("Setvolume: %d %d (-1db)\n", left, right);
93 #if HAVE_DVB_API_VERSION < 3
94         printf("Setvolume: %d %d (lin)\n", mixer.volume_left, mixer.volume_right);
95 #endif
96
97         int fd = openMixer();
98         if (fd >= 0)
99         {
100 #ifdef HAVE_DVB_API_VERSION
101                 ioctl(fd, AUDIO_SET_MIXER, &mixer);
102 #endif
103                 closeMixer(fd);
104                 return;
105         }
106
107         //HACK?
108         FILE *f;
109         if((f = fopen("/proc/stb/avs/0/volume", "wb")) == NULL) {
110                 printf("cannot open /proc/stb/avs/0/volume\n");
111                 return;
112         }
113
114         fprintf(f, "%d", left); /* in -1dB */
115
116         fclose(f);
117 }
118
119 int eDVBVolumecontrol::getVolume()
120 {
121         if (isMuted())
122                 return 0;
123         return leftVol;
124 }
125
126 bool eDVBVolumecontrol::isMuted()
127 {
128         return muted;
129 }
130
131
132 void eDVBVolumecontrol::volumeMute()
133 {
134         int fd = openMixer();
135 #ifdef HAVE_DVB_API_VERSION     
136         ioctl(fd, AUDIO_SET_MUTE, true);
137 #endif
138         closeMixer(fd);
139         muted = true;
140
141         //HACK?
142         FILE *f;
143         if((f = fopen("/proc/stb/audio/j1_mute", "wb")) == NULL) {
144                 printf("cannot open /proc/stb/audio/j1_mute\n");
145                 return;
146         }
147         
148         fprintf(f, "%d", 1);
149
150         fclose(f);
151 }
152
153 void eDVBVolumecontrol::volumeUnMute()
154 {
155         int fd = openMixer();
156 #ifdef HAVE_DVB_API_VERSION
157         ioctl(fd, AUDIO_SET_MUTE, false);
158 #endif
159         closeMixer(fd);
160         muted = false;
161
162         //HACK?
163         FILE *f;
164         if((f = fopen("/proc/stb/audio/j1_mute", "wb")) == NULL) {
165                 printf("cannot open /proc/stb/audio/j1_mute\n");
166                 return;
167         }
168         
169         fprintf(f, "%d", 0);
170
171         fclose(f);
172 }
173
174 void eDVBVolumecontrol::volumeToggleMute()
175 {
176         if (isMuted())
177                 volumeUnMute();
178         else
179                 volumeMute();
180 }