gstreamer_test_apps/QtGSTPlayer/record_play.c
author hgs
Fri, 14 May 2010 18:43:44 -0500
changeset 20 7e3786c5ed27
parent 18 5824eee55f42
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
hgs
parents:
diff changeset
     1
hgs
parents:
diff changeset
     2
hgs
parents:
diff changeset
     3
#include <stdlib.h>
hgs
parents:
diff changeset
     4
#include <string.h>
hgs
parents:
diff changeset
     5
#include <gst/gst.h>
hgs
parents:
diff changeset
     6
#include "record_play.h"
hgs
parents:
diff changeset
     7
hgs
parents:
diff changeset
     8
hgs
parents:
diff changeset
     9
GstElement *bin;
hgs
parents:
diff changeset
    10
extern int mCurrentState;
hgs
parents:
diff changeset
    11
hgs
parents:
diff changeset
    12
static GstElement *
hgs
parents:
diff changeset
    13
create_video_output ()
hgs
parents:
diff changeset
    14
{
hgs
parents:
diff changeset
    15
  static gboolean have_video = FALSE;
hgs
parents:
diff changeset
    16
  GstBin *bin;
hgs
parents:
diff changeset
    17
  GstElement *queue, *sink;
hgs
parents:
diff changeset
    18
  GstPad *pad;
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
  if (have_video) {
hgs
parents:
diff changeset
    21
    //g_print ("Already playing a video stream. Ignoring this one\n");
hgs
parents:
diff changeset
    22
    return NULL;
hgs
parents:
diff changeset
    23
  }
hgs
parents:
diff changeset
    24
  
hgs
parents:
diff changeset
    25
  /* create a new bin to hold the elements */
hgs
parents:
diff changeset
    26
  if((bin = (GstBin*) gst_bin_new (NULL)) == NULL)
hgs
parents:
diff changeset
    27
  //bin = (GstBin*) gst_pipeline_new("pipeline");
hgs
parents:
diff changeset
    28
  return NULL;
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
  /* Queue to ensure all streams can push data */
hgs
parents:
diff changeset
    31
  queue = gst_element_factory_make ("queue", "q");
hgs
parents:
diff changeset
    32
  if(queue == NULL)
hgs
parents:
diff changeset
    33
      return NULL;/* Queue should always be available */
hgs
parents:
diff changeset
    34
  /* Set the queue to buffer 1/10 of a second of raw video */
hgs
parents:
diff changeset
    35
  g_object_set (queue, "max-size-time", (GstClockTime) GST_SECOND / 10,
hgs
parents:
diff changeset
    36
      "max-size-bytes", 0, "max-size-buffers", 0, NULL);
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
//  cs = gst_element_factory_make ("ffmpegcolorspace", "cs");
hgs
parents:
diff changeset
    39
//  if (!cs)
hgs
parents:
diff changeset
    40
//    goto no_output;
hgs
parents:
diff changeset
    41
    
hgs
parents:
diff changeset
    42
  /* and a video sink */
hgs
parents:
diff changeset
    43
  sink = gst_element_factory_make ("fakesink"/*autovideosink*/, "sink");
hgs
parents:
diff changeset
    44
  if (!sink)
hgs
parents:
diff changeset
    45
    goto no_output;
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
  /* add objects to the main pipeline */
hgs
parents:
diff changeset
    48
  gst_bin_add_many (GST_BIN (bin), queue, sink, NULL);
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
  /* Link the elements */
hgs
parents:
diff changeset
    51
  gst_element_link_many (queue, sink, NULL);
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
  /* Retrieve the sinkpad from the queue and 'ghost' it onto
hgs
parents:
diff changeset
    54
   * the bin so that the caller can find it generically */
hgs
parents:
diff changeset
    55
  pad = gst_element_get_pad (queue, "sink");
hgs
parents:
diff changeset
    56
  gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad));
hgs
parents:
diff changeset
    57
  gst_object_unref (pad);
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
  //have_video = TRUE;
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
  return GST_ELEMENT (bin);
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
  /* ERRORS */
hgs
parents:
diff changeset
    64
no_output:
hgs
parents:
diff changeset
    65
  {
hgs
parents:
diff changeset
    66
    //g_print ("Could not create either ffmpegcolorspace or autovideosink for output");
hgs
parents:
diff changeset
    67
    return NULL;
hgs
parents:
diff changeset
    68
  }
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
static GstElement *
hgs
parents:
diff changeset
    72
create_audio_output ()
hgs
parents:
diff changeset
    73
{
hgs
parents:
diff changeset
    74
  static gboolean have_audio = FALSE;
hgs
parents:
diff changeset
    75
  GstBin *bin;
hgs
parents:
diff changeset
    76
  GstElement *queue, *audioconvert,*audioresample, *sink;
hgs
parents:
diff changeset
    77
  GstPad *pad;
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
  if (have_audio) {
hgs
parents:
diff changeset
    80
    //g_print ("Already playing an audio stream. Ignoring this one\n");
hgs
parents:
diff changeset
    81
    return NULL;
hgs
parents:
diff changeset
    82
  }
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
  /* create a new bin to hold the elements */
hgs
parents:
diff changeset
    85
  bin = (GstBin*) gst_bin_new (NULL);
hgs
parents:
diff changeset
    86
  if(!bin)
hgs
parents:
diff changeset
    87
      goto no_output;
hgs
parents:
diff changeset
    88
  
hgs
parents:
diff changeset
    89
  /* Queue to ensure all streams can push data */
hgs
parents:
diff changeset
    90
  queue = gst_element_factory_make ("queue", "q");
hgs
parents:
diff changeset
    91
  if (!queue) /* Queue should always be available */
hgs
parents:
diff changeset
    92
      goto no_output;
hgs
parents:
diff changeset
    93
  /* Set the queue to buffer 1/10 of a second of raw audio */
hgs
parents:
diff changeset
    94
  g_object_set (queue, "max-size-time", (GstClockTime) GST_SECOND / 10,
hgs
parents:
diff changeset
    95
      "max-size-bytes", 0, "max-size-buffers", 0, NULL);
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
  /* an audio converter to convert floating-point audio samples to int format */
hgs
parents:
diff changeset
    98
  audioconvert = gst_element_factory_make ("audioconvert", "ac");
hgs
parents:
diff changeset
    99
  if (!audioconvert)
hgs
parents:
diff changeset
   100
      goto no_output;
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
  /* an audio converter to convert floating-point audio samples to int format */
hgs
parents:
diff changeset
   103
  audioresample = gst_element_factory_make ("audioresample", "audioresample");
hgs
parents:
diff changeset
   104
  if (!audioresample)
hgs
parents:
diff changeset
   105
      goto no_output;
hgs
parents:
diff changeset
   106
  
hgs
parents:
diff changeset
   107
  /* and an audio sink */
hgs
parents:
diff changeset
   108
  sink = gst_element_factory_make ("autoaudiosink", "sink");
hgs
parents:
diff changeset
   109
  if (!sink)
hgs
parents:
diff changeset
   110
      goto no_output;
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
  /* add objects to the bin */
hgs
parents:
diff changeset
   113
  gst_bin_add_many (GST_BIN (bin), queue, audioconvert,audioresample, sink, NULL);
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
  /* link the elements */
hgs
parents:
diff changeset
   116
  gst_element_link_many (queue, audioconvert,audioresample, sink, NULL);
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
  /* Retrieve the sinkpad from the queue element and 'ghost' it onto
hgs
parents:
diff changeset
   119
   * the bin so that the caller can find it generically */
hgs
parents:
diff changeset
   120
  pad = gst_element_get_pad (queue, "sink");
hgs
parents:
diff changeset
   121
  gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad));
hgs
parents:
diff changeset
   122
  gst_object_unref (pad);
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
  //have_audio = TRUE;
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
  return GST_ELEMENT (bin);
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
  /* ERRORS */
hgs
parents:
diff changeset
   129
no_output:
hgs
parents:
diff changeset
   130
  { 
hgs
parents:
diff changeset
   131
    //g_print ("Could not create either ffmpegcolorspace or autovideosink for output");
hgs
parents:
diff changeset
   132
    return NULL;
hgs
parents:
diff changeset
   133
  }
hgs
parents:
diff changeset
   134
}
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
static void 
hgs
parents:
diff changeset
   137
new_decoded_pad (GstElement * element, GstPad * pad, gboolean last,
hgs
parents:
diff changeset
   138
      GstBin *top_pipeline)
hgs
parents:
diff changeset
   139
{
hgs
parents:
diff changeset
   140
  GstPad *out_pad;
hgs
parents:
diff changeset
   141
  GstElement *output = NULL;
hgs
parents:
diff changeset
   142
  GstCaps *caps;
hgs
parents:
diff changeset
   143
  GstStructure *s;
hgs
parents:
diff changeset
   144
  const gchar *stream_type;
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
  /* Decide which output we are creating based on the stream contents */
hgs
parents:
diff changeset
   147
  caps = gst_pad_get_caps (pad);
hgs
parents:
diff changeset
   148
  if (caps == NULL) {
hgs
parents:
diff changeset
   149
    //g_print ("Decodebin produced an unknown stream - ignoring\n");
hgs
parents:
diff changeset
   150
    return;
hgs
parents:
diff changeset
   151
  }
hgs
parents:
diff changeset
   152
  
hgs
parents:
diff changeset
   153
  s = gst_caps_get_structure (caps, 0);
hgs
parents:
diff changeset
   154
  if(s == NULL)/* Caps on a pad should always have exactly one entry */
hgs
parents:
diff changeset
   155
      return;
hgs
parents:
diff changeset
   156
  
hgs
parents:
diff changeset
   157
  stream_type = gst_structure_get_name (s);
hgs
parents:
diff changeset
   158
  
hgs
parents:
diff changeset
   159
  if (g_str_has_prefix (stream_type, "video/x-raw-")) {
hgs
parents:
diff changeset
   160
    /* Is a new video stream */
hgs
parents:
diff changeset
   161
    //g_print ("Encountered a new video stream\n");
hgs
parents:
diff changeset
   162
    output = create_video_output ();
hgs
parents:
diff changeset
   163
  }
hgs
parents:
diff changeset
   164
  else if (g_str_has_prefix (stream_type, "audio/x-raw-")) {
hgs
parents:
diff changeset
   165
    //g_print ("Encountered a new audio stream\n");
hgs
parents:
diff changeset
   166
    output = create_audio_output ();
hgs
parents:
diff changeset
   167
  }
hgs
parents:
diff changeset
   168
  else {
hgs
parents:
diff changeset
   169
    //g_print ("Found unknown stream of type %s - ignoring\n", stream_type);
hgs
parents:
diff changeset
   170
  }
hgs
parents:
diff changeset
   171
  
hgs
parents:
diff changeset
   172
  /* If no renderer was created, ignore this stream */
hgs
parents:
diff changeset
   173
  if (output == NULL)
hgs
parents:
diff changeset
   174
    return;
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
  /* Add the output into our pipeline */
hgs
parents:
diff changeset
   177
  gst_bin_add (top_pipeline, output);
hgs
parents:
diff changeset
   178
  
hgs
parents:
diff changeset
   179
  /* If we created a output pipeline, retrieve the sink pad from it */
hgs
parents:
diff changeset
   180
  out_pad = gst_element_get_pad (output, "sink");
hgs
parents:
diff changeset
   181
  g_return_if_fail (out_pad != NULL);
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
  /* Attempt to link the new pad to the output */  
hgs
parents:
diff changeset
   184
  if (gst_pad_link (pad, out_pad) != GST_PAD_LINK_OK) {
hgs
parents:
diff changeset
   185
    //g_print ("Failed to add the rendering pipeline for this new data stream\n");
hgs
parents:
diff changeset
   186
    gst_bin_remove (top_pipeline, output);
hgs
parents:
diff changeset
   187
    gst_object_unref (out_pad);
hgs
parents:
diff changeset
   188
    return;
hgs
parents:
diff changeset
   189
  }
hgs
parents:
diff changeset
   190
  gst_object_unref (out_pad);
hgs
parents:
diff changeset
   191
  
hgs
parents:
diff changeset
   192
  /* New output renderer is successfully linked in the pipeline.
hgs
parents:
diff changeset
   193
   * Change its state to playing so it is ready to receive data */
hgs
parents:
diff changeset
   194
  gst_element_set_state (output, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   195
}
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
static void
hgs
parents:
diff changeset
   198
print_tag (const GstTagList * list, const gchar * tag, gpointer unused)
hgs
parents:
diff changeset
   199
{
hgs
parents:
diff changeset
   200
  gint i, count;
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
  count = gst_tag_list_get_tag_size (list, tag);
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
  for (i = 0; i < count; i++) {
hgs
parents:
diff changeset
   205
    gchar *str;
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
    if (gst_tag_get_type (tag) == G_TYPE_STRING) {
hgs
parents:
diff changeset
   208
      if (!gst_tag_list_get_string_index (list, tag, i, &str))
hgs
parents:
diff changeset
   209
        g_assert_not_reached ();
hgs
parents:
diff changeset
   210
    } else {
hgs
parents:
diff changeset
   211
      str =
hgs
parents:
diff changeset
   212
          g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i));
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
    if (i == 0) {
hgs
parents:
diff changeset
   216
      //g_print ("  %15s: %s\n", gst_tag_get_nick (tag), str);
hgs
parents:
diff changeset
   217
    } else {
hgs
parents:
diff changeset
   218
      //g_print ("                 : %s\n", str);
hgs
parents:
diff changeset
   219
    }
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
    g_free (str);
hgs
parents:
diff changeset
   222
  }
hgs
parents:
diff changeset
   223
}
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
static gboolean
hgs
parents:
diff changeset
   228
