Created
October 19, 2019 21:51
-
-
Save jnbr/e622b3cf5020afdf28b68dd3195ded16 to your computer and use it in GitHub Desktop.
pulseaudio gstreamer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CFLAGS=-g -Wall -Werror `pkg-config --cflags gstreamer-1.0` | |
LDFLAGS=`pkg-config --libs gstreamer-1.0` | |
test: test.c | |
.PHONY clean: | |
rm test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <gst/gst.h> | |
#include <unistd.h> | |
int main(int argc, char *argv[]) { | |
GstElement *pipeline, *source, *sink; | |
GstBus *bus; | |
GstMessage *msg; | |
GstStateChangeReturn ret; | |
/* Initialize GStreamer */ | |
gst_init (&argc, &argv); | |
/* Create the elements */ | |
source = gst_element_factory_make ("audiotestsrc", "source"); | |
sink = gst_element_factory_make ("pulsesink", "sink"); | |
/* Create the empty pipeline */ | |
pipeline = gst_pipeline_new ("test-pipeline"); | |
if (!pipeline || !source || !sink) { | |
g_printerr ("Not all elements could be created.\n"); | |
return -1; | |
} | |
/* Build the pipeline */ | |
gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL); | |
if (gst_element_link (source, sink) != TRUE) { | |
g_printerr ("Elements could not be linked.\n"); | |
gst_object_unref (pipeline); | |
return -1; | |
} | |
/* Modify the source's properties */ | |
g_object_set (source, "pattern", 0, NULL); | |
/* Start playing */ | |
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); | |
if (ret == GST_STATE_CHANGE_FAILURE) { | |
g_printerr ("Unable to set the pipeline to the playing state.\n"); | |
gst_object_unref (pipeline); | |
return -1; | |
} | |
g_print ("Pipeline is set to the playing state.\n"); | |
sleep(2); | |
ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); | |
if (ret == GST_STATE_CHANGE_FAILURE) { | |
g_printerr ("Unable to set the pipeline to the paused state.\n"); | |
gst_object_unref (pipeline); | |
return -1; | |
} | |
g_print ("Pipeline is set to the paused state.\n"); | |
sleep(2); | |
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); | |
if (ret == GST_STATE_CHANGE_FAILURE) { | |
g_printerr ("Unable to set the pipeline to the playing state.\n"); | |
gst_object_unref (pipeline); | |
return -1; | |
} | |
g_print ("Pipeline is set to the playing state.\n"); | |
/* Wait until error or EOS */ | |
bus = gst_element_get_bus (pipeline); | |
msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS); | |
/* Parse message */ | |
if (msg != NULL) { | |
GError *err; | |
gchar *debug_info; | |
switch (GST_MESSAGE_TYPE (msg)) { | |
case GST_MESSAGE_ERROR: | |
gst_message_parse_error (msg, &err, &debug_info); | |
g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message); | |
g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none"); | |
g_clear_error (&err); | |
g_free (debug_info); | |
break; | |
case GST_MESSAGE_EOS: | |
g_print ("End-Of-Stream reached.\n"); | |
break; | |
default: | |
/* We should not reach here because we only asked for ERRORs and EOS */ | |
g_printerr ("Unexpected message received.\n"); | |
break; | |
} | |
gst_message_unref (msg); | |
} | |
/* Free resources */ | |
gst_object_unref (bus); | |
gst_element_set_state (pipeline, GST_STATE_NULL); | |
gst_object_unref (pipeline); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment