3 #include <gst/app/gstappsink.h>
4 #include <boost/thread.hpp>
8 #include "audio_common_msgs/AudioData.h"
9 #include "audio_common_msgs/AudioDataStamped.h"
10 #include "audio_common_msgs/AudioInfo.h"
24 ros::param::param<std::string>(
"~format",
_format,
"mp3");
25 ros::param::param<std::string>(
"~sample_format",
_sample_format,
"S16LE");
28 ros::param::param<int>(
"~bitrate",
_bitrate, 192);
31 ros::param::param<int>(
"~channels",
_channels, 1);
32 ros::param::param<int>(
"~depth",
_depth, 16);
33 ros::param::param<int>(
"~sample_rate",
_sample_rate, 16000);
36 ros::param::param<std::string>(
"~dst", dst_type,
"appsink");
41 ros::param::param<std::string>(
"~device", device,
"");
47 _loop = g_main_loop_new(NULL,
false);
48 _pipeline = gst_pipeline_new(
"ros_pipeline");
49 GstClock *clock = gst_system_clock_obtain();
50 g_object_set(clock,
"clock-type", GST_CLOCK_TYPE_REALTIME, NULL);
51 gst_pipeline_use_clock(GST_PIPELINE_CAST(
_pipeline), clock);
52 gst_object_unref(clock);
55 gst_bus_add_signal_watch(
_bus);
56 g_signal_connect(
_bus,
"message::error",
61 if (dst_type ==
"appsink")
63 _sink = gst_element_factory_make(
"appsink",
"sink");
64 g_object_set(G_OBJECT(
_sink),
"emit-signals",
true, NULL);
65 g_object_set(G_OBJECT(
_sink),
"max-buffers", 100, NULL);
66 g_signal_connect( G_OBJECT(
_sink),
"new-sample",
71 ROS_INFO(
"file sink to %s", dst_type.c_str());
72 _sink = gst_element_factory_make(
"filesink",
"sink");
73 g_object_set( G_OBJECT(
_sink),
"location", dst_type.c_str(), NULL);
76 _source = gst_element_factory_make(
"alsasrc",
"source");
84 g_object_set(G_OBJECT(
_source),
"device", device.c_str(), NULL);
88 caps = gst_caps_new_simple(
"audio/x-raw",
91 "width", G_TYPE_INT,
_depth,
92 "depth", G_TYPE_INT,
_depth,
94 "signed", G_TYPE_BOOLEAN, TRUE,
99 _filter = gst_element_factory_make(
"capsfilter",
"filter");
100 g_object_set( G_OBJECT(
_filter),
"caps", caps, NULL);
101 gst_caps_unref(caps);
103 _convert = gst_element_factory_make(
"audioconvert",
"convert");
109 _encode = gst_element_factory_make(
"lamemp3enc",
"encoder");
114 g_object_set( G_OBJECT(
_encode),
"target", 1, NULL);
119 }
else if (
_format ==
"wave") {
120 if (dst_type ==
"appsink") {
121 g_object_set( G_OBJECT(
_sink),
"caps", caps, NULL);
122 gst_caps_unref(caps);
126 _filter = gst_element_factory_make(
"wavenc",
"filter");
151 gst_element_set_state(GST_ELEMENT(
_pipeline), GST_STATE_PLAYING);
155 audio_common_msgs::AudioInfo info_msg;
160 info_msg.coding_format =
_format;
166 g_main_loop_quit(
_loop);
167 gst_element_set_state(
_pipeline, GST_STATE_NULL);
169 g_main_loop_unref(
_loop);
177 void publish(
const audio_common_msgs::AudioData &msg )
187 static GstFlowReturn
onNewBuffer (GstAppSink *appsink, gpointer userData)
189 audio_common_msgs::AudioData msg;
190 audio_common_msgs::AudioDataStamped stamped_msg;
196 g_signal_emit_by_name(appsink,
"pull-sample", &sample);
198 GstBuffer *buffer = gst_sample_get_buffer(sample);
206 GstClockTime buffer_time = gst_element_get_base_time(server->
_source)+GST_BUFFER_PTS(buffer);
207 stamped_msg.header.stamp.fromNSec(buffer_time);
210 gst_buffer_map(buffer, &map, GST_MAP_READ);
211 msg.data.resize( map.size );
213 memcpy( &msg.data[0], map.data, map.size );
214 stamped_msg.audio = msg;
216 gst_buffer_unmap(buffer, &map);
217 gst_sample_unref(sample);
225 static gboolean
onMessage (GstBus *bus, GstMessage *message, gpointer userData)
231 gst_message_parse_error(message, &err, &debug);
235 g_main_loop_quit(server->
_loop);
256 int main (
int argc,
char **argv)
259 gst_init(&argc, &argv);