module-session-manager: use dynamic builder

The buffer is very small and we should use a dynamic builder if we don't
know what pod we will expect.
This commit is contained in:
Wim Taymans 2023-06-15 11:05:17 +02:00
parent bbf8f1a0c8
commit 0b2d9ee007
8 changed files with 88 additions and 80 deletions

View file

@ -10,6 +10,7 @@
#include <pipewire/extensions/session-manager.h> #include <pipewire/extensions/session-manager.h>
#include <spa/pod/filter.h> #include <spa/pod/filter.h>
#include <spa/pod/dynamic.h>
#include "endpoint-stream.h" #include "endpoint-stream.h"
#include "client-endpoint.h" #include "client-endpoint.h"
@ -39,8 +40,8 @@ static int endpoint_stream_enum_params (void *object, int seq,
struct endpoint_stream *this = data->stream; struct endpoint_stream *this = data->stream;
struct spa_pod *result; struct spa_pod *result;
struct spa_pod *param; struct spa_pod *param;
uint8_t buffer[1024]; uint8_t buffer[2048];
struct spa_pod_builder b = { 0 }; struct spa_pod_dynamic_builder b = { 0 };
uint32_t index; uint32_t index;
uint32_t next = start; uint32_t next = start;
uint32_t count = 0; uint32_t count = 0;
@ -55,15 +56,15 @@ static int endpoint_stream_enum_params (void *object, int seq,
if (param == NULL || !spa_pod_is_object_id(param, id)) if (param == NULL || !spa_pod_is_object_id(param, id))
continue; continue;
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096);
if (spa_pod_filter(&b, &result, param, filter) != 0) if (spa_pod_filter(&b.b, &result, param, filter) == 0) {
continue; pw_log_debug(NAME" %p: %d param %u", this, seq, index);
pw_endpoint_stream_resource_param(resource, seq, id, index, next, result);
count++;
}
spa_pod_dynamic_builder_clean(&b);
pw_log_debug(NAME" %p: %d param %u", this, seq, index); if (count == num)
pw_endpoint_stream_resource_param(resource, seq, id, index, next, result);
if (++count == num)
break; break;
} }
return 0; return 0;

View file

@ -10,6 +10,7 @@
#include <pipewire/extensions/session-manager.h> #include <pipewire/extensions/session-manager.h>
#include <spa/pod/filter.h> #include <spa/pod/filter.h>
#include <spa/pod/dynamic.h>
#include "endpoint.h" #include "endpoint.h"
#include "client-endpoint.h" #include "client-endpoint.h"
@ -39,8 +40,8 @@ static int endpoint_enum_params (void *object, int seq,
struct endpoint *this = data->endpoint; struct endpoint *this = data->endpoint;
struct spa_pod *result; struct spa_pod *result;
struct spa_pod *param; struct spa_pod *param;
uint8_t buffer[1024]; uint8_t buffer[2048];
struct spa_pod_builder b = { 0 }; struct spa_pod_dynamic_builder b = { 0 };
uint32_t index; uint32_t index;
uint32_t next = start; uint32_t next = start;
uint32_t count = 0; uint32_t count = 0;
@ -57,15 +58,15 @@ static int endpoint_enum_params (void *object, int seq,
if (param == NULL || !spa_pod_is_object_id(param, id)) if (param == NULL || !spa_pod_is_object_id(param, id))
continue; continue;
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096);
if (spa_pod_filter(&b, &result, param, filter) != 0) if (spa_pod_filter(&b.b, &result, param, filter) == 0) {
continue; pw_log_debug(NAME" %p: %d param %u", this, seq, index);
pw_endpoint_resource_param(resource, seq, id, index, next, result);
count++;
}
spa_pod_dynamic_builder_clean(&b);
pw_log_debug(NAME" %p: %d param %u", this, seq, index); if (count == num)
pw_endpoint_resource_param(resource, seq, id, index, next, result);
if (++count == num)
break; break;
} }
return 0; return 0;

View file

@ -10,6 +10,7 @@
#include <pipewire/extensions/session-manager.h> #include <pipewire/extensions/session-manager.h>
#include <spa/pod/filter.h> #include <spa/pod/filter.h>
#include <spa/pod/dynamic.h>
#include "endpoint-link.h" #include "endpoint-link.h"
#include "client-session.h" #include "client-session.h"
@ -39,8 +40,8 @@ static int endpoint_link_enum_params (void *object, int seq,
struct endpoint_link *this = data->link; struct endpoint_link *this = data->link;
struct spa_pod *result; struct spa_pod *result;
struct spa_pod *param; struct spa_pod *param;
uint8_t buffer[1024]; uint8_t buffer[2048];
struct spa_pod_builder b = { 0 }; struct spa_pod_dynamic_builder b = { 0 };
uint32_t index; uint32_t index;
uint32_t next = start; uint32_t next = start;
uint32_t count = 0; uint32_t count = 0;
@ -55,15 +56,15 @@ static int endpoint_link_enum_params (void *object, int seq,
if (param == NULL || !spa_pod_is_object_id(param, id)) if (param == NULL || !spa_pod_is_object_id(param, id))
continue; continue;
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096);
if (spa_pod_filter(&b, &result, param, filter) != 0) if (spa_pod_filter(&b.b, &result, param, filter) == 0) {
continue; pw_log_debug(NAME" %p: %d param %u", this, seq, index);
pw_endpoint_link_resource_param(resource, seq, id, index, next, result);
count++;
}
spa_pod_dynamic_builder_clean(&b);
pw_log_debug(NAME" %p: %d param %u", this, seq, index); if (count == num)
pw_endpoint_link_resource_param(resource, seq, id, index, next, result);
if (++count == num)
break; break;
} }
return 0; return 0;

View file

@ -10,6 +10,7 @@
#include <pipewire/extensions/session-manager.h> #include <pipewire/extensions/session-manager.h>
#include <spa/pod/filter.h> #include <spa/pod/filter.h>
#include <spa/pod/dynamic.h>
#include "session.h" #include "session.h"
#include "client-session.h" #include "client-session.h"
@ -39,8 +40,8 @@ static int session_enum_params (void *object, int seq,
struct session *this = data->session; struct session *this = data->session;
struct spa_pod *result; struct spa_pod *result;
struct spa_pod *param; struct spa_pod *param;
uint8_t buffer[1024]; uint8_t buffer[2048];
struct spa_pod_builder b = { 0 }; struct spa_pod_dynamic_builder b = { 0 };
uint32_t index; uint32_t index;
uint32_t next = start; uint32_t next = start;
uint32_t count = 0; uint32_t count = 0;
@ -55,15 +56,15 @@ static int session_enum_params (void *object, int seq,
if (param == NULL || !spa_pod_is_object_id(param, id)) if (param == NULL || !spa_pod_is_object_id(param, id))
continue; continue;
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096);
if (spa_pod_filter(&b, &result, param, filter) != 0) if (spa_pod_filter(&b.b, &result, param, filter) == 0) {
continue; pw_log_debug(NAME" %p: %d param %u", this, seq, index);
pw_session_resource_param(resource, seq, id, index, next, result);
count++;
}
spa_pod_dynamic_builder_clean(&b);
pw_log_debug(NAME" %p: %d param %u", this, seq, index); if (count == num)
pw_session_resource_param(resource, seq, id, index, next, result);
if (++count == num)
break; break;
} }
return 0; return 0;

View file

@ -10,6 +10,7 @@
#include <spa/utils/result.h> #include <spa/utils/result.h>
#include <spa/pod/builder.h> #include <spa/pod/builder.h>
#include <spa/pod/filter.h> #include <spa/pod/filter.h>
#include <spa/pod/dynamic.h>
#define MAX_PARAMS 32 #define MAX_PARAMS 32
@ -84,8 +85,8 @@ static int method_enum_params(void *object, int seq,
struct param_data *pdata; struct param_data *pdata;
struct spa_pod *result; struct spa_pod *result;
struct spa_pod *param; struct spa_pod *param;
uint8_t buffer[1024]; uint8_t buffer[2048];
struct spa_pod_builder b = { 0 }; struct spa_pod_dynamic_builder b = { 0 };
uint32_t index; uint32_t index;
uint32_t next = start; uint32_t next = start;
uint32_t count = 0; uint32_t count = 0;
@ -103,15 +104,15 @@ static int method_enum_params(void *object, int seq,
param = *pw_array_get_unchecked(&pdata->params, index, struct spa_pod*); param = *pw_array_get_unchecked(&pdata->params, index, struct spa_pod*);
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096);
if (spa_pod_filter(&b, &result, param, filter) != 0) if (spa_pod_filter(&b.b, &result, param, filter) == 0) {
continue; pw_log_debug(NAME" %p: %d param %u", impl, seq, index);
pw_endpoint_link_resource_param(d->resource, seq, id, index, next, result);
count++;
}
spa_pod_dynamic_builder_clean(&b);
pw_log_debug(NAME" %p: %d param %u", impl, seq, index); if (count == num)
pw_endpoint_link_resource_param(d->resource, seq, id, index, next, result);
if (++count == num)
return 0; return 0;
} }
} }

View file

@ -10,6 +10,7 @@
#include <spa/utils/result.h> #include <spa/utils/result.h>
#include <spa/pod/builder.h> #include <spa/pod/builder.h>
#include <spa/pod/filter.h> #include <spa/pod/filter.h>
#include <spa/pod/dynamic.h>
#define MAX_PARAMS 32 #define MAX_PARAMS 32
@ -84,8 +85,8 @@ static int method_enum_params(void *object, int seq,
struct param_data *pdata; struct param_data *pdata;
struct spa_pod *result; struct spa_pod *result;
struct spa_pod *param; struct spa_pod *param;
uint8_t buffer[1024]; uint8_t buffer[2048];
struct spa_pod_builder b = { 0 }; struct spa_pod_dynamic_builder b = { 0 };
uint32_t index; uint32_t index;
uint32_t next = start; uint32_t next = start;
uint32_t count = 0; uint32_t count = 0;
@ -103,15 +104,15 @@ static int method_enum_params(void *object, int seq,
param = *pw_array_get_unchecked(&pdata->params, index, struct spa_pod*); param = *pw_array_get_unchecked(&pdata->params, index, struct spa_pod*);
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096);
if (spa_pod_filter(&b, &result, param, filter) != 0) if (spa_pod_filter(&b.b, &result, param, filter) == 0) {
continue; pw_log_debug(NAME" %p: %d param %u", impl, seq, index);
pw_endpoint_stream_resource_param(d->resource, seq, id, index, next, result);
count++;
}
spa_pod_dynamic_builder_clean(&b);
pw_log_debug(NAME" %p: %d param %u", impl, seq, index); if (count == num)
pw_endpoint_stream_resource_param(d->resource, seq, id, index, next, result);
if (++count == num)
return 0; return 0;
} }
} }

View file

@ -9,6 +9,7 @@
#include <spa/utils/result.h> #include <spa/utils/result.h>
#include <spa/pod/builder.h> #include <spa/pod/builder.h>
#include <spa/pod/dynamic.h>
#include <spa/pod/filter.h> #include <spa/pod/filter.h>
#define MAX_PARAMS 32 #define MAX_PARAMS 32
@ -84,8 +85,8 @@ static int method_enum_params(void *object, int seq,
struct param_data *pdata; struct param_data *pdata;
struct spa_pod *result; struct spa_pod *result;
struct spa_pod *param; struct spa_pod *param;
uint8_t buffer[1024]; uint8_t buffer[2048];
struct spa_pod_builder b = { 0 }; struct spa_pod_dynamic_builder b = { 0 };
uint32_t index; uint32_t index;
uint32_t next = start; uint32_t next = start;
uint32_t count = 0; uint32_t count = 0;
@ -103,15 +104,15 @@ static int method_enum_params(void *object, int seq,
param = *pw_array_get_unchecked(&pdata->params, index, struct spa_pod*); param = *pw_array_get_unchecked(&pdata->params, index, struct spa_pod*);
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096);
if (spa_pod_filter(&b, &result, param, filter) != 0) if (spa_pod_filter(&b.b, &result, param, filter) == 0) {
continue; pw_log_debug(NAME" %p: %d param %u", impl, seq, index);
pw_endpoint_resource_param(d->resource, seq, id, index, next, result);
count++;
}
spa_pod_dynamic_builder_clean(&b);
pw_log_debug(NAME" %p: %d param %u", impl, seq, index); if (count == num)
pw_endpoint_resource_param(d->resource, seq, id, index, next, result);
if (++count == num)
return 0; return 0;
} }
} }

View file

@ -10,6 +10,7 @@
#include <spa/utils/result.h> #include <spa/utils/result.h>
#include <spa/pod/builder.h> #include <spa/pod/builder.h>
#include <spa/pod/filter.h> #include <spa/pod/filter.h>
#include <spa/pod/dynamic.h>
#define MAX_PARAMS 32 #define MAX_PARAMS 32
@ -84,8 +85,8 @@ static int method_enum_params(void *object, int seq,
struct param_data *pdata; struct param_data *pdata;
struct spa_pod *result; struct spa_pod *result;
struct spa_pod *param; struct spa_pod *param;
uint8_t buffer[1024]; uint8_t buffer[2048];
struct spa_pod_builder b = { 0 }; struct spa_pod_dynamic_builder b = { 0 };
uint32_t index; uint32_t index;
uint32_t next = start; uint32_t next = start;
uint32_t count = 0; uint32_t count = 0;
@ -103,15 +104,15 @@ static int method_enum_params(void *object, int seq,
param = *pw_array_get_unchecked(&pdata->params, index, struct spa_pod*); param = *pw_array_get_unchecked(&pdata->params, index, struct spa_pod*);
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096);
if (spa_pod_filter(&b, &result, param, filter) != 0) if (spa_pod_filter(&b.b, &result, param, filter) == 0) {
continue; pw_log_debug(NAME" %p: %d param %u", impl, seq, index);
pw_session_resource_param(d->resource, seq, id, index, next, result);
count++;
}
spa_pod_dynamic_builder_clean(&b);
pw_log_debug(NAME" %p: %d param %u", impl, seq, index); if (count == num)
pw_session_resource_param(d->resource, seq, id, index, next, result);
if (++count == num)
return 0; return 0;
} }
} }