gstreamer_core/tsrc/examples/amr_record/src/amr_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\\amr_record_logs.txt" 
hgs
parents:
diff changeset
     8
#include "std_log_result.h" 
28
hgs
parents: 26
diff changeset
     9
#include <gst/interfaces/gstspeechencoderconfig.h>
26
hgs
parents:
diff changeset
    10
#define LOG_FILENAME_LINE __FILE__, __LINE__
hgs
parents:
diff changeset
    11
#define LOG_FILENAME_LEN 256
hgs
parents:
diff changeset
    12
#define _DEBUG 1
hgs
parents:
diff changeset
    13
hgs
parents:
diff changeset
    14
static char log_filename[LOG_FILENAME_LEN];
hgs
parents:
diff changeset
    15
hgs
parents:
diff changeset
    16
static guint bitrate = 0; 
hgs
parents:
diff changeset
    17
static guint record_duration = 10000;
hgs
parents:
diff changeset
    18
static guint _enable_logs = 0;
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
static GstSpeechEncoderConfigIntfc* iface;
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#define ENABLE_LOGS
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#ifdef ENABLE_LOGS
hgs
parents:
diff changeset
    26
#define RET_GST_ERR_STR(var, level, str) \
hgs
parents:
diff changeset
    27
    if ( level == var )\
hgs
parents:
diff changeset
    28
return str;
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
static inline const char* _gst_err_cat( GstDebugLevel level)
hgs
parents:
diff changeset
    31
{
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
    RET_GST_ERR_STR(level,GST_LEVEL_NONE,"");
hgs
parents:
diff changeset
    34
    RET_GST_ERR_STR(level,GST_LEVEL_ERROR,"E ");
hgs
parents:
diff changeset
    35
    RET_GST_ERR_STR(level,GST_LEVEL_WARNING,"W ");
hgs
parents:
diff changeset
    36
    RET_GST_ERR_STR(level,GST_LEVEL_INFO,"I ");
hgs
parents:
diff changeset
    37
    RET_GST_ERR_STR(level,GST_LEVEL_DEBUG,"D ");
hgs
parents:
diff changeset
    38
    RET_GST_ERR_STR(level,GST_LEVEL_LOG, "L ");
hgs
parents:
diff changeset
    39
    RET_GST_ERR_STR(level,GST_LEVEL_FIXME, "F ");
hgs
parents:
diff changeset
    40
    RET_GST_ERR_STR(level,GST_LEVEL_MEMDUMP, "M ");
hgs
parents:
diff changeset
    41
    return "";
hgs
parents:
diff changeset
    42
}
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
static FILE* log_fp = 0;
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
static void open_log_fp()
hgs
parents:
diff changeset
    47
{
hgs
parents:
diff changeset
    48
    if (!log_fp)
hgs
parents:
diff changeset
    49
    {
hgs
parents:
diff changeset
    50
        snprintf(log_filename, LOG_FILENAME_LEN, "C:\\logs\\testframework\\gst_amr_br%d.log", bitrate);
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
        log_fp = fopen(log_filename, "w");
hgs
parents:
diff changeset
    53
        if (!log_fp)
hgs
parents:
diff changeset
    54
            return;
hgs
parents:
diff changeset
    55
    }
hgs
parents:
diff changeset
    56
}
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
static void _gstLogFunction (GstDebugCategory *category,
hgs
parents:
diff changeset
    60
        GstDebugLevel level,
hgs
parents:
diff changeset
    61
        const gchar *file,
hgs
parents:
diff changeset
    62
        const gchar *function,
hgs
parents:
diff changeset
    63
        gint line,
hgs
parents:
diff changeset
    64
        GObject *object,
hgs
parents:
diff changeset
    65
        GstDebugMessage *message,
hgs
parents:
diff changeset
    66
        gpointer data)
