annotate stream/stream_radio.c @ 25893:638493dc056e

Check that index is still within bounds of samples array. Previous check is not enough and the code is not performance critical so do it the easy way.
author reimar
date Tue, 29 Jan 2008 22:14:00 +0000
parents 68015115f63a
children afa125da85cf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1 /*
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
2 * Radio support
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
3 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
4 * Initially wrote by Vladimir Voroshilov <voroshil@univer.omsk.su>.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
5 * Based on tv.c and tvi_v4l2.c code.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
6 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
10 * (at your option) any later version.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
11 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
15 * GNU General Public License for more details.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
16 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
20 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
21 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
22 * Abilities:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
23 * * Listening v4l compatible radio cards using line-in or
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
24 * similar cable
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
25 * * Grabbing audio data using -ao pcm or -dumpaudio
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
26 * (must be compiled with --enable-radio-capture).
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
27 */
19608
18a538908577 Check for requirements at configure-time, not at run-time.
diego
parents: 19606
diff changeset
28 #include "config.h"
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
29
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
30 #include <stdlib.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
31 #include <stdio.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
32 #include <string.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
33 #include <sys/ioctl.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
34 #include <errno.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
35 #include <unistd.h>
20985
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
36
22948
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
37 #ifdef HAVE_RADIO_BSDBT848
20985
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
38 #include <sys/param.h>
22948
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
39 #ifdef IOCTL_BT848_H_NAME
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
40 #include IOCTL_BT848_H_NAME
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
41 #endif
20985
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
42
22948
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
43 #else // HAVE_RADIO_BSDBT848
20985
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
44
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
45 #include <linux/types.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
46
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
47 #ifdef HAVE_RADIO_V4L2
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
48 #include <linux/videodev2.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
49 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
50
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
51 #ifdef HAVE_RADIO_V4L
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
52 #include <linux/videodev.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
53 #warning "V4L is deprecated and will be removed in future"
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
54 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
55
22948
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
56 #endif // !IOCTL_BT848_H_NAME
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
57
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
58
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
59 #include "stream.h"
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
60 #include "libmpdemux/demuxer.h"
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
61 #include "m_struct.h"
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
62 #include "m_option.h"
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
63 #include "mp_msg.h"
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
64 #include "help_mp.h"
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
65 #include "stream_radio.h"
23703
9fb716ab06a3 Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents: 23485
diff changeset
66 #include "libavutil/avstring.h"
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
67
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
68 #ifdef USE_RADIO_CAPTURE
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
69 #include "audio_in.h"
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
70
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
71 #ifdef HAVE_SYS_SOUNDCARD_H
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
72 #include <sys/soundcard.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
73 #else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
74 #ifdef HAVE_SOUNDCARD_H
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
75 #include <soundcard.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
76 #else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
77 #include <linux/soundcard.h>
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
78 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
79 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
80
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
81 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
82
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
83 typedef struct radio_channels_s {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
84 int index; ///< channel index in channels list
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
85 float freq; ///< frequency in MHz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
86 char name[20]; ///< channel name
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
87 struct radio_channels_s * next;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
88 struct radio_channels_s * prev;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
89 } radio_channels_t;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
90
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
91 /// default values for options
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
92 radio_param_t stream_radio_defaults={
22948
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
93 #ifdef HAVE_RADIO_BSDBT848
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
94 "/dev/tuner0", //device
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
95 87.50, //freq_min
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
96 108.00, //freq_max
20985
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
97 #else
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
98 "/dev/radio0", //device;
20985
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
99 #endif
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
100 "default", //driver
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
101 NULL, //channels
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
102 100, //volume
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
103 NULL, //adevice
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
104 44100, //arate
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
105 2, //achannels
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
106 0, //freq_channel
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
107 NULL, //capture
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
108 };
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
109
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
110 typedef struct radio_priv_s {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
111 int radio_fd; ///< radio device descriptor
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
112 int frac; ///< fraction value (see comment to init_frac)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
113 radio_channels_t* radio_channel_list;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
114 radio_channels_t* radio_channel_current;
20758
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
115 float rangelow; ///< lowest tunable frequency in MHz
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
116 float rangehigh; ///< highest tunable frequency in MHz
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
117 const struct radio_driver_s* driver;
20737
eb15b01a50cb Restoring volume level of radio card on exit.
voroshil
parents: 19793
diff changeset
118 int old_snd_volume;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
119 #ifdef USE_RADIO_CAPTURE
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
120 volatile int do_capture; ///< is capture enabled
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
121 audio_in_t audio_in;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
122 unsigned char* audio_ringbuffer;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
123 int audio_head; ///< start of meanfull data in ringbuffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
124 int audio_tail; ///< end of meanfull data in ringbuffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
125 int audio_buffer_size; ///< size of ringbuffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
126 int audio_cnt; ///< size of meanfull data inringbuffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
127 int audio_drop; ///< number of dropped bytes
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
128 int audio_inited;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
129 #endif
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
130 radio_param_t *radio_param;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
131 } radio_priv_t;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
132
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
133 typedef struct radio_driver_s {
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
134 char* name;
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
135 char* info;
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
136 int (*init_frac)(radio_priv_t* priv);
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
137 void (*set_volume)(radio_priv_t* priv,int volume);
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
138 int (*get_volume)(radio_priv_t* priv,int* volume);
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
139 int (*set_frequency)(radio_priv_t* priv,float frequency);
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
140 int (*get_frequency)(radio_priv_t* priv,float* frequency);
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
141 } radio_driver_t;
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
142
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
143 #define ST_OFF(f) M_ST_OFF(radio_param_t,f)
25242
371a40dcc1cc stream_opts arrays should be const
reimar
parents: 25211
diff changeset
144 static const m_option_t stream_opts_fields[] = {
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
145 {"hostname", ST_OFF(freq_channel), CONF_TYPE_FLOAT, 0, 0 ,0, NULL},
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
146 {"filename", ST_OFF(capture), CONF_TYPE_STRING, 0, 0 ,0, NULL},
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
147 { NULL, NULL, 0, 0, 0, 0, NULL }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
148 };
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
149
25691
68015115f63a stream_opts should be const
reimar
parents: 25242
diff changeset
150 static const struct m_struct_st stream_opts = {
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
151 "radio",
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
152 sizeof(radio_param_t),
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
153 &stream_radio_defaults,
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
154 stream_opts_fields
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
155 };
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
156
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
157 static void close_s(struct stream_st * stream);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
158 #ifdef USE_RADIO_CAPTURE
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
159 static int clear_buffer(radio_priv_t* priv);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
160 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
161
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
162
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
163 /*****************************************************************
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
164 * \brief parse channels parameter and store result into list
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
165 * \param freq_channel if channels!=NULL this mean channel number, otherwise - frequency
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
166 * \param pfreq selected frequency (from selected channel or from URL)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
167 * \result STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
168 *
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
169 * channels option must be in the following format
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
170 * <frequency>-<name>,<frequency>-<name>,...
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
171 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
172 * '_' will be replaced with spaces.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
173 *
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
174 * If channels option is not null, number in movie URL will be treated as
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
175 * channel position in channel list.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
176 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
177 static int parse_channels(radio_priv_t* priv,float freq_channel,float* pfreq){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
178 char** channels;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
179 int i;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
180 int channel = 0;
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
181 if (priv->radio_param->channels){
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
182 /*parsing channels string*/
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
183 channels=priv->radio_param->channels;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
184
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
185 mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_ChannelNamesDetected);
19606
832d6f6f805e Do not cast calloc/malloc results
reimar
parents: 19568
diff changeset
186 priv->radio_channel_list = malloc(sizeof(radio_channels_t));
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
187 priv->radio_channel_list->index=1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
188 priv->radio_channel_list->next=NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
189 priv->radio_channel_list->prev=NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
190 priv->radio_channel_current = priv->radio_channel_list;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
191
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
192 while (*channels) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
193 char* tmp = *(channels++);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
194 char* sep = strchr(tmp,'-');
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
195 if (!sep) continue; // Wrong syntax, but mplayer should not crash
23703
9fb716ab06a3 Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents: 23485
diff changeset
196 av_strlcpy(priv->radio_channel_current->name, sep + 1,sizeof(priv->radio_channel_current->name)-1);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
197
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
198 sep[0] = '\0';
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
199
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
200 priv->radio_channel_current->freq=atof(tmp);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
201
20758
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
202 if ((priv->radio_channel_current->freq>priv->rangehigh)||(priv->radio_channel_current->freq<priv->rangelow))
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
203 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_WrongFreqForChannel,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
204 priv->radio_channel_current->name);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
205
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
206 while ((sep=strchr(priv->radio_channel_current->name, '_'))) sep[0] = ' ';
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
207
19606
832d6f6f805e Do not cast calloc/malloc results
reimar
parents: 19568
diff changeset
208 priv->radio_channel_current->next = malloc(sizeof(radio_channels_t));
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
209 priv->radio_channel_current->next->index = priv->radio_channel_current->index + 1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
210 priv->radio_channel_current->next->prev = priv->radio_channel_current;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
211 priv->radio_channel_current->next->next = NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
212 priv->radio_channel_current = priv->radio_channel_current->next;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
213 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
214 if (priv->radio_channel_current->prev)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
215 priv->radio_channel_current->prev->next = NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
216 free(priv->radio_channel_current);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
217
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
218 if (freq_channel)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
219 channel = freq_channel;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
220 else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
221 channel = 1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
222
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
223 priv->radio_channel_current = priv->radio_channel_list;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
224 for (i = 1; i < channel; i++)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
225 if (priv->radio_channel_current->next)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
226 priv->radio_channel_current = priv->radio_channel_current->next;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
227 if (priv->radio_channel_current->index!=channel){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
228 if (((float)((int)freq_channel))!=freq_channel)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
229 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_WrongChannelNumberFloat,freq_channel);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
230 else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
231 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_WrongChannelNumberInt,(int)freq_channel);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
232 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
233 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
234 mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_SelectedChannel, priv->radio_channel_current->index,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
235 priv->radio_channel_current->name, priv->radio_channel_current->freq);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
236 *pfreq=priv->radio_channel_current->freq;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
237 }else{
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
238 if (freq_channel){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
239 mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_FreqParameterDetected);
19606
832d6f6f805e Do not cast calloc/malloc results
reimar
parents: 19568
diff changeset
240 priv->radio_channel_list=malloc(sizeof(radio_channels_t));
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
241 priv->radio_channel_list->next=NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
242 priv->radio_channel_list->prev=NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
243 priv->radio_channel_list->index=1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
244 snprintf(priv->radio_channel_list->name,sizeof(priv->radio_channel_current->name)-1,"Freq: %.2f",freq_channel);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
245
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
246 priv->radio_channel_current=priv->radio_channel_list;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
247 *pfreq=freq_channel;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
248 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
249 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
250 mp_msg(MSGT_RADIO, MSGL_DBG2, MSGTR_RADIO_DoneParsingChannels);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
251 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
252 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
253
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
254 #ifdef HAVE_RADIO_V4L2
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
255 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
256 * \brief get fraction value for using in set_frequency and get_frequency
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
257 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
258 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
259 * V4L2_TUNER_CAP_LOW:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
260 * unit=62.5Hz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
261 * frac= 1MHz/unit=1000000/62.5 =16000
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
262 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
263 * otherwise:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
264 * unit=62500Hz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
265 * frac= 1MHz/unit=1000000/62500 =16
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
266 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
267 static int init_frac_v4l2(radio_priv_t* priv){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
268 struct v4l2_tuner tuner;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
269
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
270 memset(&tuner,0,sizeof(tuner));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
271 tuner.index=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
272 if (ioctl(priv->radio_fd, VIDIOC_G_TUNER, &tuner)<0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
273 mp_msg(MSGT_RADIO,MSGL_WARN,MSGTR_RADIO_GetTunerFailed,strerror(errno),priv->frac);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
274 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
275 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
276 if(tuner.type!=V4L2_TUNER_RADIO){
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
277 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_NotRadioDevice,priv->radio_param->device);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
278 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
279 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
280 if(tuner.capability & V4L2_TUNER_CAP_LOW){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
281 priv->frac=16000;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
282 mp_msg(MSGT_RADIO,MSGL_DBG2,MSGTR_RADIO_TunerCapLowYes,priv->frac);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
283 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
284 else{
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
285 priv->frac=16;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
286 mp_msg(MSGT_RADIO,MSGL_DBG2,MSGTR_RADIO_TunerCapLowNo,priv->frac);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
287 }
20758
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
288
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
289 priv->rangelow=((float)tuner.rangelow)/priv->frac;
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
290 priv->rangehigh=((float)tuner.rangehigh)/priv->frac;
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
291 mp_msg(MSGT_RADIO,MSGL_V,MSGTR_RADIO_FreqRange,priv->rangelow,priv->rangehigh);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
292 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
293 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
294
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
295 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
296 * \brief tune card to given frequency
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
297 * \param frequency frequency in MHz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
298 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
299 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
300 static int set_frequency_v4l2(radio_priv_t* priv,float frequency){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
301 struct v4l2_frequency freq;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
302
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
303 memset(&freq,0,sizeof(freq));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
304 freq.tuner=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
305 freq.type=V4L2_TUNER_RADIO;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
306 freq.frequency=frequency*priv->frac;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
307 if(ioctl(priv->radio_fd,VIDIOC_S_FREQUENCY,&freq)<0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
308 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_SetFreqFailed,freq.frequency,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
309 frequency,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
310 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
311 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
312 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
313 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
314
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
315 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
316 * \brief get current tuned frequency from card
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
317 * \param frequency where to store frequency in MHz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
318 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
319 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
320 static int get_frequency_v4l2(radio_priv_t* priv,float* frequency){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
321 struct v4l2_frequency freq;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
322 memset(&freq,0,sizeof(freq));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
323 if (ioctl(priv->radio_fd, VIDIOC_G_FREQUENCY, &freq) < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
324 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_GetFreqFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
325 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
326 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
327 *frequency=((float)freq.frequency)/priv->frac;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
328 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
329 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
330
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
331 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
332 * \brief set volume on radio card
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
333 * \param volume volume level (0..100)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
334 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
335 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
336 static void set_volume_v4l2(radio_priv_t* priv,int volume){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
337 struct v4l2_queryctrl qctrl;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
338 struct v4l2_control control;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
339
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
340 /*arg must be between 0 and 100*/
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
341 if (volume > 100) volume = 100;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
342 if (volume < 0) volume = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
343
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
344 memset(&control,0,sizeof(control));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
345 control.id=V4L2_CID_AUDIO_MUTE;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
346 control.value = (volume==0?1:0);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
347 if (ioctl(priv->radio_fd, VIDIOC_S_CTRL, &control)<0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
348 mp_msg(MSGT_RADIO,MSGL_WARN,MSGTR_RADIO_SetMuteFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
349 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
350
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
351 memset(&qctrl,0,sizeof(qctrl));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
352 qctrl.id = V4L2_CID_AUDIO_VOLUME;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
353 if (ioctl(priv->radio_fd, VIDIOC_QUERYCTRL, &qctrl) < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
354 mp_msg(MSGT_RADIO, MSGL_WARN, MSGTR_RADIO_QueryControlFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
355 return;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
356 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
357
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
358 memset(&control,0,sizeof(control));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
359 control.id=V4L2_CID_AUDIO_VOLUME;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
360 control.value=qctrl.minimum+volume*(qctrl.maximum-qctrl.minimum)/100;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
361 if (ioctl(priv->radio_fd, VIDIOC_S_CTRL, &control) < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
362 mp_msg(MSGT_RADIO, MSGL_WARN,MSGTR_RADIO_SetVolumeFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
363 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
364 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
365
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
366 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
367 * \brief get current volume from radio card
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
368 * \param volume where to store volume level (0..100)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
369 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
370 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
371 static int get_volume_v4l2(radio_priv_t* priv,int* volume){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
372 struct v4l2_queryctrl qctrl;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
373 struct v4l2_control control;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
374
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
375 memset(&qctrl,0,sizeof(qctrl));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
376 qctrl.id = V4L2_CID_AUDIO_VOLUME;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
377 if (ioctl(priv->radio_fd, VIDIOC_QUERYCTRL, &qctrl) < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
378 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_QueryControlFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
379 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
380 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
381
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
382 memset(&control,0,sizeof(control));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
383 control.id=V4L2_CID_AUDIO_VOLUME;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
384 if (ioctl(priv->radio_fd, VIDIOC_G_CTRL, &control) < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
385 mp_msg(MSGT_RADIO, MSGL_ERR,MSGTR_RADIO_GetVolumeFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
386 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
387 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
388
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
389 if (qctrl.maximum==qctrl.minimum)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
390 *volume=qctrl.minimum;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
391 else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
392 *volume=100*(control.value-qctrl.minimum)/(qctrl.maximum-qctrl.minimum);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
393
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
394 /*arg must be between 0 and 100*/
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
395 if (*volume > 100) *volume = 100;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
396 if (*volume < 0) *volume = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
397
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
398 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
399 }
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
400
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
401 /* v4l2 driver info structure */
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
402 static const radio_driver_t radio_driver_v4l2={
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
403 "v4l2",
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
404 MSGTR_RADIO_DriverV4L2,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
405 init_frac_v4l2,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
406 set_volume_v4l2,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
407 get_volume_v4l2,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
408 set_frequency_v4l2,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
409 get_frequency_v4l2
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
410 };
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
411 #endif //HAVE_RADIO_V4L2
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
412 #ifdef HAVE_RADIO_V4L
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
413 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
414 * \brief get fraction value for using in set_frequency and get_frequency
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
415 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
416 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
417 * V4L2_TUNER_CAP_LOW:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
418 * unit=62.5Hz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
419 * frac= 1MHz/unit=1000000/62.5 =16000
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
420 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
421 * otherwise:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
422 * unit=62500Hz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
423 * frac= 1MHz/unit=1000000/62500 =16
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
424 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
425 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
426 static int init_frac_v4l(radio_priv_t* priv){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
427 struct video_tuner tuner;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
428 memset(&tuner,0,sizeof(tuner));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
429 if (ioctl(priv->radio_fd, VIDIOCGTUNER, &tuner) <0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
430 mp_msg(MSGT_RADIO,MSGL_WARN,MSGTR_RADIO_GetTunerFailed,strerror(errno),priv->frac);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
431 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
432 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
433 if(tuner.flags & VIDEO_TUNER_LOW){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
434 priv->frac=16000;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
435 mp_msg(MSGT_RADIO,MSGL_DBG2,MSGTR_RADIO_TunerCapLowYes,priv->frac);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
436 }else{
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
437 priv->frac=16;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
438 mp_msg(MSGT_RADIO,MSGL_DBG2,MSGTR_RADIO_TunerCapLowNo,priv->frac);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
439 }
20758
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
440
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
441 priv->rangelow=((float)tuner.rangelow)/priv->frac;
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
442 priv->rangehigh=((float)tuner.rangehigh)/priv->frac;
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
443 mp_msg(MSGT_RADIO,MSGL_V,MSGTR_RADIO_FreqRange,priv->rangelow,priv->rangehigh);
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
444
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
445 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
446 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
447
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
448 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
449 * \brief tune card to given frequency
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
450 * \param frequency frequency in MHz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
451 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
452 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
453 static int set_frequency_v4l(radio_priv_t* priv,float frequency){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
454 __u32 freq;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
455 freq=frequency*priv->frac;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
456 if (ioctl(priv->radio_fd, VIDIOCSFREQ, &freq) < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
457 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_SetFreqFailed,freq,frequency,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
458 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
459 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
460 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
461 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
462 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
463 * \brief get current tuned frequency from card
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
464 * \param frequency where to store frequency in MHz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
465 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
466 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
467 static int get_frequency_v4l(radio_priv_t* priv,float* frequency){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
468 __u32 freq;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
469 if (ioctl(priv->radio_fd, VIDIOCGFREQ, &freq) < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
470 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_GetFreqFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
471 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
472 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
473 *frequency=((float)freq)/priv->frac;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
474 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
475 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
476
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
477 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
478 * \brief set volume on radio card
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
479 * \param volume volume level (0..100)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
480 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
481 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
482 static void set_volume_v4l(radio_priv_t* priv,int volume){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
483 struct video_audio audio;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
484
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
485 /*arg must be between 0 and 100*/
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
486 if (volume > 100) volume = 100;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
487 if (volume < 0) volume = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
488
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
489 memset(&audio,0,sizeof(audio));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
490 audio.flags = (volume==0?VIDEO_AUDIO_MUTE:0);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
491 if (ioctl(priv->radio_fd, VIDIOCSAUDIO, &audio)<0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
492 mp_msg(MSGT_RADIO,MSGL_WARN,MSGTR_RADIO_SetMuteFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
493 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
494
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
495 memset(&audio,0,sizeof(audio));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
496 audio.flags = VIDEO_AUDIO_VOLUME;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
497 audio.mode = VIDEO_SOUND_STEREO;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
498 audio.audio = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
499 audio.volume = volume* (65535 / 100);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
500
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
501 if (ioctl(priv->radio_fd, VIDIOCSAUDIO, &audio) < 0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
502 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_SetVolumeFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
503 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
504 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
505
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
506 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
507 * \brief get current volume from radio card
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
508 * \param volume where to store volume level (0..100)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
509 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
510 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
511 static int get_volume_v4l(radio_priv_t* priv,int* volume){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
512 struct video_audio audio;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
513
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
514 memset(&audio,0,sizeof(audio));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
515 audio.audio=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
516 if (ioctl(priv->radio_fd, VIDIOCGAUDIO, &audio) < 0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
517 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_GetVolumeFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
518 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
519 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
520
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
521 if (audio.flags & VIDEO_AUDIO_VOLUME){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
522 *volume=100*audio.volume/65535;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
523 /*arg must be between 0 and 100*/
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
524 if (*volume > 100) *volume = 100;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
525 if (*volume < 0) *volume = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
526 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
527 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
528
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
529 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
530 }
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
531
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
532 /* v4l driver info structure */
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
533 static const radio_driver_t radio_driver_v4l={
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
534 "v4l",
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
535 MSGTR_RADIO_DriverV4L,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
536 init_frac_v4l,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
537 set_volume_v4l,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
538 get_volume_v4l,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
539 set_frequency_v4l,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
540 get_frequency_v4l
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
541 };
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
542 #endif //HAVE_RADIO_V4L
22948
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
543 #ifdef HAVE_RADIO_BSDBT848
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
544
20985
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
545 /*****************************************************************
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
546 * \brief get fraction value for using in set_frequency and get_frequency
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
547 * \return STREAM_OK if success, STREAM_ERROR otherwise
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
548 *
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
549 * For *BSD BT848 frac=100
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
550 *
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
551 * Here is a coment from FreeBSD 5.2-RELEASE source code:
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
552 *
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
553 * * Tuner Notes:
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
554 * * Programming the tuner properly is quite complicated.
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
555 * * Here are some notes, based on a FM1246 data sheet for a PAL-I tuner.
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
556 * * The tuner (front end) covers 45.75 MHz - 855.25 MHz and an FM band of
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
557 * * 87.5 MHz to 108.0 MHz.
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
558 *
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
559 * Thus, frequency range is limited to 87.5-108.0, but you can change
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
560 * it, using freq_min and freq_max options
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
561 */
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
562 static int init_frac_bsdbt848(radio_priv_t* priv){
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
563 priv->frac=100;
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
564 priv->rangelow=priv->radio_param->freq_min;
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
565 priv->rangehigh=priv->radio_param->freq_max;
20985
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
566 return STREAM_OK;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
567 }
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
568
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
569 /*****************************************************************
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
570 * \brief tune card to given frequency
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
571 * \param frequency frequency in MHz
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
572 * \return STREAM_OK if success, STREAM_ERROR otherwise
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
573 */
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
574 static int set_frequency_bsdbt848(radio_priv_t* priv,float frequency){
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
575 unsigned int freq;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
576 freq=frequency*priv->frac;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
577 if(ioctl(priv->radio_fd,RADIO_SETFREQ,&freq)<0){
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
578 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_SetFreqFailed,freq, frequency, strerror(errno));
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
579 return STREAM_ERROR;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
580 }
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
581 return STREAM_OK;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
582 }
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
583
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
584 /*****************************************************************
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
585 * \brief get current tuned frequency from card
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
586 * \param frequency where to store frequency in MHz
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
587 * \return STREAM_OK if success, STREAM_ERROR otherwise
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
588 */
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
589 static int get_frequency_bsdbt848(radio_priv_t* priv,float* frequency){
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
590 unsigned int freq;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
591 if (ioctl(priv->radio_fd, RADIO_GETFREQ, &freq) < 0) {
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
592 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_GetFreqFailed,strerror(errno));
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
593 return STREAM_ERROR;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
594 }
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
595 *frequency=((float)freq)/priv->frac;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
596 return STREAM_OK;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
597 }
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
598
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
599 /*****************************************************************
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
600 * \brief set volume on radio card
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
601 * \param volume volume level (0..100)
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
602 * \return STREAM_OK if success, STREAM_ERROR otherwise
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
603 *
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
604 * *BSD BT848 does not have volume changing abilities, so
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
605 * we will just mute sound if volume=0 and unmute it otherwise.
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
606 */
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
607 static void set_volume_bsdbt848(radio_priv_t* priv,int volume){
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
608 int audio_flags;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
609
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
610 /*arg must be between 0 and 100*/
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
611 if (volume > 100) volume = 100;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
612 if (volume < 0) volume = 0;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
613
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
614 audio_flags = (volume==0?AUDIO_MUTE:AUDIO_UNMUTE);
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
615 if (ioctl(priv->radio_fd, BT848_SAUDIO, &audio_flags)<0){
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
616 mp_msg(MSGT_RADIO,MSGL_WARN,MSGTR_RADIO_SetMuteFailed,strerror(errno));
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
617 }
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
618 }
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
619
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
620 /*****************************************************************
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
621 * \brief get current volume from radio card
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
622 * \param volume where to store volume level (0..100)
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
623 * \return previous STREAM_OK if success, STREAM_ERROR otherwise
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
624 *
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
625 * *BSD BT848 does not have volume changing abilities, so
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
626 * we will return 0 if sound is muted and 100 otherwise.
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
627 */
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
628 static int get_volume_bsdbt848(radio_priv_t* priv,int* volume){
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
629 int audio_flags;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
630
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
631 if (ioctl(priv->radio_fd, BT848_GAUDIO, &audio_flags)<0){
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
632 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_GetVolumeFailed,strerror(errno));
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
633 return STREAM_ERROR;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
634 }
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
635
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
636 if (audio_flags & AUDIO_MUTE)
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
637 *volume=0;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
638 else
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
639 *volume=100;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
640
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
641 return STREAM_OK;
20110e4437c6 Add *BSD BT848 radio support
voroshil
parents: 20968
diff changeset
642 }
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
643
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
644 /* bsdbt848 driver info structure */
22928
09f2039f1113 Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents: 22754
diff changeset
645 static const radio_driver_t radio_driver_bsdbt848={
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
646 "bsdbt848",
22928
09f2039f1113 Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents: 22754
diff changeset
647 MSGTR_RADIO_DriverBSDBT848,
09f2039f1113 Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents: 22754
diff changeset
648 init_frac_bsdbt848,
09f2039f1113 Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents: 22754
diff changeset
649 set_volume_bsdbt848,
09f2039f1113 Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents: 22754
diff changeset
650 get_volume_bsdbt848,
09f2039f1113 Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents: 22754
diff changeset
651 set_frequency_bsdbt848,
09f2039f1113 Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents: 22754
diff changeset
652 get_frequency_bsdbt848
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
653 };
22948
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
654 #endif //HAVE_RADIO_BSDBT848
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
655
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
656 static inline int init_frac(radio_priv_t* priv){
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
657 return priv->driver->init_frac(priv);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
658 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
659 static inline int set_frequency(radio_priv_t* priv,float frequency){
20758
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
660 if ((frequency<priv->rangelow)||(frequency>priv->rangehigh)){
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
661 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_WrongFreq,frequency);
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
662 return STREAM_ERROR;
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
663 }
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
664 if(priv->driver->set_frequency(priv,frequency)!=STREAM_OK)
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
665 return STREAM_ERROR;
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
666
20796
dee98cb0b090 Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents: 20758
diff changeset
667 #ifdef USE_RADIO_CAPTURE
dee98cb0b090 Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents: 20758
diff changeset
668 if(clear_buffer(priv)!=STREAM_OK){
dee98cb0b090 Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents: 20758
diff changeset
669 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_ClearBufferFailed,strerror(errno));
dee98cb0b090 Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents: 20758
diff changeset
670 return STREAM_ERROR;
dee98cb0b090 Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents: 20758
diff changeset
671 }
dee98cb0b090 Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents: 20758
diff changeset
672 #endif
dee98cb0b090 Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents: 20758
diff changeset
673 return STREAM_OK;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
674 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
675 static inline int get_frequency(radio_priv_t* priv,float* frequency){
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
676 return priv->driver->get_frequency(priv,frequency);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
677 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
678 static inline void set_volume(radio_priv_t* priv,int volume){
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
679 priv->driver->set_volume(priv,volume);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
680 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
681 static inline int get_volume(radio_priv_t* priv,int* volume){
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
682 return priv->driver->get_volume(priv,volume);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
683 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
684
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
685
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
686 #ifndef USE_RADIO_CAPTURE
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
687 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
688 * \brief stub, if capture disabled at compile-time
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
689 * \return STREAM_OK
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
690 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
691 static inline int init_audio(radio_priv_t *priv){ return STREAM_OK;}
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
692 #else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
693 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
694 * \brief making buffer empty
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
695 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
696 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
697 * when changing channel we must clear buffer to avoid large switching delay
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
698 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
699 static int clear_buffer(radio_priv_t* priv){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
700 if (!priv->do_capture) return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
701 priv->audio_tail = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
702 priv->audio_head = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
703 priv->audio_cnt=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
704 memset(priv->audio_ringbuffer,0,priv->audio_in.blocksize);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
705 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
706 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
707 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
708 * \brief read next part of data into buffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
709 * \return -1 if error occured or no data available yet, otherwise - bytes read
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
710 * NOTE: audio device works in non-blocking mode
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
711 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
712 static int read_chunk(audio_in_t *ai, unsigned char *buffer)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
713 {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
714 int ret;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
715
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
716 switch (ai->type) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
717 #if defined(HAVE_ALSA9) || defined(HAVE_ALSA1X)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
718 case AUDIO_IN_ALSA:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
719 //device opened in non-blocking mode
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
720 ret = snd_pcm_readi(ai->alsa.handle, buffer, ai->alsa.chunk_size);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
721 if (ret != ai->alsa.chunk_size) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
722 if (ret < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
723 if (ret==-EAGAIN) return -1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
724 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_MPDEMUX_AUDIOIN_ErrReadingAudio, snd_strerror(ret));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
725 if (ret == -EPIPE) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
726 if (ai_alsa_xrun(ai) == 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
727 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_MPDEMUX_AUDIOIN_XRUNSomeFramesMayBeLeftOut);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
728 } else {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
729 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_MPDEMUX_AUDIOIN_ErrFatalCannotRecover);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
730 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
731 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
732 } else {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
733 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_MPDEMUX_AUDIOIN_NotEnoughSamples);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
734 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
735 return -1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
736 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
737 return ret;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
738 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
739 #ifdef USE_OSS_AUDIO
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
740 case AUDIO_IN_OSS:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
741 {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
742 int bt=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
743 /*
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
744 we must return exactly blocksize bytes, so if we have got any bytes
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
745 at first call to read, we will loop untils get all blocksize bytes
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
746 otherwise we will return -1
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
747 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
748 while(bt<ai->blocksize){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
749 //device opened in non-blocking mode
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
750 ret = read(ai->oss.audio_fd, buffer+bt, ai->blocksize-bt);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
751 if (ret==ai->blocksize) return ret;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
752 if (ret<0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
753 if (errno==EAGAIN && bt==0) return -1; //no data avail yet
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
754 if (errno==EAGAIN) { usleep(1000); continue;} //nilling buffer to blocksize size
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
755 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_MPDEMUX_AUDIOIN_ErrReadingAudio, strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
756 return -1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
757 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
758 bt+=ret;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
759 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
760 return bt;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
761 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
762 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
763 default:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
764 return -1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
765 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
766 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
767 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
768 * \brief grab next frame from audio device
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
769 * \parameter buffer - store buffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
770 * \parameter len - store buffer size in bytes
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
771 * \return number of bytes written into buffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
772 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
773 * grabs len (or less) bytes from ringbuffer into buffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
774 * if ringbuffer is empty waits until len bytes of data will be available
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
775 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
776 * priv->audio_cnt - size (in bytes) of ringbuffer's filled part
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
777 * priv->audio_drop - size (in bytes) of dropped data (if no space in ringbuffer)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
778 * priv->audio_head - index of first byte in filled part
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
779 * priv->audio_tail - index of last byte in filled part
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
780 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
781 * NOTE: audio_tail always aligned by priv->audio_in.blocksize
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
782 * audio_head may NOT.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
783 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
784 static int grab_audio_frame(radio_priv_t *priv, char *buffer, int len)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
785 {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
786 int i;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
787 mp_msg(MSGT_RADIO, MSGL_DBG3, MSGTR_RADIO_BufferString,"grab_audio_frame",priv->audio_cnt,priv->audio_drop);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
788 /* Cache buffer must be filled by some audio packets when playing starts.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
789 Otherwise MPlayer will quit with EOF error.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
790 Probably, there is need more carefull checking rather than simple 'for' loop
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
791 (something like timer or similar).
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
792
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
793 1000ms delay will happen only at first buffer filling. At next call function
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
794 just fills buffer until either buffer full or no data from driver available.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
795 */
24821
3b23a0e6fe7b Don't wait for filling entire audio ringbuffer at each call to grab_audio_frame.
voroshil
parents: 24820
diff changeset
796 for (i=0;i<1000 && !priv->audio_cnt; i++){
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
797 //read_chunk fills exact priv->blocksize bytes
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
798 if(read_chunk(&priv->audio_in, priv->audio_ringbuffer+priv->audio_tail) < 0){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
799 //sleppeing only when waiting first block to fill empty buffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
800 if (!priv->audio_cnt){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
801 usleep(1000);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
802 continue;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
803 }else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
804 break;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
805 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
806 priv->audio_cnt+=priv->audio_in.blocksize;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
807 priv->audio_tail = (priv->audio_tail+priv->audio_in.blocksize) % priv->audio_buffer_size;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
808 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
809 if(priv->audio_cnt<len)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
810 len=priv->audio_cnt;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
811 memcpy(buffer, priv->audio_ringbuffer+priv->audio_head,len);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
812 priv->audio_head = (priv->audio_head+len) % priv->audio_buffer_size;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
813 priv->audio_cnt-=len;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
814 return len;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
815 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
816 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
817 * \brief init audio device
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
818 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
819 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
820 static int init_audio(radio_priv_t *priv)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
821 {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
822 int is_oss=1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
823 int seconds=2;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
824 char* tmp;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
825 if (priv->audio_inited) return 1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
826
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
827 /* do_capture==0 mplayer was not started with capture keyword, so disabling capture*/
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
828 if(!priv->do_capture)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
829 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
830
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
831 if (!priv->radio_param->adevice){
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
832 priv->do_capture=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
833 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
834 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
835
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
836 priv->do_capture=1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
837 mp_msg(MSGT_RADIO,MSGL_V,MSGTR_RADIO_CaptureStarting);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
838 #if defined(HAVE_ALSA9) || defined(HAVE_ALSA1X)
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
839 while ((tmp = strrchr(priv->radio_param->adevice, '='))){
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
840 tmp[0] = ':';
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
841 //adevice option looks like ALSA device name. Switching to ALSA
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
842 is_oss=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
843 }
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
844 while ((tmp = strrchr(priv->radio_param->adevice, '.')))
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
845 tmp[0] = ',';
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
846 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
847
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
848 if(audio_in_init(&priv->audio_in, is_oss?AUDIO_IN_OSS:AUDIO_IN_ALSA)<0){
24019
27eeab564338 Fix warning: too many arguments for format
cehoyos
parents: 23890
diff changeset
849 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_AudioInInitFailed);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
850 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
851
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
852 audio_in_set_device(&priv->audio_in, priv->radio_param->adevice);
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
853 audio_in_set_channels(&priv->audio_in, priv->radio_param->achannels);
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
854 audio_in_set_samplerate(&priv->audio_in, priv->radio_param->arate);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
855
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
856 if (audio_in_setup(&priv->audio_in) < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
857 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_AudioInSetupFailed, strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
858 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
859 }
24583
af12ba770230 Fix compilation with enabled radio capture and disabled OSS audio.
voroshil
parents: 24257
diff changeset
860 #ifdef USE_OSS_AUDIO
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
861 if(is_oss)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
862 ioctl(priv->audio_in.oss.audio_fd, SNDCTL_DSP_NONBLOCK, 0);
24583
af12ba770230 Fix compilation with enabled radio capture and disabled OSS audio.
voroshil
parents: 24257
diff changeset
863 #endif
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
864 #if defined(HAVE_ALSA9) || defined(HAVE_ALSA1X)
24583
af12ba770230 Fix compilation with enabled radio capture and disabled OSS audio.
voroshil
parents: 24257
diff changeset
865 if(!is_oss)
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
866 snd_pcm_nonblock(priv->audio_in.alsa.handle,1);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
867 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
868
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
869 priv->audio_buffer_size = seconds*priv->audio_in.samplerate*priv->audio_in.channels*
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
870 priv->audio_in.bytes_per_sample+priv->audio_in.blocksize;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
871 if (priv->audio_buffer_size < 256*priv->audio_in.blocksize)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
872 priv->audio_buffer_size = 256*priv->audio_in.blocksize;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
873 mp_msg(MSGT_RADIO, MSGL_V, MSGTR_RADIO_AudioBuffer,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
874 priv->audio_buffer_size,priv->audio_in.blocksize);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
875 /* start capture */
19606
832d6f6f805e Do not cast calloc/malloc results
reimar
parents: 19568
diff changeset
876 priv->audio_ringbuffer = calloc(1, priv->audio_buffer_size);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
877 if (!priv->audio_ringbuffer) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
878 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_AllocateBufferFailed,priv->audio_in.blocksize, priv->audio_buffer_size, strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
879 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
880 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
881 priv->audio_head = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
882 priv->audio_tail = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
883 priv->audio_cnt = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
884 priv->audio_drop = 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
885
24820
833520054ee5 Add missing call to audio_in_start_capture.
voroshil
parents: 24583
diff changeset
886 audio_in_start_capture(&priv->audio_in);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
887
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
888 priv->audio_inited = 1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
889
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
890 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
891 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
892 #endif //USE_RADIO_CAPTURE
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
893
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
894 /*-------------------------------------------------------------------------
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
895 for call from mplayer.c
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
896 --------------------------------------------------------------------------*/
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
897 /*****************************************************************
20968
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
898 * \brief public wrapper for get_frequency
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
899 * \parameter frequency pointer to float, which will contain frequency in MHz
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
900 * \return 1 if success,0 - otherwise
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
901 */
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
902 int radio_get_freq(struct stream_st *stream, float* frequency){
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
903 radio_priv_t* priv=(radio_priv_t*)stream->priv;
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
904
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
905 if (!frequency)
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
906 return 0;
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
907 if (get_frequency(priv,frequency)!=STREAM_OK){
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
908 return 0;
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
909 }
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
910 return 1;
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
911 }
1e6ebb9e49eb add public wrapper for get_frequency
voroshil
parents: 20967
diff changeset
912 /*****************************************************************
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
913 * \brief public wrapper for set_frequency
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
914 * \parameter frequency frequency in MHz
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
915 * \return 1 if success,0 - otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
916 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
917 int radio_set_freq(struct stream_st *stream, float frequency){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
918 radio_priv_t* priv=(radio_priv_t*)stream->priv;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
919
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
920 if (set_frequency(priv,frequency)!=STREAM_OK){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
921 return 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
922 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
923 if (get_frequency(priv,&frequency)!=STREAM_OK){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
924 return 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
925 }
20967
460da4c85cb4 Change verbosity level from MSGL_V to MSGL_INFO for "Current frequency is"
voroshil
parents: 20806
diff changeset
926 mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_CurrentFreq,frequency);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
927 return 1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
928 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
929
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
930 /*****************************************************************
21042
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
931 * \brief tune current frequency by step_interval value
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
932 * \parameter step_interval increment value
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
933 * \return 1 if success,0 - otherwise
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
934 *
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
935 */
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
936 int radio_step_freq(struct stream_st *stream, float step_interval){
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
937 float frequency;
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
938 radio_priv_t* priv=(radio_priv_t*)stream->priv;
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
939
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
940 if (get_frequency(priv,&frequency)!=STREAM_OK)
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
941 return 0;
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
942
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
943 frequency+=step_interval;
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
944 if (frequency>priv->rangehigh)
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
945 frequency=priv->rangehigh;
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
946 if (frequency<priv->rangelow)
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
947 frequency=priv->rangelow;
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
948
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
949 return radio_set_freq(stream,frequency);
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
950 }
c549c2de24ce new slave command: radio_step_freq
voroshil
parents: 20985
diff changeset
951 /*****************************************************************
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
952 * \brief step channel up or down
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
953 * \parameter direction RADIO_CHANNEL_LOWER - go to prev channel,RADIO_CHANNEL_HIGHER - to next
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
954 * \return 1 if success,0 - otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
955 *
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
956 * if channel parameter is NULL function prints error message and does nothing, otherwise
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
957 * changes channel to prev or next in list
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
958 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
959 int radio_step_channel(struct stream_st *stream, int direction) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
960 radio_priv_t* priv=(radio_priv_t*)stream->priv;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
961
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
962 if (priv->radio_channel_list) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
963 switch (direction){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
964 case RADIO_CHANNEL_HIGHER:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
965 if (priv->radio_channel_current->next)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
966 priv->radio_channel_current = priv->radio_channel_current->next;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
967 else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
968 priv->radio_channel_current = priv->radio_channel_list;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
969 if(!radio_set_freq(stream,priv->radio_channel_current->freq))
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
970 return 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
971 mp_msg(MSGT_RADIO, MSGL_V, MSGTR_RADIO_SelectedChannel,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
972 priv->radio_channel_current->index, priv->radio_channel_current->name,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
973 priv->radio_channel_current->freq);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
974 break;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
975 case RADIO_CHANNEL_LOWER:
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
976 if (priv->radio_channel_current->prev)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
977 priv->radio_channel_current = priv->radio_channel_current->prev;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
978 else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
979 while (priv->radio_channel_current->next)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
980 priv->radio_channel_current = priv->radio_channel_current->next;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
981 if(!radio_set_freq(stream,priv->radio_channel_current->freq))
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
982 return 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
983 mp_msg(MSGT_RADIO, MSGL_V, MSGTR_RADIO_SelectedChannel,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
984 priv->radio_channel_current->index, priv->radio_channel_current->name,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
985 priv->radio_channel_current->freq);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
986 break;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
987 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
988 }else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
989 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_ChangeChannelNoChannelList);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
990 return 1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
991 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
992
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
993 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
994 * \brief change channel to one with given index
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
995 * \parameter channel string, containing channel number
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
996 * \return 1 if success,0 - otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
997 *
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
998 * if channel parameter is NULL function prints error message and does nothing, otherwise
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
999 * changes channel to given
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1000 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1001 int radio_set_channel(struct stream_st *stream, char *channel) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1002 radio_priv_t* priv=(radio_priv_t*)stream->priv;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1003 int i, channel_int;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1004 radio_channels_t* tmp;
19793
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1005 char* endptr;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1006
19793
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1007 if (*channel=='\0')
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1008 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_WrongChannelName,channel);
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1009
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1010 if (priv->radio_channel_list) {
19793
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1011 channel_int = strtol(channel,&endptr,10);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1012 tmp = priv->radio_channel_list;
19793
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1013 if (*endptr!='\0'){
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1014 //channel is not a number, so it contains channel name
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1015 for ( ; tmp; tmp=tmp->next)
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1016 if (!strncmp(channel,tmp->name,sizeof(tmp->name)-1))
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1017 break;
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1018 if (!tmp){
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1019 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_WrongChannelName,channel);
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1020 return 0;
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1021 }
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1022 }else{
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1023 for (i = 1; i < channel_int; i++)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1024 if (tmp->next)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1025 tmp = tmp->next;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1026 else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1027 break;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1028 if (tmp->index!=channel_int){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1029 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_WrongChannelNumberInt,channel_int);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1030 return 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1031 }
19793
6c98f3566af1 ability to pass channel name (not only number) to radio_set_channel
voroshil
parents: 19618
diff changeset
1032 }
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1033 priv->radio_channel_current=tmp;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1034 mp_msg(MSGT_RADIO, MSGL_V, MSGTR_RADIO_SelectedChannel, priv->radio_channel_current->index,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1035 priv->radio_channel_current->name, priv->radio_channel_current->freq);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1036 if(!radio_set_freq(stream, priv->radio_channel_current->freq))
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1037 return 0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1038 } else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1039 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_ChangeChannelNoChannelList);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1040 return 1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1041 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1042
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1043 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1044 * \brief get current channel's name
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1045 * \return pointer to string, containing current channel's name
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1046 *
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1047 * NOTE: return value may be NULL (e.g. when channel list not initialized)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1048 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1049 char* radio_get_channel_name(struct stream_st *stream){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1050 radio_priv_t* priv=(radio_priv_t*)stream->priv;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1051 if (priv->radio_channel_current) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1052 return priv->radio_channel_current->name;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1053 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1054 return NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1055 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1056
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1057 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1058 * \brief fills given buffer with audio data
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1059 * \return number of bytes, written into buffer
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1060 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1061 static int fill_buffer_s(struct stream_st *s, char* buffer, int max_len){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1062 int len=max_len;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1063
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1064 #ifdef USE_RADIO_CAPTURE
23485
f6b20f40a854 Fix compiler warnings.
voroshil
parents: 22948
diff changeset
1065 radio_priv_t* priv=(radio_priv_t*)s->priv;
f6b20f40a854 Fix compiler warnings.
voroshil
parents: 22948
diff changeset
1066
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1067 if (priv->do_capture){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1068 len=grab_audio_frame(priv, buffer,max_len);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1069 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1070 else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1071 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1072 memset(buffer,0,len);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1073 return len;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1074 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1075
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1076
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1077 /*
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1078 order if significant!
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1079 when no driver explicitly specified first available will be used
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1080 */
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1081 static const radio_driver_t* radio_drivers[]={
22948
0f9bd35f971a Rework of *BSD BT848 detection for radio://
voroshil
parents: 22928
diff changeset
1082 #ifdef HAVE_RADIO_BSDBT848
22928
09f2039f1113 Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents: 22754
diff changeset
1083 &radio_driver_bsdbt848,
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1084 #endif
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1085 #ifdef HAVE_RADIO_V4L2
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1086 &radio_driver_v4l2,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1087 #endif
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1088 #ifdef HAVE_RADIO_V4L
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1089 &radio_driver_v4l,
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1090 #endif
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1091 0
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1092 };
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1093
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1094 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1095 * Stream initialization
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1096 * \return STREAM_OK if success, STREAM_ERROR otherwise
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1097 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1098 static int open_s(stream_t *stream,int mode, void* opts, int* file_format) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1099 radio_priv_t* priv;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1100 float frequency=0;
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1101 int i;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1102
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1103 if (strncmp("radio://",stream->url,8) != 0)
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24019
diff changeset
1104 return STREAM_UNSUPPORTED;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1105
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1106 if(mode != STREAM_READ)
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24019
diff changeset
1107 return STREAM_UNSUPPORTED;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1108
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1109 priv=calloc(1,sizeof(radio_priv_t));
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1110
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1111 if (!priv)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1112 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1113
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1114
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1115 priv->radio_param=opts;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1116
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1117 #ifdef USE_RADIO_CAPTURE
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1118 if (priv->radio_param->capture && strncmp("capture",priv->radio_param->capture,7)==0)
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1119 priv->do_capture=1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1120 else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1121 priv->do_capture=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1122 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1123
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1124
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1125
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1126 if (strncmp(priv->radio_param->driver,"default",7)==0)
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1127 priv->driver=radio_drivers[0];
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1128 else
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1129 priv->driver=NULL;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1130
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1131 mp_msg(MSGT_RADIO,MSGL_V,MSGTR_RADIO_AvailableDrivers);
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1132 for(i=0;radio_drivers[i];i++){
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1133 mp_msg(MSGT_RADIO,MSGL_V,"%s, ",radio_drivers[i]->name);
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1134 if(strcmp(priv->radio_param->driver,radio_drivers[i]->name)==0)
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1135 priv->driver=radio_drivers[i];
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1136 }
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1137 mp_msg(MSGT_RADIO,MSGL_V,"\n");
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1138
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1139 if(priv->driver)
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1140 mp_msg(MSGT_RADIO, MSGL_INFO, priv->driver->info);
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1141 else{
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1142 mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_DriverUnknownStr,priv->radio_param->driver);
22754
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1143 close_s(stream);
8d480f1b41df Radio driver loading rework.
voroshil
parents: 21042
diff changeset
1144 return STREAM_ERROR;
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1145 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1146
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1147 stream->type = STREAMTYPE_RADIO;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1148 /* using rawaudio demuxer */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1149 *file_format = DEMUXER_TYPE_RAWAUDIO;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1150 stream->flags = STREAM_READ;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1151
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1152 priv->radio_fd=-1;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1153
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1154 stream->start_pos=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1155 stream->end_pos=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1156 stream->priv=priv;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1157 stream->close=close_s;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1158 stream->fill_buffer=fill_buffer_s;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1159
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1160 priv->radio_fd = open(priv->radio_param->device, O_RDONLY);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1161 if (priv->radio_fd < 0) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1162 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_UnableOpenDevice,
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1163 priv->radio_param->device, strerror(errno));
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1164 close_s(stream);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1165 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1166 }
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1167 mp_msg(MSGT_RADIO, MSGL_V, MSGTR_RADIO_RadioDevice, priv->radio_fd,priv->radio_param->device);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1168 fcntl(priv->radio_fd, F_SETFD, FD_CLOEXEC);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1169
20737
eb15b01a50cb Restoring volume level of radio card on exit.
voroshil
parents: 19793
diff changeset
1170 get_volume(priv, &priv->old_snd_volume);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1171 set_volume(priv,0);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1172
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1173 if (init_frac(priv)!=STREAM_OK){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1174 close_s(stream);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1175 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1176 };
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1177
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1178 if (parse_channels(priv,priv->radio_param->freq_channel,&frequency)!=STREAM_OK){
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1179 close_s(stream);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1180 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1181 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1182
20758
e0f3254f3b76 Adding ability to check allowed frequency range.
voroshil
parents: 20738
diff changeset
1183 if ((frequency<priv->rangelow)||(frequency>priv->rangehigh)){
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1184 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_WrongFreq,frequency);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1185 close_s(stream);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1186 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1187 }else
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1188 mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_UsingFreq,frequency);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1189
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1190 if(set_frequency(priv,frequency)!=STREAM_OK){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1191 close_s(stream);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1192 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1193 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1194
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1195
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1196 if (init_audio(priv)!=STREAM_OK){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1197 close_s(stream);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1198 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1199 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1200
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1201 #if defined(USE_RADIO_CAPTURE) && defined(USE_STREAM_CACHE)
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1202 if(priv->do_capture){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1203 //5 second cache
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1204 if(!stream_enable_cache(stream,5*priv->audio_in.samplerate*priv->audio_in.channels*
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1205 priv->audio_in.bytes_per_sample,2*priv->audio_in.samplerate*priv->audio_in.channels*
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1206 priv->audio_in.bytes_per_sample,priv->audio_in.blocksize)) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1207 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_StreamEnableCacheFailed,strerror(errno));
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1208 close_s(stream);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1209 return STREAM_ERROR;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1210 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1211 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1212 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1213
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1214 set_volume(priv,priv->radio_param->volume);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1215
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1216 return STREAM_OK;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1217 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1218
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1219 /*****************************************************************
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1220 * Close stream. Clear structures.
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1221 */
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1222 static void close_s(struct stream_st * stream){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1223 radio_priv_t* priv=(radio_priv_t*)stream->priv;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1224 radio_channels_t * tmp;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1225 if (!priv) return;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1226
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1227 #ifdef USE_RADIO_CAPTURE
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1228 if(priv->audio_ringbuffer){
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1229 free(priv->audio_ringbuffer);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1230 priv->audio_ringbuffer=NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1231 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1232
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1233 priv->do_capture=0;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1234 #endif
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1235
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1236 while (priv->radio_channel_list) {
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1237 tmp=priv->radio_channel_list;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1238 priv->radio_channel_list=priv->radio_channel_list->next;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1239 free(tmp);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1240 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1241 priv->radio_channel_current=NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1242 priv->radio_channel_list=NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1243
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1244 if (priv->radio_fd>0){
20796
dee98cb0b090 Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents: 20758
diff changeset
1245 set_volume(priv, priv->old_snd_volume);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1246 close(priv->radio_fd);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1247 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1248
23890
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1249 if(priv->radio_param)
4587edae1790 Replacing global variables in radio:// with
voroshil
parents: 23703
diff changeset
1250 m_struct_free(&stream_opts,priv->radio_param);
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1251 free(priv);
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1252 stream->priv=NULL;
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1253 }
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1254
25211
c1d17bd6683c Mark all stream_info_t as const
reimar
parents: 24821
diff changeset
1255 const stream_info_t stream_info_radio = {
19568
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1256 "Radio stream",
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1257 "Radio",
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1258 "Vladimir Voroshilov",
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1259 "In development",
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1260 open_s,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1261 { "radio", NULL },
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1262 &stream_opts,
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1263 1 // Urls are an option string
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1264 };
bd821fd3e244 Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff changeset
1265