m_pipeline = gst_pipeline_new("audiorx");
m_audioMixer = gst_element_factory_make("audiomixer", "rx_mixer");
gst_bin_add(GST_BIN(m_pipeline), m_audioMixer);
m_queue = gst_element_factory_make("queue", "rx_queue");
gst_bin_add(GST_BIN(m_pipeline), m_queue);
m_converter = gst_element_factory_make("audioconvert", "rx_convert");
gst_bin_add(GST_BIN(m_pipeline), m_converter);
m_resample = gst_element_factory_make("audioresample", "rx_resample");
gst_bin_add(GST_BIN(m_pipeline), m_resample );
m_sink = gst_element_factory_make("alsasink", "rx_sink");
gst_bin_add(GST_BIN(m_pipeline), m_sink );
g_object_set( m_sink, "device", m_speaker_str, "sync", FALSE, nullptr );
gst_element_link_many(m_audioMixer, m_queue, m_converter, m_resample, m_sink, nullptr );
gst_element_set_state(m_pipeline, GST_STATE_PLAYING );
when audio devices change, do the following:
/* stop first */
gst_element_set_state(m_pipeline, GST_STATE_NULL );
/* unlink mixer */
gst_element_unlink_many(m_audioMixer, m_queue, m_converter, m_resample, m_sink, nullptr );
/* clear sink */
gst_bin_remove( GST_BIN( m_pipeline ), m_sink );
gst_object_unref( m_sink );
m_sink = nullptr;
/* create new sink */
m_sink = gst_element_factory_make("alsasink", "rx_sink");
gst_bin_add(GST_BIN(m_pipeline), m_sink );
g_object_set( m_sink, "device", m_speaker_str, "sync", FALSE, nullptr );
/* relink */
gst_element_link_many(m_audioMixer, m_queue, m_converter, m_resample, m_sink, nullptr );
/* restart */
gst_element_set_state(m_pipeline, GST_STATE_PLAYING );