mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
module-rtp-sap: add a way to add extra attributes to SDP
Useful for new device bringup without rebuilding PW
This commit is contained in:
parent
1fe6feac56
commit
066e8e1c63
1 changed files with 48 additions and 0 deletions
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include <spa/utils/hook.h>
|
||||
#include <spa/utils/result.h>
|
||||
#include <spa/utils/json.h>
|
||||
#include <spa/debug/types.h>
|
||||
|
||||
#include <pipewire/pipewire.h>
|
||||
|
|
@ -56,6 +57,8 @@
|
|||
* - `net.ttl = <int>`: TTL to use, default 1
|
||||
* - `net.loop = <bool>`: loopback multicast, default false
|
||||
* - `stream.rules` = <rules>: match rules, use create-stream and announce-stream actions
|
||||
* - `sap.preamble-extra = [strings]`: extra attributes to add to the atomic SDP preamble
|
||||
* - `sap.end-extra = [strings]`: extra attributes to add to the end of the SDP message
|
||||
*
|
||||
* ## General options
|
||||
*
|
||||
|
|
@ -255,6 +258,9 @@ struct impl {
|
|||
|
||||
uint32_t n_sessions;
|
||||
struct spa_list sessions;
|
||||
|
||||
char *extra_attrs_preamble;
|
||||
char *extra_attrs_end;
|
||||
};
|
||||
|
||||
struct format_info {
|
||||
|
|
@ -548,6 +554,9 @@ static int send_sap(struct impl *impl, struct session *sess, bool bye)
|
|||
sdp->ntp,
|
||||
sdp->media_type, sdp->dst_port, sdp->payload);
|
||||
|
||||
if (impl->extra_attrs_preamble)
|
||||
spa_strbuf_append(&buf, "%s", impl->extra_attrs_preamble);
|
||||
|
||||
if (sdp->channels) {
|
||||
if (sdp->channelmap[0] != 0) {
|
||||
// Produce Audinate format channel record. It's recognized by RAVENNA
|
||||
|
|
@ -596,6 +605,9 @@ static int send_sap(struct impl *impl, struct session *sess, bool bye)
|
|||
"a=type:broadcast\n",
|
||||
pw_get_library_version());
|
||||
|
||||
if (impl->extra_attrs_end)
|
||||
spa_strbuf_append(&buf, "%s", impl->extra_attrs_end);
|
||||
|
||||
pw_log_debug("sending SAP for %u %s", sess->node->id, buffer);
|
||||
|
||||
iov[3].iov_base = buffer;
|
||||
|
|
@ -1434,6 +1446,9 @@ static void impl_destroy(struct impl *impl)
|
|||
|
||||
pw_properties_free(impl->props);
|
||||
|
||||
free(impl->extra_attrs_preamble);
|
||||
free(impl->extra_attrs_end);
|
||||
|
||||
free(impl->ifname);
|
||||
free(impl);
|
||||
}
|
||||
|
|
@ -1546,6 +1561,39 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
|
|||
impl->ttl = pw_properties_get_uint32(props, "net.ttl", DEFAULT_TTL);
|
||||
impl->mcast_loop = pw_properties_get_bool(props, "net.loop", DEFAULT_LOOP);
|
||||
|
||||
impl->extra_attrs_preamble = NULL;
|
||||
impl->extra_attrs_end = NULL;
|
||||
char buffer[2048];
|
||||
struct spa_strbuf buf;
|
||||
if ((str = pw_properties_get(props, "sap.preamble-extra")) != NULL) {
|
||||
spa_strbuf_init(&buf, buffer, sizeof(buffer));
|
||||
struct spa_json it[2];
|
||||
char line[256];
|
||||
|
||||
spa_json_init(&it[0], str, strlen(str));
|
||||
if (spa_json_enter_array(&it[0], &it[1]) <= 0)
|
||||
spa_json_init(&it[1], str, strlen(str));
|
||||
|
||||
while (spa_json_get_string(&it[1], line, sizeof(line)) > 0)
|
||||
spa_strbuf_append(&buf, "%s\n", line);
|
||||
|
||||
impl->extra_attrs_preamble = strdup(buffer);
|
||||
}
|
||||
if ((str = pw_properties_get(props, "sap.end-extra")) != NULL) {
|
||||
spa_strbuf_init(&buf, buffer, sizeof(buffer));
|
||||
struct spa_json it[2];
|
||||
char line[256];
|
||||
|
||||
spa_json_init(&it[0], str, strlen(str));
|
||||
if (spa_json_enter_array(&it[0], &it[1]) <= 0)
|
||||
spa_json_init(&it[1], str, strlen(str));
|
||||
|
||||
while (spa_json_get_string(&it[1], line, sizeof(line)) > 0)
|
||||
spa_strbuf_append(&buf, "%s\n", line);
|
||||
|
||||
impl->extra_attrs_end = strdup(buffer);
|
||||
}
|
||||
|
||||
impl->core = pw_context_get_object(context, PW_TYPE_INTERFACE_Core);
|
||||
if (impl->core == NULL) {
|
||||
str = pw_properties_get(props, PW_KEY_REMOTE_NAME);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue