Mercurial > mplayer.hg
annotate stream/stream_radio.c @ 24787:02535b3216c5
Avoid text deformation and subtitles moving outside the screen in pan-and-scan
mode.
For this, crop amounts are passed from vo_gl as negative margins sizes. They
are used to calculate aspect ratio. They are ignored when calculating subtitle
positions, so subtitles will stay on screen most of the time.
Based on a patch by Jindrich Makovicka [makovick gmail com].
author | eugeni |
---|---|
date | Fri, 19 Oct 2007 18:16:23 +0000 |
parents | af12ba770230 |
children | 833520054ee5 |
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 | 36 |
22948 | 37 #ifdef HAVE_RADIO_BSDBT848 |
20985 | 38 #include <sys/param.h> |
22948 | 39 #ifdef IOCTL_BT848_H_NAME |
40 #include IOCTL_BT848_H_NAME | |
41 #endif | |
20985 | 42 |
22948 | 43 #else // HAVE_RADIO_BSDBT848 |
20985 | 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 | 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 | 91 /// default values for options |
92 radio_param_t stream_radio_defaults={ | |
22948 | 93 #ifdef HAVE_RADIO_BSDBT848 |
23890 | 94 "/dev/tuner0", //device |
95 87.50, //freq_min | |
96 108.00, //freq_max | |
20985 | 97 #else |
23890 | 98 "/dev/radio0", //device; |
20985 | 99 #endif |
23890 | 100 "default", //driver |
101 NULL, //channels | |
102 100, //volume | |
103 NULL, //adevice | |
104 44100, //arate | |
105 2, //achannels | |
106 0, //freq_channel | |
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 | 117 const struct radio_driver_s* driver; |
20737 | 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 | 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 | 133 typedef struct radio_driver_s { |
134 char* name; | |
135 char* info; | |
136 int (*init_frac)(radio_priv_t* priv); | |
137 void (*set_volume)(radio_priv_t* priv,int volume); | |
138 int (*get_volume)(radio_priv_t* priv,int* volume); | |
139 int (*set_frequency)(radio_priv_t* priv,float frequency); | |
140 int (*get_frequency)(radio_priv_t* priv,float* frequency); | |
141 } radio_driver_t; | |
142 | |
23890 | 143 #define ST_OFF(f) M_ST_OFF(radio_param_t,f) |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
144 static m_option_t stream_opts_fields[] = { |
23890 | 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 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
150 static struct m_struct_st stream_opts = { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
151 "radio", |
23890 | 152 sizeof(radio_param_t), |
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 | 164 * \brief parse channels parameter and store result into list |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 400 |
401 /* v4l2 driver info structure */ | |
402 static const radio_driver_t radio_driver_v4l2={ | |
403 "v4l2", | |
404 MSGTR_RADIO_DriverV4L2, | |
405 init_frac_v4l2, | |
406 set_volume_v4l2, | |
407 get_volume_v4l2, | |
408 set_frequency_v4l2, | |
409 get_frequency_v4l2 | |
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 | 531 |
532 /* v4l driver info structure */ | |
533 static const radio_driver_t radio_driver_v4l={ | |
534 "v4l", | |
535 MSGTR_RADIO_DriverV4L, | |
536 init_frac_v4l, | |
537 set_volume_v4l, | |
538 get_volume_v4l, | |
539 set_frequency_v4l, | |
540 get_frequency_v4l | |
541 }; | |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
542 #endif //HAVE_RADIO_V4L |
22948 | 543 #ifdef HAVE_RADIO_BSDBT848 |
544 | |
20985 | 545 /***************************************************************** |
546 * \brief get fraction value for using in set_frequency and get_frequency | |
547 * \return STREAM_OK if success, STREAM_ERROR otherwise | |
548 * | |
549 * For *BSD BT848 frac=100 | |
550 * | |
551 * Here is a coment from FreeBSD 5.2-RELEASE source code: | |
552 * | |
553 * * Tuner Notes: | |
554 * * Programming the tuner properly is quite complicated. | |
555 * * Here are some notes, based on a FM1246 data sheet for a PAL-I tuner. | |
556 * * The tuner (front end) covers 45.75 MHz - 855.25 MHz and an FM band of | |
557 * * 87.5 MHz to 108.0 MHz. | |
558 * | |
559 * Thus, frequency range is limited to 87.5-108.0, but you can change | |
560 * it, using freq_min and freq_max options | |
561 */ | |
562 static int init_frac_bsdbt848(radio_priv_t* priv){ | |
563 priv->frac=100; | |
23890 | 564 priv->rangelow=priv->radio_param->freq_min; |
565 priv->rangehigh=priv->radio_param->freq_max; | |
20985 | 566 return STREAM_OK; |
567 } | |
568 | |
569 /***************************************************************** | |
570 * \brief tune card to given frequency | |
571 * \param frequency frequency in MHz | |
572 * \return STREAM_OK if success, STREAM_ERROR otherwise | |
573 */ | |
574 static int set_frequency_bsdbt848(radio_priv_t* priv,float frequency){ | |
575 unsigned int freq; | |
576 freq=frequency*priv->frac; | |
577 if(ioctl(priv->radio_fd,RADIO_SETFREQ,&freq)<0){ | |
578 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_SetFreqFailed,freq, frequency, strerror(errno)); | |
579 return STREAM_ERROR; | |
580 } | |
581 return STREAM_OK; | |
582 } | |
583 | |
584 /***************************************************************** | |
585 * \brief get current tuned frequency from card | |
586 * \param frequency where to store frequency in MHz | |
587 * \return STREAM_OK if success, STREAM_ERROR otherwise | |
588 */ | |
589 static int get_frequency_bsdbt848(radio_priv_t* priv,float* frequency){ | |
590 unsigned int freq; | |
591 if (ioctl(priv->radio_fd, RADIO_GETFREQ, &freq) < 0) { | |
592 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_GetFreqFailed,strerror(errno)); | |
593 return STREAM_ERROR; | |
594 } | |
595 *frequency=((float)freq)/priv->frac; | |
596 return STREAM_OK; | |
597 } | |
598 | |
599 /***************************************************************** | |
600 * \brief set volume on radio card | |
601 * \param volume volume level (0..100) | |
602 * \return STREAM_OK if success, STREAM_ERROR otherwise | |
603 * | |
604 * *BSD BT848 does not have volume changing abilities, so | |
605 * we will just mute sound if volume=0 and unmute it otherwise. | |
606 */ | |
607 static void set_volume_bsdbt848(radio_priv_t* priv,int volume){ | |
608 int audio_flags; | |
609 | |
610 /*arg must be between 0 and 100*/ | |
611 if (volume > 100) volume = 100; | |
612 if (volume < 0) volume = 0; | |
613 | |
614 audio_flags = (volume==0?AUDIO_MUTE:AUDIO_UNMUTE); | |
615 if (ioctl(priv->radio_fd, BT848_SAUDIO, &audio_flags)<0){ | |
616 mp_msg(MSGT_RADIO,MSGL_WARN,MSGTR_RADIO_SetMuteFailed,strerror(errno)); | |
617 } | |
618 } | |
619 | |
620 /***************************************************************** | |
621 * \brief get current volume from radio card | |
622 * \param volume where to store volume level (0..100) | |
623 * \return previous STREAM_OK if success, STREAM_ERROR otherwise | |
624 * | |
625 * *BSD BT848 does not have volume changing abilities, so | |
626 * we will return 0 if sound is muted and 100 otherwise. | |
627 */ | |
628 static int get_volume_bsdbt848(radio_priv_t* priv,int* volume){ | |
629 int audio_flags; | |
630 | |
631 if (ioctl(priv->radio_fd, BT848_GAUDIO, &audio_flags)<0){ | |
632 mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_GetVolumeFailed,strerror(errno)); | |
633 return STREAM_ERROR; | |
634 } | |
635 | |
636 if (audio_flags & AUDIO_MUTE) | |
637 *volume=0; | |
638 else | |
639 *volume=100; | |
640 | |
641 return STREAM_OK; | |
642 } | |
22754 | 643 |
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 | 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 | 653 }; |
22948 | 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 | 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 | 664 if(priv->driver->set_frequency(priv,frequency)!=STREAM_OK) |
665 return STREAM_ERROR; | |
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 | 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 | 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 | 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 */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
796 for (i=0;i<1000 && priv->audio_cnt<priv->audio_buffer_size; i++){ |
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 | 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 | 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 | 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 | 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 | 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 | 852 audio_in_set_device(&priv->audio_in, priv->radio_param->adevice); |
853 audio_in_set_channels(&priv->audio_in, priv->radio_param->achannels); | |
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 | 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 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
886 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
887 priv->audio_inited = 1; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
888 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
889 return STREAM_OK; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
890 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
891 #endif //USE_RADIO_CAPTURE |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
892 |
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 for call from mplayer.c |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
895 --------------------------------------------------------------------------*/ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
896 /***************************************************************** |
20968 | 897 * \brief public wrapper for get_frequency |
898 * \parameter frequency pointer to float, which will contain frequency in MHz | |
899 * \return 1 if success,0 - otherwise | |
900 */ | |
901 int radio_get_freq(struct stream_st *stream, float* frequency){ | |
902 radio_priv_t* priv=(radio_priv_t*)stream->priv; | |
903 | |
904 if (!frequency) | |
905 return 0; | |
906 if (get_frequency(priv,frequency)!=STREAM_OK){ | |
907 return 0; | |
908 } | |
909 return 1; | |
910 } | |
911 /***************************************************************** | |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
912 * \brief public wrapper for set_frequency |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
913 * \parameter frequency frequency in MHz |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
914 * \return 1 if success,0 - otherwise |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
915 */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
916 int radio_set_freq(struct stream_st *stream, float frequency){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
917 radio_priv_t* priv=(radio_priv_t*)stream->priv; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
918 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
919 if (set_frequency(priv,frequency)!=STREAM_OK){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
920 return 0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
921 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
922 if (get_frequency(priv,&frequency)!=STREAM_OK){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
923 return 0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
924 } |
20967
460da4c85cb4
Change verbosity level from MSGL_V to MSGL_INFO for "Current frequency is"
voroshil
parents:
20806
diff
changeset
|
925 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
|
926 return 1; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
927 } |
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 /***************************************************************** |
21042 | 930 * \brief tune current frequency by step_interval value |
931 * \parameter step_interval increment value | |
932 * \return 1 if success,0 - otherwise | |
933 * | |
934 */ | |
935 int radio_step_freq(struct stream_st *stream, float step_interval){ | |
936 float frequency; | |
937 radio_priv_t* priv=(radio_priv_t*)stream->priv; | |
938 | |
939 if (get_frequency(priv,&frequency)!=STREAM_OK) | |
940 return 0; | |
941 | |
942 frequency+=step_interval; | |
943 if (frequency>priv->rangehigh) | |
944 frequency=priv->rangehigh; | |
945 if (frequency<priv->rangelow) | |
946 frequency=priv->rangelow; | |
947 | |
948 return radio_set_freq(stream,frequency); | |
949 } | |
950 /***************************************************************** | |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
951 * \brief step channel up or down |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
952 * \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
|
953 * \return 1 if success,0 - otherwise |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
954 * |
23890 | 955 * 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
|
956 * changes channel to prev or next in list |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
957 */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
958 int radio_step_channel(struct stream_st *stream, int direction) { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
959 radio_priv_t* priv=(radio_priv_t*)stream->priv; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
960 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
961 if (priv->radio_channel_list) { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
962 switch (direction){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
963 case RADIO_CHANNEL_HIGHER: |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
964 if (priv->radio_channel_current->next) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
965 priv->radio_channel_current = priv->radio_channel_current->next; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
966 else |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
967 priv->radio_channel_current = priv->radio_channel_list; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
968 if(!radio_set_freq(stream,priv->radio_channel_current->freq)) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
969 return 0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
970 mp_msg(MSGT_RADIO, MSGL_V, MSGTR_RADIO_SelectedChannel, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
971 priv->radio_channel_current->index, priv->radio_channel_current->name, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
972 priv->radio_channel_current->freq); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
973 break; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
974 case RADIO_CHANNEL_LOWER: |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
975 if (priv->radio_channel_current->prev) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
976 priv->radio_channel_current = priv->radio_channel_current->prev; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
977 else |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
978 while (priv->radio_channel_current->next) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
979 priv->radio_channel_current = priv->radio_channel_current->next; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
980 if(!radio_set_freq(stream,priv->radio_channel_current->freq)) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
981 return 0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
982 mp_msg(MSGT_RADIO, MSGL_V, MSGTR_RADIO_SelectedChannel, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
983 priv->radio_channel_current->index, priv->radio_channel_current->name, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
984 priv->radio_channel_current->freq); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
985 break; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
986 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
987 }else |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
988 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_ChangeChannelNoChannelList); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
989 return 1; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
990 } |
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 * \brief change channel to one with given index |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
994 * \parameter channel string, containing channel number |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
995 * \return 1 if success,0 - otherwise |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
996 * |
23890 | 997 * 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
|
998 * changes channel to given |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
999 */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1000 int radio_set_channel(struct stream_st *stream, char *channel) { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1001 radio_priv_t* priv=(radio_priv_t*)stream->priv; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1002 int i, channel_int; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1003 radio_channels_t* tmp; |
19793
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1004 char* endptr; |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1005 |
19793
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1006 if (*channel=='\0') |
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1007 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
|
1008 |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1009 if (priv->radio_channel_list) { |
19793
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1010 channel_int = strtol(channel,&endptr,10); |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1011 tmp = priv->radio_channel_list; |
19793
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1012 if (*endptr!='\0'){ |
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1013 //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
|
1014 for ( ; tmp; tmp=tmp->next) |
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1015 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
|
1016 break; |
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1017 if (!tmp){ |
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1018 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
|
1019 return 0; |
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1020 } |
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1021 }else{ |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1022 for (i = 1; i < channel_int; i++) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1023 if (tmp->next) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1024 tmp = tmp->next; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1025 else |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1026 break; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1027 if (tmp->index!=channel_int){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1028 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
|
1029 return 0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1030 } |
19793
6c98f3566af1
ability to pass channel name (not only number) to radio_set_channel
voroshil
parents:
19618
diff
changeset
|
1031 } |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1032 priv->radio_channel_current=tmp; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1033 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
|
1034 priv->radio_channel_current->name, priv->radio_channel_current->freq); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1035 if(!radio_set_freq(stream, priv->radio_channel_current->freq)) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1036 return 0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1037 } else |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1038 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_ChangeChannelNoChannelList); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1039 return 1; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1040 } |
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 * \brief get current channel's name |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1044 * \return pointer to string, containing current channel's name |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1045 * |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1046 * 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
|
1047 */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1048 char* radio_get_channel_name(struct stream_st *stream){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1049 radio_priv_t* priv=(radio_priv_t*)stream->priv; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1050 if (priv->radio_channel_current) { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1051 return priv->radio_channel_current->name; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1052 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1053 return NULL; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1054 } |
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 * \brief fills given buffer with audio data |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1058 * \return number of bytes, written into buffer |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1059 */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1060 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
|
1061 int len=max_len; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1062 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1063 #ifdef USE_RADIO_CAPTURE |
23485 | 1064 radio_priv_t* priv=(radio_priv_t*)s->priv; |
1065 | |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1066 if (priv->do_capture){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1067 len=grab_audio_frame(priv, buffer,max_len); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1068 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1069 else |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1070 #endif |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1071 memset(buffer,0,len); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1072 return len; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1073 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1074 |
22754 | 1075 |
1076 /* | |
1077 order if significant! | |
1078 when no driver explicitly specified first available will be used | |
1079 */ | |
1080 static const radio_driver_t* radio_drivers[]={ | |
22948 | 1081 #ifdef HAVE_RADIO_BSDBT848 |
22928
09f2039f1113
Fix typo in r22772 which causes compilation error under *BSD.
voroshil
parents:
22754
diff
changeset
|
1082 &radio_driver_bsdbt848, |
22754 | 1083 #endif |
1084 #ifdef HAVE_RADIO_V4L2 | |
1085 &radio_driver_v4l2, | |
1086 #endif | |
1087 #ifdef HAVE_RADIO_V4L | |
1088 &radio_driver_v4l, | |
1089 #endif | |
1090 0 | |
1091 }; | |
1092 | |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1093 /***************************************************************** |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1094 * Stream initialization |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1095 * \return STREAM_OK if success, STREAM_ERROR otherwise |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1096 */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1097 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
|
1098 radio_priv_t* priv; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1099 float frequency=0; |
22754 | 1100 int i; |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1101 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1102 if (strncmp("radio://",stream->url,8) != 0) |
24257 | 1103 return STREAM_UNSUPPORTED; |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1104 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1105 if(mode != STREAM_READ) |
24257 | 1106 return STREAM_UNSUPPORTED; |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1107 |
23890 | 1108 priv=calloc(1,sizeof(radio_priv_t)); |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1109 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1110 if (!priv) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1111 return STREAM_ERROR; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1112 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1113 |
23890 | 1114 priv->radio_param=opts; |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1115 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1116 #ifdef USE_RADIO_CAPTURE |
23890 | 1117 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
|
1118 priv->do_capture=1; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1119 else |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1120 priv->do_capture=0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1121 #endif |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1122 |
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 |
23890 | 1125 if (strncmp(priv->radio_param->driver,"default",7)==0) |
22754 | 1126 priv->driver=radio_drivers[0]; |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1127 else |
22754 | 1128 priv->driver=NULL; |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1129 |
22754 | 1130 mp_msg(MSGT_RADIO,MSGL_V,MSGTR_RADIO_AvailableDrivers); |
1131 for(i=0;radio_drivers[i];i++){ | |
1132 mp_msg(MSGT_RADIO,MSGL_V,"%s, ",radio_drivers[i]->name); | |
23890 | 1133 if(strcmp(priv->radio_param->driver,radio_drivers[i]->name)==0) |
22754 | 1134 priv->driver=radio_drivers[i]; |
1135 } | |
1136 mp_msg(MSGT_RADIO,MSGL_V,"\n"); | |
1137 | |
1138 if(priv->driver) | |
1139 mp_msg(MSGT_RADIO, MSGL_INFO, priv->driver->info); | |
1140 else{ | |
23890 | 1141 mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_DriverUnknownStr,priv->radio_param->driver); |
22754 | 1142 close_s(stream); |
1143 return STREAM_ERROR; | |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1144 } |
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 stream->type = STREAMTYPE_RADIO; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1147 /* using rawaudio demuxer */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1148 *file_format = DEMUXER_TYPE_RAWAUDIO; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1149 stream->flags = STREAM_READ; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1150 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1151 priv->radio_fd=-1; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1152 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1153 stream->start_pos=0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1154 stream->end_pos=0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1155 stream->priv=priv; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1156 stream->close=close_s; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1157 stream->fill_buffer=fill_buffer_s; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1158 |
23890 | 1159 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
|
1160 if (priv->radio_fd < 0) { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1161 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_UnableOpenDevice, |
23890 | 1162 priv->radio_param->device, strerror(errno)); |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1163 close_s(stream); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1164 return STREAM_ERROR; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1165 } |
23890 | 1166 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
|
1167 fcntl(priv->radio_fd, F_SETFD, FD_CLOEXEC); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1168 |
20737 | 1169 get_volume(priv, &priv->old_snd_volume); |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1170 set_volume(priv,0); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1171 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1172 if (init_frac(priv)!=STREAM_OK){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1173 close_s(stream); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1174 return STREAM_ERROR; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1175 }; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1176 |
23890 | 1177 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
|
1178 close_s(stream); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1179 return STREAM_ERROR; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1180 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1181 |
20758
e0f3254f3b76
Adding ability to check allowed frequency range.
voroshil
parents:
20738
diff
changeset
|
1182 if ((frequency<priv->rangelow)||(frequency>priv->rangehigh)){ |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1183 mp_msg(MSGT_RADIO, MSGL_ERR, MSGTR_RADIO_WrongFreq,frequency); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1184 close_s(stream); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1185 return STREAM_ERROR; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1186 }else |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1187 mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_UsingFreq,frequency); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1188 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1189 if(set_frequency(priv,frequency)!=STREAM_OK){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1190 close_s(stream); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1191 return STREAM_ERROR; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1192 } |
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 if (init_audio(priv)!=STREAM_OK){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1196 close_s(stream); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1197 return STREAM_ERROR; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1198 } |
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 #if defined(USE_RADIO_CAPTURE) && defined(USE_STREAM_CACHE) |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1201 if(priv->do_capture){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1202 //5 second cache |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1203 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
|
1204 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
|
1205 priv->audio_in.bytes_per_sample,priv->audio_in.blocksize)) { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1206 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
|
1207 close_s(stream); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1208 return STREAM_ERROR; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1209 } |
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 #endif |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1212 |
23890 | 1213 set_volume(priv,priv->radio_param->volume); |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1214 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1215 return STREAM_OK; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1216 } |
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 * Close stream. Clear structures. |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1220 */ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1221 static void close_s(struct stream_st * stream){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1222 radio_priv_t* priv=(radio_priv_t*)stream->priv; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1223 radio_channels_t * tmp; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1224 if (!priv) return; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1225 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1226 #ifdef USE_RADIO_CAPTURE |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1227 if(priv->audio_ringbuffer){ |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1228 free(priv->audio_ringbuffer); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1229 priv->audio_ringbuffer=NULL; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1230 } |
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 priv->do_capture=0; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1233 #endif |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1234 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1235 while (priv->radio_channel_list) { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1236 tmp=priv->radio_channel_list; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1237 priv->radio_channel_list=priv->radio_channel_list->next; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1238 free(tmp); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1239 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1240 priv->radio_channel_current=NULL; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1241 priv->radio_channel_list=NULL; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1242 |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1243 if (priv->radio_fd>0){ |
20796
dee98cb0b090
Move non driver-specific block to non-driver specific procedure, to avoid
voroshil
parents:
20758
diff
changeset
|
1244 set_volume(priv, priv->old_snd_volume); |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1245 close(priv->radio_fd); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1246 } |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1247 |
23890 | 1248 if(priv->radio_param) |
1249 m_struct_free(&stream_opts,priv->radio_param); | |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1250 free(priv); |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1251 stream->priv=NULL; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1252 } |
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 stream_info_t stream_info_radio = { |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1255 "Radio stream", |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1256 "Radio", |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1257 "Vladimir Voroshilov", |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1258 "In development", |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1259 open_s, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1260 { "radio", NULL }, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1261 &stream_opts, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1262 1 // Urls are an option string |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1263 }; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
diff
changeset
|
1264 |