this fix is sponsored by wc frisch
[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 #include <config.h>
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         printf("[volume.cpp] Volume up\n");
48         setVolume(leftVol + left, rightVol + right);
49 }
50
51 void eDVBVolumecontrol::volumeDown(int left, int right)
52 {
53         printf("[volume.cpp] Volume down\n");
54         setVolume(leftVol - left, rightVol - right);
55 }
56
57 int eDVBVolumecontrol::checkVolume(int vol)
58 {
59         if (vol < 0)
60                 vol = 0;
61         else if (vol > 100)
62                 vol = 100;
63         return vol;
64 }
65
66 void eDVBVolumecontrol::setVolume(int left, int right)
67 {
68         leftVol = checkVolume(left);
69         rightVol = checkVolume(right);
70         
71         left = 63 - leftVol * 63 / 100;
72         right = 63 - rightVol * 63 / 100;
73         
74 #if HAVE_DVB_API_VERSION < 3   
75                 audioMixer_t mixer;
76 #else
77                 audio_mixer_t mixer;
78 #endif
79
80 #ifdef HAVE_DVB_API_VERSION
81                 mixer.volume_left = (left * left) / 64;
82                 mixer.volume_right = (right * right) / 64;
83 #endif
84
85                 int fd = openMixer();
86 #ifdef HAVE_DVB_API_VERSION
87                 ioctl(fd, AUDIO_SET_MIXER, &mixer);
88 #endif
89                 closeMixer(fd);
90                 
91                 printf("Setvolume: %d %d\n", leftVol, rightVol);
92                 printf("Setvolume: %d %d\n", left, right);              
93                 
94         //HACK?
95         FILE *f;
96         if((f = fopen("/proc/stb/avs/0/volume", "wb")) == NULL) {
97                 printf("cannot open /proc/stb/avs/0/volume\n");
98                 return;
99         }
100         
101         fprintf(f, "%d", left);
102
103         fclose(f);
104 }
105
106 int eDVBVolumecontrol::getVolume()
107 {
108         if (isMuted())
109                 return 0;
110         return leftVol;
111 }
112
113 bool eDVBVolumecontrol::isMuted()
114 {
115         return muted;
116 }
117
118
119 void eDVBVolumecontrol::volumeMute()
120 {
121         int fd = openMixer();
122 #ifdef HAVE_DVB_API_VERSION     
123         ioctl(fd, AUDIO_SET_MUTE, true);
124 #endif
125         closeMixer(fd);
126         muted = true;
127 }
128
129 void eDVBVolumecontrol::volumeUnMute()
130 {
131         int fd = openMixer();
132 #ifdef HAVE_DVB_API_VERSION
133         ioctl(fd, AUDIO_SET_MUTE, false);
134 #endif
135         closeMixer(fd);
136         muted = false;
137 }
138
139 void eDVBVolumecontrol::volumeToggleMute()
140 {
141         printf("Mute\n");
142         if (isMuted())
143                 volumeUnMute();
144         else
145                 volumeMute();
146                 
147 }