[Sound-open-firmware] [PATCH] topology: utility for visualizing topology
Add a simple utility that parses topology bin files and creates a graph using the linux dot tool.
Signed-off-by: Ranjani Sridharan ranjani.sridharan@linux.intel.com --- topology/Makefile.am | 5 ++ topology/parse_topology.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 topology/parse_topology.c
diff --git a/topology/Makefile.am b/topology/Makefile.am index 73e10e9..b69dfb4 100644 --- a/topology/Makefile.am +++ b/topology/Makefile.am @@ -59,3 +59,8 @@ EXTRA_DIST = \ sof-cnl-rt274.m4 \ sof-hsw-rt5640.m4 \ sof-apl-tdf8532.m4 + +bin_PROGRAMS = tplg_graph + +tplg_graph_SOURCES = \ + parse_topology.c diff --git a/topology/parse_topology.c b/topology/parse_topology.c new file mode 100644 index 0000000..b54ca77 --- /dev/null +++ b/topology/parse_topology.c @@ -0,0 +1,130 @@ +/* + * Utility for visualizing topology files. + * + * Copyright (c) 2015, Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +#include <stdio.h> +#include <sound/asoc.h> +#include <string.h> +#include <stdlib.h> + +/* + * The output graph is saved as "tplg.png" + * Usage: ./tplg_graph <tplg file> + */ + +int main(int argc, char **argv) +{ + struct snd_soc_tplg_hdr *hdr; + struct snd_soc_tplg_dapm_graph_elem *graph_elem; + char *filename; + char *dotfilename = "tplg.dot"; + FILE *file, *dotfile; + char *start = "digraph topology {\n"; + char *node_color = "node [color=Red,fontname=Courier]\n"; + char *edge_color = "edge [color=Blue, style=dashed]\n"; + char *end = "}\n"; + char edge[256]; + int i, status, ret; + size_t size, file_size; + + /* command line arguments */ + if (argc < 2) { + printf("usage: tplg_graph <tplg file>\n"); + exit(EXIT_FAILURE); + } + + filename = malloc(strlen(argv[1])); + strcpy(filename, argv[1]); + + /* open files */ + file = fopen(filename, "rb"); + if (!file) { + fprintf(stderr, "Unable to open file %s", filename); + return -1; + } + + dotfile = fopen(dotfilename, "w"); + if (!dotfile) { + fprintf(stderr, "Unable to open file %s", dotfilename); + return -1; + } + + fwrite(start, strlen(start), 1, dotfile); + fwrite(node_color, strlen(node_color), 1, dotfile); + fwrite(edge_color, strlen(edge_color), 1, dotfile); + + + /* file size */ + fseek(file, 0, SEEK_END); + file_size = ftell(file); + fseek(file, 0, SEEK_SET); + + /* Allocate memory */ + size = sizeof(struct snd_soc_tplg_hdr); + hdr = (struct snd_soc_tplg_hdr *)malloc(size); + if (!hdr) { + printf("error: mem alloc\n"); + return -1; + } + + size = sizeof(struct snd_soc_tplg_dapm_graph_elem); + graph_elem = (struct snd_soc_tplg_dapm_graph_elem *)malloc(size); + if (!graph_elem) { + printf("error: mem alloc\n"); + return -1; + } + + while (1) { + ret = fread(hdr, sizeof(struct snd_soc_tplg_hdr), 1, file); + if (ret != 1) + printf("error: reading header\n"); + + switch (hdr->type) { + case SND_SOC_TPLG_TYPE_DAPM_GRAPH: + size = sizeof(struct snd_soc_tplg_dapm_graph_elem); + /* parse pipeline graph */ + for (i = 0; i < hdr->count; i++) { + ret = fread(graph_elem, size, 1, file); + if (ret != 1) + printf("error: reading graph elem\n"); + + /* write route to output dot file */ + sprintf(edge, ""%s"->"%s"\n", + graph_elem->source, graph_elem->sink); + fwrite(edge, strlen(edge), 1, dotfile); + fwrite("\n", 1, 1, dotfile); + } + + if (ftell(file) == file_size) + goto finish; + break; + + default: + fseek(file, hdr->payload_size, SEEK_CUR); + if (ftell(file) == file_size) + goto finish; + break; + } + } + +finish: + fwrite(end, strlen(end), 1, dotfile); + fclose(dotfile); + fclose(file); + free(hdr); + free(graph_elem); + + /* create topology graph */ + status = system("dot tplg.dot -Tpng -o tplg.png"); +}
On 5/3/18 4:44 PM, Ranjani Sridharan wrote:
Add a simple utility that parses topology bin files and creates a graph using the linux dot tool.
Signed-off-by: Ranjani Sridharan ranjani.sridharan@linux.intel.com
topology/Makefile.am | 5 ++ topology/parse_topology.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 topology/parse_topology.c
diff --git a/topology/Makefile.am b/topology/Makefile.am index 73e10e9..b69dfb4 100644 --- a/topology/Makefile.am +++ b/topology/Makefile.am @@ -59,3 +59,8 @@ EXTRA_DIST = \ sof-cnl-rt274.m4 \ sof-hsw-rt5640.m4 \ sof-apl-tdf8532.m4
+bin_PROGRAMS = tplg_graph
+tplg_graph_SOURCES = \
- parse_topology.c
diff --git a/topology/parse_topology.c b/topology/parse_topology.c new file mode 100644 index 0000000..b54ca77 --- /dev/null +++ b/topology/parse_topology.c @@ -0,0 +1,130 @@ +/*
- Utility for visualizing topology files.
- Copyright (c) 2015, Intel Corporation.
- This program is free software; you can redistribute it and/or modify it
- under the terms and conditions of the GNU General Public License,
- version 2, as published by the Free Software Foundation.
- This program is distributed in the hope it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- more details.
why is the copyright from 2015 and the license GPL? Is this coming from some other project?
- */
+#include <stdio.h> +#include <sound/asoc.h> +#include <string.h> +#include <stdlib.h>
+/*
- The output graph is saved as "tplg.png"
- Usage: ./tplg_graph <tplg file>
- */
+int main(int argc, char **argv) +{
- struct snd_soc_tplg_hdr *hdr;
- struct snd_soc_tplg_dapm_graph_elem *graph_elem;
- char *filename;
- char *dotfilename = "tplg.dot";
- FILE *file, *dotfile;
- char *start = "digraph topology {\n";
- char *node_color = "node [color=Red,fontname=Courier]\n";
- char *edge_color = "edge [color=Blue, style=dashed]\n";
- char *end = "}\n";
- char edge[256];
- int i, status, ret;
- size_t size, file_size;
- /* command line arguments */
- if (argc < 2) {
printf("usage: tplg_graph <tplg file>\n");
exit(EXIT_FAILURE);
- }
- filename = malloc(strlen(argv[1]));
- strcpy(filename, argv[1]);
- /* open files */
- file = fopen(filename, "rb");
- if (!file) {
fprintf(stderr, "Unable to open file %s", filename);
return -1;
- }
- dotfile = fopen(dotfilename, "w");
- if (!dotfile) {
fprintf(stderr, "Unable to open file %s", dotfilename);
return -1;
- }
- fwrite(start, strlen(start), 1, dotfile);
- fwrite(node_color, strlen(node_color), 1, dotfile);
- fwrite(edge_color, strlen(edge_color), 1, dotfile);
- /* file size */
- fseek(file, 0, SEEK_END);
- file_size = ftell(file);
- fseek(file, 0, SEEK_SET);
- /* Allocate memory */
- size = sizeof(struct snd_soc_tplg_hdr);
- hdr = (struct snd_soc_tplg_hdr *)malloc(size);
- if (!hdr) {
printf("error: mem alloc\n");
return -1;
- }
- size = sizeof(struct snd_soc_tplg_dapm_graph_elem);
- graph_elem = (struct snd_soc_tplg_dapm_graph_elem *)malloc(size);
- if (!graph_elem) {
printf("error: mem alloc\n");
return -1;
- }
- while (1) {
ret = fread(hdr, sizeof(struct snd_soc_tplg_hdr), 1, file);
if (ret != 1)
printf("error: reading header\n");
switch (hdr->type) {
case SND_SOC_TPLG_TYPE_DAPM_GRAPH:
size = sizeof(struct snd_soc_tplg_dapm_graph_elem);
/* parse pipeline graph */
for (i = 0; i < hdr->count; i++) {
ret = fread(graph_elem, size, 1, file);
if (ret != 1)
printf("error: reading graph elem\n");
/* write route to output dot file */
sprintf(edge, "\"%s\"->\"%s\"\n",
graph_elem->source, graph_elem->sink);
fwrite(edge, strlen(edge), 1, dotfile);
fwrite("\n", 1, 1, dotfile);
}
if (ftell(file) == file_size)
goto finish;
break;
default:
fseek(file, hdr->payload_size, SEEK_CUR);
if (ftell(file) == file_size)
goto finish;
break;
}
- }
+finish:
- fwrite(end, strlen(end), 1, dotfile);
- fclose(dotfile);
- fclose(file);
- free(hdr);
- free(graph_elem);
- /* create topology graph */
- status = system("dot tplg.dot -Tpng -o tplg.png");
+}
On Thu, 2018-05-03 at 16:51 -0500, Pierre-Louis Bossart wrote:
On 5/3/18 4:44 PM, Ranjani Sridharan wrote:
Add a simple utility that parses topology bin files and creates a graph using the linux dot tool.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com
topology/Makefile.am | 5 ++ topology/parse_topology.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 topology/parse_topology.c
diff --git a/topology/Makefile.am b/topology/Makefile.am index 73e10e9..b69dfb4 100644 --- a/topology/Makefile.am +++ b/topology/Makefile.am @@ -59,3 +59,8 @@ EXTRA_DIST = \ sof-cnl-rt274.m4 \ sof-hsw-rt5640.m4 \ sof-apl-tdf8532.m4
+bin_PROGRAMS = tplg_graph
+tplg_graph_SOURCES = \
- parse_topology.c
diff --git a/topology/parse_topology.c b/topology/parse_topology.c new file mode 100644 index 0000000..b54ca77 --- /dev/null +++ b/topology/parse_topology.c @@ -0,0 +1,130 @@ +/*
- Utility for visualizing topology files.
- Copyright (c) 2015, Intel Corporation.
- This program is free software; you can redistribute it and/or
modify it
- under the terms and conditions of the GNU General Public
License,
- version 2, as published by the Free Software Foundation.
- This program is distributed in the hope it will be useful, but
WITHOUT
- ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for
- more details.
why is the copyright from 2015 and the license GPL? Is this coming from some other project?
Sorry, copied it from rmbox. Should I change it to FreeBSD?
- */
+#include <stdio.h> +#include <sound/asoc.h> +#include <string.h> +#include <stdlib.h>
+/*
- The output graph is saved as "tplg.png"
- Usage: ./tplg_graph <tplg file>
- */
+int main(int argc, char **argv) +{
- struct snd_soc_tplg_hdr *hdr;
- struct snd_soc_tplg_dapm_graph_elem *graph_elem;
- char *filename;
- char *dotfilename = "tplg.dot";
- FILE *file, *dotfile;
- char *start = "digraph topology {\n";
- char *node_color = "node [color=Red,fontname=Courier]\n";
- char *edge_color = "edge [color=Blue, style=dashed]\n";
- char *end = "}\n";
- char edge[256];
- int i, status, ret;
- size_t size, file_size;
- /* command line arguments */
- if (argc < 2) {
printf("usage: tplg_graph <tplg file>\n");
exit(EXIT_FAILURE);
- }
- filename = malloc(strlen(argv[1]));
- strcpy(filename, argv[1]);
- /* open files */
- file = fopen(filename, "rb");
- if (!file) {
fprintf(stderr, "Unable to open file %s",
filename);
return -1;
- }
- dotfile = fopen(dotfilename, "w");
- if (!dotfile) {
fprintf(stderr, "Unable to open file %s",
dotfilename);
return -1;
- }
- fwrite(start, strlen(start), 1, dotfile);
- fwrite(node_color, strlen(node_color), 1, dotfile);
- fwrite(edge_color, strlen(edge_color), 1, dotfile);
- /* file size */
- fseek(file, 0, SEEK_END);
- file_size = ftell(file);
- fseek(file, 0, SEEK_SET);
- /* Allocate memory */
- size = sizeof(struct snd_soc_tplg_hdr);
- hdr = (struct snd_soc_tplg_hdr *)malloc(size);
- if (!hdr) {
printf("error: mem alloc\n");
return -1;
- }
- size = sizeof(struct snd_soc_tplg_dapm_graph_elem);
- graph_elem = (struct snd_soc_tplg_dapm_graph_elem
*)malloc(size);
- if (!graph_elem) {
printf("error: mem alloc\n");
return -1;
- }
- while (1) {
ret = fread(hdr, sizeof(struct snd_soc_tplg_hdr),
1, file);
if (ret != 1)
printf("error: reading header\n");
switch (hdr->type) {
case SND_SOC_TPLG_TYPE_DAPM_GRAPH:
size = sizeof(struct
snd_soc_tplg_dapm_graph_elem);
/* parse pipeline graph */
for (i = 0; i < hdr->count; i++) {
ret = fread(graph_elem, size, 1,
file);
if (ret != 1)
printf("error: reading
graph elem\n");
/* write route to output dot file
*/
sprintf(edge, "\"%s\"->\"%s\"\n",
graph_elem->source,
graph_elem->sink);
fwrite(edge, strlen(edge), 1,
dotfile);
fwrite("\n", 1, 1, dotfile);
}
if (ftell(file) == file_size)
goto finish;
break;
default:
fseek(file, hdr->payload_size, SEEK_CUR);
if (ftell(file) == file_size)
goto finish;
break;
}
- }
+finish:
- fwrite(end, strlen(end), 1, dotfile);
- fclose(dotfile);
- fclose(file);
- free(hdr);
- free(graph_elem);
- /* create topology graph */
- status = system("dot tplg.dot -Tpng -o tplg.png");
+}
Sound-open-firmware mailing list Sound-open-firmware@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/sound-open-firmware
On Thu, 2018-05-03 at 15:30 -0700, Ranjani Sridharan wrote:
License for
- more details.
why is the copyright from 2015 and the license GPL? Is this coming from some other project?
Sorry, copied it from rmbox. Should I change it to FreeBSD?
Yes (just use same header as SOF FW files), this is probably worth upstreaming to alsa-utils. Btw, how does this differ from the Chromium script that does the same ?
Liam
On 5/7/18 8:14 AM, Liam Girdwood wrote:
On Thu, 2018-05-03 at 15:30 -0700, Ranjani Sridharan wrote:
License for
- more details.
why is the copyright from 2015 and the license GPL? Is this coming from some other project?
Sorry, copied it from rmbox. Should I change it to FreeBSD?
Yes (just use same header as SOF FW files), this is probably worth upstreaming to alsa-utils. Btw, how does this differ from the Chromium script that does the same ?
Why are rmbox files licensed with GPL in the first place? Is this intentional?
On Mon, 2018-05-07 at 08:37 -0500, Pierre-Louis Bossart wrote:
On 5/7/18 8:14 AM, Liam Girdwood wrote:
On Thu, 2018-05-03 at 15:30 -0700, Ranjani Sridharan wrote:
License for
- more details.
why is the copyright from 2015 and the license GPL? Is this coming from some other project?
Sorry, copied it from rmbox. Should I change it to FreeBSD?
Yes (just use same header as SOF FW files), this is probably worth upstreaming to alsa-utils. Btw, how does this differ from the Chromium script that does the same ?
Why are rmbox files licensed with GPL in the first place? Is this intentional?
I can't quite remember, the current code will be deprecated with the packet based trace anyway (which can be BSD).
Ranjani, if upstream to alsa-utils then it will need to be GPL otherwise BSD.
Liam
On Mon, 2018-05-07 at 14:14 +0100, Liam Girdwood wrote:
On Thu, 2018-05-03 at 15:30 -0700, Ranjani Sridharan wrote:
License for
- more details.
why is the copyright from 2015 and the license GPL? Is this coming from some other project?
Sorry, copied it from rmbox. Should I change it to FreeBSD?
Yes (just use same header as SOF FW files), this is probably worth upstreaming to alsa-utils. Btw, how does this differ from the Chromium script that does the same ?
This chromium script reads the power on/off status of all dapm widget in asoc whereas this utility is just to visualize the widgets and connections in topology. It is helpful to visually verify the widget connections for someone creating a new topology with m4.
Liam _______________________________________________ Sound-open-firmware mailing list Sound-open-firmware@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/sound-open-firmware
participants (3)
-
Liam Girdwood
-
Pierre-Louis Bossart
-
Ranjani Sridharan