~blackskad/gnomeradio/dev-vol-button

« back to all changes in this revision

Viewing changes to src/tech.c

  • Committer: mfcn
  • Date: 2008-09-13 15:05:32 UTC
  • Revision ID: svn-v3-trunk0:ba97a3d1-ec25-0410-b1c6-e06ad936ea6c:trunk:206
Tags: GNOMERADIO_1_8
        * configure.in:
        * src/Makefile.am:

        Version 1.8

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
#include <sys/ioctl.h>
24
24
#include <assert.h>
25
25
 
26
 
#include <linux/videodev.h>
27
26
#include <sys/soundcard.h>
28
27
 
29
28
#include "tech.h"
30
29
 
31
 
static int freq_fact, fd = -1, mixer_fd = -1, mixer_src = -1;
 
30
static int mixer_fd = -1, mixer_src = -1;
32
31
static char *devices[] = SOUND_DEVICE_NAMES;
33
32
 
34
33
/*
170
169
        
171
170
        return volume;
172
171
}
173
 
 
174
 
/*
175
 
 * These functions handle the radio device
176
 
 */
177
 
 
178
 
int radio_init(char *device)
179
 
{
180
 
        struct video_tuner tuner;
181
 
        
182
 
        if ((fd = open(device, O_RDONLY))< 0)
183
 
                return 0;
184
 
        
185
 
        tuner.tuner = 0;
186
 
        if (ioctl (fd, VIDIOCGTUNER, &tuner) < 0)
187
 
                freq_fact = 16;
188
 
        else
189
 
        {
190
 
                if ((tuner.flags & VIDEO_TUNER_LOW) == 0)
191
 
                        freq_fact = 16;
192
 
                else 
193
 
                        freq_fact = 16000;
194
 
        }               
195
 
        
196
 
        radio_unmute();
197
 
        
198
 
        return 1;
199
 
}
200
 
 
201
 
int radio_is_init(void)
202
 
{
203
 
        return (fd >= 0);
204
 
}
205
 
 
206
 
void radio_stop(void)
207
 
{
208
 
        radio_mute();
209
 
        
210
 
        if (fd >= 0)
211
 
                close(fd);
212
 
}
213
 
 
214
 
int radio_setfreq(float freq)
215
 
{
216
 
    int ifreq = (freq+1.0/32)*freq_fact;
217
 
    if (fd<0)
218
 
        return 0;
219
 
    
220
 
#if 0
221
 
        printf("Setting to %i (= %.2f)\n", ifreq, freq);
222
 
#endif
223
 
        
224
 
        if ((freq > 108) || (freq < 65))
225
 
                return 1;
226
 
 
227
 
        assert ((freq <= 108) && (freq > 65));
228
 
 
229
 
    return ioctl(fd, VIDIOCSFREQ, &ifreq);
230
 
}
231
 
 
232
 
int radio_check_station(float freq)
233
 
{
234
 
        static int a, b;
235
 
        static float last;
236
 
        int signal;
237
 
        
238
 
        signal = radio_getsignal();
239
 
        
240
 
        if (last == 0.0f)
241
 
                last = freq;
242
 
        
243
 
        if ((a + b + signal > 8) && (fabsf(freq - last) > 0.25f)) {
244
 
                a = b = 0;
245
 
                last = freq;
246
 
                return 1;
247
 
        }
248
 
        a = b;
249
 
        b = signal;
250
 
        return 0;
251
 
}       
252
 
 
253
 
 
254
 
void radio_unmute(void)
255
 
{
256
 
    struct video_audio vid_aud;
257
 
 
258
 
    if (fd<0)
259
 
        return;
260
 
 
261
 
    if (ioctl(fd, VIDIOCGAUDIO, &vid_aud))
262
 
                perror("VIDIOCGAUDIO");
263
 
    /*if (vid_aud.volume == 0)*/
264
 
        vid_aud.volume = 0xFFFF;
265
 
    vid_aud.flags &= ~VIDEO_AUDIO_MUTE;
266
 
        vid_aud.mode = VIDEO_SOUND_STEREO;
267
 
        
268
 
    if (ioctl(fd, VIDIOCSAUDIO, &vid_aud))
269
 
                perror("VIDIOCSAUDIO");
270
 
}
271
 
 
272
 
void radio_mute(void)
273
 
{
274
 
    struct video_audio vid_aud;
275
 
 
276
 
    if (fd<0)
277
 
        return;
278
 
 
279
 
    if (ioctl(fd, VIDIOCGAUDIO, &vid_aud))
280
 
                perror("VIDIOCGAUDIO");
281
 
    vid_aud.flags |= VIDEO_AUDIO_MUTE;
282
 
    if (ioctl(fd, VIDIOCSAUDIO, &vid_aud))
283
 
                perror("VIDIOCSAUDIO");
284
 
}
285
 
 
286
 
int radio_getstereo()
287
 
{
288
 
    struct video_audio va;
289
 
    va.mode=-1;
290
 
 
291
 
    if (fd<0)
292
 
        return -1;
293
 
    
294
 
    if (ioctl (fd, VIDIOCGAUDIO, &va) < 0)
295
 
                return -1;
296
 
        if (va.mode == VIDEO_SOUND_STEREO)
297
 
                return 1;
298
 
        else 
299
 
                return 0;
300
 
}
301
 
 
302
 
int radio_getsignal()
303
 
{
304
 
    struct video_tuner vt;
305
 
    int signal;
306
 
 
307
 
    if (fd<0)
308
 
        return -1;
309
 
 
310
 
    memset(&vt,0,sizeof(vt));
311
 
    ioctl (fd, VIDIOCGTUNER, &vt);
312
 
    signal=vt.signal>>13;
313
 
 
314
 
    return signal;
315
 
}