// *** main int main() { //makeing a follower ShmdataLogger logger = shmdata_make_logger(&mylog, &mylog, &mylog, &mylog, &mylog, &mylog, NULL); assert(NULL != logger); ShmdataFollower follower = shmdata_make_follower("/tmp/check-shmdatasink", &on_data, &on_server_connect, &on_server_disconnect, NULL, logger); assert(NULL != follower); //gstreamer shmdatasink for writing GstElement *pipeline, *audiosource, *shmdatasink; GstBus *bus; guint bus_watch_id; gst_init(NULL, NULL); #ifdef HAVE_CONFIG_H GstRegistry *registry = gst_registry_get(); gst_registry_scan_path(registry, "./" LT_OBJDIR); #else g_printerr("shmdatasink plugin not found"); return -1; #endif loop = g_main_loop_new(NULL, FALSE); /* Create gstreamer elements */ pipeline = gst_pipeline_new("audio-player"); audiosource = gst_element_factory_make("audiotestsrc", "audiosource"); shmdatasink = gst_element_factory_make("shmdatasink", "shmdata-output"); if (!pipeline || !audiosource || !shmdatasink) { g_printerr("One element could not be created. Exiting.\n"); return -1; } g_object_set(G_OBJECT(shmdatasink), "socket-path", "/tmp/check-shmdatasink", NULL); bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); bus_watch_id = gst_bus_add_watch(bus, bus_call, loop); gst_object_unref(bus); gst_bin_add_many(GST_BIN(pipeline), audiosource, shmdatasink, NULL); gst_element_link(audiosource, shmdatasink); gst_element_set_state(pipeline, GST_STATE_PLAYING); g_main_loop_run(loop); // cleaning gst gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline)); g_source_remove(bus_watch_id); g_main_loop_unref(loop); // cleaning follower shmdata_delete_follower(follower); shmdata_delete_logger(logger); return res; }
static gboolean gst_shmdata_sink_on_caps (GstBaseSink *sink, GstCaps *caps){ GstShmdataSink *self = GST_SHMDATA_SINK (sink); if (NULL == self->socket_path) { GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ_WRITE, ("Could not make writer with no path."), (NULL)); return FALSE; } GST_DEBUG_OBJECT (self, "Creating new socket at %s" " with shared memory of %lu bytes", self->socket_path, self->size); g_free(self->caps); self->caps = gst_caps_to_string (caps); g_object_notify(G_OBJECT(sink), "caps"); GST_DEBUG_OBJECT(G_OBJECT(sink), "on_caps %s", self->caps); self->shmlogger = shmdata_make_logger(&gst_shmdata_on_error, &gst_shmdata_on_critical, &gst_shmdata_on_warning, &gst_shmdata_on_message, &gst_shmdata_on_info, &gst_shmdata_on_debug, self); self->shmwriter = shmdata_make_writer(self->socket_path, self->size, NULL == self->caps ? "unknown" : self->caps, &gst_shmdata_sink_on_client_connected, &gst_shmdata_sink_on_client_disconnected, self, self->shmlogger); if (NULL == self->shmwriter) { GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ_WRITE, ("Could not make shmdata writer."), (NULL)); return FALSE; } self->access = shmdata_get_one_write_access(self->shmwriter); GST_DEBUG ("Created shmdata writer at %s", self->socket_path); self->allocator = gst_shmdata_sink_allocator_new (self); return TRUE; }
static gboolean gst_shmdata_src_start_reading (GstShmdataSrc * self) { if (!self->socket_path) { GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, ("No path specified for socket."), (NULL)); return FALSE; } GST_DEBUG_OBJECT (self, "Opening socket %s", self->socket_path); GST_OBJECT_LOCK (self); self->is_first_read = TRUE; self->shmlogger = shmdata_make_logger(&gst_shmdata_on_error, &gst_shmdata_on_critical, &gst_shmdata_on_warning, &gst_shmdata_on_message, &gst_shmdata_on_info, &gst_shmdata_on_debug, self); self->shmfollower = shmdata_make_follower(self->socket_path, &gst_shmdata_src_on_data, &gst_shmdata_src_on_server_connect, &gst_shmdata_src_on_server_disconnect, self, self->shmlogger); GST_OBJECT_UNLOCK (self); if (!self->shmfollower) { GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ_WRITE, ("Could not initialize shmdata follower %s", self->socket_path), (NULL)); return FALSE; } return TRUE; }