fix volume scaling
[vuplus_dvbapp] / 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 #ifdef HAVE_DVB_API_VERSION
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 #endif
87
88         printf("Setvolume: %d %d (raw)\n", leftVol, rightVol);
89         printf("Setvolume: %d %d (-1db)\n", left, right);
90         printf("Setvolume: %d %d (lin)\n", mixer.volume_left, mixer.volume_right);
91
92         int fd = openMixer();
93         if (fd >= 0)
94         {
95 #ifdef HAVE_DVB_API_VERSION
96                 ioctl(fd, AUDIO_SET_MIXER, &mixer);
97 #endif
98                 closeMixer(fd);
99                 return;
100         }
101
102         //HACK?
103         FILE *f;
104         if((f = fopen("/proc/stb/avs/0/volume", "wb")) == NULL) {
105                 printf("cannot open /proc/stb/avs/0/volume\n");
106                 return;
107         }
108
109         fprintf(f, "%d", left); /* in -1dB */
110
111         fclose(f);
112 }
113
114 int eDVBVolumecontrol::getVolume()
115 {
116         if (isMuted())
117                 return 0;
118         return leftVol;
119 }
120
121 bool eDVBVolumecontrol::isMuted()
122 {
123         return muted;
124 }
125
126
127 void eDVBVolumecontrol::volumeMute()
128 {
129         int fd = openMixer();
130 #ifdef HAVE_DVB_API_VERSION     
131         ioctl(fd, AUDIO_SET_MUTE, true);
132 #endif
133         closeMixer(fd);
134         muted = true;
135
136         //HACK?
137         FILE *f;
138         if((f = fopen("/proc/stb/audio/j1_mute", "wb")) == NULL) {
139                 printf("cannot open /proc/stb/audio/j1_mute\n");
140                 return;
141         }
142         
143         fprintf(f, "%d", 1);
144
145         fclose(f);
146 }
147
148 void eDVBVolumecontrol::volumeUnMute()
149 {
150         int fd = openMixer();
151 #ifdef HAVE_DVB_API_VERSION
152         ioctl(fd, AUDIO_SET_MUTE, false);
153 #endif
154         closeMixer(fd);
155         muted = false;
156
157         //HACK?
158         FILE *f;
159         if((f = fopen("/proc/stb/audio/j1_mute", "wb")) == NULL) {
160                 printf("cannot open /proc/stb/audio/j1_mute\n");
161                 return;
162         }
163         
164         fprintf(f, "%d", 0);
165
166         fclose(f);
167 }
168
169 void eDVBVolumecontrol::volumeToggleMute()
170 {
171         if (isMuted())
172                 volumeUnMute();
173         else
174                 volumeMute();
175 }