hgs
parents:
diff changeset
    67
{
hgs
parents:
diff changeset
    68
    open_log_fp();
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
    fprintf(log_fp, "%s : %s \n", _gst_err_cat(level), gst_debug_message_get(message));
hgs
parents:
diff changeset
    71
    fflush(log_fp);
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
}
hgs
parents:
diff changeset
    74
#endif // ENABLE_LOGS
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
static void parse_args(int argc, char** argv)
hgs
parents:
diff changeset
    77
{
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    gint cur = 1;
hgs
parents:
diff changeset
    80
    while ( argv[cur] && cur < argc )
hgs
parents:
diff changeset
    81
    {
hgs
parents:
diff changeset
    82
        GST_WARNING("br:%d, record_duration:%d \n",bitrate,record_duration);
hgs
parents:
diff changeset
    83
        if( !strcmp(argv[cur],"-br") ) bitrate = atoi(argv[cur+1]);
hgs
parents:
diff changeset
    84
        else if( !strcmp(argv[cur],"-l") ) _enable_logs = atoi(argv[cur+1]);
hgs
parents:
diff changeset
    85
        else if( !strcmp(argv[cur],"-d") ) record_duration = atoi(argv[cur+1]);
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
        cur+=2;
hgs
parents:
diff changeset
    88
    }
hgs
parents:
diff changeset
    89
}
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
GstElement *pipeline, *source, *amrmux,*sink;
hgs
parents:
diff changeset
    93
GstBus *bus;
hgs
parents:
diff changeset
    94
GMainLoop *loop;
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
static gboolean
hgs
parents:
diff changeset
    97
bus_call (GstBus     *bus,
hgs
parents:
diff changeset
    98
        GstMessage *msg,
hgs
parents:
diff changeset
    99
        gpointer    data)
hgs
parents:
diff changeset
   100
    {
hgs
parents:
diff changeset
   101
#ifdef ENABLE_LOGS
hgs
parents:
diff changeset
   102
    if(_enable_logs)
hgs
parents:
diff changeset
   103
        {
hgs
parents:
diff changeset
   104
        open_log_fp();
hgs
parents:
diff changeset
   105
        fprintf(log_fp,"[msg] %s from %s\n", GST_MESSAGE_TYPE_NAME(msg), GST_MESSAGE_SRC_NAME (msg));
hgs
parents:
diff changeset
   106
        }
hgs
parents:
diff changeset
   107
#endif
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    switch (GST_MESSAGE_TYPE (msg)) {
hgs
parents:
diff changeset
   110
        case GST_MESSAGE_EOS:
hgs
parents:
diff changeset
   111
            gst_element_set_state (pipeline, GST_STATE_NULL);
hgs
parents:
diff changeset
   112
            g_main_loop_quit(loop);
hgs
parents:
diff changeset
   113
            gst_object_unref (GST_OBJECT (pipeline));
hgs
parents:
diff changeset
   114
            break;
hgs
parents:
diff changeset
   115
            
hgs
parents:
diff changeset
   116
        case GST_MESSAGE_ERROR: {
hgs
parents:
diff changeset
   117
        gchar *debug;
hgs
parents:
diff changeset
   118
        GError *err;
hgs
parents:
diff changeset
   119
        gst_message_parse_error (msg, &err, &debug);
hgs
parents:
diff changeset
   120
        g_free (debug);
hgs
parents:
diff changeset
   121
        g_print ("Error: %s\n", err->message);
hgs
parents:
diff changeset
   122
        g_error_free (err);
hgs
parents:
diff changeset
   123
        break;
hgs
parents:
diff changeset
   124
        }
hgs
parents:
diff changeset
   125
        default:
hgs
parents:
diff changeset
   126
            break;
hgs
parents:
diff changeset
   127
    }
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
    return TRUE;
hgs
parents:
diff changeset
   130
    }
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
static gboolean
hgs
parents:
diff changeset
   133
quit_loop (gpointer data)
hgs
parents:
diff changeset
   134
{
hgs
parents:
diff changeset
   135
    GST_WARNING("Sending EOS\n");
hgs
parents:
diff changeset
   136
    gst_element_send_event (pipeline, gst_event_new_eos ());
hgs
parents:
diff changeset
   137
    return TRUE;
hgs
parents:
diff changeset
   138
}
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
int main (int argc, char *argv[])
hgs
parents:
diff changeset
   141
{
hgs
parents:
diff changeset
   142
    char filename[1024];
hgs
parents:
diff changeset
   143
    GstCaps* caps;
hgs
parents:
diff changeset
   144
#ifdef ENABLE_LOGS
hgs
parents:
diff changeset
   145
    if ( _enable_logs )
hgs
parents:
diff changeset
   146
    setenv("GST_DEBUG","2",1);
hgs
parents:
diff changeset
   147
#endif // ENABLE_LOGS
hgs
parents:
diff changeset
   148
    
hgs
parents:
diff changeset
   149
    parse_args(argc,argv);
hgs
parents:
diff changeset
   150
    
hgs
parents:
diff changeset
   151
    gst_init (&argc, &argv);
hgs
parents:
diff changeset
   152
#ifdef ENABLE_LOGS
hgs
parents:
diff changeset
   153
    if ( _enable_logs )
hgs
parents:
diff changeset
   154
    gst_debug_add_log_function( _gstLogFunction, 0);
hgs
parents:
diff changeset
   155
#endif // ENABLE_LOGS
hgs
parents:
diff changeset
   156
    
hgs
parents:
diff changeset
   157
    loop = g_main_loop_new (NULL, FALSE);
hgs
parents:
diff changeset
   158
 
hgs
parents:
diff changeset
   159
    /* create elements */
hgs
parents:
diff changeset
   160
    pipeline = gst_pipeline_new ("audio-player");
hgs
parents:
diff changeset
   161
    source = gst_element_factory_make ("devsoundsrc", "audio-source");
hgs
parents:
diff changeset
   162
    amrmux = gst_element_factory_make ("amrmux", "amrmux");
hgs
parents:
diff changeset
   163
    sink = gst_element_factory_make ("filesink", "sink");    
hgs
parents:
diff changeset
   164
    
hgs
parents:
diff changeset
   165
    if (!pipeline || !source || !amrmux || !sink) {
hgs
parents:
diff changeset
   166
        g_print ("One element could not be created\n");
hgs
parents:
diff changeset
   167
        GST_ERROR("One element could not be created\n");
hgs
parents:
diff changeset
   168
        return -1;
hgs
parents:
diff changeset
   169
        }
hgs
parents:
diff changeset
   170
    if(bitrate > 0)
hgs
parents:
diff changeset
   171
        {
hgs
parents:
diff changeset
   172
        snprintf(filename, 1024, "C:\\data\\amr_record_%d.amr", bitrate );
hgs
parents:
diff changeset
   173
        }
hgs
parents:
diff changeset
   174
    else
hgs
parents:
diff changeset
   175
        {
hgs
parents:
diff changeset
   176
        snprintf(filename, 1024, "C:\\data\\amr_record.amr" );
hgs
parents:
diff changeset
   177
        }
hgs
parents:
diff changeset
   178
    
hgs
parents:
diff changeset
   179
    /* set filename property on the file source. Also add a message  handler. */
hgs
parents:
diff changeset
   180
    g_object_set (G_OBJECT (sink), "location", filename, NULL);
hgs
parents:
diff changeset
   181
            /* put all elements in a bin */
hgs
parents:
diff changeset
   182
    gst_bin_add_many (GST_BIN (pipeline),source, amrmux,sink, NULL);
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
    caps = gst_caps_new_simple ("audio/amr",
hgs
parents:
diff changeset
   185
              "width", G_TYPE_INT, 8,
hgs
parents:
diff changeset
   186
              "depth", G_TYPE_INT, 8,
hgs
parents:
diff changeset
   187
              "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents:
diff changeset
   188
              "endianness",G_TYPE_INT, G_BYTE_ORDER,
hgs
parents:
diff changeset
   189
              "rate", G_TYPE_INT, 8000,
hgs
parents:
diff changeset
   190
              "channels", G_TYPE_INT, 1, NULL);  
hgs
parents:
diff changeset
   191
    
hgs
parents:
diff changeset
   192
    if(!gst_element_link_filtered (source, amrmux, caps))
hgs
parents:
diff changeset
   193
        {
hgs
parents:
diff changeset
   194
        GST_ERROR("Linking source, amrmux failed\n");
hgs
parents:
diff changeset
   195
        return -1;
hgs
parents:
diff changeset
   196
        }
hgs
parents:
diff changeset
   197
    
hgs
parents:
diff changeset
   198
    if(!gst_element_link (amrmux, sink))
hgs
parents:
diff changeset
   199
        {
hgs
parents:
diff changeset
   200
        GST_ERROR("Linking amrmux,sink failed\n");
hgs
parents:
diff changeset
   201
        return -1;
hgs
parents:
diff changeset
   202
        }
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
    gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)), bus_call, loop);
