Я работаю над аудиоприложением, основанным на 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);
}
Но он остановит звук на несколько секунд.Я хочу сделать переключение как можно более плавным.Есть ли лучшая идея, чтобы это произошло?
Спасибо