gstreamer_core/tsrc/examples/wav_record/src/wav_record.c
author hgs
Tue, 24 Aug 2010 03:01:45 -0500
changeset 28 4ed5253bb6ba
parent 26 69c7080681bf
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26
hgs
parents:
diff changeset
     1
hgs
parents:
diff changeset
     2
#include <gst/gst_global.h>
hgs
parents:
diff changeset
     3
#include <stdlib.h>
hgs
parents:
diff changeset
     4
#include <gst/gst.h>
hgs
parents:
diff changeset
     5
#include <gst/gstelement.h>
hgs
parents:
diff changeset
     6
#include <string.h>
hgs
parents:
diff changeset
     7
#define LOG_FILE "c:\\logs\\wav_record_logs.txt" 
hgs
parents:
diff changeset
     8
#include "std_log_result.h" 
hgs
parents:
diff changeset
     9
#define LOG_FILENAME_LINE __FILE__, __LINE__
hgs
parents:
diff changeset
    10
hgs
parents:
diff changeset
    11
void create_xml(int result)
hgs
parents:
diff changeset
    12
{
hgs
parents:
diff changeset
    13
hgs
parents:
diff changeset
    14
    if(result)
hgs
parents:
diff changeset
    15
    {
hgs
parents:
diff changeset
    16
        assert_failed = 1;
hgs
parents:
diff changeset
    17
    } 
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
    testResultXml(xmlfile);
hgs
parents:
diff changeset
    20
    close_log_file();
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
    if(result)
hgs
parents:
diff changeset
    23
    {
hgs
parents:
diff changeset
    24
        exit (-1);
hgs
parents:
diff changeset
    25
    }    
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
}
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
GstElement *pipeline, *source, *wavenc,*sink;
hgs
parents:
diff changeset
    30
GstBus *bus;
hgs
parents:
diff changeset
    31
GMainLoop *loop;
28
hgs
parents: 26
diff changeset
    32
gint error;
26
hgs
parents:
diff changeset
    33
static gboolean
hgs
parents:
diff changeset
    34
bus_call (GstBus     *bus,
hgs
parents:
diff changeset
    35
          GstMessage *msg,
hgs
parents:
diff changeset
    36
          gpointer    data)
hgs
parents:
diff changeset
    37
{
hgs
parents:
diff changeset
    38
  switch (GST_MESSAGE_TYPE (msg)) {
hgs
parents:
diff changeset
    39
    case GST_MESSAGE_EOS:
hgs
parents:
diff changeset
    40
        gst_element_set_state (pipeline, GST_STATE_NULL);
hgs
parents:
diff changeset
    41
        g_main_loop_quit(loop);
hgs
parents:
diff changeset
    42
        gst_object_unref (GST_OBJECT (pipeline));
hgs
parents:
diff changeset
    43
        //std_log(LOG_FILENAME_LINE, "Test Successful");
28
hgs
parents: 26
diff changeset
    44
        create_xml(error); 
26
hgs
parents:
diff changeset
    45
      break;
hgs
parents:
diff changeset
    46
    case GST_MESSAGE_ERROR: {
hgs
parents:
diff changeset
    47
      gchar *debug;
hgs
parents:
diff changeset
    48
      GError *err;
hgs
parents:
diff changeset
    49
      gst_message_parse_error (msg, &err, &debug);
hgs
parents:
diff changeset
    50
      g_free (debug);
hgs
parents:
diff changeset
    51
      g_print ("Error: %s\n", err->message);
28
hgs
parents: 26
diff changeset
    52
      error = err->code;
26
hgs
parents:
diff changeset
    53
      g_error_free (err);
hgs
parents:
diff changeset
    54
      //std_log(LOG_FILENAME_LINE, "Test Failed");
28
hgs
parents: 26
diff changeset
    55
26
hgs
parents:
diff changeset
    56
      break;
hgs
parents:
diff changeset
    57
    }
hgs
parents:
diff changeset
    58
    default:
hgs
parents:
diff changeset
    59
      break;
hgs
parents:
diff changeset
    60
  }
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
  return TRUE;
hgs
parents:
diff changeset
    63
}
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
static gboolean
hgs
parents:
diff changeset
    66
quit_loop (gpointer data)
hgs
parents:
diff changeset
    67
{
hgs
parents:
diff changeset
    68
    gst_element_send_event (pipeline, gst_event_new_eos ());
hgs
parents:
diff changeset
    69
    
hgs
parents:
diff changeset
    70
}
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
/// exe name record_duration sampling_rate chans width
hgs
parents:
diff changeset
    74