hgs
parents:
diff changeset
   205
    iface = GST_SPEECH_ENCODER_CONFIG_GET_IFACE(source);
hgs
parents:
diff changeset
   206
    if(!iface)
hgs
parents:
diff changeset
   207
        {
hgs
parents:
diff changeset
   208
        GST_ERROR("Speech Encoder Interface NULL \n");
hgs
parents:
diff changeset
   209
        return -1;
hgs
parents:
diff changeset
   210
        }
hgs
parents:
diff changeset
   211
    if (bitrate > 0)
hgs
parents:
diff changeset
   212
        {
hgs
parents:
diff changeset
   213
        GST_WARNING("Setting bitrate %d \n",bitrate);
hgs
parents:
diff changeset
   214
        iface->SetBitrate(bitrate);
hgs
parents:
diff changeset
   215
        }
hgs
parents:
diff changeset
   216
    
hgs
parents:
diff changeset
   217
            /* Now set to playing and iterate. */
hgs
parents:
diff changeset
   218
    g_print ("Setting to PLAYING\n");
hgs
parents:
diff changeset
   219
    GST_WARNING("Setting to Playing \n");
hgs
parents:
diff changeset
   220
    gst_element_set_state (pipeline, GST_STATE_PLAYING);
hgs
parents:
diff changeset
   221
    iface->GetBitrate(&bitrate);
hgs
parents:
diff changeset
   222
    
hgs
parents:
diff changeset
   223
    g_timeout_add (record_duration, quit_loop, loop);
hgs
parents:
diff changeset
   224
    
hgs
parents:
diff changeset
   225
    g_main_loop_run (loop);
hgs
parents:
diff changeset
   226
            /* clean up nicely */
hgs
parents:
diff changeset
   227
    GST_WARNING("Returned, stopping playback\n");
hgs
parents:
diff changeset
   228
    
hgs
parents:
diff changeset
   229
    gst_element_set_state (pipeline, GST_STATE_NULL);
hgs
parents:
diff changeset
   230
    gst_object_unref (GST_OBJECT (pipeline));
hgs
parents:
diff changeset
   231
    
hgs
parents:
diff changeset
   232
#ifdef ENABLE_LOGS
hgs
parents:
diff changeset
   233
    if ( _enable_logs )
hgs
parents:
diff changeset
   234
    fclose(log_fp);
hgs
parents:
diff changeset
   235
#endif // ENABLE_LOGS
hgs
parents:
diff changeset
   236
    
hgs
parents:
diff changeset
   237
    g_print ("completed playing audio\n");
hgs
parents:
diff changeset
   238
    return 0;
hgs
parents:
diff changeset
   239
}
hgs
parents:
diff changeset
   240