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