alsa-project/alsa-utils pull request #268 was edited from ranj063: Introduce a new keyword "Subtreecopy" for extending existing conf nodes with additional nodes. This feature is useful for extending previous pipeline class definitions with the addition of one or more widgets without having to duplicate everything in the new class definition. For example: Consider a pipeline class definition as below. Note that only the widgets & routes are shown here. ``` Class.Pipeline.mixout-gain-dai-copier-playback { Object.Widget { mixout."1" {} dai-copier."1" {} gain."1" {} pipeline."1" {} } Object.Base { !route [ { source mixout.$index.1 sink gain.$index.1 } ] } } ``` If we want to extend this pipeline with the addition of an eqiir/eqfir, we can create a Subtreecopy node with type extend as follows: ``` Subtreecopy.mixout-gain-eqiir-eqfir-dai-copier-playback { source "Class.Pipeline.mixout-gain-dai-copier-playback" target "Class.Pipeline" type extend Object.Widget { eqiir.1 {} eqfir.1 {} } Object.Base { !route [ { source gain.$index.1 sink eqiir.$index.1 } { source eqiir.$index.1 sink eqfir.$index.1 } ] } } ``` But if we want to modify an existing pipeline class while modifying the order of widgets and/or inserting new widgets, we should use the type "override" instead. This allows for adding new widgets to the list of widgets in the base class definition while also allowing overriding the routes to allow inserting the new widgets and reordering the widgets in the base class. For example, if we want to add a drc widget between the gain and the eqiir modules in the above class, we can do the following: ``` Subtreecopy.mixout-efx-dai-copier-playback { source "Class.Pipeline.mixout-gain-eqiir-eqfir-dai-copier-playback" target "Class.Pipeline" type override Object.Widget { drc.1 {} } Object.Base { !route [ { source mixout.$index.1 sink gain.$index.1 } { source gain.$index.1 sink drc.$index.1 } { source drc.$index.1 sink eqiir.$index.1 } { source eqiir.$index.1 sink eqfir.$index.1 } ] } } ``` Note that the routes array contains all the routes in the new subtreecopy definition. This subtreecopy feature can also be used to copy normal config blocks without having the need to duplicate information. For example, if all the widgets in a pipeline support the same audio formats, we can define it as follows: ``` Class.Pipeline.dai-copier-eqiir-module-copier-capture { formats { num_input_audio_formats 2 num_output_audio_formats 2 Object.Base.input_audio_format [ { in_bit_depth 32 in_valid_bit_depth 32 } { in_channels 4 in_bit_depth 32 in_valid_bit_depth 32 in_ch_cfg $CHANNEL_CONFIG_3_POINT_1 in_ch_map $CHANNEL_MAP_3_POINT_1 } ] Object.Base.output_audio_format [ { out_bit_depth 32 out_valid_bit_depth 32 } { out_channels 4 out_bit_depth 32 out_valid_bit_depth 32 out_ch_cfg $CHANNEL_CONFIG_3_POINT_1 out_ch_map $CHANNEL_MAP_3_POINT_1 } ] } Object.Widget { dai-copier."1" { type dai_out num_output_pins 1 Subtreecopy.formats { source "Class.Pipeline.dai-copier-eqiir-module-copier-capture.formats" type override } } eqiir."1" { Subtreecopy.formats { source "Class.Pipeline.dai-copier-eqiir-module-copier-capture.formats" type override } Object.Control.bytes."1" { IncludeByKey.DMIC0_DAI_EQIIR { "passthrough" "include/components/eqiir/passthrough.conf" "highpass_40hz_0db" "include/components/eqiir/highpass_40hz_0db_48khz.conf" "highpass_40hz_20db" "include/components/eqiir/highpass_40hz_20db_48khz.conf" } } } module-copier."2" { Subtreecopy.formats { source "Class.Pipeline.dai-copier-eqiir-module-copier-capture.formats" type override } } pipeline."1" { priority 0 lp_mode 0 } } } ``` The subtreecopy node in each widget ensures that the pipeline formats are applied to all widgets without the need for duplicating them for each widget. Link: https://github.com/thesofproject/sof/issues/9082 Request URL : https://github.com/alsa-project/alsa-utils/pull/268 Patch URL : https://github.com/alsa-project/alsa-utils/pull/268.patch Repository URL: https://github.com/alsa-project/alsa-utils