~ubuntu-branches/ubuntu/maverick/brasero/maverick

1.1.23 by Robert Ancell
Import upstream version 2.27.2
1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2
/*
3
 * Libbrasero-burn
4
 * Copyright (C) Philippe Rouquier 2005-2009 <bonfire-app@wanadoo.fr>
5
 *
6
 * Libbrasero-burn is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 2 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * The Libbrasero-burn authors hereby grant permission for non-GPL compatible
12
 * GStreamer plugins to be used and distributed together with GStreamer
13
 * and Libbrasero-burn. This permission is above and beyond the permissions granted
14
 * by the GPL license by which Libbrasero-burn is covered. If you modify this code
15
 * you may extend this exception to your version of the code, but you are not
16
 * obligated to do so. If you do not wish to do so, delete this exception
17
 * statement from your version.
18
 * 
19
 * Libbrasero-burn is distributed in the hope that it will be useful,
20
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
 * GNU Library General Public License for more details.
23
 * 
24
 * You should have received a copy of the GNU General Public License
25
 * along with this program; if not, write to:
26
 * 	The Free Software Foundation, Inc.,
27
 * 	51 Franklin Street, Fifth Floor
28
 * 	Boston, MA  02110-1301, USA.
29
 */
30
31
#ifdef HAVE_CONFIG_H
32
#  include <config.h>
33
#endif
34
35
#include <glib.h>
36
#include <glib/gi18n-lib.h>
37
#include <glib-object.h>
1.1.25 by Robert Ancell
Import upstream version 2.27.4
38
#include <gio/gio.h>
1.1.23 by Robert Ancell
Import upstream version 2.27.2
39
40
#include "brasero-misc.h"
41
1.1.33 by Luke Yelavich
Import upstream version 2.29.1
42
#include "burn-debug.h"
43
1.1.23 by Robert Ancell
Import upstream version 2.27.2
44
#include "brasero-track-stream-cfg.h"
45
#include "brasero-io.h"
46
#include "brasero-tags.h"
47
1.1.34 by Robert Ancell
Import upstream version 2.29.2
48
static BraseroIOJobCallbacks *io_methods = NULL;
49
1.1.23 by Robert Ancell
Import upstream version 2.27.2
50
typedef struct _BraseroTrackStreamCfgPrivate BraseroTrackStreamCfgPrivate;
51
struct _BraseroTrackStreamCfgPrivate
52
{
53
	BraseroIOJobBase *load_uri;
54
1.1.25 by Robert Ancell
Import upstream version 2.27.4
55
	GFileMonitor *monitor;
56
1.1.23 by Robert Ancell
Import upstream version 2.27.2
57
	GError *error;
58
59
	guint loading:1;
60
};
61
62
#define BRASERO_TRACK_STREAM_CFG_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_TRACK_STREAM_CFG, BraseroTrackStreamCfgPrivate))
63
64
G_DEFINE_TYPE (BraseroTrackStreamCfg, brasero_track_stream_cfg, BRASERO_TYPE_TRACK_STREAM);
65
1.1.25 by Robert Ancell
Import upstream version 2.27.4
66
static void
67
brasero_track_stream_cfg_file_changed (GFileMonitor *monitor,
68
								GFile *file,
69
								GFile *other_file,
70
								GFileMonitorEvent event,
71
								BraseroTrackStream *track)
