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 "transcode <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 */
13 /* main header */
14 #include <gst/gst.h>
15 /* and a header we need for the string manipulation */
16 #include <string.h>
18 int
19 main (int argc, char *argv[])
20 {
21 GstElement *bin, *filesrc, *decoder, *encoder, *filesink;
22 gchar *artist, *title, *ext, *filename;
24 /* initialize GStreamer */
25 gst_init (&argc, &argv);
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 }
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 g_print ("It needs to be in the form of artist - title.mp3.\n");
45 return 1;
46 }
47 *title = '\0';
48 title += 3;
51 /* create a new bin to hold the elements */
52 bin = gst_pipeline_new ("pipeline");
53 g_assert (bin);
55 /* create a file reader */
56 filesrc = gst_element_factory_make ("filesrc", "disk_source");
57 g_assert (filesrc);
59 /* now it's time to get the decoder */
60 decoder = gst_element_factory_make ("mad", "decode");
61 if (!decoder) {
62 g_print ("could not find plugin \"mad\"");
63 return 1;
64 }
66 /* create the encoder */
67 encoder = gst_element_factory_make ("vorbisenc", "encoder");
68 if (!encoder) {
69 g_print ("cound not find plugin \"vorbisenc\"");
70 return 1;
71 }
73 /* and a file writer */
74 filesink = gst_element_factory_make ("filesink", "filesink");
75 g_assert (filesink);
77 /* set the filenames */
78 filename = g_strdup_printf ("%s.ogg", argv[1]); /* easy solution */
79 g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
80 g_object_set (G_OBJECT (filesink), "location", filename, NULL);
81 g_free (filename);
83 /* make sure the tag setter uses our stuff
84 (though that should already be default) */
85 gst_tag_setter_set_merge_mode (GST_TAG_SETTER (encoder), GST_TAG_MERGE_KEEP);
86 /* set the tagging information */
87 gst_tag_setter_add (GST_TAG_SETTER (encoder), GST_TAG_MERGE_REPLACE,
88 GST_TAG_ARTIST, artist, GST_TAG_TITLE, title, NULL);
90 /* add objects to the main pipeline */
91 gst_bin_add_many (GST_BIN (bin), filesrc, decoder, encoder, filesink, NULL);
93 /* link the elements */
94 gst_element_link_many (filesrc, decoder, encoder, filesink, NULL);
96 /* start playing */
97 gst_element_set_state (bin, GST_STATE_PLAYING);
99 while (gst_bin_iterate (GST_BIN (bin)));
101 /* stop the bin */
102 gst_element_set_state (bin, GST_STATE_NULL);
104 return 0;
105 }