topology: add binary output from the builder

- snd_tplg_build_bin()
- snd_tplg_build_bin_file()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2019-12-14 19:20:02 +01:00
parent 39fb37fef5
commit bee8d4fcaa
2 changed files with 87 additions and 14 deletions

View file

@ -791,7 +791,18 @@ void snd_tplg_free(snd_tplg_t *tplg);
* \return Zero on success, otherwise a negative error code * \return Zero on success, otherwise a negative error code
*/ */
int snd_tplg_build_file(snd_tplg_t *tplg, const char *infile, int snd_tplg_build_file(snd_tplg_t *tplg, const char *infile,
const char *outfile); const char *outfile);
/**
* \brief Parse and build topology text file into binary file.
* \param tplg Topology instance.
* \param infile Topology text input file to be parsed
* \param bin Binary topology output buffer (malloc).
* \param size Binary topology output buffer size in bytes.
* \return Zero on success, otherwise a negative error code
*/
int snd_tplg_build_bin_file(snd_tplg_t *tplg, const char *infile,
void **bin, size_t *size);
/** /**
* \brief Enable verbose reporting of binary file output * \brief Enable verbose reporting of binary file output
@ -1089,6 +1100,15 @@ int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t);
*/ */
int snd_tplg_build(snd_tplg_t *tplg, const char *outfile); int snd_tplg_build(snd_tplg_t *tplg, const char *outfile);
/**
* \brief Build all registered topology data into memory.
* \param tplg Topology instance.
* \param bin Binary topology output buffer (malloc).
* \param size Binary topology output buffer size in bytes.
* \return Zero on success, otherwise a negative error code
*/
int snd_tplg_build_bin(snd_tplg_t *tplg, void **bin, size_t *size);
/** /**
* \brief Attach private data to topology manifest. * \brief Attach private data to topology manifest.
* \param tplg Topology instance. * \param tplg Topology instance.

View file

@ -393,9 +393,7 @@ static int tplg_build_integ(snd_tplg_t *tplg)
return err; return err;
} }
int snd_tplg_build_file(snd_tplg_t *tplg, static int tplg_load(snd_tplg_t *tplg, const char *infile)
const char *infile,
const char *outfile)
{ {
snd_config_t *cfg = NULL; snd_config_t *cfg = NULL;
int err = 0; int err = 0;
@ -414,10 +412,53 @@ int snd_tplg_build_file(snd_tplg_t *tplg,
} }
snd_config_delete(cfg); snd_config_delete(cfg);
return 0;
}
static int tplg_build(snd_tplg_t *tplg)
{
int err;
err = tplg_build_integ(tplg);
if (err < 0) {
SNDERR("error: failed to check topology integrity\n");
return err;
}
err = tplg_write_data(tplg);
if (err < 0) {
SNDERR("error: failed to write data %d\n", err);
return err;
}
return 0;
}
int snd_tplg_build_file(snd_tplg_t *tplg,
const char *infile,
const char *outfile)
{
int err;
err = tplg_load(tplg, infile);
if (err < 0)
return err;
return snd_tplg_build(tplg, outfile); return snd_tplg_build(tplg, outfile);
} }
int snd_tplg_build_bin_file(snd_tplg_t *tplg,
const char *infile,
void **bin, size_t *size)
{
int err;
err = tplg_load(tplg, infile);
if (err < 0)
return err;
return snd_tplg_build_bin(tplg, bin, size);
}
int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t) int snd_tplg_add_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
{ {
switch (t->type) { switch (t->type) {
@ -450,17 +491,9 @@ int snd_tplg_build(snd_tplg_t *tplg, const char *outfile)
int fd, err; int fd, err;
ssize_t r; ssize_t r;
err = tplg_build_integ(tplg); err = tplg_build(tplg);
if (err < 0) { if (err < 0)
SNDERR("error: failed to check topology integrity\n");
return err; return err;
}
err = tplg_write_data(tplg);
if (err < 0) {
SNDERR("error: failed to write data %d\n", err);
return err;
}
fd = open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); fd = open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd < 0) { if (fd < 0) {
@ -481,6 +514,26 @@ int snd_tplg_build(snd_tplg_t *tplg, const char *outfile)
return 0; return 0;
} }
int snd_tplg_build_bin(snd_tplg_t *tplg,
void **bin, size_t *size)
{
int err;
err = tplg_build(tplg);
if (err < 0)
return err;
err = tplg_build(tplg);
if (err < 0)
return err;
*bin = tplg->bin;
*size = tplg->bin_size;
tplg->bin = NULL;
tplg->bin_size = tplg->bin_pos = 0;
return 0;
}
int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len) int snd_tplg_set_manifest_data(snd_tplg_t *tplg, const void *data, int len)
{ {
if (len <= 0) if (len <= 0)