Remove check legacy dvbapi version.
[vuplus_dvbapp] / 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 #define VIDEO_DEV "/dev/dvb/adapter0/video0"
9 #define AUDIO_DEV "/dev/dvb/adapter0/audio0"
10 #include <linux/dvb/audio.h>
11 #include <linux/dvb/video.h>
12
13 eDVBVolumecontrol* eDVBVolumecontrol::instance = NULL;
14
15 eDVBVolumecontrol* eDVBVolumecontrol::getInstance()
16 {
17         if (instance == NULL)
18                 instance = new eDVBVolumecontrol;
19         return instance;
20 }
21
22 eDVBVolumecontrol::eDVBVolumecontrol()
23 {
24         volumeUnMute();
25         setVolume(100, 100);
26 }
27
28 int eDVBVolumecontrol::openMixer()
29 {
30         return open( AUDIO_DEV, O_RDWR );
31 }
32
33 void eDVBVolumecontrol::closeMixer(int fd)
34 {
35         close(fd);
36 }
37
38 void eDVBVolumecontrol::volumeUp(int left, int right)
39 {
40         setVolume(leftVol + left, rightVol + right);
41 }
42
43 void eDVBVolumecontrol::volumeDown(int left, int right)
44 {
45         setVolume(leftVol - left, rightVol - right);
46 }
47
48 int eDVBVolumecontrol::checkVolume(int vol)
49 {
50         if (vol < 0)
51                 vol = 0;
52         else if (vol > 100)
53                 vol = 100;
54         return vol;
55 }
56
57 void eDVBVolumecontrol::setVolume(int left, int right)
58 {
59                 /* left, right is 0..100 */
60         leftVol = checkVolume(left);
61         rightVol = checkVolume(right);
62         
63                 /* convert to -1dB steps */
64         left = 63 - leftVol * 63 / 100;
65         right = 63 - rightVol * 63 / 100;
66                 /* now range is 63..0, where 0 is loudest */
67
68         audio_mixer_t mixer;
69
70         mixer.volume_left = left;
71         mixer.volume_right = right;
72
73         eDebug("Setvolume: %d %d (raw)", leftVol, rightVol);
74         eDebug("Setvolume: %d %d (-1db)", left, right);
75
76         int fd = openMixer();
77         if (fd >= 0)
78         {
79                 ioctl(fd, AUDIO_SET_MIXER, &mixer);
80                 closeMixer(fd);
81                 return;
82         }
83
84         //HACK?
85         FILE *f;
86         if((f = fopen("/proc/stb/avs/0/volume", "wb")) == NULL) {
87                 eDebug("cannot open /proc/stb/avs/0/volume(%m)");
88                 return;
89         }
90
91         fprintf(f, "%d", left); /* in -1dB */
92
93         fclose(f);
94 }
95
96 int eDVBVolumecontrol::getVolume()
97 {
98         return leftVol;
99 }
100
101 bool eDVBVolumecontrol::isMuted()
102 {
103         return muted;
104 }
105
106
107 void eDVBVolumecontrol::volumeMute()
108 {
109         int fd = openMixer();
110         ioctl(fd, AUDIO_SET_MUTE, true);
111         closeMixer(fd);
112         muted = true;
113
114         //HACK?
115         FILE *f;
116         if((f = fopen("/proc/stb/audio/j1_mute", "wb")) == NULL) {
117                 eDebug("cannot open /proc/stb/audio/j1_mute(%m)");
118                 return;
119         }
120         
121         fprintf(f, "%d", 1);
122
123         fclose(f);
124 }
125
126 void eDVBVolumecontrol::volumeUnMute()
127 {
128         int fd = openMixer();
129         ioctl(fd, AUDIO_SET_MUTE, false);
130         closeMixer(fd);
131         muted = false;
132
133         //HACK?
134         FILE *f;
135         if((f = fopen("/proc/stb/audio/j1_mute", "wb")) == NULL) {
136                 eDebug("cannot open /proc/stb/audio/j1_mute(%m)");
137                 return;
138         }
139         
140         fprintf(f, "%d", 0);
141
142         fclose(f);
143 }
144
145 void eDVBVolumecontrol::volumeToggleMute()
146 {
147         if (isMuted())
148                 volumeUnMute();
149         else
150                 volumeMute();
151 }