]> git.vomp.tv Git - vompclient.git/blob - audio.cc
Connection failed detection
[vompclient.git] / audio.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "audio.h"
22
23 Audio* Audio::instance = NULL;
24
25 Audio::Audio()
26 {
27   if (instance) return;
28   instance = this;
29   initted = 0;
30   fdAudio = 0;
31   streamType = 0;
32   volume = 20;
33   muted = 0;
34   userMute = 0;
35   systemMute = 0;
36 }
37
38 Audio::~Audio()
39 {
40   instance = NULL;
41 }
42
43 Audio* Audio::getInstance()
44 {
45   return instance;
46 }
47
48 int Audio::init(UCHAR tstreamType)
49 {
50   if (initted) return 0;
51   initted = 1;
52
53 //  if ((fdAudio = open("/dev/adec_mpg", O_RDWR | O_NONBLOCK)) < 0) return 0;
54   if ((fdAudio = open("/dev/adec_mpg", O_WRONLY)) < 0) return 0;
55
56   streamType = tstreamType;
57
58   if (!initAllParams())
59   {
60     shutdown();
61     return 0;
62   }
63
64   unMute();
65
66   // Set the volume variable to what the hardware is set at now
67   int hwvol = -1;
68   int hwvolFail = ioctl(fdAudio, AV_GET_AUD_VOLUME, &hwvol);
69   if (!hwvolFail)
70   {
71     volume = 20 - ((hwvol >> 16) & 0xFF);
72     if ((volume < 0) || (volume > 20)) volume = 20;
73   }
74
75   return 1;
76 }
77
78 int Audio::initAllParams()
79 {
80   return (setStreamType(streamType) && setChannel() && setSource());
81 }
82
83 int Audio::shutdown()
84 {
85   if (!initted) return 0;
86   initted = 0;
87   close(fdAudio);
88   return 1;
89 }
90
91 int Audio::getFD()
92 {
93   if (!initted) return 0;
94
95   return fdAudio;
96 }
97
98 int Audio::write(char *buf, int len)
99 {
100   return 0; //write(fdAudio, buf, len);
101 }
102
103 int Audio::setStreamType(UCHAR type)
104 {
105   if (!initted) return 0;
106
107   if (ioctl(fdAudio, AV_SET_AUD_STREAMTYPE, type) != 0) return 0;
108   return 1;
109 }
110
111 int Audio::setChannel()
112 {
113   if (!initted) return 0;
114
115   if (ioctl(fdAudio, AV_SET_AUD_CHANNEL, 0) != 0) return 0;
116   return 1;
117 }
118
119 int Audio::setSource()
120 {
121   if (!initted) return 0;
122
123   if (ioctl(fdAudio, AV_SET_AUD_SRC, 1) != 0) return 0;
124   return 1;
125 }
126
127 int Audio::sync()
128 {
129   if (!initted) return 0;
130
131   if (ioctl(fdAudio, AV_SET_AUD_SYNC, 2) != 0) return 0;
132   return 1;
133 }
134
135 int Audio::play()
136 {
137   if (!initted) return 0;
138
139   if (ioctl(fdAudio, AV_SET_AUD_PLAY, 0) != 0) return 0;
140   return 1;
141 }
142
143 int Audio::stop()
144 {
145   if (!initted) return 0;
146
147   if (ioctl(fdAudio, AV_SET_AUD_RESET, 0x11) != 0) return 0;
148   return 1;
149 }
150
151 int Audio::mute()
152 {
153   if (!initted) return 0;
154
155   if (ioctl(fdAudio, AV_SET_AUD_MUTE, 1) != 0) return 0;
156   Log::getInstance()->log("Audio", Log::DEBUG, "MUTE MUTE MUTE");
157
158   muted = 1;
159   return 1;
160 }
161
162 int Audio::unMute()
163 {
164   if (!initted) return 0;
165
166   if (ioctl(fdAudio, AV_SET_AUD_MUTE, 0) != 0) return 0;
167   Log::getInstance()->log("Audio", Log::DEBUG, "MUTE OFF OFF OFF");
168
169   muted = 0;
170   return 1;
171 }
172
173 int Audio::pause()
174 {
175   if (!initted) return 0;
176
177   if (ioctl(fdAudio, AV_SET_AUD_PAUSE, 1) != 0) return 0;
178   return 1;
179 }
180
181 int Audio::unPause()
182 {
183   if (!initted) return 0;
184
185   if (ioctl(fdAudio, AV_SET_AUD_UNPAUSE, 1) != 0) return 0;
186   return 1;
187 }
188
189 int Audio::reset()
190 {
191   if (!initted) return 0;
192 //test();
193   if (ioctl(fdAudio, AV_SET_AUD_RESET, 0x11) != 0) return 0;
194   if (ioctl(fdAudio, AV_SET_AUD_PLAY, 0) != 0) return 0;
195
196   doMuting();
197   return 1;
198 }
199
200 int Audio::setVolume(int tvolume)
201 {
202   // parameter: 0 for silence, 20 for full
203   if ((tvolume < 0) || (tvolume > 20)) return 0;
204
205 // volume = 2 * (20 - volume);
206 // Right, that one was rubbish... 0-10 were almost
207 // inaudible, 11-20 did what should have been done
208 // over the whole 0-20 range
209
210   tvolume = 20 - tvolume;
211
212   unsigned long vol = (tvolume << 24) | (tvolume << 16);
213
214   Log::getInstance()->log("Audio", Log::DEBUG, "%lx", vol);
215   Log::getInstance()->log("Audio", Log::DEBUG, "%i", tvolume);
216
217   if (ioctl(fdAudio, AV_SET_AUD_VOLUME, &vol) != 0) return 0;
218   return 1;
219 }
220
221 #ifdef DEV
222 int Audio::test()
223 {
224 //  ULLONG stc = 0;
225 //  return ioctl(fdAudio, AV_SET_AUD_STC, &stc);
226
227   aud_sync_parms_t a;
228   a.parm1 = 0;
229   a.parm2 = 0;
230
231   int b = ioctl(fdAudio, AV_SET_AUD_DISABLE_SYNC, &a);
232
233
234   printf("Audio sync disable = %i\n", b); // is in a DEV block
235
236   return 1;
237
238
239 }
240 #endif
241
242 int Audio::volumeUp()
243 {
244   if (!initted) return 0;
245   if (userMute) toggleUserMute();
246   if (volume == 20) return volume;
247   volume++;
248   setVolume(volume);
249   return volume;
250 }
251
252 int Audio::volumeDown()
253 {
254   if (!initted) return 0;
255   if (userMute) toggleUserMute();
256   if (volume == 0) return 0;
257   volume--;
258   setVolume(volume);
259   return volume;
260 }
261
262 int Audio::getVolume()
263 {
264   if (!initted) return 0;
265   return volume;
266 }
267
268 int Audio::toggleUserMute()
269 {
270   if (!initted) return 0;
271
272   if (userMute)
273   {
274     userMute = 0;
275   }
276   else
277   {
278     userMute = 1;
279   }
280
281   doMuting();
282
283   return userMute;
284 }
285
286 int Audio::systemMuteOn()
287 {
288   systemMute = 1;
289   return doMuting();
290 }
291
292 int Audio::systemMuteOff()
293 {
294   systemMute = 0;
295   return doMuting();
296 }
297
298 int Audio::doMuting()
299 {
300   Log::getInstance()->log("Audio", Log::DEBUG, "doMuting: user=%i sys=%i", userMute, systemMute);
301
302
303   if (userMute || systemMute)
304   {
305     return mute();
306   }
307   else
308   {
309     return unMute();
310   }
311 }