3 * gstv4ltuner.c: tuner interface implementation for V4L
5 * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
29 #include "gstv4ltuner.h"
30 #include "gstv4lelement.h"
31 #include "v4l_calls.h"
33 static void gst_v4l_tuner_channel_class_init (GstV4lTunerChannelClass * klass);
34 static void gst_v4l_tuner_channel_init (GstV4lTunerChannel * channel);
36 static void gst_v4l_tuner_norm_class_init (GstV4lTunerNormClass * klass);
37 static void gst_v4l_tuner_norm_init (GstV4lTunerNorm * norm);
39 static const GList *gst_v4l_tuner_list_channels (GstTuner * tuner);
40 static void gst_v4l_tuner_set_channel (GstTuner * tuner,
41 GstTunerChannel * channel);
42 static GstTunerChannel *gst_v4l_tuner_get_channel (GstTuner * tuner);
44 static const GList *gst_v4l_tuner_list_norms (GstTuner * tuner);
45 static void gst_v4l_tuner_set_norm (GstTuner * tuner, GstTunerNorm * norm);
46 static GstTunerNorm *gst_v4l_tuner_get_norm (GstTuner * tuner);
48 static void gst_v4l_tuner_set_frequency (GstTuner * tuner,
49 GstTunerChannel * channel, gulong frequency);
50 static gulong gst_v4l_tuner_get_frequency (GstTuner * tuner,
51 GstTunerChannel * channel);
52 static gint gst_v4l_tuner_signal_strength (GstTuner * tuner,
53 GstTunerChannel * channel);
55 static GstTunerNormClass *norm_parent_class = NULL;
56 static GstTunerChannelClass *channel_parent_class = NULL;
59 gst_v4l_tuner_channel_get_type (void)
61 static GType gst_v4l_tuner_channel_type = 0;
63 if (!gst_v4l_tuner_channel_type) {
64 static const GTypeInfo v4l_tuner_channel_info = {
65 sizeof (GstV4lTunerChannelClass),
68 (GClassInitFunc) gst_v4l_tuner_channel_class_init,
71 sizeof (GstV4lTunerChannel),
73 (GInstanceInitFunc) gst_v4l_tuner_channel_init,
77 gst_v4l_tuner_channel_type =
78 g_type_register_static (GST_TYPE_TUNER_CHANNEL,
79 "GstV4lTunerChannel", &v4l_tuner_channel_info, 0);
82 return gst_v4l_tuner_channel_type;
86 gst_v4l_tuner_channel_class_init (GstV4lTunerChannelClass * klass)
88 channel_parent_class = g_type_class_peek_parent (klass);
92 gst_v4l_tuner_channel_init (GstV4lTunerChannel * channel)
100 gst_v4l_tuner_norm_get_type (void)
102 static GType gst_v4l_tuner_norm_type = 0;
104 if (!gst_v4l_tuner_norm_type) {
105 static const GTypeInfo v4l_tuner_norm_info = {
106 sizeof (GstV4lTunerNormClass),
109 (GClassInitFunc) gst_v4l_tuner_norm_class_init,
112 sizeof (GstV4lTunerNorm),
114 (GInstanceInitFunc) gst_v4l_tuner_norm_init,
118 gst_v4l_tuner_norm_type =
119 g_type_register_static (GST_TYPE_TUNER_NORM,
120 "GstV4lTunerNorm", &v4l_tuner_norm_info, 0);
123 return gst_v4l_tuner_norm_type;
127 gst_v4l_tuner_norm_class_init (GstV4lTunerNormClass * klass)
129 norm_parent_class = g_type_class_peek_parent (klass);
133 gst_v4l_tuner_norm_init (GstV4lTunerNorm * norm)
139 gst_v4l_tuner_interface_init (GstTunerClass * klass)
141 /* default virtual functions */
142 klass->list_channels = gst_v4l_tuner_list_channels;
143 klass->set_channel = gst_v4l_tuner_set_channel;
144 klass->get_channel = gst_v4l_tuner_get_channel;
146 klass->list_norms = gst_v4l_tuner_list_norms;
147 klass->set_norm = gst_v4l_tuner_set_norm;
148 klass->get_norm = gst_v4l_tuner_get_norm;
150 klass->set_frequency = gst_v4l_tuner_set_frequency;
151 klass->get_frequency = gst_v4l_tuner_get_frequency;
152 klass->signal_strength = gst_v4l_tuner_signal_strength;
155 static G_GNUC_UNUSED gboolean
156 gst_v4l_tuner_contains_channel (GstV4lElement * v4lelement,
157 GstV4lTunerChannel * v4lchannel)
161 for (item = v4lelement->channels; item != NULL; item = item->next)
162 if (item->data == v4lchannel)
169 gst_v4l_tuner_list_channels (GstTuner * tuner)
171 return GST_V4LELEMENT (tuner)->channels;
175 gst_v4l_tuner_set_channel (GstTuner * tuner, GstTunerChannel * channel)
177 GstV4lElement *v4lelement = GST_V4LELEMENT (tuner);
178 GstV4lTunerChannel *v4lchannel = GST_V4L_TUNER_CHANNEL (channel);
181 /* assert that we're opened and that we're using a known item */
182 g_return_if_fail (GST_V4L_IS_OPEN (v4lelement));
183 g_return_if_fail (gst_v4l_tuner_contains_channel (v4lelement, v4lchannel));
185 gst_v4l_get_chan_norm (v4lelement, NULL, &norm);
186 gst_v4l_set_chan_norm (v4lelement, v4lchannel->index, norm);
189 static GstTunerChannel *
190 gst_v4l_tuner_get_channel (GstTuner * tuner)
192 GstV4lElement *v4lelement = GST_V4LELEMENT (tuner);
196 /* assert that we're opened */
197 g_return_val_if_fail (GST_V4L_IS_OPEN (v4lelement), NULL);
199 gst_v4l_get_chan_norm (v4lelement, &channel, NULL);
201 for (item = v4lelement->channels; item != NULL; item = item->next) {
202 if (channel == GST_V4L_TUNER_CHANNEL (item->data)->index)
203 return GST_TUNER_CHANNEL (item->data);
209 static G_GNUC_UNUSED gboolean
210 gst_v4l_tuner_contains_norm (GstV4lElement * v4lelement,
211 GstV4lTunerNorm * v4lnorm)
215 for (item = v4lelement->norms; item != NULL; item = item->next)
216 if (item->data == v4lnorm)
223 gst_v4l_tuner_list_norms (GstTuner * tuner)
225 return GST_V4LELEMENT (tuner)->norms;
229 gst_v4l_tuner_set_norm (GstTuner * tuner, GstTunerNorm * norm)
231 GstV4lElement *v4lelement = GST_V4LELEMENT (tuner);
232 GstV4lTunerNorm *v4lnorm = GST_V4L_TUNER_NORM (norm);
235 /* assert that we're opened and that we're using a known item */
236 g_return_if_fail (GST_V4L_IS_OPEN (v4lelement));
237 g_return_if_fail (gst_v4l_tuner_contains_norm (v4lelement, v4lnorm));
239 gst_v4l_get_chan_norm (v4lelement, &channel, NULL);
240 gst_v4l_set_chan_norm (v4lelement, channel, v4lnorm->index);
243 static GstTunerNorm *
244 gst_v4l_tuner_get_norm (GstTuner * tuner)
246 GstV4lElement *v4lelement = GST_V4LELEMENT (tuner);
250 /* assert that we're opened */
251 g_return_val_if_fail (GST_V4L_IS_OPEN (v4lelement), NULL);
253 gst_v4l_get_chan_norm (v4lelement, NULL, &norm);
255 for (item = v4lelement->norms; item != NULL; item = item->next) {
256 if (norm == GST_V4L_TUNER_NORM (item->data)->index)
257 return GST_TUNER_NORM (item->data);
264 gst_v4l_tuner_set_frequency (GstTuner * tuner,
265 GstTunerChannel * channel, gulong frequency)
267 GstV4lElement *v4lelement = GST_V4LELEMENT (tuner);
268 GstV4lTunerChannel *v4lchannel = GST_V4L_TUNER_CHANNEL (channel);
271 /* assert that we're opened and that we're using a known item */
272 g_return_if_fail (GST_V4L_IS_OPEN (v4lelement));
273 g_return_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
274 GST_TUNER_CHANNEL_FREQUENCY));
275 g_return_if_fail (gst_v4l_tuner_contains_channel (v4lelement, v4lchannel));
277 gst_v4l_get_chan_norm (v4lelement, &chan, NULL);
278 if (chan == GST_V4L_TUNER_CHANNEL (channel)->index) {
279 gst_v4l_set_frequency (v4lelement, v4lchannel->tuner, frequency);
284 gst_v4l_tuner_get_frequency (GstTuner * tuner, GstTunerChannel * channel)
286 GstV4lElement *v4lelement = GST_V4LELEMENT (tuner);
287 GstV4lTunerChannel *v4lchannel = GST_V4L_TUNER_CHANNEL (channel);
289 gulong frequency = 0;
291 /* assert that we're opened and that we're using a known item */
292 g_return_val_if_fail (GST_V4L_IS_OPEN (v4lelement), 0);
293 g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
294 GST_TUNER_CHANNEL_FREQUENCY), 0);
295 g_return_val_if_fail (gst_v4l_tuner_contains_channel (v4lelement,
298 gst_v4l_get_chan_norm (v4lelement, &chan, NULL);
299 if (chan == GST_V4L_TUNER_CHANNEL (channel)->index) {
300 gst_v4l_get_frequency (v4lelement, v4lchannel->tuner, &frequency);
307 gst_v4l_tuner_signal_strength (GstTuner * tuner, GstTunerChannel * channel)
309 GstV4lElement *v4lelement = GST_V4LELEMENT (tuner);
310 GstV4lTunerChannel *v4lchannel = GST_V4L_TUNER_CHANNEL (channel);
314 /* assert that we're opened and that we're using a known item */
315 g_return_val_if_fail (GST_V4L_IS_OPEN (v4lelement), 0);
316 g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
317 GST_TUNER_CHANNEL_FREQUENCY), 0);
318 g_return_val_if_fail (gst_v4l_tuner_contains_channel (v4lelement,
321 gst_v4l_get_chan_norm (v4lelement, &chan, NULL);
322 if (chan == GST_V4L_TUNER_CHANNEL (channel)->index &&
323 GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) {
324 gst_v4l_get_signal (v4lelement, v4lchannel->tuner, &signal);
327 return (gint) signal;