1 /*
2  * Copyright (C) 2012, 2013 Intel Corporation.
3  *
4  * Authors: Krzesimir Nowak <krnowak@openismus.com>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21 
22 /**
23  * SECTION:gupnp-dlna-audio-information
24  * @short_description: Base class representing audio metadata needed
25  * for DLNA profiles matching.
26  * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
27  * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
28  *
29  * #GUPnPDLNAAudioInformation holds all audio metadatas important for
30  * matching profiles. Note that it does not mean all data should be
31  * provided for every audio file as in some cases it does not make
32  * sense (e.g. WMA version does not make sense for MPEG audio files).
33  *
34  * For metadata attributes that do not exist in current audio file an
35  * unset value should be returned. For metadata attributes that do
36  * exist a set value with proper underlying value should be
37  * returned. In case metadata extractor has completely no clue how to
38  * extract some metadata attribute at all, an unsupported value should
39  * be returned. Note that unsupported values should be a temporary
40  * mean before fixing the multimedia framework to be able to extract
41  * such attribute.
42  *
43  * Note that gupnp_dlna_audio_information_get_mime() should always
44  * return a set value. Otherwise it is highly probably that the file
45  * will not match against any DLNA profile.
46  */
47 
48 #include "gupnp-dlna-audio-information.h"
49 
50 G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAAudioInformation,
51                         gupnp_dlna_audio_information,
52                         G_TYPE_OBJECT)
53 
54 struct _GUPnPDLNAAudioInformationPrivate {
55         gpointer placeholder;
56 };
57 
58 static void
gupnp_dlna_audio_information_class_init(GUPnPDLNAAudioInformationClass * info_class)59 gupnp_dlna_audio_information_class_init
60                                     (GUPnPDLNAAudioInformationClass *info_class)
61 {
62         info_class->get_bitrate = NULL;
63         info_class->get_channels = NULL;
64         info_class->get_depth = NULL;
65         info_class->get_layer = NULL;
66         info_class->get_level = NULL;
67         info_class->get_mpeg_audio_version = NULL;
68         info_class->get_mpeg_version = NULL;
69         info_class->get_profile = NULL;
70         info_class->get_rate = NULL;
71         info_class->get_stream_format = NULL;
72         info_class->get_wma_version = NULL;
73         info_class->get_mime = NULL;
74 
75         g_type_class_add_private (info_class,
76                                   sizeof (GUPnPDLNAAudioInformationPrivate));
77 }
78 
79 static void
gupnp_dlna_audio_information_init(GUPnPDLNAAudioInformation * info)80 gupnp_dlna_audio_information_init (GUPnPDLNAAudioInformation *info)
81 {
82         GUPnPDLNAAudioInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
83                                         (info,
84                                          GUPNP_TYPE_DLNA_AUDIO_INFORMATION,
85                                          GUPnPDLNAAudioInformationPrivate);
86 
87         info->priv = priv;
88 }
89 
90 /**
91  * gupnp_dlna_audio_information_get_bitrate: (skip)
92  * @info: A #GUPnPDLNAAudioInformation object.
93  *
94  * Returns: A bitrate.
95  */
96 GUPnPDLNAIntValue
gupnp_dlna_audio_information_get_bitrate(GUPnPDLNAAudioInformation * info)97 gupnp_dlna_audio_information_get_bitrate (GUPnPDLNAAudioInformation *info)
98 {
99         GUPnPDLNAAudioInformationClass *info_class;
100 
101         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
102                               GUPNP_DLNA_INT_VALUE_UNSET);
103 
104         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
105 
106         g_return_val_if_fail
107                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
108                              GUPNP_DLNA_INT_VALUE_UNSET);
109         g_return_val_if_fail (info_class->get_bitrate != NULL,
110                               GUPNP_DLNA_INT_VALUE_UNSET);
111 
112         return info_class->get_bitrate (info);
113 }
114 
115 /**
116  * gupnp_dlna_audio_information_get_channels: (skip)
117  * @info: A #GUPnPDLNAAudioInformation object.
118  *
119  * Returns: A number of channels.
120  */
121 GUPnPDLNAIntValue
gupnp_dlna_audio_information_get_channels(GUPnPDLNAAudioInformation * info)122 gupnp_dlna_audio_information_get_channels (GUPnPDLNAAudioInformation *info)
123 {
124         GUPnPDLNAAudioInformationClass *info_class;
125 
126         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
127                               GUPNP_DLNA_INT_VALUE_UNSET);
128 
129         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
130 
131         g_return_val_if_fail
132                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
133                              GUPNP_DLNA_INT_VALUE_UNSET);
134         g_return_val_if_fail (info_class->get_channels != NULL,
135                               GUPNP_DLNA_INT_VALUE_UNSET);
136 
137         return info_class->get_channels (info);
138 }
139 
140 /**
141  * gupnp_dlna_audio_information_get_depth: (skip)
142  * @info: A #GUPnPDLNAAudioInformation object.
143  *
144  * Returns: A depth.
145  */
146 GUPnPDLNAIntValue
gupnp_dlna_audio_information_get_depth(GUPnPDLNAAudioInformation * info)147 gupnp_dlna_audio_information_get_depth (GUPnPDLNAAudioInformation *info)
148 {
149         GUPnPDLNAAudioInformationClass *info_class;
150 
151         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
152                               GUPNP_DLNA_INT_VALUE_UNSET);
153 
154         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
155 
156         g_return_val_if_fail
157                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
158                              GUPNP_DLNA_INT_VALUE_UNSET);
159         g_return_val_if_fail (info_class->get_depth != NULL,
160                               GUPNP_DLNA_INT_VALUE_UNSET);
161 
162         return info_class->get_depth (info);
163 }
164 
165 /**
166  * gupnp_dlna_audio_information_get_layer: (skip)
167  * @info: A #GUPnPDLNAAudioInformation object.
168  *
169  * Returns: A layer.
170  */
171 GUPnPDLNAIntValue
gupnp_dlna_audio_information_get_layer(GUPnPDLNAAudioInformation * info)172 gupnp_dlna_audio_information_get_layer (GUPnPDLNAAudioInformation *info)
173 {
174         GUPnPDLNAAudioInformationClass *info_class;
175 
176         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
177                               GUPNP_DLNA_INT_VALUE_UNSET);
178 
179         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
180 
181         g_return_val_if_fail
182                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
183                              GUPNP_DLNA_INT_VALUE_UNSET);
184         g_return_val_if_fail (info_class->get_layer != NULL,
185                               GUPNP_DLNA_INT_VALUE_UNSET);
186 
187         return info_class->get_layer (info);
188 }
189 
190 /**
191  * gupnp_dlna_audio_information_get_level: (skip)
192  * @info: A #GUPnPDLNAAudioInformation object.
193  *
194  * Returns: A level.
195  */
196 GUPnPDLNAStringValue
gupnp_dlna_audio_information_get_level(GUPnPDLNAAudioInformation * info)197 gupnp_dlna_audio_information_get_level (GUPnPDLNAAudioInformation *info)
198 {
199         GUPnPDLNAAudioInformationClass *info_class;
200 
201         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
202                               GUPNP_DLNA_STRING_VALUE_UNSET);
203 
204         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
205 
206         g_return_val_if_fail
207                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
208                              GUPNP_DLNA_STRING_VALUE_UNSET);
209         g_return_val_if_fail (info_class->get_level != NULL,
210                               GUPNP_DLNA_STRING_VALUE_UNSET);
211 
212         return info_class->get_level (info);
213 }
214 
215 /**
216  * gupnp_dlna_audio_information_get_mpeg_audio_version: (skip)
217  * @info: A #GUPnPDLNAAudioInformation object.
218  *
219  * Returns: An MPEG audio version.
220  */
221 GUPnPDLNAIntValue
gupnp_dlna_audio_information_get_mpeg_audio_version(GUPnPDLNAAudioInformation * info)222 gupnp_dlna_audio_information_get_mpeg_audio_version
223                                         (GUPnPDLNAAudioInformation *info)
224 {
225         GUPnPDLNAAudioInformationClass *info_class;
226 
227         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
228                               GUPNP_DLNA_INT_VALUE_UNSET);
229 
230         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
231 
232         g_return_val_if_fail
233                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
234                              GUPNP_DLNA_INT_VALUE_UNSET);
235         g_return_val_if_fail (info_class->get_mpeg_audio_version != NULL,
236                               GUPNP_DLNA_INT_VALUE_UNSET);
237 
238         return info_class->get_mpeg_audio_version (info);
239 }
240 
241 /**
242  * gupnp_dlna_audio_information_get_mpeg_version: (skip)
243  * @info: A #GUPnPDLNAAudioInformation object.
244  *
245  * Returns: An MPEG version.
246  */
247 GUPnPDLNAIntValue
gupnp_dlna_audio_information_get_mpeg_version(GUPnPDLNAAudioInformation * info)248 gupnp_dlna_audio_information_get_mpeg_version (GUPnPDLNAAudioInformation *info)
249 {
250         GUPnPDLNAAudioInformationClass *info_class;
251 
252         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
253                               GUPNP_DLNA_INT_VALUE_UNSET);
254 
255         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
256 
257         g_return_val_if_fail
258                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
259                              GUPNP_DLNA_INT_VALUE_UNSET);
260         g_return_val_if_fail (info_class->get_mpeg_version != NULL,
261                               GUPNP_DLNA_INT_VALUE_UNSET);
262 
263         return info_class->get_mpeg_version (info);
264 }
265 
266 /**
267  * gupnp_dlna_audio_information_get_profile: (skip)
268  * @info: A #GUPnPDLNAAudioInformation object.
269  *
270  * Returns: A profile.
271  */
272 GUPnPDLNAStringValue
gupnp_dlna_audio_information_get_profile(GUPnPDLNAAudioInformation * info)273 gupnp_dlna_audio_information_get_profile (GUPnPDLNAAudioInformation *info)
274 {
275         GUPnPDLNAAudioInformationClass *info_class;
276 
277         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
278                               GUPNP_DLNA_STRING_VALUE_UNSET);
279 
280         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
281 
282         g_return_val_if_fail
283                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
284                              GUPNP_DLNA_STRING_VALUE_UNSET);
285         g_return_val_if_fail (info_class->get_profile != NULL,
286                               GUPNP_DLNA_STRING_VALUE_UNSET);
287 
288         return info_class->get_profile (info);
289 }
290 
291 /**
292  * gupnp_dlna_audio_information_get_rate: (skip)
293  * @info: A #GUPnPDLNAAudioInformation object.
294  *
295  * Returns: A sample rate.
296  */
297 GUPnPDLNAIntValue
gupnp_dlna_audio_information_get_rate(GUPnPDLNAAudioInformation * info)298 gupnp_dlna_audio_information_get_rate (GUPnPDLNAAudioInformation *info)
299 {
300         GUPnPDLNAAudioInformationClass *info_class;
301 
302         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
303                               GUPNP_DLNA_INT_VALUE_UNSET);
304 
305         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
306 
307         g_return_val_if_fail
308                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
309                              GUPNP_DLNA_INT_VALUE_UNSET);
310         g_return_val_if_fail (info_class->get_rate != NULL,
311                               GUPNP_DLNA_INT_VALUE_UNSET);
312 
313         return info_class->get_rate (info);
314 }
315 
316 /**
317  * gupnp_dlna_audio_information_get_stream_format: (skip)
318  * @info: A #GUPnPDLNAAudioInformation object.
319  *
320  * Returns: A stream format.
321  */
322 GUPnPDLNAStringValue
gupnp_dlna_audio_information_get_stream_format(GUPnPDLNAAudioInformation * info)323 gupnp_dlna_audio_information_get_stream_format (GUPnPDLNAAudioInformation *info)
324 {
325         GUPnPDLNAAudioInformationClass *info_class;
326 
327         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
328                               GUPNP_DLNA_STRING_VALUE_UNSET);
329 
330         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
331 
332         g_return_val_if_fail
333                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
334                              GUPNP_DLNA_STRING_VALUE_UNSET);
335         g_return_val_if_fail (info_class->get_stream_format != NULL,
336                               GUPNP_DLNA_STRING_VALUE_UNSET);
337 
338         return info_class->get_stream_format (info);
339 }
340 
341 /**
342  * gupnp_dlna_audio_information_get_wma_version: (skip)
343  * @info: A #GUPnPDLNAAudioInformation object.
344  *
345  * Returns: A WMA version.
346  */
347 GUPnPDLNAIntValue
gupnp_dlna_audio_information_get_wma_version(GUPnPDLNAAudioInformation * info)348 gupnp_dlna_audio_information_get_wma_version (GUPnPDLNAAudioInformation *info)
349 {
350         GUPnPDLNAAudioInformationClass *info_class;
351 
352         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
353                               GUPNP_DLNA_INT_VALUE_UNSET);
354 
355         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
356 
357         g_return_val_if_fail
358                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
359                              GUPNP_DLNA_INT_VALUE_UNSET);
360         g_return_val_if_fail (info_class->get_wma_version != NULL,
361                               GUPNP_DLNA_INT_VALUE_UNSET);
362 
363         return info_class->get_wma_version (info);
364 }
365 
366 /**
367  * gupnp_dlna_audio_information_get_mime: (skip)
368  * @info: A #GUPnPDLNAAudioInformation object.
369  *
370  * Returns: A MIME type.
371  */
372 GUPnPDLNAStringValue
gupnp_dlna_audio_information_get_mime(GUPnPDLNAAudioInformation * info)373 gupnp_dlna_audio_information_get_mime (GUPnPDLNAAudioInformation *info)
374 {
375         GUPnPDLNAAudioInformationClass *info_class;
376 
377         g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
378                               GUPNP_DLNA_STRING_VALUE_UNSET);
379 
380         info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
381 
382         g_return_val_if_fail
383                             (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
384                              GUPNP_DLNA_STRING_VALUE_UNSET);
385         g_return_val_if_fail (info_class->get_mime != NULL,
386                               GUPNP_DLNA_STRING_VALUE_UNSET);
387 
388         return info_class->get_mime (info);
389 }
390