changed volume envelope; should do a nice transition between both songs now
[platform/upstream/gstreamer.git] / examples / mixer / mixer.c
1 #include <stdlib.h>
2 #include <gst/gst.h>
3
4 gboolean playing;
5
6 /* example based on helloworld by thomas@apestaart.org
7    demonstrates the adder plugin and the volume envelope plugin 
8    work in progress but do try it out */
9
10 /* eos will be called when the src element has an end of stream */
11 void eos(GstElement *element) 
12 {
13   g_print("have eos, quitting\n");
14
15   playing = FALSE;
16 }
17
18 int main(int argc,char *argv[]) 
19 {
20   GstElement *bin_in1, *bin_in2, *main_bin;
21   GstElement *disksrc1, *decoder1, *volenv1;
22   GstElement *disksrc2, *decoder2, *volenv2;
23   GstElement *adder;
24   GstElement *audiosink;
25
26   GstPad *pad; /* to request pads for the adder */
27
28   gst_init(&argc,&argv);
29
30   if (argc != 3) {
31     g_print("usage: %s <filename1> <filename2>\n", argv[0]);
32     exit(-1);
33   }
34
35   /* create input bins */
36
37   /* create bins to hold the input elements */
38   bin_in1 = gst_bin_new("bin");
39   bin_in2 = gst_bin_new("bin");
40
41   /* first input bin */
42
43   /* create elements */
44
45   disksrc1 = gst_elementfactory_make("disksrc", "disk_source1");
46   gtk_object_set(GTK_OBJECT(disksrc1),"location", argv[1],NULL);
47   gtk_signal_connect(GTK_OBJECT(disksrc1),"eos",
48                      GTK_SIGNAL_FUNC(eos),NULL);
49   decoder1 = gst_elementfactory_make("mad","decoder1");
50   volenv1 = gst_elementfactory_make("volenv", "volume1");
51
52   /* add to the bin */
53
54   gst_bin_add(GST_BIN(bin_in1), disksrc1);
55   gst_bin_add(GST_BIN(bin_in1), decoder1);
56   gst_bin_add(GST_BIN(bin_in1), volenv1);
57
58   /* connect elements */
59   gst_pad_connect(gst_element_get_pad(disksrc1,"src"),
60                   gst_element_get_pad(decoder1,"sink"));
61   gst_pad_connect(gst_element_get_pad(decoder1,"src"),
62                   gst_element_get_pad(volenv1,"sink"));
63
64   /* add a ghost pad */
65   gst_element_add_ghost_pad (bin_in1, gst_element_get_pad (volenv1, "src"), "channel1");
66
67   /* second input bin */
68
69   /* create elements */
70
71   disksrc2 = gst_elementfactory_make("disksrc", "disk_source2");
72   gtk_object_set(GTK_OBJECT(disksrc2),"location", argv[2],NULL);
73   gtk_signal_connect(GTK_OBJECT(disksrc2),"eos",
74                      GTK_SIGNAL_FUNC(eos),NULL);
75   decoder2 = gst_elementfactory_make("mad","decoder2");
76   volenv2 = gst_elementfactory_make("volenv", "volume2");
77
78   /* add to the bin */
79
80   gst_bin_add(GST_BIN(bin_in2), disksrc2);
81   gst_bin_add(GST_BIN(bin_in2), decoder2);
82   gst_bin_add(GST_BIN(bin_in2), volenv2);
83
84   /* connect elements */
85   gst_pad_connect(gst_element_get_pad(disksrc2,"src"),
86                   gst_element_get_pad(decoder2,"sink"));
87   gst_pad_connect(gst_element_get_pad(decoder2,"src"),
88                   gst_element_get_pad(volenv2,"sink"));
89
90   /* add a ghost pad */
91   gst_element_add_ghost_pad (bin_in2, gst_element_get_pad (volenv2, "src"), "channel2");
92   
93
94   /* create adder */
95   adder = gst_elementfactory_make("adder", "adderel");
96
97   /* create an audio sink */
98   audiosink = gst_elementfactory_make("esdsink", "play_audio");
99
100   /* now create main bin */
101   main_bin = gst_bin_new("bin");
102
103   gst_bin_add(GST_BIN(main_bin), bin_in1);
104   gst_bin_add(GST_BIN(main_bin), bin_in2);
105   gst_bin_add(GST_BIN(main_bin), adder);
106   gst_bin_add(GST_BIN(main_bin), audiosink);
107
108   /* request pads and connect to adder */
109
110   pad = gst_element_request_pad_by_name (adder, "sink%d");
111   g_print ("new pad %s\n", gst_pad_get_name (pad));
112   gst_pad_connect (gst_element_get_pad (bin_in1, "channel1"), pad);
113   pad = gst_element_request_pad_by_name (adder, "sink%d");
114   g_print ("new pad %s\n", gst_pad_get_name (pad));
115   gst_pad_connect (gst_element_get_pad (bin_in2, "channel2"), pad);
116
117   /* connect adder and audiosink */
118
119   gst_pad_connect(gst_element_get_pad(adder,"src"),
120                   gst_element_get_pad(audiosink,"sink"));
121
122   /* register the volume envelope */
123
124   gtk_object_set(GTK_OBJECT(volenv1), "controlpoint", "0:0.000001", NULL);
125   gtk_object_set(GTK_OBJECT(volenv1), "controlpoint", "5:0.000001", NULL);
126   gtk_object_set(GTK_OBJECT(volenv1), "controlpoint", "10:1", NULL);
127   gtk_object_set(GTK_OBJECT(volenv1), "controlpoint", "15:1", NULL);
128   gtk_object_set(GTK_OBJECT(volenv1), "controlpoint", "20:0.000001", NULL);
129
130   gtk_object_set(GTK_OBJECT(volenv2), "controlpoint", "0:1", NULL);
131   gtk_object_set(GTK_OBJECT(volenv2), "controlpoint", "5:1", NULL);
132   gtk_object_set(GTK_OBJECT(volenv2), "controlpoint", "10:0.000001", NULL);
133   gtk_object_set(GTK_OBJECT(volenv2), "controlpoint", "15:0.000001", NULL);
134   gtk_object_set(GTK_OBJECT(volenv2), "controlpoint", "20:1", NULL);
135
136   /* start playing */
137   gst_element_set_state(main_bin, GST_STATE_PLAYING);
138
139   playing = TRUE;
140
141   while (playing) {
142     gst_bin_iterate(GST_BIN(main_bin));
143   }
144
145   /* stop the bin */
146   gst_element_set_state(main_bin, GST_STATE_NULL);
147
148   gst_object_destroy(GST_OBJECT(audiosink));
149
150   gst_object_destroy(GST_OBJECT(disksrc1));
151   gst_object_destroy(GST_OBJECT(decoder1));
152   gst_object_destroy(GST_OBJECT(volenv1));
153
154   gst_object_destroy(GST_OBJECT(disksrc2));
155   gst_object_destroy(GST_OBJECT(decoder2));
156   gst_object_destroy(GST_OBJECT(volenv2));
157
158   gst_object_destroy(GST_OBJECT(bin_in1));
159   gst_object_destroy(GST_OBJECT(bin_in2));
160   gst_object_destroy(GST_OBJECT(main_bin));
161
162   exit(0);
163 }
164