mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
More work on multichannel
Reorder channels to a more common default order. Only add channel layout when channels > 1 Don't try to link to a session that is still starting Small sse fixes.
This commit is contained in:
parent
5196f7f053
commit
fcd90b25d3
12 changed files with 262 additions and 124 deletions
|
|
@ -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),
|
SPA_FORMAT_AUDIO_channels, &SPA_POD_Int(info->channels),
|
||||||
0);
|
0);
|
||||||
|
|
||||||
|
if (info->channels > 1) {
|
||||||
spa_pod_builder_prop(builder, SPA_FORMAT_AUDIO_position, 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);
|
spa_pod_builder_array(builder, sizeof(uint32_t), SPA_TYPE_Id, info->channels, info->position);
|
||||||
|
}
|
||||||
return spa_pod_builder_pop(builder);
|
return spa_pod_builder_pop(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
170
spa/include/spa/param/audio/layout.h
Normal file
170
spa/include/spa/param/audio/layout.h
Normal file
|
|
@ -0,0 +1,170 @@
|
||||||
|
/* Simple Plugin API
|
||||||
|
* Copyright (C) 2016 Wim Taymans <wim.taymans@gmail.com>
|
||||||
|
*
|
||||||
|
* 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 <endian.h>
|
||||||
|
|
||||||
|
#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__ */
|
||||||
|
|
@ -144,32 +144,35 @@ enum spa_audio_format {
|
||||||
enum spa_audio_channel {
|
enum spa_audio_channel {
|
||||||
SPA_AUDIO_CHANNEL_UNKNOWN, /**< unspecified */
|
SPA_AUDIO_CHANNEL_UNKNOWN, /**< unspecified */
|
||||||
SPA_AUDIO_CHANNEL_NA, /**< N/A, silent */
|
SPA_AUDIO_CHANNEL_NA, /**< N/A, silent */
|
||||||
|
|
||||||
SPA_AUDIO_CHANNEL_MONO, /**< mono stream */
|
SPA_AUDIO_CHANNEL_MONO, /**< mono stream */
|
||||||
|
|
||||||
SPA_AUDIO_CHANNEL_FL, /**< front left */
|
SPA_AUDIO_CHANNEL_FL, /**< front left */
|
||||||
SPA_AUDIO_CHANNEL_FR, /**< front right */
|
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_FC, /**< front center */
|
||||||
SPA_AUDIO_CHANNEL_LFE, /**< LFE */
|
SPA_AUDIO_CHANNEL_LFE, /**< LFE */
|
||||||
SPA_AUDIO_CHANNEL_SL, /**< side left */
|
SPA_AUDIO_CHANNEL_RL, /**< rear left */
|
||||||
SPA_AUDIO_CHANNEL_SR, /**< side right */
|
SPA_AUDIO_CHANNEL_RR, /**< rear right */
|
||||||
SPA_AUDIO_CHANNEL_RC, /**< rear center */
|
|
||||||
SPA_AUDIO_CHANNEL_FLC, /**< front left center */
|
SPA_AUDIO_CHANNEL_FLC, /**< front left center */
|
||||||
SPA_AUDIO_CHANNEL_FRC, /**< front right 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_RLC, /**< rear left center */
|
||||||
SPA_AUDIO_CHANNEL_RRC, /**< rear right center */
|
SPA_AUDIO_CHANNEL_RRC, /**< rear right center */
|
||||||
SPA_AUDIO_CHANNEL_FLW, /**< front left wide */
|
SPA_AUDIO_CHANNEL_FLW, /**< front left wide */
|
||||||
SPA_AUDIO_CHANNEL_FRW, /**< front right wide */
|
SPA_AUDIO_CHANNEL_FRW, /**< front right wide */
|
||||||
|
SPA_AUDIO_CHANNEL_LFE2, /**< LFE 2 */
|
||||||
SPA_AUDIO_CHANNEL_FLH, /**< front left high */
|
SPA_AUDIO_CHANNEL_FLH, /**< front left high */
|
||||||
SPA_AUDIO_CHANNEL_FCH, /**< front center high */
|
SPA_AUDIO_CHANNEL_FCH, /**< front center high */
|
||||||
SPA_AUDIO_CHANNEL_FRH, /**< front right 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_TFLC, /**< top front left center */
|
||||||
SPA_AUDIO_CHANNEL_TFRC, /**< top front right center */
|
SPA_AUDIO_CHANNEL_TFRC, /**< top front right center */
|
||||||
SPA_AUDIO_CHANNEL_TSL, /**< top side left */
|
SPA_AUDIO_CHANNEL_TSL, /**< top side left */
|
||||||
|
|
@ -183,41 +186,6 @@ enum spa_audio_channel {
|
||||||
SPA_AUDIO_CHANNEL_CUSTOM_START = 0x10000,
|
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 */
|
/** Extra audio flags */
|
||||||
#define SPA_AUDIO_FLAG_NONE (0) /*< no valid flag */
|
#define SPA_AUDIO_FLAG_NONE (0) /*< no valid flag */
|
||||||
#define SPA_AUDIO_FLAG_UNPOSITIONED (1 << 0) /*< the position array explicitly
|
#define SPA_AUDIO_FLAG_UNPOSITIONED (1 << 0) /*< the position array explicitly
|
||||||
|
|
|
||||||
|
|
@ -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_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_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_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_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_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_RL, SPA_TYPE_AUDIO_CHANNEL_BASE "RL", SPA_TYPE_Int, },
|
||||||
{ SPA_AUDIO_CHANNEL_SR, SPA_TYPE_AUDIO_CHANNEL_BASE "SR", SPA_TYPE_Int, },
|
{ SPA_AUDIO_CHANNEL_RR, SPA_TYPE_AUDIO_CHANNEL_BASE "RR", SPA_TYPE_Int, },
|
||||||
{ SPA_AUDIO_CHANNEL_RC, SPA_TYPE_AUDIO_CHANNEL_BASE "RC", SPA_TYPE_Int, },
|
|
||||||
{ SPA_AUDIO_CHANNEL_FLC, SPA_TYPE_AUDIO_CHANNEL_BASE "FLC", 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_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_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_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_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_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_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_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_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_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_TFRC, SPA_TYPE_AUDIO_CHANNEL_BASE "TFRC", SPA_TYPE_Int, },
|
||||||
{ SPA_AUDIO_CHANNEL_TSL, SPA_TYPE_AUDIO_CHANNEL_BASE "TSL", 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, },
|
{ 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
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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
|
static inline uint32_t
|
||||||
spa_pod_builder_push_array(struct spa_pod_builder *builder)
|
spa_pod_builder_push_array(struct spa_pod_builder *builder)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ channelmix_f32_5p1_4_sse(void *data, int n_dst, void *dst[n_dst],
|
||||||
memset(d[i], 0, n_bytes);
|
memset(d[i], 0, n_bytes);
|
||||||
}
|
}
|
||||||
else if (v == VOLUME_NORM) {
|
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];
|
float *d0 = d[0], *d1 = d[1], *d2 = d[2], *d3 = d[3];
|
||||||
|
|
||||||
unrolled = n_samples / 4;
|
unrolled = n_samples / 4;
|
||||||
|
|
@ -238,7 +238,7 @@ channelmix_f32_5p1_4_sse(void *data, int n_dst, void *dst[n_dst],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
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];
|
float *d0 = d[0], *d1 = d[1], *d2 = d[2], *d3 = d[3];
|
||||||
|
|
||||||
unrolled = n_samples / 4;
|
unrolled = n_samples / 4;
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
#include <spa/param/param.h>
|
#include <spa/param/param.h>
|
||||||
#include <spa/pod/filter.h>
|
#include <spa/pod/filter.h>
|
||||||
#include <spa/control/control.h>
|
#include <spa/control/control.h>
|
||||||
|
#include <spa/debug/types.h>
|
||||||
|
|
||||||
#define NAME "channelmix"
|
#define NAME "channelmix"
|
||||||
|
|
||||||
|
|
@ -143,11 +144,11 @@ static int setup_convert(struct impl *this,
|
||||||
src_chan = src_info->info.raw.channels;
|
src_chan = src_info->info.raw.channels;
|
||||||
dst_chan = dst_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,
|
spa_log_info(this->log, NAME " %p: %s/%d@%d->%s/%d@%d", this,
|
||||||
src_info->info.raw.format,
|
spa_debug_type_find_name(spa_type_audio_format, src_info->info.raw.format),
|
||||||
src_chan,
|
src_chan,
|
||||||
src_info->info.raw.rate,
|
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_chan,
|
||||||
dst_info->info.raw.rate);
|
dst_info->info.raw.rate);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
const int16_t *s = src;
|
||||||
float **d = (float **) dst;
|
float **d = (float **) dst;
|
||||||
|
float *d0 = d[0];
|
||||||
int n, n_samples;
|
int n, n_samples;
|
||||||
__m128 out, factor = _mm_set1_ps(1.0f / S16_SCALE);
|
__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++) {
|
for(n = 0; n_samples--; n++) {
|
||||||
out = _mm_cvtsi32_ss(out, *s);
|
out = _mm_cvtsi32_ss(out, *s);
|
||||||
out = _mm_mul_ss(out, factor);
|
out = _mm_mul_ss(out, factor);
|
||||||
_mm_store_ss(&d[0][n], out);
|
_mm_store_ss(&d0[n], out);
|
||||||
s += n_dst;
|
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;
|
const int16_t *s = src;
|
||||||
float **d = (float **) dst;
|
float **d = (float **) dst;
|
||||||
|
float *d0 = d[0], *d1 = d[1];
|
||||||
int n = 0, n_samples, unrolled;
|
int n = 0, n_samples, unrolled;
|
||||||
__m128i in, t[2];
|
__m128i in, t[2];
|
||||||
__m128 out[2], factor = _mm_set1_ps(1.0f / S16_SCALE);
|
__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_cvtepi32_ps(t[1]);
|
||||||
out[1] = _mm_mul_ps(out[1], factor);
|
out[1] = _mm_mul_ps(out[1], factor);
|
||||||
|
|
||||||
_mm_storeu_ps(&d[0][n], out[0]);
|
_mm_storeu_ps(&d0[n], out[0]);
|
||||||
_mm_storeu_ps(&d[1][n], out[1]);
|
_mm_storeu_ps(&d1[n], out[1]);
|
||||||
|
|
||||||
s += 4*n_dst;
|
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[0] = _mm_mul_ss(out[0], factor);
|
||||||
out[1] = _mm_cvtsi32_ss(out[1], s[1]);
|
out[1] = _mm_cvtsi32_ss(out[1], s[1]);
|
||||||
out[1] = _mm_mul_ss(out[1], factor);
|
out[1] = _mm_mul_ss(out[1], factor);
|
||||||
_mm_store_ss(&d[0][n], out[0]);
|
_mm_store_ss(&d0[n], out[0]);
|
||||||
_mm_store_ss(&d[1][n], out[1]);
|
_mm_store_ss(&d1[n], out[1]);
|
||||||
s += n_dst;
|
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)
|
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 **s = (const float **) src;
|
||||||
|
const float *s0 = s[0];
|
||||||
int32_t *d = dst;
|
int32_t *d = dst;
|
||||||
int n, n_samples, unrolled;
|
int n, n_samples, unrolled;
|
||||||
__m128 in[1];
|
__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;
|
n_samples = n_samples & 3;
|
||||||
|
|
||||||
for(n = 0; unrolled--; n += 4) {
|
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));
|
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);
|
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;
|
d += 4*n_src;
|
||||||
}
|
}
|
||||||
for(; n_samples--; n++) {
|
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_mul_ss(in[0], int_max);
|
||||||
in[0] = _mm_min_ss(int_max, _mm_max_ss(in[0], int_min));
|
in[0] = _mm_min_ss(int_max, _mm_max_ss(in[0], int_min));
|
||||||
*d = _mm_cvttss_si32(in[0]) << 8;
|
*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)
|
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 **s = (const float **) src;
|
||||||
|
const float *s0 = s[0], *s1 = s[1];
|
||||||
int32_t *d = dst;
|
int32_t *d = dst;
|
||||||
int n, n_samples, unrolled;
|
int n, n_samples, unrolled;
|
||||||
__m128 in[2];
|
__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;
|
n_samples = n_samples & 3;
|
||||||
|
|
||||||
for(n = 0; unrolled--; n += 4) {
|
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[1] = _mm_mul_ps(_mm_loadu_ps(&s[1][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[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));
|
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;
|
d += 4*n_src;
|
||||||
}
|
}
|
||||||
for(; n_samples--; n++) {
|
for(; n_samples--; n++) {
|
||||||
in[0] = _mm_load_ss(&s[0][n]);
|
in[0] = _mm_load_ss(&s0[n]);
|
||||||
in[1] = _mm_load_ss(&s[1][n]);
|
in[1] = _mm_load_ss(&s1[n]);
|
||||||
|
|
||||||
in[0] = _mm_unpacklo_ps(in[0], in[1]);
|
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)
|
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 **s = (const float **) src;
|
||||||
|
const float *s0 = s[0], *s1 = s[1], *s2 = s[2], *s3 = s[3];
|
||||||
int32_t *d = dst;
|
int32_t *d = dst;
|
||||||
int n, n_samples, unrolled;
|
int n, n_samples, unrolled;
|
||||||
__m128 in[4];
|
__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;
|
n_samples = n_samples & 3;
|
||||||
|
|
||||||
for(n = 0; unrolled--; n += 4) {
|
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[1] = _mm_mul_ps(_mm_loadu_ps(&s[1][n]), int_max);
|
in[1] = _mm_mul_ps(_mm_loadu_ps(&s1[n]), int_max);
|
||||||
in[2] = _mm_mul_ps(_mm_loadu_ps(&s[2][n]), int_max);
|
in[2] = _mm_mul_ps(_mm_loadu_ps(&s2[n]), int_max);
|
||||||
in[3] = _mm_mul_ps(_mm_loadu_ps(&s[3][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[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));
|
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;
|
d += 4*n_src;
|
||||||
}
|
}
|
||||||
for(; n_samples--; n++) {
|
for(; n_samples--; n++) {
|
||||||
in[0] = _mm_load_ss(&s[0][n]);
|
in[0] = _mm_load_ss(&s0[n]);
|
||||||
in[1] = _mm_load_ss(&s[1][n]);
|
in[1] = _mm_load_ss(&s1[n]);
|
||||||
in[2] = _mm_load_ss(&s[2][n]);
|
in[2] = _mm_load_ss(&s2[n]);
|
||||||
in[3] = _mm_load_ss(&s[3][n]);
|
in[3] = _mm_load_ss(&s3[n]);
|
||||||
|
|
||||||
in[0] = _mm_unpacklo_ps(in[0], in[2]);
|
in[0] = _mm_unpacklo_ps(in[0], in[2]);
|
||||||
in[1] = _mm_unpacklo_ps(in[1], in[3]);
|
in[1] = _mm_unpacklo_ps(in[1], in[3]);
|
||||||
|
|
|
||||||
|
|
@ -593,11 +593,14 @@ impl_node_port_enum_params(struct spa_node *node,
|
||||||
static int calc_width(struct spa_audio_info *info)
|
static int calc_width(struct spa_audio_info *info)
|
||||||
{
|
{
|
||||||
switch (info->info.raw.format) {
|
switch (info->info.raw.format) {
|
||||||
|
case SPA_AUDIO_FORMAT_U8P:
|
||||||
case SPA_AUDIO_FORMAT_U8:
|
case SPA_AUDIO_FORMAT_U8:
|
||||||
return 1;
|
return 1;
|
||||||
|
case SPA_AUDIO_FORMAT_S16P:
|
||||||
case SPA_AUDIO_FORMAT_S16:
|
case SPA_AUDIO_FORMAT_S16:
|
||||||
case SPA_AUDIO_FORMAT_S16_OE:
|
case SPA_AUDIO_FORMAT_S16_OE:
|
||||||
return 2;
|
return 2;
|
||||||
|
case SPA_AUDIO_FORMAT_S24P:
|
||||||
case SPA_AUDIO_FORMAT_S24:
|
case SPA_AUDIO_FORMAT_S24:
|
||||||
case SPA_AUDIO_FORMAT_S24_OE:
|
case SPA_AUDIO_FORMAT_S24_OE:
|
||||||
return 3;
|
return 3;
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
#include <spa/param/audio/format-utils.h>
|
#include <spa/param/audio/format-utils.h>
|
||||||
#include <spa/param/param.h>
|
#include <spa/param/param.h>
|
||||||
#include <spa/pod/filter.h>
|
#include <spa/pod/filter.h>
|
||||||
|
#include <spa/debug/types.h>
|
||||||
|
|
||||||
#define NAME "resample"
|
#define NAME "resample"
|
||||||
|
|
||||||
|
|
@ -115,11 +116,11 @@ static int setup_convert(struct impl *this,
|
||||||
dst_info = info;
|
dst_info = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
spa_log_info(this->log, NAME " %p: %d/%d@%d->%d/%d@%d", this,
|
spa_log_info(this->log, NAME " %p: %s/%d@%d->%s/%d@%d", this,
|
||||||
src_info->info.raw.format,
|
spa_debug_type_find_name(spa_type_audio_format, src_info->info.raw.format),
|
||||||
src_info->info.raw.channels,
|
src_info->info.raw.channels,
|
||||||
src_info->info.raw.rate,
|
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.channels,
|
||||||
dst_info->info.raw.rate);
|
dst_info->info.raw.rate);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,7 @@ struct session {
|
||||||
struct spa_proxy *proxy;
|
struct spa_proxy *proxy;
|
||||||
struct spa_hook listener;
|
struct spa_hook listener;
|
||||||
|
|
||||||
|
bool starting;
|
||||||
bool dsp_pending;
|
bool dsp_pending;
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool busy;
|
bool busy;
|
||||||
|
|
@ -275,6 +276,7 @@ handle_node(struct impl *impl, uint32_t id, uint32_t parent_id,
|
||||||
sess->id = id;
|
sess->id = id;
|
||||||
sess->need_dsp = need_dsp;
|
sess->need_dsp = need_dsp;
|
||||||
sess->enabled = true;
|
sess->enabled = true;
|
||||||
|
sess->starting = true;
|
||||||
sess->node = node;
|
sess->node = node;
|
||||||
if ((str = spa_dict_lookup(props, "node.plugged")) != NULL)
|
if ((str = spa_dict_lookup(props, "node.plugged")) != NULL)
|
||||||
sess->plugged = pw_properties_parse_uint64(str);
|
sess->plugged = pw_properties_parse_uint64(str);
|
||||||
|
|
@ -651,6 +653,11 @@ static int rescan_node(struct impl *impl, struct node *node)
|
||||||
|
|
||||||
session = find.sess;
|
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)
|
if (strcmp(category, "Capture") == 0)
|
||||||
direction = PW_DIRECTION_OUTPUT;
|
direction = PW_DIRECTION_OUTPUT;
|
||||||
else if (strcmp(category, "Playback") == 0)
|
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 pw_properties *props;
|
||||||
struct node *node = sess->node;
|
struct node *node = sess->node;
|
||||||
void *dsp;
|
void *dsp;
|
||||||
|
int i;
|
||||||
|
uint64_t mask = 0;
|
||||||
|
|
||||||
if (node->info->props == NULL)
|
if (node->info->props == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < node->format.channels; i++)
|
||||||
|
mask |= 1UL << node->format.position[i];
|
||||||
|
|
||||||
props = pw_properties_new_dict(node->info->props);
|
props = pw_properties_new_dict(node->info->props);
|
||||||
pw_properties_setf(props, "audio-dsp.direction", "%d", sess->direction);
|
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.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.rate", "%d", node->format.rate);
|
||||||
pw_properties_setf(props, "audio-dsp.maxbuffer", "%ld", MAX_QUANTUM_SIZE * sizeof(float));
|
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;
|
sess->dsp_pending = true;
|
||||||
pw_proxy_add_proxy_listener(dsp, &sess->listener, &dsp_node_events, sess);
|
pw_proxy_add_proxy_listener(dsp, &sess->listener, &dsp_node_events, sess);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
sess->starting = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_rescan(struct impl *impl)
|
static void do_rescan(struct impl *impl)
|
||||||
|
|
|
||||||
|
|
@ -144,6 +144,8 @@ static const struct pw_port_implementation port_implementation = {
|
||||||
|
|
||||||
static const char *chmap_names[] =
|
static const char *chmap_names[] =
|
||||||
{
|
{
|
||||||
|
"UNK", /**< unknown */
|
||||||
|
"NA", /**< unmapped */
|
||||||
"MONO", /**< mono */
|
"MONO", /**< mono */
|
||||||
"FL", /**< front left */
|
"FL", /**< front left */
|
||||||
"FR", /**< front right */
|
"FR", /**< front right */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue