@@ -30,6 +30,8 @@ DECLARE_SOF_RT_UUID("codec_adapter", ca_uuid, 0xd8218443, 0x5ff3, 0x4a4c,
3030
3131DECLARE_TR_CTX (ca_tr , SOF_UUID (ca_uuid ), LOG_LEVEL_INFO );
3232
33+ #define ENUM_CTRL_PASSTHROUGH 0
34+
3335/**
3436 * \brief Create a codec adapter component.
3537 * \param[in] drv - component driver pointer.
@@ -91,6 +93,7 @@ static struct comp_dev *codec_adapter_new(const struct comp_driver *drv,
9193
9294 dev -> state = COMP_STATE_READY ;
9395 cd -> state = PP_STATE_CREATED ;
96+ cd -> passthrough = 0 ;
9497
9598 comp_cl_info (& comp_codec_adapter , "codec_adapter_new() done" );
9699 return dev ;
@@ -620,6 +623,89 @@ static int codec_adapter_ctrl_set_data(struct comp_dev *dev,
620623 return ret ;
621624}
622625
626+ static int codec_adapter_ctrl_enum_set (struct sof_ipc_ctrl_data * cdata , struct comp_data * cd )
627+ {
628+ int ret ;
629+
630+ switch (cdata -> index ) {
631+ case ENUM_CTRL_PASSTHROUGH :
632+ if (cdata -> num_elems )
633+ cd -> passthrough = cdata -> chanv [0 ].value ;
634+ break ;
635+ default :
636+ comp_cl_err (& comp_codec_adapter ,
637+ "codec_adapter_ctrl_enum_set() error: invalid index=%d" ,
638+ cdata -> index );
639+ ret = - EINVAL ;
640+ break ;
641+ }
642+
643+ return ret ;
644+ }
645+
646+ static int codec_adapter_set_value (struct comp_dev * dev ,
647+ struct sof_ipc_ctrl_data * cdata )
648+ {
649+ int ret ;
650+ struct comp_data * cd = comp_get_drvdata (dev );
651+
652+ switch (cdata -> cmd ) {
653+ case SOF_CTRL_CMD_ENUM :
654+ comp_dbg (dev , "codec_adapter_set_value(): SOF_CTRL_CMD_ENUM index=%d" ,
655+ cdata -> index );
656+ ret = codec_adapter_ctrl_enum_set (cdata , cd );
657+ break ;
658+ default :
659+ comp_err (dev , "codec_adapter_set_value() error: invalid cdata->cmd" );
660+ ret = - EINVAL ;
661+ break ;
662+ }
663+
664+ return ret ;
665+ }
666+
667+ static int codec_adapter_ctrl_enum_get (struct sof_ipc_ctrl_data * cdata , struct comp_data * cd )
668+ {
669+ int ret ;
670+ int j ;
671+
672+ switch (cdata -> index ) {
673+ case ENUM_CTRL_PASSTHROUGH :
674+ for (j = 0 ; j < cdata -> num_elems ; j ++ )
675+ cdata -> chanv [j ].value = cd -> passthrough ;
676+ break ;
677+ default :
678+ comp_cl_err (& comp_codec_adapter ,
679+ "codec_adapter_ctrl_enum_get() error: invalid index=%d" ,
680+ cdata -> index );
681+ ret = - EINVAL ;
682+ break ;
683+ }
684+
685+ return ret ;
686+ }
687+
688+ static int codec_adapter_get_value (struct comp_dev * dev ,
689+ struct sof_ipc_ctrl_data * cdata )
690+ {
691+ int ret ;
692+ struct comp_data * cd = comp_get_drvdata (dev );
693+
694+ switch (cdata -> cmd ) {
695+ case SOF_CTRL_CMD_ENUM :
696+ comp_dbg (dev , "codec_adapter_get_value(): SOF_CTRL_CMD_ENUM index=%d" ,
697+ cdata -> index );
698+ ret = codec_adapter_ctrl_enum_get (cdata , cd );
699+ break ;
700+ default :
701+ comp_err (dev , "codec_adapter_get_value() error: invalid cdata->cmd" );
702+ ret = - EINVAL ;
703+ break ;
704+ }
705+
706+ return ret ;
707+ }
708+
623709/* Used to pass standard and bespoke commands (with data) to component */
624710static int codec_adapter_cmd (struct comp_dev * dev , int cmd , void * data ,
625711 int max_data_size )
@@ -637,6 +723,12 @@ static int codec_adapter_cmd(struct comp_dev *dev, int cmd, void *data,
637723 comp_err (dev , "codec_adapter_cmd() get_data not implemented yet." );
638724 ret = - ENODATA ;
639725 break ;
726+ case COMP_CMD_SET_VALUE :
727+ ret = codec_adapter_set_value (dev , cdata );
728+ break ;
729+ case COMP_CMD_GET_VALUE :
730+ ret = codec_adapter_get_value (dev , cdata );
731+ break ;
640732 default :
641733 comp_err (dev , "codec_adapter_cmd() error: unknown command" );
642734 ret = - EINVAL ;
0 commit comments