mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -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),
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
|||
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 {
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include <spa/param/param.h>
|
||||
#include <spa/pod/filter.h>
|
||||
#include <spa/control/control.h>
|
||||
#include <spa/debug/types.h>
|
||||
|
||||
#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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include <spa/param/audio/format-utils.h>
|
||||
#include <spa/param/param.h>
|
||||
#include <spa/pod/filter.h>
|
||||
#include <spa/debug/types.h>
|
||||
|
||||
#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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue