modules-avb: Introducing entity builder. The entity builder is necessary

to attach ressource to the descriptors instead of having them splitted.

It is the case for the avb-streams which in a seperated list. Instead they
should be encapsulated within the descriptor itself, as one cannot leave
without the other.
This commit is contained in:
hackerman-kl 2025-11-15 09:37:39 +01:00 committed by Wim Taymans
parent 8ea56477d9
commit 57af462ecf
3 changed files with 101 additions and 0 deletions

View file

@ -736,6 +736,7 @@ if build_module_avb
'module-avb/acmp.c',
'module-avb/aecp.c',
'module-avb/aecp-aem.c',
'module-avb/es-builder.c',
'module-avb/avdecc.c',
'module-avb/maap.c',
'module-avb/mmrp.c',

View file

@ -0,0 +1,81 @@
/* PipeWire */
/* SPDX-FileCopyrightText: Copyright © 2025 Alexandre Malki <alexandre.malki@kebag-logic.com> */
/* SPDX-License-Identifier: MIT */
#include "es-builder.h"
#include "aecp-aem-descriptors.h"
/**
* \brief The goal of this modules is to create a an entity and
* attache the necessary status or resources to it so they
* do no have to be seperated and referenced somewhere else.
*
* In a sense, it encapsulates the descriptor, and the states
* information that will be altered either by a aecp/acmp commands
* or internal state changes reflected into the counters.
*/
/** The callback type used for the different entity descriptor */
typedef void* (*es_builder_cb_t) (struct server *server, uint16_t type,
uint16_t index, size_t size, void *ptr);
/** Structure holding all necessary cb
* \todo for the future of compatibility between milan's version
* and plain AVB, add the right callback, that would reduce
* code complexity and increase reusability.
* As well as having multiple entity model defined using different
* entity on the same machine
*/
struct es_builder_st {
es_builder_cb_t build_descriptor_cb;
};
/** All callback that needs a status information */
static const struct es_builder_st es_builder[AVB_AEM_DESC_LAST_RESERVED_17221] =
{
};
/**
* \brief, should be called when creating an a descriptor, it will attach
* the right state variable that are necessary for counters, stream info
* and so on...
*/
void es_builder_add_descriptor(struct server *server, uint16_t type,
uint16_t index, size_t size, void *ptr_aem)
{
void *desc_ptr;
struct descriptor *d;
if (!server) {
pw_log_error("Invalid server, it is empty %p\n", server);
spa_assert(0);
}
if (type >= AVB_AEM_DESC_LAST_RESERVED_17221) {
pw_log_error("Invalid Type %u\n", type);
spa_assert(0);
}
/* Look if the descriptor has a callback to attach more status data */
if (!es_builder[type].build_descriptor_cb) {
if (!server_add_descriptor(server, type, index, size, ptr_aem)) {
pw_log_error("Could not allocate descriptor %u at "
"index %u the avb aem type\n", type, index);
spa_assert(0);
}
} else {
desc_ptr = es_builder[type].build_descriptor_cb(server, type,
index, size, ptr_aem);
if (!desc_ptr) {
pw_log_error("Could not allocate specific descriptr "
"%u at index %u the avb aem type\n",
type, index);
spa_assert(0);
}
d = (struct descriptor *) desc_ptr;
d->size = size;
}
}

View file

@ -0,0 +1,19 @@
/* PipeWire */
/* SPDX-FileCopyrightText: Copyright © 2025 Alexandre Malki <alexandre.malki@kebag-logic.com> */
/* SPDX-License-Identifier: MIT */
#ifndef __ES_BUILDER_H__
#define __ES_BUILDER_H__
#include "internal.h"
/**
* This is a mandatory feature to add the necessary state information
* to create the right entity model
**/
void es_builder_add_descriptor(struct server *server, uint16_t type,
uint16_t index, size_t size, void *ptr_aem);
#endif // __ES_BUILDER_H__