bus_call (GstBus     *bus,
hgs
parents:
diff changeset
   229
          GstMessage *message,
hgs
parents:
diff changeset
   230
          gpointer    data)
hgs
parents:
diff changeset
   231
{
hgs
parents:
diff changeset
   232
  switch (GST_MESSAGE_TYPE (message)){
hgs
parents:
diff changeset
   233
      case GST_MESSAGE_EOS:
hgs
parents:
diff changeset
   234
        gst_message_unref (message);
hgs
parents:
diff changeset
   235
        gst_element_set_state (bin, GST_STATE_NULL);
hgs
parents:
diff changeset
   236
        /* Unreffing the bin will clean up all its children too */
hgs
parents:
diff changeset
   237
        gst_object_unref (bin);           
hgs
parents:
diff changeset
   238
        mCurrentState = NONE;
hgs
parents:
diff changeset
   239
        break;
hgs
parents:
diff changeset
   240
      case GST_MESSAGE_ERROR:{
hgs
parents:
diff changeset
   241
        GError *gerror;
hgs
parents:
diff changeset
   242
        gchar *debug;
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
        gst_message_parse_error (message, &gerror, &debug);
hgs
parents:
diff changeset
   245
        gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
hgs
parents:
diff changeset
   246
        gst_message_unref (message);
hgs
parents:
diff changeset
   247
        g_error_free (gerror);
hgs
parents:
diff changeset
   248
        g_free (debug);
hgs
parents:
diff changeset
   249
        gst_element_set_state (bin, GST_STATE_NULL);
hgs
parents:
diff changeset
   250
        /* Unreffing the bin will clean up all its children too */
hgs
parents:
diff changeset
   251
        gst_object_unref (bin);           
hgs
parents:
diff changeset
   252
        mCurrentState = NONE;
hgs
parents:
diff changeset
   253
        break;
hgs
parents:
diff changeset
   254
      }
hgs
parents:
diff changeset
   255
      case GST_MESSAGE_WARNING:{
hgs
parents:
diff changeset
   256
        GError *gerror;
hgs
parents:
diff changeset
   257
        gchar *debug;
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
        gst_message_parse_warning (message, &gerror, &debug);
hgs
parents:
diff changeset
   260
        gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
hgs
parents:
diff changeset
   261
        gst_message_unref (message);
hgs
parents:
diff changeset
   262
        g_error_free (gerror);
hgs
parents:
diff changeset
   263
        g_free (debug);
hgs
parents:
diff changeset
   264
        break;
hgs
parents:
diff changeset
   265
      }
hgs
parents:
diff changeset
   266
      case GST_MESSAGE_TAG:
hgs
parents:
diff changeset
   267
      {
hgs
parents:
diff changeset
   268
        GstTagList *tags;
hgs
parents:
diff changeset
   269
hgs
parents:
diff changeset
   270
        gst_message_parse_tag (message, &tags);
hgs
parents:
diff changeset
   271
        if (tags) {
hgs
parents:
diff changeset
   272
          //g_print ("TAGS received from element \"%s\".\n",
hgs
parents:
diff changeset
   273
           //   GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))));
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
          gst_tag_list_foreach (tags, print_tag, NULL);
hgs
parents:
diff changeset
   276
          gst_tag_list_free (tags);
hgs
parents:
diff changeset
   277
          tags = NULL;
hgs
parents:
diff changeset
   278
        }
hgs
parents:
diff changeset
   279
        break;
hgs
parents:
diff changeset
   280
      }
hgs
parents:
diff changeset
   281
      default:
hgs
parents:
diff changeset
   282
        gst_message_unref (message);
hgs
parents:
diff changeset
   283
        break;
hgs
parents:
diff changeset
   284
    }
hgs
parents:
diff changeset
   285
  return TRUE;
hgs
parents:
diff changeset
   286
}
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
//static void
hgs
parents:
diff changeset
   291
//event_loop (GstElement * pipe)
hgs
parents:
diff changeset
   292
//{
hgs
parents:
diff changeset
   293
//  GstBus *bus;
hgs
parents:
diff changeset
   294
//  GstMessage *message = NULL;
hgs
parents:
diff changeset
   295
//
hgs
parents:
diff changeset
   296
//  bus = gst_element_get_bus (GST_ELEMENT (pipe));
hgs
parents:
diff changeset
   297
//
hgs
parents:
diff changeset
   298
//  while (TRUE) {
hgs
parents:
diff changeset
   299
//    message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
hgs
parents:
diff changeset
   300
//
hgs
parents:
diff changeset
   301
//    g_assert (message != NULL);
hgs
parents:
diff changeset
   302
//
hgs
parents:
diff changeset
   303
//    switch (message->type) {
hgs
parents:
diff changeset
   304
//      case GST_MESSAGE_EOS:
hgs
parents:
diff changeset
   305
//        gst_message_unref (message);
hgs
parents:
diff changeset
   306
//        return;
hgs
parents:
diff changeset
   307
//      case GST_MESSAGE_ERROR:{
hgs
parents:
diff changeset
   308
//        GError *gerror;
hgs
parents:
diff changeset
   309
//        gchar *debug;
hgs
parents:
diff changeset
   310
//
hgs
parents:
diff changeset
   311
//        gst_message_parse_error (message, &gerror, &debug);
hgs
parents:
diff changeset
   312
//        gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
hgs
parents:
diff changeset
   313
//        gst_message_unref (message);
hgs
parents:
diff changeset
   314
//        g_error_free (gerror);
hgs
parents:
diff changeset
   315
//        g_free (debug);
hgs
parents:
diff changeset
   316
//        return;
hgs
parents:
diff changeset
   317
//      }
hgs
parents:
diff changeset
   318
//      case GST_MESSAGE_WARNING:{
hgs
parents:
diff changeset
   319
//        GError *gerror;
hgs
parents:
diff changeset
   320
//        gchar *debug;
hgs
parents:
diff changeset
   321
//
hgs
parents:
diff changeset
   322
//        gst_message_parse_warning (message, &gerror, &debug);
hgs
parents:
diff changeset
   323
//        gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
hgs
parents:
diff changeset
   324
//        gst_message_unref (message);
hgs
parents:
diff changeset
   325
//        g_error_free (gerror);
hgs
parents:
diff changeset
   326
//        g_free (debug);
hgs
parents:
diff changeset
   327
//        break;
hgs
parents:
diff changeset
   328
//      }
hgs
parents:
diff changeset
   329
//      case GST_MESSAGE_TAG:
hgs
parents:
diff changeset
   330
//      {
hgs
parents:
diff changeset
   331
//        GstTagList *tags;
hgs
parents:
diff changeset
   332
//
hgs
parents:
diff changeset
   333
//        gst_message_parse_tag (message, &tags);
hgs
parents:
diff changeset
   334
//        if (tags) {
hgs
parents:
diff changeset
   335
//          //g_print ("TAGS received from element \"%s\".\n",
hgs
parents:
diff changeset
   336
//              GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))));
hgs
parents:
diff changeset
   337
//
hgs
parents:
diff changeset
   338
//          gst_tag_list_foreach (tags, print_tag, NULL);
hgs
parents:
diff changeset
   339
//          gst_tag_list_free (tags);
hgs
parents:
diff changeset
   340
//          tags = NULL;
hgs
parents:
diff changeset
   341
//        }
hgs
parents:
diff changeset
   342
//        break;
hgs
parents:
diff changeset
   343
//      }
hgs
parents:
diff changeset
   344
//      default:
hgs
parents:
diff changeset
   345
//        gst_message_unref (message);
hgs
parents:
diff changeset
   346
//        break;
hgs
parents:
diff changeset
   347
//    }
hgs
parents:
diff changeset
   348
//  }
hgs
parents:
diff changeset
   349
//}
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
int
hgs
parents:
diff changeset
   352
gst_play_file (const char* file)
hgs
parents:
diff changeset
   353
{
hgs
parents:
diff changeset
   354
  GstElement *filesrc, *decodebin, *sink;
hgs
parents:
diff changeset
   355
  GstCaps* caps;
hgs
parents:
diff changeset
   356
  //int length = strlen( file );
hgs
parents:
diff changeset
   357
  //gst_init (&argc, &argv);
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
  if (file == NULL) {
hgs
parents:
diff changeset
   360
    //g_print ("file is not present");
hgs
parents:
diff changeset
   361
    goto no_output;
hgs
parents:
diff changeset
   362
  }
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
  //g_print ("Constructing pipeline\n");
hgs
parents:
diff changeset
   365
  
hgs
parents:
diff changeset
   366
  /* create a new bin to hold the elements */
hgs
parents:
diff changeset
   367
  bin = gst_pipeline_new ("pipeline");
hgs
parents:
diff changeset
   368
  if(!bin)
hgs
parents:
diff changeset
   369
      goto no_output;
hgs
parents:
diff changeset
   370
hgs
parents:
diff changeset
   371
  /* create a disk reader */
hgs
parents:
diff changeset
   372
  filesrc = gst_element_factory_make ("filesrc", "disk_source");
hgs
parents:
diff changeset
   373
  if(!filesrc)
hgs
parents:
diff changeset
   374
      goto no_output;
hgs
parents:
diff changeset
   375
  
hgs
parents:
diff changeset
   376
  g_object_set (G_OBJECT (filesrc), "location", file, NULL);
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
  if( g_str_has_suffix (file, "raw") )
hgs
parents:
diff changeset
   379
  {
hgs
parents:
diff changeset
   380
      sink = gst_element_factory_make ("devsoundsink", "sink");
hgs
parents:
diff changeset
   381
      caps = gst_caps_new_simple ("audio/x-raw-int",
hgs
parents:
diff changeset
   382
                   "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   383
                   "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   384
                   "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   385
                   "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   386
                   "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   387
                   "channels", G_TYPE_INT, 1, NULL);     
hgs
parents:
diff changeset
   388
      gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
hgs
parents:
diff changeset
   389
      
hgs
parents:
diff changeset
   390
      gst_element_link_filtered (filesrc, sink, caps);      
hgs
parents:
diff changeset
   391
  }
hgs
parents:
diff changeset
   392
  else if( g_str_has_suffix (file, "g711") )
hgs
parents:
diff changeset
   393
  {
hgs
parents:
diff changeset
   394
      sink = gst_element_factory_make ("devsoundsink", "sink");
hgs
parents:
diff changeset
   395
      caps = gst_caps_new_simple ("audio/x-alaw",
hgs
parents:
diff changeset
   396
                   "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   397
                   "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   398
                   "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   399
                   "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   400
                   "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   401
                   "channels", G_TYPE_INT, 1, NULL);   
hgs
parents:
diff changeset
   402
      gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
hgs
parents:
diff changeset
   403
      
hgs
parents:
diff changeset
   404
      gst_element_link_filtered (filesrc, sink, caps);     
hgs
parents:
diff changeset
   405
  }
hgs
parents:
diff changeset
   406
  else if( g_str_has_suffix (file, "g729") )
hgs
parents:
diff changeset
   407
  {
hgs
parents:
diff changeset
   408
      sink = gst_element_factory_make ("devsoundsink", "sink");
hgs
parents:
diff changeset
   409
      caps = gst_caps_new_simple ("audio/g729",
hgs
parents:
diff changeset
   410
                   "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   411
                   "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   412
                   "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   413
                   "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   414
                   "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   415
                   "channels", G_TYPE_INT, 1, NULL);  
hgs
parents:
diff changeset
   416
      gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
hgs
parents:
diff changeset
   417
      
hgs
parents:
diff changeset
   418
      gst_element_link_filtered (filesrc, sink, caps);   
hgs
parents:
diff changeset
   419
  }
hgs
parents:
diff changeset
   420
  else if( g_str_has_suffix (file, "ilbc") )
hgs
parents:
diff changeset
   421
  {
hgs
parents:
diff changeset
   422
      sink = gst_element_factory_make ("devsoundsink", "sink");
hgs
parents:
diff changeset
   423
      
hgs
parents:
diff changeset
   424
      caps = gst_caps_new_simple ("audio/ilbc",
hgs
parents:
diff changeset
   425
                   "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   426
                   "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   427
                   "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   428
                   "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   429
                   "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   430
                   "channels", G_TYPE_INT, 1, NULL);   
hgs
parents:
diff changeset
   431
      
hgs
parents:
diff changeset
   432
      gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
      gst_element_link_filtered (filesrc, sink, caps);   
hgs
parents:
diff changeset
   435
  }
hgs
parents:
diff changeset
   436
  else if( g_str_has_suffix (file, "amr") )
hgs
parents:
diff changeset
   437
  {
hgs
parents:
diff changeset
   438
      sink = gst_element_factory_make ("devsoundsink", "sink");
hgs
parents:
diff changeset
   439
      caps = gst_caps_new_simple ("audio/amr",
hgs
parents:
diff changeset
   440
                   "width", G_TYPE_INT, 8,
hgs
parents:
diff changeset
   441
                   "depth", G_TYPE_INT, 8,
hgs
parents:
diff changeset
   442
                   "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   443
                   "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   444
                   "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   445
                   "channels", G_TYPE_INT, 1, NULL);   
hgs
parents:
diff changeset
   446
      gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
hgs
parents:
diff changeset
   447
      
hgs
parents:
diff changeset
   448
      //gst_element_link (source, sink);
hgs
parents:
diff changeset
   449
      gst_element_link_filtered (filesrc, sink, caps);     
hgs
parents:
diff changeset
   450
  }
hgs
parents:
diff changeset
   451
  
hgs
parents:
diff changeset
   452
  else
hgs
parents:
diff changeset
   453
  {
hgs
parents:
diff changeset
   454
      /* Create the decodebin */
hgs
parents:
diff changeset
   455
      decodebin = gst_element_factory_make ("decodebin", NULL);
hgs
parents:
diff changeset
   456
      if (!decodebin) {
hgs
parents:
diff changeset
   457
        //g_print ("could not find the \"decodebin\" element\n");
hgs
parents:
diff changeset
   458
        return -1;
hgs
parents:
diff changeset
   459
      }
hgs
parents:
diff changeset
   460
    
hgs
parents:
diff changeset
   461
      /* add objects to the main pipeline */
hgs
parents:
diff changeset
   462
      gst_bin_add_many (GST_BIN (bin), filesrc, decodebin, NULL);
hgs
parents:
diff changeset
   463
    
hgs
parents:
diff changeset
   464
      /* link the elements. */
hgs
parents:
diff changeset
   465
      gst_element_link_many (filesrc, decodebin, NULL);
hgs
parents:
diff changeset
   466
      
hgs
parents:
diff changeset
   467
      /* Connect to decodebin's 'new-decoded-pad' signal to detect when it produces
hgs
parents:
diff changeset
   468
       * a new stream */
hgs
parents:
diff changeset
   469
      g_signal_connect (G_OBJECT (decodebin), "new-decoded-pad", 
hgs
parents:
diff changeset
   470
          G_CALLBACK (new_decoded_pad), bin);
hgs
parents:
diff changeset
   471
  }
hgs
parents:
diff changeset
   472
hgs
parents:
diff changeset
   473
  gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL);
