diff --git a/spa/include/spa/param/audio/format-utils.h b/spa/include/spa/param/audio/format-utils.h index d35f4a621..dca53a8cf 100644 --- a/spa/include/spa/param/audio/format-utils.h +++ b/spa/include/spa/param/audio/format-utils.h @@ -62,8 +62,10 @@ spa_format_audio_raw_build(struct spa_pod_builder *builder, uint32_t id, struct SPA_FORMAT_AUDIO_channels, &SPA_POD_Int(info->channels), 0); - spa_pod_builder_prop(builder, SPA_FORMAT_AUDIO_position, 0); - spa_pod_builder_array(builder, sizeof(uint32_t), SPA_TYPE_Id, info->channels, info->position); + if (info->channels > 1) { + spa_pod_builder_prop(builder, SPA_FORMAT_AUDIO_position, 0); + spa_pod_builder_array(builder, sizeof(uint32_t), SPA_TYPE_Id, info->channels, info->position); + } return spa_pod_builder_pop(builder); } diff --git a/spa/include/spa/param/audio/layout.h b/spa/include/spa/param/audio/layout.h new file mode 100644 index 000000000..6aceeb4c2 --- /dev/null +++ b/spa/include/spa/param/audio/layout.h @@ -0,0 +1,170 @@ +/* Simple Plugin API + * Copyright (C) 2016 Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __SPA_AUDIO_LAYOUT_H__ +#define __SPA_AUDIO_LAYOUT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define SPA_AUDIO_LAYOUT_Mono 1, SPA_AUDIO_CHANNEL_MONO +#define SPA_AUDIO_LAYOUT_Stereo 2, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR +#define SPA_AUDIO_LAYOUT_Quad 4, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR +#define SPA_AUDIO_LAYOUT_Pentagonal 5, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \ + SPA_AUDIO_CHANNEL_FC +#define SPA_AUDIO_LAYOUT_Hexagonal 6, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC +#define SPA_AUDIO_LAYOUT_Octagonal 8, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, +#define SPA_AUDIO_LAYOUT_Cube 8, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \ + SPA_AUDIO_CHANNEL_TFL, SPA_AUDIO_CHANNEL_TFR, \ + SPA_AUDIO_CHANNEL_TRL, SPA_AUDIO_CHANNEL_TRR, + + +#define SPA_AUDIO_LAYOUT_MPEG_1_0 SPA_AUDIO_LAYOUT_MONO +#define SPA_AUDIO_LAYOUT_MPEG_2_0 SPA_AUDIO_LAYOUT_STEREO +#define SPA_AUDIO_LAYOUT_MPEG_3_0A 3, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC +#define SPA_AUDIO_LAYOUT_MPEG_3_0B 3, SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FL, \ + SPA_AUDIO_CHANNEL_FR +#define SPA_AUDIO_LAYOUT_MPEG_4_0A 4, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC +#define SPA_AUDIO_LAYOUT_MPEG_4_0B 4, SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FL, \ + SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_RC +#define SPA_AUDIO_LAYOUT_MPEG_5_0A 5, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_MPEG_5_0B 5, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, \ + SPA_AUDIO_CHANNEL_FC +#define SPA_AUDIO_LAYOUT_MPEG_5_0C 5, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FC, \ + SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_MPEG_5_0D 5, SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FL, \ + SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_MPEG_5_1A 6, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_MPEG_5_1B 6, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE +#define SPA_AUDIO_LAYOUT_MPEG_5_1C 6, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FC, \ + SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR, SPA_AUDIO_CHANNEL_LFE +#define SPA_AUDIO_LAYOUT_MPEG_5_1D 6, SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FL, \ + SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR, SPA_AUDIO_CHANNEL_LFE +#define SPA_AUDIO_LAYOUT_MPEG_6_1A 7, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, \ + SPA_AUDIO_CHANNEL_RC +#define SPA_AUDIO_LAYOUT_MPEG_7_1A 8, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_MPEG_7_1B 8, SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR, SPA_AUDIO_CHANNEL_FL, \ + SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_RL, \ + SPA_AUDIO_CHANNEL_RR, SPA_AUDIO_CHANNEL_LFE +#define SPA_AUDIO_LAYOUT_MPEG_7_1C 8, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR + + +#define SPA_AUDIO_LAYOUT_2_1 3, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_LFE + +#define SPA_AUDIO_LAYOUT_2RC 3, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_RC +#define SPA_AUDIO_LAYOUT_2FC 3, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC + +#define SPA_AUDIO_LAYOUT_3_1 4, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE +#define SPA_AUDIO_LAYOUT_4_0 4, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC +#define SPA_AUDIO_LAYOUT_2_2 4, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR + +#define SPA_AUDIO_LAYOUT_4_1 5, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_RC +#define SPA_AUDIO_LAYOUT_5_0 5, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_5_0R 5, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RL, \ + SPA_AUDIO_CHANNEL_RR +#define SPA_AUDIO_LAYOUT_5_1 6, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_5_1R 6, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR +#define SPA_AUDIO_LAYOUT_6_0 6, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_6_0F 6, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FLC, SPA_AUDIO_CHANNEL_FRC, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_6_1 7, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_RC, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_6_1F 7, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \ + SPA_AUDIO_CHANNEL_RC +#define SPA_AUDIO_LAYOUT_7_0 7, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RL, \ + SPA_AUDIO_CHANNEL_RR, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_7_0F 7, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FLC, \ + SPA_AUDIO_CHANNEL_FRC, SPA_AUDIO_CHANNEL_SL, \ + SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_7_1 8, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_7_1W 8, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_FLC, SPA_AUDIO_CHANNEL_FRC, \ + SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR +#define SPA_AUDIO_LAYOUT_7_1WR 8, SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \ + SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \ + SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \ + SPA_AUDIO_CHANNEL_FLC, SPA_AUDIO_CHANNEL_FRC + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __SPA_AUDIO_LAYOUT_H__ */ diff --git a/spa/include/spa/param/audio/raw.h b/spa/include/spa/param/audio/raw.h index edc3eddd4..40ed662e3 100644 --- a/spa/include/spa/param/audio/raw.h +++ b/spa/include/spa/param/audio/raw.h @@ -144,32 +144,35 @@ enum spa_audio_format { enum spa_audio_channel { SPA_AUDIO_CHANNEL_UNKNOWN, /**< unspecified */ SPA_AUDIO_CHANNEL_NA, /**< N/A, silent */ + SPA_AUDIO_CHANNEL_MONO, /**< mono stream */ + SPA_AUDIO_CHANNEL_FL, /**< front left */ SPA_AUDIO_CHANNEL_FR, /**< front right */ - SPA_AUDIO_CHANNEL_RL, /**< rear left */ - SPA_AUDIO_CHANNEL_RR, /**< rear right */ SPA_AUDIO_CHANNEL_FC, /**< front center */ SPA_AUDIO_CHANNEL_LFE, /**< LFE */ - SPA_AUDIO_CHANNEL_SL, /**< side left */ - SPA_AUDIO_CHANNEL_SR, /**< side right */ - SPA_AUDIO_CHANNEL_RC, /**< rear center */ + SPA_AUDIO_CHANNEL_RL, /**< rear left */ + SPA_AUDIO_CHANNEL_RR, /**< rear right */ SPA_AUDIO_CHANNEL_FLC, /**< front left center */ SPA_AUDIO_CHANNEL_FRC, /**< front right center */ + SPA_AUDIO_CHANNEL_RC, /**< rear center */ + SPA_AUDIO_CHANNEL_SL, /**< side left */ + SPA_AUDIO_CHANNEL_SR, /**< side right */ + SPA_AUDIO_CHANNEL_TC, /**< top center */ + SPA_AUDIO_CHANNEL_TFL, /**< top front left */ + SPA_AUDIO_CHANNEL_TFC, /**< top front center */ + SPA_AUDIO_CHANNEL_TFR, /**< top front right */ + SPA_AUDIO_CHANNEL_TRL, /**< top rear left */ + SPA_AUDIO_CHANNEL_TRC, /**< top rear center */ + SPA_AUDIO_CHANNEL_TRR, /**< top rear right */ SPA_AUDIO_CHANNEL_RLC, /**< rear left center */ SPA_AUDIO_CHANNEL_RRC, /**< rear right center */ SPA_AUDIO_CHANNEL_FLW, /**< front left wide */ SPA_AUDIO_CHANNEL_FRW, /**< front right wide */ + SPA_AUDIO_CHANNEL_LFE2, /**< LFE 2 */ SPA_AUDIO_CHANNEL_FLH, /**< front left high */ SPA_AUDIO_CHANNEL_FCH, /**< front center high */ SPA_AUDIO_CHANNEL_FRH, /**< front right high */ - SPA_AUDIO_CHANNEL_TC, /**< top center */ - SPA_AUDIO_CHANNEL_TFL, /**< top front left */ - SPA_AUDIO_CHANNEL_TFR, /**< top front right */ - SPA_AUDIO_CHANNEL_TFC, /**< top front center */ - SPA_AUDIO_CHANNEL_TRL, /**< top rear left */ - SPA_AUDIO_CHANNEL_TRR, /**< top rear right */ - SPA_AUDIO_CHANNEL_TRC, /**< top rear center */ SPA_AUDIO_CHANNEL_TFLC, /**< top front left center */ SPA_AUDIO_CHANNEL_TFRC, /**< top front right center */ SPA_AUDIO_CHANNEL_TSL, /**< top side left */ @@ -183,41 +186,6 @@ enum spa_audio_channel { SPA_AUDIO_CHANNEL_CUSTOM_START = 0x10000, }; -#define SPA_AUDIO_CHANNEL_MASK(ch) (1LL << SPA_AUDIO_CHANNEL_ ## ch) - -enum spa_audio_layout { - SPA_AUDIO_LAYOUT_DEFAULT, /**< default layout for the number of channels */ - SPA_AUDIO_LAYOUT_CUSTOM, /**< custom layout, either the order of the channels is - * non-standard or the channel position array contains - * custom channels. */ - SPA_AUDIO_LAYOUT_MONO, /**< MONO */ - SPA_AUDIO_LAYOUT_STEREO, /**< FL FR */ - SPA_AUDIO_LAYOUT_2_1, /**< FL FR LFE */ - SPA_AUDIO_LAYOUT_2RC, /**< FL FR RC */ - SPA_AUDIO_LAYOUT_2FC, /**< FL FR FC */ - SPA_AUDIO_LAYOUT_3_1, /**< FL FR FC LFE */ - SPA_AUDIO_LAYOUT_4_0, /**< FL FR FC RC */ - SPA_AUDIO_LAYOUT_4_1, /**< FL FR FC RC LFE */ - SPA_AUDIO_LAYOUT_2_2, /**< FL FR SL SR */ - SPA_AUDIO_LAYOUT_QUAD, /**< FL FR RL RR */ - SPA_AUDIO_LAYOUT_5_0, /**< FL FR FC SL SR */ - SPA_AUDIO_LAYOUT_5_1, /**< FL FR FC SL SR LFE */ - SPA_AUDIO_LAYOUT_5_0R, /**< FL FR FC RL RR */ - SPA_AUDIO_LAYOUT_5_1R, /**< FL FR FC RL RR LFE */ - SPA_AUDIO_LAYOUT_6_0, /**< FL FR FC SL SR RC */ - SPA_AUDIO_LAYOUT_6_0F, /**< FL FR SL SR FLC FRC */ - SPA_AUDIO_LAYOUT_HEXAGONAL, /**< FL FR FC RL RR RC */ - SPA_AUDIO_LAYOUT_6_1, /**< FL FR FC SL SR LFE RC */ - SPA_AUDIO_LAYOUT_6_1R, /**< FL FR FC RL RR LFE RC */ - SPA_AUDIO_LAYOUT_6_1F, /**< FL FR SL SR FLC FRC LFE */ - SPA_AUDIO_LAYOUT_7_0, /**< FL FR FC SL SR RL RR */ - SPA_AUDIO_LAYOUT_7_0F, /**< FL FR FC SL SR FLC FRC */ - SPA_AUDIO_LAYOUT_7_1, /**< FL FR FC SL SR LFE RL RR */ - SPA_AUDIO_LAYOUT_7_1W, /**< FL FR FC SL SR LFE FLC FRC */ - SPA_AUDIO_LAYOUT_7_1WR, /**< FL FR FC RL RR LFE FLC FRC */ - SPA_AUDIO_LAYOUT_OCTAGONAL, /**< FL FR FC SL SR RL RC RR */ -}; - /** Extra audio flags */ #define SPA_AUDIO_FLAG_NONE (0) /*< no valid flag */ #define SPA_AUDIO_FLAG_UNPOSITIONED (1 << 0) /*< the position array explicitly diff --git a/spa/include/spa/param/audio/type-info.h b/spa/include/spa/param/audio/type-info.h index 905e142a1..d88d2c08a 100644 --- a/spa/include/spa/param/audio/type-info.h +++ b/spa/include/spa/param/audio/type-info.h @@ -92,29 +92,30 @@ static const struct spa_type_info spa_type_audio_channel[] = { { SPA_AUDIO_CHANNEL_MONO, SPA_TYPE_AUDIO_CHANNEL_BASE "MONO", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FL, SPA_TYPE_AUDIO_CHANNEL_BASE "FL", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FR, SPA_TYPE_AUDIO_CHANNEL_BASE "FR", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_RL, SPA_TYPE_AUDIO_CHANNEL_BASE "RL", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_RR, SPA_TYPE_AUDIO_CHANNEL_BASE "RR", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FC, SPA_TYPE_AUDIO_CHANNEL_BASE "FC", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_LFE, SPA_TYPE_AUDIO_CHANNEL_BASE "LFE", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_SL, SPA_TYPE_AUDIO_CHANNEL_BASE "SL", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_SR, SPA_TYPE_AUDIO_CHANNEL_BASE "SR", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_RC, SPA_TYPE_AUDIO_CHANNEL_BASE "RC", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_RL, SPA_TYPE_AUDIO_CHANNEL_BASE "RL", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_RR, SPA_TYPE_AUDIO_CHANNEL_BASE "RR", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FLC, SPA_TYPE_AUDIO_CHANNEL_BASE "FLC", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FRC, SPA_TYPE_AUDIO_CHANNEL_BASE "FRC", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_RC, SPA_TYPE_AUDIO_CHANNEL_BASE "RC", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_SL, SPA_TYPE_AUDIO_CHANNEL_BASE "SL", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_SR, SPA_TYPE_AUDIO_CHANNEL_BASE "SR", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_TC, SPA_TYPE_AUDIO_CHANNEL_BASE "TC", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_TFL, SPA_TYPE_AUDIO_CHANNEL_BASE "TFL", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_TFC, SPA_TYPE_AUDIO_CHANNEL_BASE "TFC", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_TFR, SPA_TYPE_AUDIO_CHANNEL_BASE "TFR", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_TRL, SPA_TYPE_AUDIO_CHANNEL_BASE "TRL", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_TRC, SPA_TYPE_AUDIO_CHANNEL_BASE "TRC", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_TRR, SPA_TYPE_AUDIO_CHANNEL_BASE "TRR", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_RLC, SPA_TYPE_AUDIO_CHANNEL_BASE "RLC", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_RRC, SPA_TYPE_AUDIO_CHANNEL_BASE "RRC", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FLW, SPA_TYPE_AUDIO_CHANNEL_BASE "FLW", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FRW, SPA_TYPE_AUDIO_CHANNEL_BASE "FRW", SPA_TYPE_Int, }, + { SPA_AUDIO_CHANNEL_LFE2, SPA_TYPE_AUDIO_CHANNEL_BASE "LFE2", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FLH, SPA_TYPE_AUDIO_CHANNEL_BASE "FLH", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FCH, SPA_TYPE_AUDIO_CHANNEL_BASE "FCH", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_FRH, SPA_TYPE_AUDIO_CHANNEL_BASE "FRH", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_TC, SPA_TYPE_AUDIO_CHANNEL_BASE "TC", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_TFL, SPA_TYPE_AUDIO_CHANNEL_BASE "TFL", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_TFR, SPA_TYPE_AUDIO_CHANNEL_BASE "TFR", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_TFC, SPA_TYPE_AUDIO_CHANNEL_BASE "TFC", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_TRL, SPA_TYPE_AUDIO_CHANNEL_BASE "TRL", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_TRR, SPA_TYPE_AUDIO_CHANNEL_BASE "TRR", SPA_TYPE_Int, }, - { SPA_AUDIO_CHANNEL_TRC, SPA_TYPE_AUDIO_CHANNEL_BASE "TRC", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_TFLC, SPA_TYPE_AUDIO_CHANNEL_BASE "TFLC", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_TFRC, SPA_TYPE_AUDIO_CHANNEL_BASE "TFRC", SPA_TYPE_Int, }, { SPA_AUDIO_CHANNEL_TSL, SPA_TYPE_AUDIO_CHANNEL_BASE "TSL", SPA_TYPE_Int, }, @@ -127,41 +128,6 @@ static const struct spa_type_info spa_type_audio_channel[] = { { 0, NULL, }, }; -#define SPA_TYPE__AudioLayout SPA_TYPE_ENUM_BASE "AudioLayout" -#define SPA_TYPE_AUDIO_LAYOUT_BASE SPA_TYPE__AudioLayout ":" - -static const struct spa_type_info spa_type_audio_layout[] = { - { SPA_AUDIO_LAYOUT_DEFAULT, SPA_TYPE_AUDIO_LAYOUT_BASE "Default", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_CUSTOM, SPA_TYPE_AUDIO_LAYOUT_BASE "Custom", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_MONO, SPA_TYPE_AUDIO_LAYOUT_BASE "Mono", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_STEREO, SPA_TYPE_AUDIO_LAYOUT_BASE "Stereo", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_2_1, SPA_TYPE_AUDIO_LAYOUT_BASE "2.1", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_2RC, SPA_TYPE_AUDIO_LAYOUT_BASE "2.1 Rear", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_2FC, SPA_TYPE_AUDIO_LAYOUT_BASE "2.1 Front", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_3_1, SPA_TYPE_AUDIO_LAYOUT_BASE "3.1", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_4_0, SPA_TYPE_AUDIO_LAYOUT_BASE "4.0", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_4_1, SPA_TYPE_AUDIO_LAYOUT_BASE "4.1", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_2_2, SPA_TYPE_AUDIO_LAYOUT_BASE "2.2", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_QUAD, SPA_TYPE_AUDIO_LAYOUT_BASE "Quad", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_5_0, SPA_TYPE_AUDIO_LAYOUT_BASE "5.0", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_5_1, SPA_TYPE_AUDIO_LAYOUT_BASE "5.1", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_5_0R, SPA_TYPE_AUDIO_LAYOUT_BASE "5.0 Rear", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_5_1R, SPA_TYPE_AUDIO_LAYOUT_BASE "5.1 Rear", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_6_0, SPA_TYPE_AUDIO_LAYOUT_BASE "6.0", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_6_0F, SPA_TYPE_AUDIO_LAYOUT_BASE "6.0 Front", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_HEXAGONAL, SPA_TYPE_AUDIO_LAYOUT_BASE "Hexagonal", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_6_1, SPA_TYPE_AUDIO_LAYOUT_BASE "6.1", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_6_1R, SPA_TYPE_AUDIO_LAYOUT_BASE "6.1 Rear", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_6_1F, SPA_TYPE_AUDIO_LAYOUT_BASE "6.1 Front", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_7_0, SPA_TYPE_AUDIO_LAYOUT_BASE "7.0", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_7_0F, SPA_TYPE_AUDIO_LAYOUT_BASE "7.0 Front", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_7_1, SPA_TYPE_AUDIO_LAYOUT_BASE "7.1", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_7_1W, SPA_TYPE_AUDIO_LAYOUT_BASE "7.1 Wide", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_7_1WR, SPA_TYPE_AUDIO_LAYOUT_BASE "7.1 Wide Rear", SPA_TYPE_Int, }, - { SPA_AUDIO_LAYOUT_OCTAGONAL, SPA_TYPE_AUDIO_LAYOUT_BASE "Octagonal", SPA_TYPE_Int, }, - { 0, NULL, }, -}; - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/spa/include/spa/pod/builder.h b/spa/include/spa/pod/builder.h index 3265463c4..906ee0b13 100644 --- a/spa/include/spa/pod/builder.h +++ b/spa/include/spa/pod/builder.h @@ -354,6 +354,11 @@ spa_pod_builder_fraction(struct spa_pod_builder *builder, uint32_t num, uint32_t return spa_pod_builder_primitive(builder, &p.pod); } +#define SPA_POD_Array(ctype, child_type, n_vals, ...) \ + (struct { struct spa_pod_array array; ctype vals[n_vals];}) \ + { { { n_vals * sizeof(ctype) + sizeof(struct spa_pod_array_body), SPA_TYPE_Array }, \ + { { sizeof(ctype), child_type } } }, { __VA_ARGS__ } } + static inline uint32_t spa_pod_builder_push_array(struct spa_pod_builder *builder) { diff --git a/spa/plugins/audioconvert/channelmix-ops-sse.c b/spa/plugins/audioconvert/channelmix-ops-sse.c index 37a6b68cb..f00767712 100644 --- a/spa/plugins/audioconvert/channelmix-ops-sse.c +++ b/spa/plugins/audioconvert/channelmix-ops-sse.c @@ -216,7 +216,7 @@ channelmix_f32_5p1_4_sse(void *data, int n_dst, void *dst[n_dst], memset(d[i], 0, n_bytes); } else if (v == VOLUME_NORM) { - float *s0 = s[0], *s1 = s[1], *s2 = s[2], *s3 = s[3], *s4 = d[4]; + float *s0 = s[0], *s1 = s[1], *s2 = s[2], *s3 = s[3], *s4 = s[4]; float *d0 = d[0], *d1 = d[1], *d2 = d[2], *d3 = d[3]; unrolled = n_samples / 4; @@ -238,7 +238,7 @@ channelmix_f32_5p1_4_sse(void *data, int n_dst, void *dst[n_dst], } } else { - float *s0 = s[0], *s1 = s[1], *s2 = s[2], *s3 = s[3], *s4 = d[4]; + float *s0 = s[0], *s1 = s[1], *s2 = s[2], *s3 = s[3], *s4 = s[4]; float *d0 = d[0], *d1 = d[1], *d2 = d[2], *d3 = d[3]; unrolled = n_samples / 4; diff --git a/spa/plugins/audioconvert/channelmix.c b/spa/plugins/audioconvert/channelmix.c index d3214ced8..273563328 100644 --- a/spa/plugins/audioconvert/channelmix.c +++ b/spa/plugins/audioconvert/channelmix.c @@ -29,6 +29,7 @@ #include #include #include +#include #define NAME "channelmix" @@ -143,11 +144,11 @@ static int setup_convert(struct impl *this, src_chan = src_info->info.raw.channels; dst_chan = dst_info->info.raw.channels; - spa_log_info(this->log, NAME " %p: %d/%d@%d->%d/%d@%d", this, - src_info->info.raw.format, + spa_log_info(this->log, NAME " %p: %s/%d@%d->%s/%d@%d", this, + spa_debug_type_find_name(spa_type_audio_format, src_info->info.raw.format), src_chan, src_info->info.raw.rate, - dst_info->info.raw.format, + spa_debug_type_find_name(spa_type_audio_format, dst_info->info.raw.format), dst_chan, dst_info->info.raw.rate); diff --git a/spa/plugins/audioconvert/fmt-ops-sse.c b/spa/plugins/audioconvert/fmt-ops-sse.c index 7a18c1aca..e0311c4dc 100644 --- a/spa/plugins/audioconvert/fmt-ops-sse.c +++ b/spa/plugins/audioconvert/fmt-ops-sse.c @@ -29,6 +29,7 @@ conv_s16_to_f32d_1_sse(void *data, int n_dst, void *dst[n_dst], const void *src, { const int16_t *s = src; float **d = (float **) dst; + float *d0 = d[0]; int n, n_samples; __m128 out, factor = _mm_set1_ps(1.0f / S16_SCALE); @@ -37,7 +38,7 @@ conv_s16_to_f32d_1_sse(void *data, int n_dst, void *dst[n_dst], const void *src, for(n = 0; n_samples--; n++) { out = _mm_cvtsi32_ss(out, *s); out = _mm_mul_ss(out, factor); - _mm_store_ss(&d[0][n], out); + _mm_store_ss(&d0[n], out); s += n_dst; } } @@ -47,6 +48,7 @@ conv_s16_to_f32d_2_sse(void *data, int n_dst, void *dst[n_dst], const void *src, { const int16_t *s = src; float **d = (float **) dst; + float *d0 = d[0], *d1 = d[1]; int n = 0, n_samples, unrolled; __m128i in, t[2]; __m128 out[2], factor = _mm_set1_ps(1.0f / S16_SCALE); @@ -69,8 +71,8 @@ conv_s16_to_f32d_2_sse(void *data, int n_dst, void *dst[n_dst], const void *src, out[1] = _mm_cvtepi32_ps(t[1]); out[1] = _mm_mul_ps(out[1], factor); - _mm_storeu_ps(&d[0][n], out[0]); - _mm_storeu_ps(&d[1][n], out[1]); + _mm_storeu_ps(&d0[n], out[0]); + _mm_storeu_ps(&d1[n], out[1]); s += 4*n_dst; } @@ -80,8 +82,8 @@ conv_s16_to_f32d_2_sse(void *data, int n_dst, void *dst[n_dst], const void *src, out[0] = _mm_mul_ss(out[0], factor); out[1] = _mm_cvtsi32_ss(out[1], s[1]); out[1] = _mm_mul_ss(out[1], factor); - _mm_store_ss(&d[0][n], out[0]); - _mm_store_ss(&d[1][n], out[1]); + _mm_store_ss(&d0[n], out[0]); + _mm_store_ss(&d1[n], out[1]); s += n_dst; } } @@ -102,6 +104,7 @@ static void conv_f32d_to_s32_1_sse(void *data, void *dst, int n_src, const void *src[n_src], int n_bytes) { const float **s = (const float **) src; + const float *s0 = s[0]; int32_t *d = dst; int n, n_samples, unrolled; __m128 in[1]; @@ -115,7 +118,7 @@ conv_f32d_to_s32_1_sse(void *data, void *dst, int n_src, const void *src[n_src], n_samples = n_samples & 3; for(n = 0; unrolled--; n += 4) { - in[0] = _mm_mul_ps(_mm_loadu_ps(&s[0][n]), int_max); + in[0] = _mm_mul_ps(_mm_loadu_ps(&s0[n]), int_max); in[0] = _mm_min_ps(int_max, _mm_max_ps(in[0], int_min)); out[0] = _mm_slli_epi32(_mm_cvttps_epi32(in[0]), 8); @@ -130,7 +133,7 @@ conv_f32d_to_s32_1_sse(void *data, void *dst, int n_src, const void *src[n_src], d += 4*n_src; } for(; n_samples--; n++) { - in[0] = _mm_load_ss(&s[0][n]); + in[0] = _mm_load_ss(&s0[n]); in[0] = _mm_mul_ss(in[0], int_max); in[0] = _mm_min_ss(int_max, _mm_max_ss(in[0], int_min)); *d = _mm_cvttss_si32(in[0]) << 8; @@ -142,6 +145,7 @@ static void conv_f32d_to_s32_2_sse(void *data, void *dst, int n_src, const void *src[n_src], int n_bytes) { const float **s = (const float **) src; + const float *s0 = s[0], *s1 = s[1]; int32_t *d = dst; int n, n_samples, unrolled; __m128 in[2]; @@ -155,8 +159,8 @@ conv_f32d_to_s32_2_sse(void *data, void *dst, int n_src, const void *src[n_src], n_samples = n_samples & 3; for(n = 0; unrolled--; n += 4) { - in[0] = _mm_mul_ps(_mm_loadu_ps(&s[0][n]), int_max); - in[1] = _mm_mul_ps(_mm_loadu_ps(&s[1][n]), int_max); + in[0] = _mm_mul_ps(_mm_loadu_ps(&s0[n]), int_max); + in[1] = _mm_mul_ps(_mm_loadu_ps(&s1[n]), int_max); in[0] = _mm_min_ps(int_max, _mm_max_ps(in[0], int_min)); in[1] = _mm_min_ps(int_max, _mm_max_ps(in[1], int_min)); @@ -176,8 +180,8 @@ conv_f32d_to_s32_2_sse(void *data, void *dst, int n_src, const void *src[n_src], d += 4*n_src; } for(; n_samples--; n++) { - in[0] = _mm_load_ss(&s[0][n]); - in[1] = _mm_load_ss(&s[1][n]); + in[0] = _mm_load_ss(&s0[n]); + in[1] = _mm_load_ss(&s1[n]); in[0] = _mm_unpacklo_ps(in[0], in[1]); @@ -193,6 +197,7 @@ static void conv_f32d_to_s32_4_sse(void *data, void *dst, int n_src, const void *src[n_src], int n_bytes) { const float **s = (const float **) src; + const float *s0 = s[0], *s1 = s[1], *s2 = s[2], *s3 = s[3]; int32_t *d = dst; int n, n_samples, unrolled; __m128 in[4]; @@ -206,10 +211,10 @@ conv_f32d_to_s32_4_sse(void *data, void *dst, int n_src, const void *src[n_src], n_samples = n_samples & 3; for(n = 0; unrolled--; n += 4) { - in[0] = _mm_mul_ps(_mm_loadu_ps(&s[0][n]), int_max); - in[1] = _mm_mul_ps(_mm_loadu_ps(&s[1][n]), int_max); - in[2] = _mm_mul_ps(_mm_loadu_ps(&s[2][n]), int_max); - in[3] = _mm_mul_ps(_mm_loadu_ps(&s[3][n]), int_max); + in[0] = _mm_mul_ps(_mm_loadu_ps(&s0[n]), int_max); + in[1] = _mm_mul_ps(_mm_loadu_ps(&s1[n]), int_max); + in[2] = _mm_mul_ps(_mm_loadu_ps(&s2[n]), int_max); + in[3] = _mm_mul_ps(_mm_loadu_ps(&s3[n]), int_max); in[0] = _mm_min_ps(int_max, _mm_max_ps(in[0], int_min)); in[1] = _mm_min_ps(int_max, _mm_max_ps(in[1], int_min)); @@ -239,10 +244,10 @@ conv_f32d_to_s32_4_sse(void *data, void *dst, int n_src, const void *src[n_src], d += 4*n_src; } for(; n_samples--; n++) { - in[0] = _mm_load_ss(&s[0][n]); - in[1] = _mm_load_ss(&s[1][n]); - in[2] = _mm_load_ss(&s[2][n]); - in[3] = _mm_load_ss(&s[3][n]); + in[0] = _mm_load_ss(&s0[n]); + in[1] = _mm_load_ss(&s1[n]); + in[2] = _mm_load_ss(&s2[n]); + in[3] = _mm_load_ss(&s3[n]); in[0] = _mm_unpacklo_ps(in[0], in[2]); in[1] = _mm_unpacklo_ps(in[1], in[3]); diff --git a/spa/plugins/audioconvert/fmtconvert.c b/spa/plugins/audioconvert/fmtconvert.c index a334a39f8..9da4d71d4 100644 --- a/spa/plugins/audioconvert/fmtconvert.c +++ b/spa/plugins/audioconvert/fmtconvert.c @@ -593,11 +593,14 @@ impl_node_port_enum_params(struct spa_node *node, static int calc_width(struct spa_audio_info *info) { switch (info->info.raw.format) { + case SPA_AUDIO_FORMAT_U8P: case SPA_AUDIO_FORMAT_U8: return 1; + case SPA_AUDIO_FORMAT_S16P: case SPA_AUDIO_FORMAT_S16: case SPA_AUDIO_FORMAT_S16_OE: return 2; + case SPA_AUDIO_FORMAT_S24P: case SPA_AUDIO_FORMAT_S24: case SPA_AUDIO_FORMAT_S24_OE: return 3; diff --git a/spa/plugins/audioconvert/resample.c b/spa/plugins/audioconvert/resample.c index b01d968b6..52d86801b 100644 --- a/spa/plugins/audioconvert/resample.c +++ b/spa/plugins/audioconvert/resample.c @@ -30,6 +30,7 @@ #include #include #include +#include #define NAME "resample" @@ -115,11 +116,11 @@ static int setup_convert(struct impl *this, dst_info = info; } - spa_log_info(this->log, NAME " %p: %d/%d@%d->%d/%d@%d", this, - src_info->info.raw.format, + spa_log_info(this->log, NAME " %p: %s/%d@%d->%s/%d@%d", this, + spa_debug_type_find_name(spa_type_audio_format, src_info->info.raw.format), src_info->info.raw.channels, src_info->info.raw.rate, - dst_info->info.raw.format, + spa_debug_type_find_name(spa_type_audio_format, dst_info->info.raw.format), dst_info->info.raw.channels, dst_info->info.raw.rate); diff --git a/src/examples/media-session.c b/src/examples/media-session.c index 6acdca71d..fd4191105 100644 --- a/src/examples/media-session.c +++ b/src/examples/media-session.c @@ -133,6 +133,7 @@ struct session { struct spa_proxy *proxy; struct spa_hook listener; + bool starting; bool dsp_pending; bool enabled; bool busy; @@ -275,6 +276,7 @@ handle_node(struct impl *impl, uint32_t id, uint32_t parent_id, sess->id = id; sess->need_dsp = need_dsp; sess->enabled = true; + sess->starting = true; sess->node = node; if ((str = spa_dict_lookup(props, "node.plugged")) != NULL) sess->plugged = pw_properties_parse_uint64(str); @@ -651,6 +653,11 @@ static int rescan_node(struct impl *impl, struct node *node) session = find.sess; + if (session->starting) { + pw_log_info(NAME " %p: session %d is starting", impl, session->id); + return 0; + } + if (strcmp(category, "Capture") == 0) direction = PW_DIRECTION_OUTPUT; else if (strcmp(category, "Playback") == 0) @@ -722,14 +729,19 @@ static void rescan_session(struct impl *impl, struct session *sess) struct pw_properties *props; struct node *node = sess->node; void *dsp; + int i; + uint64_t mask = 0; if (node->info->props == NULL) return; + for (i = 0; i < node->format.channels; i++) + mask |= 1UL << node->format.position[i]; + props = pw_properties_new_dict(node->info->props); pw_properties_setf(props, "audio-dsp.direction", "%d", sess->direction); pw_properties_setf(props, "audio-dsp.channels", "%d", node->format.channels); - pw_properties_setf(props, "audio-dsp.channelmask", "%d", 0); + pw_properties_setf(props, "audio-dsp.channelmask", "%"PRIu64, mask); pw_properties_setf(props, "audio-dsp.rate", "%d", node->format.rate); pw_properties_setf(props, "audio-dsp.maxbuffer", "%ld", MAX_QUANTUM_SIZE * sizeof(float)); @@ -744,6 +756,9 @@ static void rescan_session(struct impl *impl, struct session *sess) sess->dsp_pending = true; pw_proxy_add_proxy_listener(dsp, &sess->listener, &dsp_node_events, sess); } + else { + sess->starting = false; + } } static void do_rescan(struct impl *impl) diff --git a/src/modules/module-media-session/audio-dsp.c b/src/modules/module-media-session/audio-dsp.c index 696489603..9cceef7da 100644 --- a/src/modules/module-media-session/audio-dsp.c +++ b/src/modules/module-media-session/audio-dsp.c @@ -144,6 +144,8 @@ static const struct pw_port_implementation port_implementation = { static const char *chmap_names[] = { + "UNK", /**< unknown */ + "NA", /**< unmapped */ "MONO", /**< mono */ "FL", /**< front left */ "FR", /**< front right */