72
{
73
	BraseroTrackStreamCfgPrivate *priv;
74
	gchar *name;
75
76
	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (track);
77
78
        switch (event) {
79
 /*               case G_FILE_MONITOR_EVENT_CHANGED:
80
                        return;
81
*/
82
                case G_FILE_MONITOR_EVENT_DELETED:
83
                        g_object_unref (priv->monitor);
84
                        priv->monitor = NULL;
85
86
			name = g_file_get_basename (file);
87
			priv->error = g_error_new (BRASERO_BURN_ERROR,
88
								  BRASERO_BURN_ERROR_FILE_NOT_FOUND,
89
								  /* Translators: %s is the name of the file that has just been deleted */
90
								  _("\"%s\" was removed from the file system."),
91
								 name);
92
			g_free (name);
93
                        break;
94
95
                default:
96
                        return;
97
        }
98
99
        brasero_track_changed (BRASERO_TRACK (track));
100
}
101
102
static void
103
brasero_track_stream_cfg_results_cb (GObject *obj,
104
				     GError *error,
105
				     const gchar *uri,
106
				     GFileInfo *info,
107
				     gpointer user_data)
1.1.23 by Robert Ancell
Import upstream version 2.27.2
108
{
1.1.33 by Luke Yelavich
Import upstream version 2.29.1
109
	GFile *file;
1.1.23 by Robert Ancell
Import upstream version 2.27.2
110
	guint64 len;
1.1.25 by Robert Ancell
Import upstream version 2.27.4
111
	GObject *snapshot;
1.1.23 by Robert Ancell
Import upstream version 2.27.2
112
	BraseroTrackStreamCfgPrivate *priv;
113
114
	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (obj);
115
	priv->loading = FALSE;
116
117
	/* Check the return status for this file */
118
	if (error) {
119
		priv->error = g_error_copy (error);
120
		brasero_track_changed (BRASERO_TRACK (obj));
121
		return;
122
	}
123
124
	/* FIXME: we don't know whether it's audio or video that is required */
1.1.25 by Robert Ancell
Import upstream version 2.27.4
125
	if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) {
126
		/* This error is special as it can be recovered from */
127
		priv->error = g_error_new (BRASERO_BURN_ERROR,
128
					   BRASERO_BURN_ERROR_FILE_FOLDER,
129
					   _("Directories cannot be added to video or audio discs"));
130
		brasero_track_changed (BRASERO_TRACK (obj));
131
		return;
132
	}
133
134
	if (g_file_info_get_file_type (info) == G_FILE_TYPE_REGULAR
135
	&&  (!strcmp (g_file_info_get_content_type (info), "audio/x-scpls")
136
	||   !strcmp (g_file_info_get_content_type (info), "audio/x-ms-asx")
137
	||   !strcmp (g_file_info_get_content_type (info), "audio/x-mp3-playlist")
138
	||   !strcmp (g_file_info_get_content_type (info), "audio/x-mpegurl"))) {
139
		/* This error is special as it can be recovered from */
140
		priv->error = g_error_new (BRASERO_BURN_ERROR,
141
					   BRASERO_BURN_ERROR_FILE_PLAYLIST,
142
					   _("Playlists cannot be added to video or audio discs"));
143
144
		brasero_track_changed (BRASERO_TRACK (obj));
145
		return;
146
	}
147
1.1.23 by Robert Ancell
Import upstream version 2.27.2
148
	if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR
149
	|| (!g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_VIDEO)
150
	&&  !g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_AUDIO))) {
151
		gchar *name;
152
153
		BRASERO_GET_BASENAME_FOR_DISPLAY (uri, name);
154
		priv->error = g_error_new (BRASERO_BURN_ERROR,
1.1.25 by Robert Ancell
Import upstream version 2.27.4
155
					   BRASERO_BURN_ERROR_GENERAL,
1.1.23 by Robert Ancell
Import upstream version 2.27.2
156
					   /* Translators: %s is the name of the file */
157
					   _("\"%s\" is not suitable for audio or video media"),
158
					   name);
159
		g_free (name);
160
161
		brasero_track_changed (BRASERO_TRACK (obj));
162
		return;
163
	}
164
1.1.35 by Robert Ancell
Import upstream version 2.29.3
165
	/* Also make sure it's duration is appropriate (!= 0) */
166
	len = g_file_info_get_attribute_uint64 (info, BRASERO_IO_LEN);
167
	if (len <= 0) {
168
		gchar *name;
169
170
		BRASERO_GET_BASENAME_FOR_DISPLAY (uri, name);
171
		priv->error = g_error_new (BRASERO_BURN_ERROR,
172
					   BRASERO_BURN_ERROR_GENERAL,
173
					   /* Translators: %s is the name of the file */
174
					   _("\"%s\" is not suitable for audio or video media"),
175
					   name);
176
		g_free (name);
177
178
		brasero_track_changed (BRASERO_TRACK (obj));
179
		return;
180
	}
181
1.1.23 by Robert Ancell
Import upstream version 2.27.2
182
	if (g_file_info_get_is_symlink (info)) {
183
		gchar *sym_uri;
184
185
		sym_uri = g_strconcat ("file://", g_file_info_get_symlink_target (info), NULL);
186
		if (BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_source)
187
			BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_source (BRASERO_TRACK_STREAM (obj), sym_uri);
188
189
		g_free (sym_uri);
190
	}
191
1.1.33 by Luke Yelavich
Import upstream version 2.29.1
192
	/* Check whether the stream is wav+dts as it can be burnt as such */
193
	if (g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_DTS)) {
194
		BRASERO_BURN_LOG ("Track has DTS");
195
		BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_format (BRASERO_TRACK_STREAM (obj), 
196
		                                                                                BRASERO_AUDIO_FORMAT_DTS|
197
		                                                                                BRASERO_METADATA_INFO);
198
	}
199
	else if (BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_format)
1.1.23 by Robert Ancell
Import upstream version 2.27.2
200
		BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_format (BRASERO_TRACK_STREAM (obj),
1.1.33 by Luke Yelavich
Import upstream version 2.29.1
201
		                                                                                (g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_VIDEO)?
202
		                                                                                 BRASERO_VIDEO_FORMAT_UNDEFINED:BRASERO_AUDIO_FORMAT_NONE)|
203
		                                                                                (g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_AUDIO)?
204
		                                                                                 BRASERO_AUDIO_FORMAT_UNDEFINED:BRASERO_AUDIO_FORMAT_NONE)|
205
		                                                                                BRASERO_METADATA_INFO);
1.3.6 by Josselin Mouette
Import upstream version 2.30.1
206
1.1.37 by Didier Roche
Import upstream version 2.29.6
207
	/* Size/length. Only set when end value has not been already set.
208
	 * Fix #607752 -  audio track start and end points are overwritten after
209
	 * being read from a project file.
210
	 * We don't want to set a new len if one has been set already. Nevertheless
211
	 * if the length we detected is smaller than the one that was set we go
212
	 * for the new one. */
213
	if (BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_boundaries) {
214
		gint64 min_start;
215
216
		/* Make sure that the start value is coherent */
217
		min_start = (len - BRASERO_MIN_STREAM_LENGTH) >= 0? (len - BRASERO_MIN_STREAM_LENGTH):0;
218
		if (min_start && brasero_track_stream_get_start (BRASERO_TRACK_STREAM (obj)) > min_start) {
219
			BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_boundaries (BRASERO_TRACK_STREAM (obj),
220
													    min_start,
221
													    -1,
222
													    -1);
223
		}
224
225
		if (brasero_track_stream_get_end (BRASERO_TRACK_STREAM (obj)) > len
226
		||  brasero_track_stream_get_end (BRASERO_TRACK_STREAM (obj)) <= 0) {
227
			/* Don't set either gap or start to make sure we don't remove
228
			 * values set by project parser or values set from the beginning
229
			 * Fix #607752 -  audio track start and end points are overwritten
230
			 * after being read from a project file */
231
			BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_boundaries (BRASERO_TRACK_STREAM (obj),
232
													    -1,
233
													    len,
234
													    -1);
235
		}
236
	}
1.1.25 by Robert Ancell
Import upstream version 2.27.4
237
238
	snapshot = g_file_info_get_attribute_object (info, BRASERO_IO_THUMBNAIL);