hgs
parents:
diff changeset
   474
  //g_print ("Starting playback\n");   
hgs
parents:
diff changeset
   475
  /* start playing */
hgs
parents:
diff changeset
   476
  gst_element_set_state (bin, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   477
  return 0;
hgs
parents:
diff changeset
   478
  
hgs
parents:
diff changeset
   479
no_output:
hgs
parents:
diff changeset
   480
      return -1;
hgs
parents:
diff changeset
   481
  
hgs
parents:
diff changeset
   482
}
hgs
parents:
diff changeset
   483
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
int
hgs
parents:
diff changeset
   486
gst_record_file (int type)
hgs
parents:
diff changeset
   487
{
hgs
parents:
diff changeset
   488
    GstElement *audiosrc, *filesink;
hgs
parents:
diff changeset
   489
    char* carray = NULL;
hgs
parents:
diff changeset
   490
    GstCaps* caps;
hgs
parents:
diff changeset
   491
    //g_print ("Constructing pipeline\n");
hgs
parents:
diff changeset
   492
    
hgs
parents:
diff changeset
   493
    /* switch case for recording type*/
hgs
parents:
diff changeset
   494
    switch( type )
hgs
parents:
diff changeset
   495
    {
hgs
parents:
diff changeset
   496
        case RECORD_RAW: 
hgs
parents:
diff changeset
   497
            caps = gst_caps_new_simple ("audio/x-raw-int",
hgs
parents:
diff changeset
   498
                       "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   499
                       "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   500
                       "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   501
                       "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   502
                       "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   503
                       "channels", G_TYPE_INT, 1, NULL);
hgs
parents:
diff changeset
   504
            
hgs
parents:
diff changeset
   505
            carray = "c:\\data\\sounds\\Digital\\record.raw";
hgs
parents:
diff changeset
   506
            break;
hgs
parents:
diff changeset
   507
            
hgs
parents:
diff changeset
   508
        case RECORD_AMR: 
hgs
parents:
diff changeset
   509
            {
hgs
parents:
diff changeset
   510
            return gst_record_amr();
hgs
parents:
diff changeset
   511
            }
hgs
parents:
diff changeset
   512
            break;
hgs
parents:
diff changeset
   513
hgs
parents:
diff changeset
   514
        case RECORD_G711:  
hgs
parents:
diff changeset
   515
hgs
parents:
diff changeset
   516
            caps = gst_caps_new_simple ("audio/x-alaw",
hgs
parents:
diff changeset
   517
                       "width", G_TYPE_INT, 8,
hgs
parents:
diff changeset
   518
                       "depth", G_TYPE_INT, 8,
hgs
parents:
diff changeset
   519
                       "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   520
                       "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   521
                       "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   522
                       "channels", G_TYPE_INT, 1, NULL);
hgs
parents:
diff changeset
   523
hgs
parents:
diff changeset
   524
            carray = "c:\\data\\sounds\\Digital\\record.g711";
hgs
parents:
diff changeset
   525
            break;
hgs
parents:
diff changeset
   526
            
hgs
parents:
diff changeset
   527
        case RECORD_G729: // 
hgs
parents:
diff changeset
   528
hgs
parents:
diff changeset
   529
            caps = gst_caps_new_simple ("audio/g729",
hgs
parents:
diff changeset
   530
                       "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   531
                       "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   532
                       "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   533
                       "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   534
                       "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   535
                       "channels", G_TYPE_INT, 1, NULL);
hgs
parents:
diff changeset
   536
            
hgs
parents:
diff changeset
   537
            carray = "c:\\data\\sounds\\Digital\\record.g729";
hgs
parents:
diff changeset
   538
            break;
hgs
parents:
diff changeset
   539
            
hgs
parents:
diff changeset
   540
        case RECORD_ILBC: // 
hgs
parents:
diff changeset
   541
hgs
parents:
diff changeset
   542
            caps = gst_caps_new_simple ("audio/ilbc",
hgs
parents:
diff changeset
   543
                       "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   544
                       "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   545
                       "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   546
                       "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   547
                       "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   548
                       "channels", G_TYPE_INT, 1, NULL);
hgs
parents:
diff changeset
   549
            
hgs
parents:
diff changeset
   550
            carray = "c:\\data\\sounds\\Digital\\record.ilbc";
hgs
parents:
diff changeset
   551
            break;
hgs
parents:
diff changeset
   552
        case RECORD_WAV:
hgs
parents:
diff changeset
   553
            {
hgs
parents:
diff changeset
   554
                return gst_record_wav();
hgs
parents:
diff changeset
   555
            }
hgs
parents:
diff changeset
   556
            break;
hgs
parents:
diff changeset
   557
        case RECORD_AAC:
hgs
parents:
diff changeset
   558
            {
hgs
parents:
diff changeset
   559
                return gst_record_aac();
hgs
parents:
diff changeset
   560
            }
hgs
parents:
diff changeset
   561
            break;
hgs
parents:
diff changeset
   562
        default:
hgs
parents:
diff changeset
   563
            return -1;
hgs
parents:
diff changeset
   564
            break;            
hgs
parents:
diff changeset
   565
    }
hgs
parents:
diff changeset
   566
    /* create a new bin to hold the elements */
hgs
parents:
diff changeset
   567
    bin = gst_pipeline_new ("pipeline");
hgs
parents:
diff changeset
   568
    if(!bin)
hgs
parents:
diff changeset
   569
        goto no_output;
hgs
parents:
diff changeset
   570
    
hgs
parents:
diff changeset
   571
    /* create a disk reader */
hgs
parents:
diff changeset
   572
    audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source");
hgs
parents:
diff changeset
   573
    if(!audiosrc)
hgs
parents:
diff changeset
   574
        goto no_output;
hgs
parents:
diff changeset
   575
   
hgs
parents:
diff changeset
   576
    /* Create the decodebin */
hgs
parents:
diff changeset
   577
    filesink = gst_element_factory_make ("filesink", NULL);
hgs
parents:
diff changeset
   578
    if(!filesink)
hgs
parents:
diff changeset
   579
        goto no_output;
hgs
parents:
diff changeset
   580
    
hgs
parents:
diff changeset
   581
    g_object_set (G_OBJECT (audiosrc),
hgs
parents:
diff changeset
   582
              "blocksize", 1280,
hgs
parents:
diff changeset
   583
               NULL);
hgs
parents:
diff changeset
   584
    
hgs
parents:
diff changeset
   585
    g_object_set (G_OBJECT (filesink), "location", carray,"buffer-size",1280, NULL);
hgs
parents:
diff changeset
   586
   
hgs
parents:
diff changeset
   587
    /* add objects to the main pipeline */
hgs
parents:
diff changeset
   588
    gst_bin_add_many (GST_BIN (bin), audiosrc, filesink, NULL);
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
    /* link the elements. */
hgs
parents:
diff changeset
   591
    gst_element_link_filtered (audiosrc, filesink, caps);
hgs
parents:
diff changeset
   592
    //gst_element_link_many (audiosrc, filesink, NULL);
hgs
parents:
diff changeset
   593
    gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL);
hgs
parents:
diff changeset
   594
    
hgs
parents:
diff changeset
   595
    //g_print ("Starting recoring\n");   
hgs
parents:
diff changeset
   596
    /* start playing */
hgs
parents:
diff changeset
   597
    gst_element_set_state (bin, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
    /* Run event loop listening for bus messages until EOS or ERROR */
hgs
parents:
diff changeset
   600
    //event_loop (bin);
hgs
parents:
diff changeset
   601
    
hgs
parents:
diff changeset
   602
//    //g_print ("Finished playback - stopping pipeline\n");
hgs
parents:
diff changeset
   603
//    
hgs
parents:
diff changeset
   604
//    /* stop the bin */
hgs
parents:
diff changeset
   605
//    gst_element_set_state (bin, GST_STATE_NULL);
hgs
parents:
diff changeset
   606
//    
hgs
parents:
diff changeset
   607
//    /* Unreffing the bin will clean up all its children too */
hgs
parents:
diff changeset
   608
//    gst_object_unref (bin);
hgs
parents:
diff changeset
   609
//    
hgs
parents:
diff changeset
   610
    return 0;
hgs
parents:
diff changeset
   611
no_output:
hgs
parents:
diff changeset
   612
    return -1;
hgs
parents:
diff changeset
   613
hgs
parents:
diff changeset
   614
}
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
hgs
parents:
diff changeset
   617
int
hgs
parents:
diff changeset
   618
gst_record_wav ()
hgs
parents:
diff changeset
   619
{
hgs
parents:
diff changeset
   620
    GstElement *audiosrc, *filesink, *wavenc;
hgs
parents:
diff changeset
   621
    char* carray = NULL;
hgs
parents:
diff changeset
   622
    GstCaps* caps;
hgs
parents:
diff changeset
   623
    
hgs
parents:
diff changeset
   624
    //g_print ("Constructing pipeline\n");
hgs
parents:
diff changeset
   625
    
hgs
parents:
diff changeset
   626
    /* create a new bin to hold the elements */
hgs
parents:
diff changeset
   627
    bin = gst_pipeline_new ("pipeline");
hgs
parents:
diff changeset
   628
    if(!bin)
hgs
parents:
diff changeset
   629
        goto no_output;
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
    /* create a disk reader */
hgs
parents:
diff changeset
   632
    audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source");
hgs
parents:
diff changeset
   633
    if(!audiosrc)
hgs
parents:
diff changeset
   634
        goto no_output;
hgs
parents:
diff changeset
   635
hgs
parents:
diff changeset
   636
    /* Create the decodebin */
hgs
parents:
diff changeset
   637
    filesink = gst_element_factory_make ("filesink", NULL);
hgs
parents:
diff changeset
   638
    if(!filesink)
hgs
parents:
diff changeset
   639
        goto no_output;
hgs
parents:
diff changeset
   640
hgs
parents:
diff changeset
   641
    wavenc = gst_element_factory_make ("wavenc", NULL);
hgs
parents:
diff changeset
   642
    if(!wavenc)
hgs
parents:
diff changeset
   643
        goto no_output;
hgs
parents:
diff changeset
   644
    
hgs
parents:
diff changeset
   645
    caps = gst_caps_new_simple ("audio/x-raw-int",
hgs
parents:
diff changeset
   646
              "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   647
              "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   648
              "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   649
              "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   650
              "rate", G_TYPE_INT, 16000,
hgs
parents:
diff changeset
   651
              "channels", G_TYPE_INT, 1, NULL);
hgs
parents:
diff changeset
   652
    
hgs
parents:
diff changeset
   653
    carray = "c:\\data\\sounds\\Digital\\record.wav";
hgs
parents:
diff changeset
   654
    
hgs
parents:
diff changeset
   655
    g_object_set (G_OBJECT (audiosrc),
hgs
parents:
diff changeset
   656
              "blocksize", 1280,
hgs
parents:
diff changeset
   657
               NULL);
hgs
parents:
diff changeset
   658
    
hgs
parents:
diff changeset
   659
    g_object_set (G_OBJECT (filesink), "location", carray,"buffer-size",1280, NULL);
hgs
parents:
diff changeset
   660
    
hgs
parents:
diff changeset
   661
    /* add objects to the main pipeline */
hgs
parents:
diff changeset
   662
    gst_bin_add_many (GST_BIN (bin), audiosrc,wavenc, filesink, NULL);
hgs
parents:
diff changeset
   663
hgs
parents:
diff changeset
   664
    /* link the elements. */
hgs
parents:
diff changeset
   665
    gst_element_link_filtered (audiosrc, wavenc, caps);
hgs
parents:
diff changeset
   666
    gst_element_link (wavenc, filesink);
hgs
parents:
diff changeset
   667
    gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL);
