Как изменить параметр элемента gstreamer alsasink во время выполнения - PullRequest
0 голосов
/ 30 января 2019

Я работаю над аудиоприложением, основанным на gstreamer.Конвейер будет передавать аудио на устройство «alsasink».

appsrc->queue->audioconvert->audioresample->alsasink

Код ниже:

...
pipeline.app_source = gst_element_factory_make ("appsrc", "audio_source");
pipeline.audio_queue = gst_element_factory_make ("queue", "audio_queue");
pipeline.audio_convert1 = gst_element_factory_make ("audioconvert", "audio_convert1");
pipeline.audio_resample = gst_element_factory_make ("audioresample", "audio_resample");
pipeline.audio_sink = gst_element_factory_make ("alsasink", "audio_sink");
g_object_set(pipeline.audio_sink, "device", "dawser:PROFILE=music", NULL);
pipeline.pipeline = gst_pipeline_new ("test-pipeline");
...

Для этого элемента «alsasink» я хочу дать пользователю интерфейс для изменения содержимого параметра «device» для достижения различныхзвук эффективен во время выполнения, когда аудио потоковое.Например, чтобы изменить его значение на «dawser: PROFILE = game».

Я пытался изменить его, когда конвейер играет, с помощью следующего кода:

void change_profile() {
    g_object_set(pipeline.audio_sink, "device", "dawser:PROFILE=game", NULL);
}

Но, похоже, это такне вступают в силу.Только когда я сначала остановлю конвейер, а затем снова запустю его, он может работать:

void change_profile() {
    gst_element_set_state (pipeline.pipeline, GST_STATE_NULL);
    g_object_set(pipeline.audio_sink, "device", "dawser:PROFILE=game", NULL);
    gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
}

Но он остановит звук на несколько секунд.Я хочу сделать переключение как можно более плавным.Есть ли лучшая идея, чтобы это произошло?

Спасибо

...