239
	if (snapshot) {
240
		GValue *value;
241
242
		value = g_new0 (GValue, 1);
243
		g_value_init (value, GDK_TYPE_PIXBUF);
244
		g_value_set_object (value, g_object_ref (snapshot));
245
		brasero_track_tag_add (BRASERO_TRACK (obj),
246
				       BRASERO_TRACK_STREAM_THUMBNAIL_TAG,
247
				       value);
248
	}
249
250
	if (g_file_info_get_content_type (info)) {
251
		const gchar *icon_string = "text-x-preview";
252
		GtkIconTheme *theme;
253
		GIcon *icon;
254
255
		theme = gtk_icon_theme_get_default ();
256
257
		/* NOTE: implemented in glib 2.15.6 (not for windows though) */
258
		icon = g_content_type_get_icon (g_file_info_get_content_type (info));
259
		if (G_IS_THEMED_ICON (icon)) {
260
			const gchar * const *names = NULL;
261
262
			names = g_themed_icon_get_names (G_THEMED_ICON (icon));
263
			if (names) {
264
				gint i;
265
266
				for (i = 0; names [i]; i++) {
267
					if (gtk_icon_theme_has_icon (theme, names [i])) {
268
						icon_string = names [i];
269
						break;
270
					}
271
				}
272
			}
273
		}
274
275
		brasero_track_tag_add_string (BRASERO_TRACK (obj),
276
					      BRASERO_TRACK_STREAM_MIME_TAG,
277
					      icon_string);
278
		g_object_unref (icon);
279
	}
280
1.1.23 by Robert Ancell
Import upstream version 2.27.2
281
	/* Get the song info */
1.1.29 by Robert Ancell
Import upstream version 2.27.92
282
	if (g_file_info_get_attribute_string (info, BRASERO_IO_TITLE)
283
	&& !brasero_track_tag_lookup_string (BRASERO_TRACK (obj), BRASERO_TRACK_STREAM_TITLE_TAG))
1.1.23 by Robert Ancell
Import upstream version 2.27.2
284
		brasero_track_tag_add_string (BRASERO_TRACK (obj),
285
					      BRASERO_TRACK_STREAM_TITLE_TAG,
286
					      g_file_info_get_attribute_string (info, BRASERO_IO_TITLE));
1.1.29 by Robert Ancell
Import upstream version 2.27.92
287
	if (g_file_info_get_attribute_string (info, BRASERO_IO_ARTIST)
288
	&& !brasero_track_tag_lookup_string (BRASERO_TRACK (obj), BRASERO_TRACK_STREAM_ARTIST_TAG))
1.1.23 by Robert Ancell
Import upstream version 2.27.2
289
		brasero_track_tag_add_string (BRASERO_TRACK (obj),
290
					      BRASERO_TRACK_STREAM_ARTIST_TAG,
291
					      g_file_info_get_attribute_string (info, BRASERO_IO_ARTIST));
1.1.35 by Robert Ancell
Import upstream version 2.29.3
292
	if (g_file_info_get_attribute_string (info, BRASERO_IO_ALBUM)
293
	&& !brasero_track_tag_lookup_string (BRASERO_TRACK (obj), BRASERO_TRACK_STREAM_ALBUM_TAG))
294
		brasero_track_tag_add_string (BRASERO_TRACK (obj),
295
					      BRASERO_TRACK_STREAM_ALBUM_TAG,
296
					      g_file_info_get_attribute_string (info, BRASERO_IO_ALBUM));
1.1.29 by Robert Ancell
Import upstream version 2.27.92
297
	if (g_file_info_get_attribute_string (info, BRASERO_IO_COMPOSER)
298
	&& !brasero_track_tag_lookup_string (BRASERO_TRACK (obj), BRASERO_TRACK_STREAM_COMPOSER_TAG))