int main (int argc, char *argv[])
hgs
parents:
diff changeset
    75
{
hgs
parents:
diff changeset
    76
    char filename[1024];
hgs
parents:
diff changeset
    77
    GstCaps* caps;
hgs
parents:
diff changeset
    78
    int sampling_rate = 8000;
hgs
parents:
diff changeset
    79
    int chans = 1; 
hgs
parents:
diff changeset
    80
    int width = 16;
hgs
parents:
diff changeset
    81
    guint record_duration = 10000;
hgs
parents:
diff changeset
    82
    
28
hgs
parents: 26
diff changeset
    83
    error = 0;
26
hgs
parents:
diff changeset
    84
    if (argc > 1) {
hgs
parents:
diff changeset
    85
    record_duration = (guint) atoi( argv[1] ) * 1000;
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
    if (argc > 2) {
hgs
parents:
diff changeset
    89
    sampling_rate = (int) atoi( argv[2] );
hgs
parents:
diff changeset
    90
    }
hgs
parents:
diff changeset
    91
    
hgs
parents:
diff changeset
    92
    if (argc > 3) {
hgs
parents:
diff changeset
    93
    chans = (int) atoi( argv[3] );
hgs
parents:
diff changeset
    94
    }
hgs
parents:
diff changeset
    95
    
hgs
parents:
diff changeset
    96
    if (argc > 4) {
hgs
parents:
diff changeset
    97
    width = (int) atoi( argv[4] );
hgs
parents:
diff changeset
    98
    }
hgs
parents:
diff changeset
    99
    
hgs
parents:
diff changeset
   100
    
hgs
parents:
diff changeset
   101
    gst_init (&argc, &argv);
hgs
parents:
diff changeset
   102
    loop = g_main_loop_new (NULL, FALSE);
hgs
parents:
diff changeset
   103
    
hgs
parents:
diff changeset
   104
    /* create elements */
hgs
parents:
diff changeset
   105
    pipeline = gst_pipeline_new ("audio-player");
hgs
parents:
diff changeset
   106
    source = gst_element_factory_make ("devsoundsrc", "audio-source");
hgs
parents:
diff changeset
   107
    wavenc = gst_element_factory_make ("wavenc", "mp3parse");
hgs
parents:
diff changeset
   108
    sink = gst_element_factory_make ("filesink", "sink");    
hgs
parents:
diff changeset
   109
    
hgs
parents:
diff changeset
   110
    if (!pipeline || !source || !wavenc || !sink) {
hgs
parents:
diff changeset
   111
        g_print ("One element could not be created\n");
hgs
parents:
diff changeset
   112
        return -1;
hgs
parents:
diff changeset
   113
        }
hgs
parents:
diff changeset
   114
    snprintf(filename, 1024, "C:\\data\\wav_record_samp-%d-chans-%d-duration-%dsec.wav",
hgs
parents:
diff changeset
   115
            sampling_rate, chans,record_duration/1000 );
hgs
parents:
diff changeset
   116
    
hgs
parents:
diff changeset
   117
    /* set filename property on the file source. Also add a message  handler. */
hgs
parents:
diff changeset
   118
    g_object_set (G_OBJECT (sink), "location", filename, NULL);
hgs
parents:
diff changeset
   119
            /* put all elements in a bin */
hgs
parents:
diff changeset
   120
    gst_bin_add_many (GST_BIN (pipeline),source, wavenc,sink, NULL);
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    caps = gst_caps_new_simple ("audio/x-raw-int",
hgs
parents:
diff changeset
   123
              "width", G_TYPE_INT, width,
hgs
parents:
diff changeset
   124
              "depth", G_TYPE_INT, width,
hgs
parents:
diff changeset
   125
              "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   126
              "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   127
              "rate", G_TYPE_INT, sampling_rate,
hgs
parents:
diff changeset
   128
              "channels", G_TYPE_INT, chans, NULL);  
hgs
parents:
diff changeset
   129
    
hgs
parents:
diff changeset
   130
    gst_element_link_filtered (source, wavenc, caps);
hgs
parents:
diff changeset
   131
    gst_element_link (wavenc, sink);
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)), bus_call, loop);
hgs
parents:
diff changeset
   134
    //g_signal_connect (decoder, "pad-added", G_CALLBACK (new_pad_cb),pipeline);
hgs
parents:
diff changeset
   135
            /* Now set to playing and iterate. */
hgs
parents:
diff changeset
   136
    g_print ("Setting to PLAYING\n");
hgs
parents:
diff changeset
   137
    gst_element_set_state (pipeline, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   138
    g_timeout_add (record_duration, quit_loop, loop);
hgs
parents:
diff changeset
   139
    g_print ("Running\n");
hgs
parents:
diff changeset
   140
    g_main_loop_run (loop);
hgs
parents:
diff changeset
   141
            /* clean up nicely */
hgs
parents:
diff changeset
   142
    g_print ("Returned, stopping playback\n");
hgs
parents:
diff changeset
   143
    gst_element_set_state (pipeline, GST_STATE_NULL);
hgs
parents:
diff changeset
   144
    g_print ("Deleting pipeline\n");
hgs
parents:
diff changeset
   145
    gst_object_unref (GST_OBJECT (pipeline));
hgs
parents:
diff changeset
   146
    
hgs
parents:
diff changeset
   147
    g_print ("completed palying audio\n");
hgs
parents:
diff changeset
   148
    return 0;
hgs
parents:
diff changeset
   149
}
hgs
parents:
diff changeset
   150