hgs
parents:
diff changeset
   668
    //g_print ("Starting recoring\n");   
hgs
parents:
diff changeset
   669
    /* start playing */
hgs
parents:
diff changeset
   670
    gst_element_set_state (bin, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   671
hgs
parents:
diff changeset
   672
    return 0;
hgs
parents:
diff changeset
   673
    
hgs
parents:
diff changeset
   674
no_output:
hgs
parents:
diff changeset
   675
    return -1;
hgs
parents:
diff changeset
   676
}
hgs
parents:
diff changeset
   677
hgs
parents:
diff changeset
   678
int gst_pause()
hgs
parents:
diff changeset
   679
{
hgs
parents:
diff changeset
   680
    gst_element_set_state (bin, GST_STATE_PAUSED);
hgs
parents:
diff changeset
   681
    return 0;
hgs
parents:
diff changeset
   682
}
hgs
parents:
diff changeset
   683
hgs
parents:
diff changeset
   684
int gst_resume()
hgs
parents:
diff changeset
   685
{
hgs
parents:
diff changeset
   686
    gst_element_set_state (bin, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   687
    return 0;
hgs
parents:
diff changeset
   688
}
hgs
parents:
diff changeset
   689
hgs
parents:
diff changeset
   690
hgs
parents:
diff changeset
   691
int gst_record_stop()
hgs
parents:
diff changeset
   692
{
hgs
parents:
diff changeset
   693
    gst_element_send_event (bin, gst_event_new_eos ());
hgs
parents:
diff changeset
   694
    //gst_element_set_state (bin, GST_STATE_NULL);
hgs
parents:
diff changeset
   695
    return 0;
hgs
parents:
diff changeset
   696
}
hgs
parents:
diff changeset
   697
hgs
parents:
diff changeset
   698
hgs
parents:
diff changeset
   699
int gst_seek()
hgs
parents:
diff changeset
   700
{
hgs
parents:
diff changeset
   701
// need to implement..
hgs
parents:
diff changeset
   702
}
hgs
parents:
diff changeset
   703
hgs
parents:
diff changeset
   704
int gst_get_events()
hgs
parents:
diff changeset
   705
{
hgs
parents:
diff changeset
   706
    return g_main_context_iteration(NULL, FALSE);
hgs
parents:
diff changeset
   707
    //return 0;
hgs
parents:
diff changeset
   708
}
hgs
parents:
diff changeset
   709
hgs
parents:
diff changeset
   710
int gst_unref()
hgs
parents:
diff changeset
   711
{
hgs
parents:
diff changeset
   712
    //g_print ("Finished playback - stopping pipeline\n");
hgs
parents:
diff changeset
   713
    /* stop the bin */
hgs
parents:
diff changeset
   714
    gst_element_set_state (bin, GST_STATE_NULL);
hgs
parents:
diff changeset
   715
    /* Unreffing the bin will clean up all its children too */
hgs
parents:
diff changeset
   716
    gst_object_unref (bin);   
hgs
parents:
diff changeset
   717
    return 0;
hgs
parents:
diff changeset
   718
}
hgs
parents:
diff changeset
   719
hgs
parents:
diff changeset
   720
int gst_record_aac()
hgs
parents:
diff changeset
   721
{
hgs
parents:
diff changeset
   722
    GstElement *audiosrc,*filesink,*aacenc, *mp4mux;
hgs
parents:
diff changeset
   723
    GstBus *bus;
hgs
parents:
diff changeset
   724
    GstPad *mp4sinkpad,*aacencsrcpad;
hgs
parents:
diff changeset
   725
    char* carray = NULL;
hgs
parents:
diff changeset
   726
    GstCaps* caps;
hgs
parents:
diff changeset
   727
    
hgs
parents:
diff changeset
   728
    /*create a pipeline*/
hgs
parents:
diff changeset
   729
    bin = gst_pipeline_new ("pipeline");
hgs
parents:
diff changeset
   730
    if(!bin)
hgs
parents:
diff changeset
   731
        goto no_output;
hgs
parents:
diff changeset
   732
    /* create a disk reader */
hgs
parents:
diff changeset
   733
    audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source");
hgs
parents:
diff changeset
   734
    if(!audiosrc)
hgs
parents:
diff changeset
   735
        goto no_output;
hgs
parents:
diff changeset
   736
hgs
parents:
diff changeset
   737
    /* Create the decodebin */
hgs
parents:
diff changeset
   738
    filesink = gst_element_factory_make ("filesink", NULL);
hgs
parents:
diff changeset
   739
    if(!filesink)
hgs
parents:
diff changeset
   740
        goto no_output;
hgs
parents:
diff changeset
   741
    //setting num-buffers
hgs
parents:
diff changeset
   742
    //g_object_set (G_OBJECT (audiosrc), "num-buffers", 5000 , NULL);
hgs
parents:
diff changeset
   743
    g_object_set (G_OBJECT (audiosrc),
hgs
parents:
diff changeset
   744
            "blocksize", 1280,
hgs
parents:
diff changeset
   745
            NULL);
hgs
parents:
diff changeset
   746
hgs
parents:
diff changeset
   747
    aacenc = gst_element_factory_make("nokiaaacenc", "nokiaaacenc");
hgs
parents:
diff changeset
   748
    if(!aacenc)
hgs
parents:
diff changeset
   749
        goto no_output;
hgs
parents:
diff changeset
   750
    mp4mux = gst_element_factory_make("mp4mux", "mp4mux");
hgs
parents:
diff changeset
   751
    if(!mp4mux)
hgs
parents:
diff changeset
   752
        goto no_output;
hgs
parents:
diff changeset
   753
    caps = gst_caps_new_simple("audio/x-raw-int",
hgs
parents:
diff changeset
   754
            "width", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   755
            "depth", G_TYPE_INT, 16,
hgs
parents:
diff changeset
   756
            "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   757
            "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   758
            "rate", G_TYPE_INT, 8000,
hgs
parents:
diff changeset
   759
            "channels", G_TYPE_INT, 1, NULL);
hgs
parents:
diff changeset
   760
    carray = "c:\\data\\sounds\\Digital\\record.mp4";
hgs
parents:
diff changeset
   761
hgs
parents:
diff changeset
   762
   
hgs
parents:
diff changeset
   763
    g_object_set(G_OBJECT (filesink), "location", carray, NULL);
hgs
parents:
diff changeset
   764
    bus = gst_pipeline_get_bus(GST_PIPELINE (bin));
hgs
parents:
diff changeset
   765
    
hgs
parents:
diff changeset
   766
    gst_bus_add_watch(bus, bus_call, NULL);
hgs
parents:
diff changeset
   767
   
hgs
parents:
diff changeset
   768
    gst_object_unref(bus);
hgs
parents:
diff changeset
   769
    
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
    //add objects to the main pipeline 
hgs
parents:
diff changeset
   772
    gst_bin_add_many(GST_BIN (bin),audiosrc,aacenc,mp4mux,filesink, NULL);
hgs
parents:
diff changeset
   773
   
hgs
parents:
diff changeset
   774
    gst_element_link_filtered (audiosrc, aacenc, caps);
hgs
parents:
diff changeset
   775
   
hgs
parents:
diff changeset
   776
    mp4sinkpad  = gst_element_get_request_pad( mp4mux, "audio_%d");
hgs
parents:
diff changeset
   777
    
hgs
parents:
diff changeset
   778
    aacencsrcpad  = gst_element_get_pad( aacenc, "src");  
hgs
parents:
diff changeset
   779
    if (gst_pad_link (aacencsrcpad,mp4sinkpad) != GST_PAD_LINK_OK) {
hgs
parents:
diff changeset
   780
hgs
parents:
diff changeset
   781
    g_print("gst_pad_link (aacencsrcpad,mp4sinkpad) failed");
hgs
parents:
diff changeset
   782
    
hgs
parents:
diff changeset
   783
    return -1;
hgs
parents:
diff changeset
   784
    }       
hgs
parents:
diff changeset
   785
    //gst_element_link (aacenc, filesink);
hgs
parents:
diff changeset
   786
    gst_element_link (mp4mux, filesink);
hgs
parents:
diff changeset
   787
    
hgs
parents:
diff changeset
   788
    gst_caps_unref (caps);
hgs
parents:
diff changeset
   789
    
hgs
parents:
diff changeset
   790
hgs
parents:
diff changeset
   791
    gst_element_set_state(bin, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   792
    
hgs
parents:
diff changeset
   793
    return 0;
hgs
parents:
diff changeset
   794
no_output:
hgs
parents:
diff changeset
   795
    return -1;
hgs
parents:
diff changeset
   796
}
hgs
parents:
diff changeset
   797
hgs
parents:
diff changeset
   798
int gst_record_amr()
hgs
parents:
diff changeset
   799
{
hgs
parents:
diff changeset
   800
      GstElement *audiosrc, *filesink, *amrmux;
hgs
parents:
diff changeset
   801
      GstBus *bus;
hgs
parents:
diff changeset
   802
      char* carray = NULL;
hgs
parents:
diff changeset
   803
      GstCaps* caps;
hgs
parents:
diff changeset
   804
       /* create a new bin to hold the elements */
hgs
parents:
diff changeset
   805
      bin = gst_pipeline_new ("pipeline");
hgs
parents:
diff changeset
   806
      if(!bin)
hgs
parents:
diff changeset
   807
          goto no_output;
hgs
parents:
diff changeset
   808
      //g_print ("pipeline created");
hgs
parents:
diff changeset
   809
      audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source"); 
hgs
parents:
diff changeset
   810
     // encoder = gst_element_factory_make ("wavenc", NULL); 
hgs
parents:
diff changeset
   811
      if(!audiosrc)
hgs
parents:
diff changeset
   812
          goto no_output;
hgs
parents:
diff changeset
   813
hgs
parents:
diff changeset
   814
      amrmux = gst_element_factory_make ("amrmux", "muxer"); 
hgs
parents:
diff changeset
   815
      if(!amrmux)
hgs
parents:
diff changeset
   816
          goto no_output;
hgs
parents:
diff changeset
   817
hgs
parents:
diff changeset
   818
      filesink = gst_element_factory_make("filesink", "filesink");
hgs
parents:
diff changeset
   819
      if(!filesink)
hgs
parents:
diff changeset
   820
          goto no_output;
hgs
parents:
diff changeset
   821
      
hgs
parents:
diff changeset
   822
      caps = gst_caps_new_simple ("audio/amr",
hgs
parents:
diff changeset
   823
                 "width", G_TYPE_INT, 8,
hgs
parents:
diff changeset
   824
                 "depth", G_TYPE_INT, 8,
hgs
parents:
diff changeset
   825
                 "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   826
                 "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   827
                 "rate", G_TYPE_INT,  8000,
hgs
parents:
diff changeset
   828
                 "channels", G_TYPE_INT, 1, NULL);
hgs
parents:
diff changeset
   829
      carray = "c:\\data\\sounds\\Digital\\record.amr";
hgs
parents:
diff changeset
   830
      
hgs
parents:
diff changeset
   831
      g_object_set (G_OBJECT (audiosrc),
hgs
parents:
diff changeset
   832
                "blocksize", 1280,
hgs
parents:
diff changeset
   833
                 NULL);
hgs
parents:
diff changeset
   834
      
hgs
parents:
diff changeset
   835
      g_object_set(G_OBJECT (filesink), "location", carray, NULL);
hgs
parents:
diff changeset
   836
       
hgs
parents:
diff changeset
   837
      bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
hgs
parents:
diff changeset
   838
      gst_bus_add_watch (bus, bus_call, NULL);
hgs
parents:
diff changeset
   839
      gst_object_unref (bus);
hgs
parents:
diff changeset
   840
      
hgs
parents:
diff changeset
   841
hgs
parents:
diff changeset
   842
      /* add objects to the main pipeline */
hgs
parents:
diff changeset
   843
      gst_bin_add_many(GST_BIN (bin),audiosrc,amrmux,filesink , NULL);
hgs
parents:
diff changeset
   844
      /* link the elements */
hgs
parents:
diff changeset
   845
      gst_element_link_filtered (audiosrc, amrmux, caps);
hgs
parents:
diff changeset
   846
      
hgs
parents:
diff changeset
   847
      gst_element_link( amrmux, filesink );
hgs
parents:
diff changeset
   848
      
hgs
parents:
diff changeset
   849
      gst_element_set_state (bin, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   850
      
hgs
parents:
diff changeset
   851
      return 0;
hgs
parents:
diff changeset
   852
no_output:
hgs
parents:
diff changeset
   853
      return -1;
hgs
parents:
diff changeset
   854
    
hgs
parents:
diff changeset
   855
}