audio: remove layout from audio

Make special format types for planar and interleaved instead of
having a field.
Add enum for audio channel positions
Add some default audio channel layouts
Place the channel layout in the audio format when possible
alsa: place audio channel positions in format
Add sse optimized channel mixing for some common cases
Remove name from port info, it's not mandatory and in the properties
Add direction to port info
This commit is contained in:
Wim Taymans 2018-09-13 17:03:56 +02:00
parent fb3379e587
commit 5196f7f053
38 changed files with 981 additions and 369 deletions

View file

@ -26,9 +26,14 @@ extern "C" {
#include <endian.h>
#define SPA_AUDIO_MAX_CHANNELS 64
enum spa_audio_format {
SPA_AUDIO_FORMAT_UNKNOWN,
SPA_AUDIO_FORMAT_ENCODED,
/* interleaved formats */
SPA_AUDIO_FORMAT_START_Interleaved = 0x100,
SPA_AUDIO_FORMAT_S8,
SPA_AUDIO_FORMAT_U8,
SPA_AUDIO_FORMAT_S16_LE,
@ -60,6 +65,18 @@ enum spa_audio_format {
SPA_AUDIO_FORMAT_F64_LE,
SPA_AUDIO_FORMAT_F64_BE,
/* planar formats */
SPA_AUDIO_FORMAT_START_Planar = 0x200,
SPA_AUDIO_FORMAT_U8P,
SPA_AUDIO_FORMAT_S16P,
SPA_AUDIO_FORMAT_S24_32P,
SPA_AUDIO_FORMAT_S32P,
SPA_AUDIO_FORMAT_S24P,
SPA_AUDIO_FORMAT_F32P,
SPA_AUDIO_FORMAT_F64P,
SPA_AUDIO_FORMAT_START_Other = 0x300,
#if __BYTE_ORDER == __BIG_ENDIAN
SPA_AUDIO_FORMAT_S16 = SPA_AUDIO_FORMAT_S16_BE,
SPA_AUDIO_FORMAT_U16 = SPA_AUDIO_FORMAT_U16_BE,
@ -121,26 +138,97 @@ enum spa_audio_format {
#endif
};
#define SPA_AUDIO_FORMAT_IS_INTERLEAVED(fmt) ((fmt) > SPA_AUDIO_FORMAT_START_Interleaved && (fmt) < SPA_AUDIO_FORMAT_START_Planar)
#define SPA_AUDIO_FORMAT_IS_PLANAR(fmt) ((fmt) > SPA_AUDIO_FORMAT_START_Planar && (fmt) < SPA_AUDIO_FORMAT_START_Other)
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_FLC, /**< front left center */
SPA_AUDIO_CHANNEL_FRC, /**< front right center */
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_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 */
SPA_AUDIO_CHANNEL_TSR, /**< top side right */
SPA_AUDIO_CHANNEL_LLFE, /**< left LFE */
SPA_AUDIO_CHANNEL_RLFE, /**< right LFE */
SPA_AUDIO_CHANNEL_BC, /**< bottom center */
SPA_AUDIO_CHANNEL_BLC, /**< bottom left center */
SPA_AUDIO_CHANNEL_BRC, /**< bottom right center */
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
* contains unpositioned channels. */
/** Layout of the audio samples for the different channels. */
enum spa_audio_layout {
SPA_AUDIO_LAYOUT_INVALID,
SPA_AUDIO_LAYOUT_INTERLEAVED, /*< interleaved audio */
SPA_AUDIO_LAYOUT_NON_INTERLEAVED, /*< non-interleaved audio */
};
/** Audio information description */
struct spa_audio_info_raw {
enum spa_audio_format format; /*< format, one of enum spa_audio_format */
uint32_t flags; /*< extra flags */
enum spa_audio_layout layout; /*< sample layout */
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
uint64_t channel_mask; /*< channel mask */
enum spa_audio_format format; /*< format, one of enum spa_audio_format */
uint32_t flags; /*< extra flags */
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
uint32_t position[SPA_AUDIO_MAX_CHANNELS]; /*< channel position from enum spa_audio_channel */
};
#define SPA_AUDIO_INFO_RAW_INIT(...) (struct spa_audio_info_raw) { __VA_ARGS__ }