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