1.1.23 by Robert Ancell
Import upstream version 2.27.2
299
		brasero_track_tag_add_string (BRASERO_TRACK (obj),
300
					      BRASERO_TRACK_STREAM_COMPOSER_TAG,
301
					      g_file_info_get_attribute_string (info, BRASERO_IO_COMPOSER));
1.1.29 by Robert Ancell
Import upstream version 2.27.92
302
	if (g_file_info_get_attribute_int32 (info, BRASERO_IO_ISRC)
303
	&& !brasero_track_tag_lookup_int (BRASERO_TRACK (obj), BRASERO_TRACK_STREAM_ISRC_TAG))
1.1.23 by Robert Ancell
Import upstream version 2.27.2
304
		brasero_track_tag_add_int (BRASERO_TRACK (obj),
305
					   BRASERO_TRACK_STREAM_ISRC_TAG,
306
					   g_file_info_get_attribute_int32 (info, BRASERO_IO_ISRC));
307
1.1.25 by Robert Ancell
Import upstream version 2.27.4
308
	/* Start monitoring it */
309
	file = g_file_new_for_uri (uri);
310
	priv->monitor = g_file_monitor_file (file,
311
	                                     G_FILE_MONITOR_NONE,
312
	                                     NULL,
313
	                                     NULL);
314
	g_object_unref (file);
315
316
	g_signal_connect (priv->monitor,
317
	                  "changed",
318
	                  G_CALLBACK (brasero_track_stream_cfg_file_changed),
319
	                  obj);
320
1.1.23 by Robert Ancell
Import upstream version 2.27.2
321
	brasero_track_changed (BRASERO_TRACK (obj));
322
}
323
324
static void
325
brasero_track_stream_cfg_get_info (BraseroTrackStreamCfg *track)
326
{
327
	BraseroTrackStreamCfgPrivate *priv;
328
	gchar *uri;
329
330
	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (track);
331
332
	if (priv->error) {
333
		g_error_free (priv->error);
334
		priv->error = NULL;
335
	}
336
337
	/* get info async for the file */
1.1.34 by Robert Ancell
Import upstream version 2.29.2
338
	if (!priv->load_uri) {
339
		if (!io_methods)
340
			io_methods = brasero_io_register_job_methods (brasero_track_stream_cfg_results_cb,
341
			                                              NULL,
342
			                                              NULL);
343
344
		priv->load_uri = brasero_io_register_with_methods (G_OBJECT (track), io_methods);
345
	}
1.1.23 by Robert Ancell
Import upstream version 2.27.2
346
347
	priv->loading = TRUE;
348
	uri = brasero_track_stream_get_source (BRASERO_TRACK_STREAM (track), TRUE);
349
	brasero_io_get_file_info (uri,
350
				  priv->load_uri,
351
				  BRASERO_IO_INFO_PERM|
352
				  BRASERO_IO_INFO_MIME|
353
				  BRASERO_IO_INFO_URGENT|
354
				  BRASERO_IO_INFO_METADATA|
355
				  BRASERO_IO_INFO_METADATA_MISSING_CODEC|
356
				  BRASERO_IO_INFO_METADATA_THUMBNAIL,
357
				  track);
1.1.25 by Robert Ancell
Import upstream version 2.27.4
358
	g_free (uri);
1.1.23 by Robert Ancell
Import upstream version 2.27.2
359
}
360
361
static BraseroBurnResult
362
brasero_track_stream_cfg_set_source (BraseroTrackStream *track,
363
				     const gchar *uri)
364
{
1.1.25 by Robert Ancell
Import upstream version 2.27.4
365
	BraseroTrackStreamCfgPrivate *priv;
366
367
	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (track);
368
	if (priv->monitor) {
369
		g_object_unref (priv->monitor);
370
		priv->monitor = NULL;
371
	}
372
373
	if (priv->load_uri)
374
		brasero_io_cancel_by_base (priv->load_uri);
375
1.1.23 by Robert Ancell
Import upstream version 2.27.2
376
	if (BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_source)
377
		BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_source (track, uri);
378
379
	brasero_track_stream_cfg_get_info (BRASERO_TRACK_STREAM_CFG (track));
380
	brasero_track_changed (BRASERO_TRACK (track));
381
	return BRASERO_BURN_OK;
382
}
383
384
static BraseroBurnResult
385
brasero_track_stream_cfg_get_status (BraseroTrack *track,
386
				     BraseroStatus *status)
