2 #include <gst/app/gstappsrc.h> 4 #include <boost/thread.hpp> 6 #include "audio_common_msgs/AudioData.h" 25 std::string sample_format;
28 ros::param::param<std::string>(
"~dst", dst_type,
"alsasink");
29 ros::param::param<std::string>(
"~device", device, std::string());
30 ros::param::param<bool>(
"~do_timestamp", do_timestamp,
true);
31 ros::param::param<std::string>(
"~format", format,
"mp3");
32 ros::param::param<int>(
"~channels", channels, 1);
33 ros::param::param<int>(
"~depth", depth, 16);
34 ros::param::param<int>(
"~sample_rate", sample_rate, 16000);
35 ros::param::param<std::string>(
"~sample_format", sample_format,
"S16LE");
39 _loop = g_main_loop_new(NULL,
false);
41 _pipeline = gst_pipeline_new(
"app_pipeline");
42 _source = gst_element_factory_make(
"appsrc",
"app_source");
43 g_object_set(G_OBJECT(
_source),
"do-timestamp", (do_timestamp) ? TRUE : FALSE, NULL);
47 caps = gst_caps_new_simple(
49 "format", G_TYPE_STRING, sample_format.c_str(),
50 "rate", G_TYPE_INT, sample_rate,
51 "channels", G_TYPE_INT, channels,
52 "width", G_TYPE_INT, depth,
53 "depth", G_TYPE_INT, depth,
54 "signed", G_TYPE_BOOLEAN, TRUE,
55 "layout", G_TYPE_STRING,
"interleaved",
58 if (dst_type ==
"alsasink")
60 _audio = gst_bin_new(
"audiobin");
61 _convert = gst_element_factory_make(
"audioconvert",
"convert");
62 audiopad = gst_element_get_static_pad(
_convert,
"sink");
63 _resample = gst_element_factory_make(
"audioresample",
"resample");
65 _sink = gst_element_factory_make(
"alsasink",
"sink");
66 g_object_set(G_OBJECT(
_sink),
"sync", FALSE, NULL);
67 if (!device.empty()) {
68 g_object_set(G_OBJECT(
_sink),
"device", device.c_str(), NULL);
72 gst_element_add_pad(
_audio, gst_ghost_pad_new(
"sink", audiopad));
76 ROS_INFO(
"file sink to %s", dst_type.c_str());
77 _sink = gst_element_factory_make(
"filesink",
"sink");
78 g_object_set(G_OBJECT(_sink),
"location", dst_type.c_str(), NULL);
83 if (dst_type ==
"alsasink")
85 _decoder = gst_element_factory_make(
"decodebin",
"decoder");
88 _filter = gst_element_factory_make(
"capsfilter",
"filter");
89 g_object_set( G_OBJECT(
_filter),
"caps", caps, NULL);
93 gst_object_unref(audiopad);
102 else if (format ==
"wave")
104 g_object_set( G_OBJECT(
_source),
"caps", caps, NULL);
105 g_object_set (G_OBJECT (
_source),
"format", GST_FORMAT_TIME, NULL);
106 if (dst_type ==
"alsasink")
110 gst_object_unref(audiopad);
114 _filter = gst_element_factory_make(
"wavenc",
"filter");
118 gst_caps_unref(caps);
122 ROS_ERROR(
"Unsupported format: %s", format.c_str());
125 gst_element_set_state(GST_ELEMENT(
_pipeline), GST_STATE_PLAYING);
133 void onAudio(
const audio_common_msgs::AudioDataConstPtr &msg)
135 GstBuffer *buffer = gst_buffer_new_and_alloc(msg->data.size());
136 gst_buffer_fill(buffer, 0, &msg->data[0], msg->data.size());
139 g_signal_emit_by_name(
_source,
"push-buffer", buffer, &ret);
142 static void cb_newpad (GstElement *decodebin, GstPad *pad,
152 audiopad = gst_element_get_static_pad (client->
_audio,
"sink");
153 if (GST_PAD_IS_LINKED (audiopad))
155 g_object_unref (audiopad);
160 caps = gst_pad_query_caps (pad, NULL);
161 str = gst_caps_get_structure (caps, 0);
162 if (!g_strrstr (gst_structure_get_name (str),
"audio")) {
163 gst_caps_unref (caps);
164 gst_object_unref (audiopad);
168 gst_caps_unref (caps);
171 gst_pad_link (pad, audiopad);
173 g_object_unref (audiopad);
187 int main (
int argc,
char **argv)
190 gst_init(&argc, &argv);
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
static void cb_newpad(GstElement *decodebin, GstPad *pad, gpointer data)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
int main(int argc, char **argv)
boost::thread _gst_thread
void onAudio(const audio_common_msgs::AudioDataConstPtr &msg)