365894126 发表于 2021-8-29 19:13:42

qcc30xx/51xx 利用splitter capability实现音频双输出

可以实现I2S和模拟同时输出。

apps\libs\audio_mixer\audio_mixer.c:
static void mixerHardwareConnect(connection_type_t connection_type)
{
….

-hw_connect_data.aux_left = NULL;
-hw_connect_data.aux_right = NULL;
+hw_connect_data.aux_left = ChainGetOutput(mixerSpeakerGetChain(), path_role_aux_left);;
+hw_connect_data.aux_right = ChainGetOutput(mixerSpeakerGetChain(), path_role_aux_right);;
AudioHardwareConnectOutput(&hw_connect_data);
}apps\libs\audio_mixer\audio_mixer_channel_roles.h:
typedef enum
{
mixer_left_channel,
mixer_right_channel,
+path_role_aux_left,
+path_role_aux_right,
mixer_secondary_left_channel,

} audio_mixer_channel_role_t;apps\libs\audio_mixer\audio_mixer_speaker.c:
static void mixerSpeakerConfigureChain(unsigned output_sample_rate)
{
Operator speaker_peq_op;
+Operator output_splitter_op;

crossover_op = ChainGetOperatorByRole(speaker_data.chain, crossover_role);
if (crossover_op)
{
OperatorsStandardSetUCID(crossover_op,
mixerSpeakerGetCrossoverUcid(speaker_data.mode));
}
+output_splitter_op = ChainGetOperatorByRole(speaker_data.chain, output_splitter_role);
+if (output_splitter_op)
+{

+}apps\libs\audio_mixer\audio_mixer_speaker_chain_configs.c:
#define MAKE_SPEAKER_OPS_COMMON() \
MAKE_OPERATOR_CONFIG(capability_id_volume, media_volume_role), \
MAKE_OPERATOR_CONFIG(capability_id_peq, speaker_peq_role), \
+MAKE_OPERATOR_CONFIG(capability_id_splitter, output_splitter_role), \
MAKE_OPERATOR_CONFIG(capability_id_passthrough, post_processing_role)
static const operator_path_node_t left_primary_left[] =
{
{media_volume_role, VOLUME_INPUT_MAIN1, VOLUME_OUTPUT1},
{speaker_peq_role, LEFT_INPUT, LEFT_OUTPUT},
+{output_splitter_role, PRIMARY_LEFT_INPUT, PRIMARY_LEFT_OUTPUT},
{post_processing_role, PRIMARY_LEFT_INPUT, PRIMARY_LEFT_OUTPUT}
};
static const operator_path_node_t right_primary_right[] =
{
{media_volume_role, VOLUME_INPUT_MAIN2, VOLUME_OUTPUT2},
{speaker_peq_role, RIGHT_INPUT, RIGHT_OUTPUT},
+{output_splitter_role, PRIMARY_RIGHT_INPUT, PRIMARY_RIGHT_OUTPUT},
{post_processing_role, PRIMARY_RIGHT_INPUT, PRIMARY_RIGHT_OUTPUT}
};
+static const operator_path_node_t path_aux_left[] =
+{
+{output_splitter_role, UNUSED_TERMINAL, SECONDARY_LEFT_OUTPUT},
+{post_processing_role, SECONDARY_LEFT_OUTPUT, SECONDARY_LEFT_OUTPUT}
+};
+static const operator_path_node_t path_aux_right[] =
+{
+{output_splitter_role, UNUSED_TERMINAL, SECONDARY_RIGHT_OUTPUT},
+{post_processing_role, SECONDARY_RIGHT_OUTPUT, SECONDARY_RIGHT_OUTPUT}
+};
static const operator_path_t paths_mono[] =
{
{mixer_left_channel, path_with_in_and_out,
ARRAY_DIM((left_primary_left)), left_primary_left},
{mixer_prompt_left_channel, path_with_input, ARRAY_DIM((prompt_mix)), prompt_mix},
+{path_role_aux_left, path_with_output, ARRAY_DIM((path_aux_left)), path_aux_left}
};
static const operator_path_t paths_stereo[] =
{
{mixer_left_channel, path_with_in_and_out,
ARRAY_DIM((left_primary_left)), left_primary_left},
{mixer_right_channel, path_with_in_and_out, ARRAY_DIM((right_primary_right)),
right_primary_right},
{mixer_prompt_left_channel, path_with_input, ARRAY_DIM((prompt_mix)), prompt_mix},
+{path_role_aux_left, path_with_output, ARRAY_DIM((path_aux_left)), path_aux_left},
+{path_role_aux_right, path_with_output, ARRAY_DIM((path_aux_right)), path_aux_right}
};apps\libs\audio_mixer\audio_mixer_speaker_chain_configs.h:
typedef enum _audio_mixer_speaker_roles
{
+output_splitter_role,
media_volume_role,
speaker_peq_role,
stereo_to_mono_role,
crossover_role,
master_volume_role,
compander_role,
post_processing_role
} audio_mixer_speaker_roles_t;

levalmok 发表于 2021-8-30 23:54:00

技术大牛!

yaoziqiang 发表于 2021-8-31 08:15:23

非常不错,赞:lol

天中雨水 发表于 2021-9-3 14:13:27

双输入、双输出,可以吗?

jjr 发表于 2022-4-5 00:08:48

adk6.4.2.26按照这个方法会panic

moyanming2013 发表于 2022-4-5 19:08:10

学习了
页: [1]
查看完整版本: qcc30xx/51xx 利用splitter capability实现音频双输出