add more configPaths
[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 / 100.0 * 63.0;
72         right = 63 - rightVol / 100.0 * 63.0;
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
95 int eDVBVolumecontrol::getVolume()
96 {
97         if (isMuted())
98                 return 0;
99         return leftVol;
100 }
101
102 bool eDVBVolumecontrol::isMuted()
103 {
104         return muted;
105 }
106
107
108 void eDVBVolumecontrol::volumeMute()
109 {
110         int fd = openMixer();
111 #ifdef HAVE_DVB_API_VERSION     
112         ioctl(fd, AUDIO_SET_MUTE, true);
113 #endif
114         closeMixer(fd);
115         muted = true;
116 }
117
118 void eDVBVolumecontrol::volumeUnMute()
119 {
120         int fd = openMixer();
121 #ifdef HAVE_DVB_API_VERSION
122         ioctl(fd, AUDIO_SET_MUTE, false);
123 #endif
124         closeMixer(fd);
125         muted = false;
126 }
127
128 void eDVBVolumecontrol::volumeToggleMute()
129 {
130         printf("Mute\n");
131         if (isMuted())
132                 volumeUnMute();
133         else
134                 volumeMute();
135                 
136 }