From 5feb88575c3ea2c59d61747a391257f98705eea5 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 12 Aug 2021 15:16:00 +0200 Subject: [PATCH] spa: add helpers to parse and create iec958 formats --- spa/include/spa/param/audio/format-utils.h | 29 ++++++++++++++++++++++ spa/include/spa/param/audio/format.h | 2 ++ spa/include/spa/param/audio/iec958.h | 10 ++++++++ 3 files changed, 41 insertions(+) diff --git a/spa/include/spa/param/audio/format-utils.h b/spa/include/spa/param/audio/format-utils.h index 557a31930..80e84f2ba 100644 --- a/spa/include/spa/param/audio/format-utils.h +++ b/spa/include/spa/param/audio/format-utils.h @@ -68,6 +68,17 @@ spa_format_audio_dsp_parse(const struct spa_pod *format, struct spa_audio_info_d return res; } +static inline int +spa_format_audio_iec958_parse(const struct spa_pod *format, struct spa_audio_info_iec958 *info) +{ + int res; + res = spa_pod_parse_object(format, + SPA_TYPE_OBJECT_Format, NULL, + SPA_FORMAT_AUDIO_iec958Codec, SPA_POD_Id(&info->codec), + SPA_FORMAT_AUDIO_rate, SPA_POD_Int(&info->rate)); + return res; +} + static inline struct spa_pod * spa_format_audio_raw_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_raw *info) { @@ -110,6 +121,24 @@ spa_format_audio_dsp_build(struct spa_pod_builder *builder, uint32_t id, struct return (struct spa_pod*)spa_pod_builder_pop(builder, &f); } + +static inline struct spa_pod * +spa_format_audio_iec958_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_iec958 *info) +{ + struct spa_pod_frame f; + spa_pod_builder_push_object(builder, &f, SPA_TYPE_OBJECT_Format, id); + spa_pod_builder_add(builder, + SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_audio), + SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_iec958), + 0); + if (info->codec != SPA_AUDIO_IEC958_CODEC_UNKNOWN) + spa_pod_builder_add(builder, + SPA_FORMAT_AUDIO_iec958Codec, SPA_POD_Id(info->codec), 0); + if (info->rate != 0) + spa_pod_builder_add(builder, + SPA_FORMAT_AUDIO_rate, SPA_POD_Int(info->rate), 0); + return (struct spa_pod*)spa_pod_builder_pop(builder, &f); +} /** * \} */ diff --git a/spa/include/spa/param/audio/format.h b/spa/include/spa/param/audio/format.h index 57a707cba..0cce49bb9 100644 --- a/spa/include/spa/param/audio/format.h +++ b/spa/include/spa/param/audio/format.h @@ -36,6 +36,7 @@ extern "C" { #include #include +#include struct spa_audio_info { uint32_t media_type; @@ -43,6 +44,7 @@ struct spa_audio_info { union { struct spa_audio_info_raw raw; struct spa_audio_info_dsp dsp; + struct spa_audio_info_iec958 iec958; } info; }; diff --git a/spa/include/spa/param/audio/iec958.h b/spa/include/spa/param/audio/iec958.h index 303202cba..fb46c561e 100644 --- a/spa/include/spa/param/audio/iec958.h +++ b/spa/include/spa/param/audio/iec958.h @@ -25,6 +25,8 @@ #ifndef SPA_AUDIO_IEC958_H #define SPA_AUDIO_IEC958_H +#include + #ifdef __cplusplus extern "C" { #endif @@ -48,6 +50,14 @@ enum spa_audio_iec958_codec { SPA_AUDIO_IEC958_CODEC_DTSHD, /**< DTS-HD Master Audio */ }; +struct spa_audio_info_iec958 { + enum spa_audio_iec958_codec codec; /*< format, one of the DSP formats in enum spa_audio_format_dsp */ + uint32_t flags; /*< extra flags */ + uint32_t rate; /*< sample rate */ +}; + +#define SPA_AUDIO_INFO_IEC958_INIT(...) (struct spa_audio_info_iec958) { __VA_ARGS__ } + /** * \} */