From 592c7c404c813ee6d7ca35d2a97b4045bdc80b6d Mon Sep 17 00:00:00 2001 From: Carlos Rafael Giani Date: Thu, 29 May 2025 20:46:46 +0200 Subject: [PATCH] spa: Add channel mode to mp3 audio info and add channel mode docs --- spa/include/spa/param/audio/mp3-utils.h | 8 ++++++-- spa/include/spa/param/audio/mp3.h | 15 +++++++++++++-- spa/include/spa/param/format-types.h | 4 ++++ spa/include/spa/param/format.h | 2 ++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/spa/include/spa/param/audio/mp3-utils.h b/spa/include/spa/param/audio/mp3-utils.h index 481000e25..3be1f13d0 100644 --- a/spa/include/spa/param/audio/mp3-utils.h +++ b/spa/include/spa/param/audio/mp3-utils.h @@ -33,8 +33,9 @@ spa_format_audio_mp3_parse(const struct spa_pod *format, struct spa_audio_info_m int res; res = spa_pod_parse_object(format, SPA_TYPE_OBJECT_Format, NULL, - SPA_FORMAT_AUDIO_rate, SPA_POD_OPT_Int(&info->rate), - SPA_FORMAT_AUDIO_channels, SPA_POD_OPT_Int(&info->channels)); + SPA_FORMAT_AUDIO_rate, SPA_POD_OPT_Int(&info->rate), + SPA_FORMAT_AUDIO_channels, SPA_POD_OPT_Int(&info->channels), + SPA_FORMAT_AUDIO_MP3_channelMode, SPA_POD_OPT_Id(&info->channel_mode)); return res; } @@ -55,6 +56,9 @@ spa_format_audio_mp3_build(struct spa_pod_builder *builder, uint32_t id, if (info->channels != 0) spa_pod_builder_add(builder, SPA_FORMAT_AUDIO_channels, SPA_POD_Int(info->channels), 0); + if (info->channel_mode != 0) + spa_pod_builder_add(builder, + SPA_FORMAT_AUDIO_MP3_channelMode, SPA_POD_Id(info->channel_mode), 0); return (struct spa_pod*)spa_pod_builder_pop(builder, &f); } diff --git a/spa/include/spa/param/audio/mp3.h b/spa/include/spa/param/audio/mp3.h index 86be21a1e..a28bba661 100644 --- a/spa/include/spa/param/audio/mp3.h +++ b/spa/include/spa/param/audio/mp3.h @@ -18,15 +18,26 @@ extern "C" { enum spa_audio_mp3_channel_mode { SPA_AUDIO_MP3_CHANNEL_MODE_UNKNOWN, + /** Mono mode, only used if channel count is 1 */ SPA_AUDIO_MP3_CHANNEL_MODE_MONO, + /** Regular stereo mode with two independent channels */ SPA_AUDIO_MP3_CHANNEL_MODE_STEREO, + /** + * Joint stereo mode, exploiting the similarities between channels + * using techniques like mid-side coding + */ SPA_AUDIO_MP3_CHANNEL_MODE_JOINTSTEREO, + /** + * Two mono tracks, different from stereo in that each channel + * contains entirely different content (like two different mono songs) + */ SPA_AUDIO_MP3_CHANNEL_MODE_DUAL, }; struct spa_audio_info_mp3 { - uint32_t rate; /*< sample rate */ - uint32_t channels; /*< number of channels */ + uint32_t rate; /*< sample rate in Hz */ + uint32_t channels; /*< number of channels */ + enum spa_audio_mp3_channel_mode channel_mode; /*< MP3 channel mode */ }; #define SPA_AUDIO_INFO_MP3_INIT(...) ((struct spa_audio_info_mp3) { __VA_ARGS__ }) diff --git a/spa/include/spa/param/format-types.h b/spa/include/spa/param/format-types.h index 8daaa103e..46ff10624 100644 --- a/spa/include/spa/param/format-types.h +++ b/spa/include/spa/param/format-types.h @@ -97,6 +97,8 @@ static const struct spa_type_info spa_type_media_subtype[] = { #define SPA_TYPE_INFO_FORMAT_AUDIO_WMA_BASE SPA_TYPE_INFO_FORMAT_AUDIO_WMA ":" #define SPA_TYPE_INFO_FORMAT_AUDIO_AMR SPA_TYPE_INFO_FORMAT_AUDIO_BASE "AMR" #define SPA_TYPE_INFO_FORMAT_AUDIO_AMR_BASE SPA_TYPE_INFO_FORMAT_AUDIO_AMR ":" +#define SPA_TYPE_INFO_FORMAT_AUDIO_MP3 SPA_TYPE_INFO_FORMAT_AUDIO_BASE "MP3" +#define SPA_TYPE_INFO_FORMAT_AUDIO_MP3_BASE SPA_TYPE_INFO_FORMAT_AUDIO_MP3 ":" #define SPA_TYPE_INFO_FormatVideo SPA_TYPE_INFO_FORMAT_BASE "Video" #define SPA_TYPE_INFO_FORMAT_VIDEO_BASE SPA_TYPE_INFO_FormatVideo ":" @@ -139,6 +141,8 @@ static const struct spa_type_info spa_type_format[] = { spa_type_audio_wma_profile }, { SPA_FORMAT_AUDIO_AMR_bandMode, SPA_TYPE_Id, SPA_TYPE_INFO_FORMAT_AUDIO_AMR_BASE "bandMode", spa_type_audio_amr_band_mode }, + { SPA_FORMAT_AUDIO_MP3_channelMode, SPA_TYPE_Id, SPA_TYPE_INFO_FORMAT_AUDIO_MP3_BASE "channelMode", + spa_type_audio_mp3_channel_mode }, { SPA_FORMAT_VIDEO_format, SPA_TYPE_Id, SPA_TYPE_INFO_FORMAT_VIDEO_BASE "format", spa_type_video_format, }, diff --git a/spa/include/spa/param/format.h b/spa/include/spa/param/format.h index 486f5d8ef..ffb9959ce 100644 --- a/spa/include/spa/param/format.h +++ b/spa/include/spa/param/format.h @@ -110,6 +110,8 @@ enum spa_format { SPA_FORMAT_AUDIO_AMR_bandMode, /**< AMR band mode (Id enum spa_audio_amr_band_mode) */ + SPA_FORMAT_AUDIO_MP3_channelMode, /**< MP3 channel mode, (Id enum spa_audio_mp3_channel_mode) */ + /* Video Format keys */ SPA_FORMAT_START_Video = 0x20000,