whitespace fixes
[platform/upstream/gstreamer.git] / tests / old / examples / retag / retag.c
1 /*
2  * This example shows how to use interfaces and the tag subsystem.
3  * It takes an mp3 file as input, and makes an ogg file out of it. While doing
4  * this, it parses the filename and sets artist and title in the ogg file.
5  * It assumes the filename to be "<artist> - <title>.mp3"
6  *
7  * Run the program as "retag <mp3 file>"
8  *
9  * To run this program, you need to have the gst-plugins package (specifically
10  * the vorbis and mad plugins) installed.
11  */
12
13 /* main header */
14 #include <gst/gst.h>
15 /* and a header we need for the string manipulation */
16 #include <string.h>
17
18 int
19 main (int argc, char *argv[])
20 {
21   GstElement *bin, *filesrc, *tag_changer, *filesink;
22   gchar *artist, *title, *ext, *filename;
23
24   /* initialize GStreamer */
25   gst_init (&argc, &argv);
26
27   /* check that the argument is there */
28   if (argc != 2) {
29     g_print ("usage: %s <mp3 file>\n", argv[0]);
30     return 1;
31   }
32
33   /* parse the mp3 name */
34   artist = strrchr (argv[1], '/');
35   if (artist == NULL)
36     artist = argv[1];
37   artist = g_strdup (artist);
38   ext = strrchr (artist, '.');
39   if (ext)
40     *ext = '\0';
41   title = strstr (artist, " - ");
42   if (title == NULL) {
43     g_print ("The format of the mp3 file is invalid.\n");
44     return 1;
45   }
46   *title = '\0';
47   title += 3;
48
49
50   /* create a new bin to hold the elements */
51   bin = gst_pipeline_new ("pipeline");
52   g_assert (bin);
53
54   /* create a file reader */
55   filesrc = gst_element_factory_make ("filesrc", "disk_source");
56   g_assert (filesrc);
57
58   /* now it's time to get the tag_changer */
59   tag_changer = gst_element_factory_make ("id3tag", "tag_changer");
60   if (!tag_changer) {
61     g_print ("could not find plugin \"mad\"");
62     return 1;
63   }
64
65   /* and a file writer */
66   filesink = gst_element_factory_make ("filesink", "filesink");
67   g_assert (filesink);
68
69   /* set the filenames */
70   filename = g_strdup_printf ("%s.temp", argv[1]);      /* easy solution */
71   g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
72   g_object_set (G_OBJECT (filesink), "location", filename, NULL);
73
74   /* make sure the tag setter uses our stuff
75      (though that should already be default) */
76   gst_tag_setter_set_merge_mode (GST_TAG_SETTER (tag_changer),
77       GST_TAG_MERGE_KEEP);
78   /* set the tagging information */
79   gst_tag_setter_add (GST_TAG_SETTER (tag_changer), GST_TAG_MERGE_REPLACE,
80       GST_TAG_ARTIST, artist, GST_TAG_TITLE, title, NULL);
81
82   /* add objects to the main pipeline */
83   gst_bin_add_many (GST_BIN (bin), filesrc, tag_changer, filesink, NULL);
84
85   /* link the elements */
86   if (!gst_element_link_many (filesrc, tag_changer, filesink, NULL))
87     g_assert_not_reached ();
88
89   /* start playing */
90   gst_element_set_state (bin, GST_STATE_PLAYING);
91
92   while (gst_bin_iterate (GST_BIN (bin)));
93
94   /* stop the bin */
95   gst_element_set_state (bin, GST_STATE_NULL);
96
97   /* rename the file to the correct name and remove the old one */
98   remove (argv[1]);
99   rename (filename, argv[1]);
100   g_free (filename);
101
102   return 0;
103 }