387
{
388
	BraseroTrackStreamCfgPrivate *priv;
389
390
	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (track);
391
392
	if (priv->error) {
393
		brasero_status_set_error (status, g_error_copy (priv->error));
394
		return BRASERO_BURN_ERR;
395
	}
396
397
	if (priv->loading) {
398
		if (status)
399
			brasero_status_set_not_ready (status,
400
						      -1.0,
401
						      _("Analysing video files"));
402
403
		return BRASERO_BURN_NOT_READY;
404
	}
405
406
	if (status)
407
		brasero_status_set_completed (status);
408
1.1.25 by Robert Ancell
Import upstream version 2.27.4
409
	return BRASERO_TRACK_CLASS (brasero_track_stream_cfg_parent_class)->get_status (track, status);
1.1.23 by Robert Ancell
Import upstream version 2.27.2
410
}
411
412
static void
413
brasero_track_stream_cfg_init (BraseroTrackStreamCfg *object)
414
{ }
415
416
static void
417
brasero_track_stream_cfg_finalize (GObject *object)
418
{
419
	BraseroTrackStreamCfgPrivate *priv;
420
421
	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (object);
1.1.25 by Robert Ancell
Import upstream version 2.27.4
422
423
	if (priv->load_uri) {
424
		brasero_io_cancel_by_base (priv->load_uri);
1.1.34 by Robert Ancell
Import upstream version 2.29.2
425
426
		if (io_methods->ref == 1)
427
			io_methods = NULL;
428
429
		brasero_io_job_base_free (priv->load_uri);
1.1.25 by Robert Ancell
Import upstream version 2.27.4
430
		priv->load_uri = NULL;
431
	}
432
433
	if (priv->monitor) {
434
		g_object_unref (priv->monitor);
435
		priv->monitor = NULL;
436
	}
437
1.1.23 by Robert Ancell
Import upstream version 2.27.2
438
	if (priv->error) {
439
		g_error_free (priv->error);
440
		priv->error = NULL;
441
	}
442
443
	G_OBJECT_CLASS (brasero_track_stream_cfg_parent_class)->finalize (object);
444
}
445
446
static void
447
brasero_track_stream_cfg_class_init (BraseroTrackStreamCfgClass *klass)
448
{
449
	GObjectClass* object_class = G_OBJECT_CLASS (klass);
450
	BraseroTrackClass* track_class = BRASERO_TRACK_CLASS (klass);
451
	BraseroTrackStreamClass *parent_class = BRASERO_TRACK_STREAM_CLASS (klass);
452
453
	g_type_class_add_private (klass, sizeof (BraseroTrackStreamCfgPrivate));
454
455
	object_class->finalize = brasero_track_stream_cfg_finalize;
456
457
	track_class->get_status = brasero_track_stream_cfg_get_status;
458
459
	parent_class->set_source = brasero_track_stream_cfg_set_source;
460
}
461
1.1.27 by Chris Coulson
Import upstream version 2.27.90
462
/**
463
 * brasero_track_stream_cfg_new:
464
 *
465
 *  Creates a new #BraseroTrackStreamCfg object.
466
 *
467
 * Return value: a #BraseroTrackStreamCfg object.
468
 **/
469
1.1.25 by Robert Ancell
Import upstream version 2.27.4
470
BraseroTrackStreamCfg *
471
brasero_track_stream_cfg_new (void)
472
{
473
	return g_object_new (BRASERO_TYPE_TRACK_STREAM_CFG, NULL);
474
}
475