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