implemented ring buffer
[platform/upstream/gstreamer.git] / examples / cutter / cutter.c
1 /*
2  * cutter.c - cut audio into pieces based on silence  - thomas@apestaart.org
3  * 
4  * construct a simple pipeline osssrc ! cutter ! disksink
5  * pause when necessary, change output
6  *
7  * Latest change :      03/06/2001
8  *
9  * Version :            0.3
10  */
11
12 #include <stdlib.h>
13 #include <gst/gst.h>
14 #include <unistd.h>
15 #include <time.h>
16
17 #define DEBUG
18
19 gboolean        playing = TRUE;
20 gboolean        cut_start_signalled = FALSE;
21 gboolean        cut_stop_signalled = FALSE;
22
23 int             id = 0;                 /* increment this for each new cut */
24 GstElement      *main_bin;
25 GstElement      *audiosrc;
26 GstElement      *queue;
27 GstElement      *thread;
28 GstElement      *cutter;
29 GstElement      *disksink;
30 GstElement      *encoder;
31 char            buffer[255];
32
33 /* signal callbacks */
34
35 void cut_start (GstElement *element)
36 {
37   g_print ("\nDEBUG: main: cut start\n");
38   /* we should pause the pipeline, disconnect cutter and disksink
39    * create a new disksink to a real file, reconnect, and set to play
40    */
41   g_print ("DEBUG: cut_start: main_bin pausing\n");
42   gst_element_set_state (main_bin, GST_STATE_PAUSED);
43   g_print ("DEBUG: cut_start: main_bin paused\n");
44
45   {
46     long seconds;
47     struct tm *ct;
48     time (&seconds);
49     ct = localtime (&seconds);
50 //    sprintf (buffer, "/news/incoming/audio/cutter.%06d.wav", id);
51     sprintf (buffer, "/news/incoming/audio/cutter.%04d%02d%02d.%02d%02d%02d.wav", 
52         ct->tm_year + 1900, ct->tm_mon, ct->tm_mday,
53         ct->tm_hour, ct->tm_min, ct->tm_sec);
54   }
55   g_print ("DEBUG: cut_start: setting new location to %s\n", buffer);
56   g_object_set (G_OBJECT (disksink), "location", buffer, NULL);
57   g_object_set (G_OBJECT (disksink), "type", 4, NULL);
58
59   gst_element_set_state (main_bin, GST_STATE_PLAYING);
60   ++id;
61   g_print ("start_cut_signal done\n");
62   return;
63 }
64
65 void cut_start_signal (GstElement *element)
66 {
67   g_print ("\nDEBUG: main: cut start signal\n");
68   cut_start_signalled = TRUE;
69 }
70
71 void cut_stop (GstElement *element)
72 {
73   g_print ("\nDEBUG: main: cut stop\n");
74   /* we should pause the pipeline, disconnect disksink, create a fake disksink,
75    * connect to pipeline, and set to play
76    */
77   g_print ("DEBUG: cut_stop: main_bin paused\n");
78   gst_element_set_state (main_bin, GST_STATE_PAUSED);
79
80   g_print ("DEBUG: cut_stop: setting new location\n");
81   g_object_set (G_OBJECT (disksink), "location", "/dev/null", NULL);
82
83   gst_element_set_state (main_bin, GST_STATE_PLAYING);
84   g_print ("stop_cut_signal done\n");
85   return;
86 }
87
88 void cut_stop_signal (GstElement *element)
89 {
90   g_print ("\nDEBUG: main: cut stop signal\n");
91   cut_stop_signalled = TRUE;
92 }
93
94 int main (int argc, char *argv[]) 
95 {
96   //int i, j;
97   //gboolean done;
98   
99   //char buffer[20];
100   
101   //output_channel_t *channel_out;
102   
103   GstElement *audiosrc;
104
105   gst_init (&argc,&argv);
106 /*
107   if (argc == 1) 
108   {
109     g_print("usage: %s <filename1> <filename2> <...>\n", argv[0]);
110     exit(-1);
111   }*/
112   
113   /* set up input channel and main bin */
114
115   g_print ("creating main bin\n");  
116   /* create cutter */
117   cutter = gst_elementfactory_make ("cutter", "cutter");
118
119   g_object_set (G_OBJECT (cutter), 
120         "threshold_dB", -40.0, 
121         "runlength", 0.5,
122         "prelength", 1.0,
123         NULL);
124
125   /* create an audio src */
126   audiosrc = gst_elementfactory_make ("osssrc", "audio_src");
127
128   /* set params */
129
130   g_object_set (G_OBJECT (audiosrc), "frequency", 44100, 
131                                          "channels", 1,
132                                          "format", 16, NULL);
133
134   encoder = gst_elementfactory_make ("passthrough", "encoder");
135   disksink = gst_elementfactory_make ("afsink", "disk_sink");
136
137   g_object_set (G_OBJECT (disksink), "location", "/dev/null", NULL);
138
139   thread = gst_thread_new ("thread");
140   g_assert (thread != NULL);
141   
142   /* create main bin */
143   main_bin = gst_pipeline_new ("bin");
144   g_assert (main_bin != NULL);
145
146   queue = gst_elementfactory_make ("queue", "queue");
147
148   /* add elements to bin */
149   gst_bin_add (GST_BIN (main_bin), audiosrc);
150   gst_bin_add (GST_BIN (thread), queue);
151
152   gst_bin_add (GST_BIN (thread), cutter);
153   gst_bin_add (GST_BIN (thread), encoder);
154   gst_bin_add (GST_BIN (thread), disksink);
155
156   /* connect adder and disksink */
157
158   gst_pad_connect (gst_element_get_pad (audiosrc, "src"),
159                    gst_element_get_pad (queue, "sink"));
160
161   gst_pad_connect (gst_element_get_pad (queue, "src"),
162                    gst_element_get_pad (cutter, "sink"));
163   gst_pad_connect (gst_element_get_pad (cutter, "src"),
164                    gst_element_get_pad (encoder, "sink"));
165   gst_pad_connect (gst_element_get_pad (encoder, "src"),
166                    gst_element_get_pad (disksink, "sink"));
167
168   gst_bin_add (GST_BIN (main_bin), thread);
169
170   /* set signal handlers */
171   g_print ("setting signal handlers\n");
172   g_signal_connectc (G_OBJECT(cutter), "cut_start",
173                      (GCallback)cut_start_signal, NULL, FALSE);
174   g_signal_connectc (G_OBJECT(cutter), "cut_stop",
175                      (GCallback)cut_stop_signal, NULL, FALSE);
176
177   /* start playing */
178   g_print ("setting to play\n");
179   gst_element_set_state (main_bin, GST_STATE_PLAYING);
180 /*
181   g_print ("setting thread to play\n");
182   gst_element_set_state (GST_ELEMENT (thread), GST_STATE_PLAYING);
183 */
184   while (playing) 
185   {
186 //      g_print ("> ");
187       gst_bin_iterate (GST_BIN (main_bin));
188 //      g_print (" <");
189       if (cut_start_signalled)
190       {
191         g_print ("\nDEBUG: main: cut_start_signalled true !\n");
192         cut_start (cutter);
193         cut_start_signalled = FALSE;
194       }
195       if (cut_stop_signalled)
196       {
197         g_print ("\nDEBUG: main: cut_stop_signalled true !\n");
198         cut_stop (cutter);
199         cut_stop_signalled = FALSE;
200       }
201   }
202   g_print ("we're done iterating.\n");
203   /* stop the bin */
204
205   gst_element_set_state (main_bin, GST_STATE_NULL);
206
207   gst_object_destroy (GST_OBJECT (disksink));
208   gst_object_destroy (GST_OBJECT (main_bin));
209
210   exit(0);
211 }