How to create a pw_filter with 2 inputs and 2 outpus?
I decided to play with the idea of making a pw_filter
. So far I am just following what is done at https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/examples/audio-dsp-filter.c. But I want the filter to be stereo. I am assuming it is just a matter of duplicating the usage of pw_filter_add_port
. But the result is random. Sometimes it works and 2 outputs and 2 inputs are created. But on other occasions only 1 input or output is created. I have seen other combinations too... This is the code:
auto* props_filter = pw_properties_new(nullptr, nullptr);
pw_properties_set(props_filter, PW_KEY_NODE_NAME, "pe_delay");
pw_properties_set(props_filter, PW_KEY_MEDIA_TYPE, "Audio");
pw_properties_set(props_filter, PW_KEY_MEDIA_CATEGORY, "Filter");
pw_properties_set(props_filter, PW_KEY_MEDIA_ROLE, "DSP");
filter = pw_filter_new(pm->core, "pe_filter", props_filter);
pw_filter_add_listener(filter, &listener, &filter_events, &pf_data);
// left channel input
auto* props_in_left = pw_properties_new(nullptr, nullptr);
pw_properties_set(props_in_left, PW_KEY_FORMAT_DSP, "32 bit float mono audio");
pw_properties_set(props_in_left, PW_KEY_PORT_NAME, "input_fl");
pw_properties_set(props_in_left, "audio.channel", "FL");
pf_data.in_left = static_cast<pf::port*>(pw_filter_add_port(
filter, PW_DIRECTION_INPUT, PW_FILTER_PORT_FLAG_MAP_BUFFERS, sizeof(pf::port), props_in_left, nullptr, 0));
// right channel input
auto* props_in_right = pw_properties_new(nullptr, nullptr);
pw_properties_set(props_in_right, PW_KEY_FORMAT_DSP, "32 bit float mono audio");
pw_properties_set(props_in_right, PW_KEY_PORT_NAME, "input_fr");
pw_properties_set(props_in_right, "audio.channel", "FR");
pf_data.in_right = static_cast<pf::port*>(pw_filter_add_port(
filter, PW_DIRECTION_INPUT, PW_FILTER_PORT_FLAG_MAP_BUFFERS, sizeof(pf::port), props_in_right, nullptr, 0));
// left channel output
auto* props_out_left = pw_properties_new(nullptr, nullptr);
pw_properties_set(props_out_left, PW_KEY_FORMAT_DSP, "32 bit float mono audio");
pw_properties_set(props_out_left, PW_KEY_PORT_NAME, "output_fl");
pw_properties_set(props_in_left, "audio.channel", "FL");
pf_data.out_left = static_cast<pf::port*>(pw_filter_add_port(
filter, PW_DIRECTION_OUTPUT, PW_FILTER_PORT_FLAG_MAP_BUFFERS, sizeof(pf::port), props_out_left, nullptr, 0));
// right channel output
auto* props_out_right = pw_properties_new(nullptr, nullptr);
pw_properties_set(props_out_right, PW_KEY_FORMAT_DSP, "32 bit float mono audio");
pw_properties_set(props_out_right, PW_KEY_PORT_NAME, "output_fr");
pw_properties_set(props_in_left, "audio.channel", "FR");
pf_data.out_right = static_cast<pf::port*>(pw_filter_add_port(
filter, PW_DIRECTION_OUTPUT, PW_FILTER_PORT_FLAG_MAP_BUFFERS, sizeof(pf::port), props_out_right, nullptr, 0));
if (pw_filter_connect(filter, PW_FILTER_FLAG_RT_PROCESS, nullptr, 0) < 0) {
util::error(log_tag + "can not connect the filter to pipewire!");
} else {
util::debug(log_tag + "delay filter connected to pipewire");
}
Sometimes I see this in the system log node 0x55726743a250: can't add port 0x557266a37040: -28, No space left on device
. There is something I am doing wrong...