> -----Original Message----- > From: Liam Girdwood [mailto:liam.r.girdwood@xxxxxxxxxxxxxxx] > Sent: Tuesday, November 15, 2016 4:50 PM > > @@ -341,13 +348,22 @@ static int execute_cset(snd_ctl_t *ctl, const char > *cset, unsigned int type) > > * \brief Execute the sequence > > * \param uc_mgr Use case manager > > * \param seq Sequence > > + * \param cdev_in input cdev, parenet's cdev for a component device, > > + * or NULL for a machine device. > > * \return zero on success, otherwise a negative error code > > + * > > + * A machine device's sequence can enable or disable a component device. > > + * But the enable/disable sequence of a component device does not > > + define > > + * cdev, the card device. So when executing a component device's > > + sequence, > > + * we need to pass the cdev defined by the sequence of its parent, > > + the > > + * machine device. And for machine device, cdev should be set to NULL. > > */ > > static int execute_sequence(snd_use_case_mgr_t *uc_mgr, > > struct list_head *seq, > > struct list_head *value_list1, > > struct list_head *value_list2, > > - struct list_head *value_list3) > > + struct list_head *value_list3, > > + char *cdev_in) > > Could the current cdev be embedded in uc_mgr ? Yes, it could and there will be less code change. Actually I found the machine devices always set the same cdev name in their sequences. > > @@ -366,7 +382,16 @@ static int execute_sequence(snd_use_case_mgr_t > *uc_mgr, > > case SEQUENCE_ELEMENT_TYPE_CSET: > > case SEQUENCE_ELEMENT_TYPE_CSET_BIN_FILE: > > case SEQUENCE_ELEMENT_TYPE_CSET_TLV: > > - if (cdev == NULL) { > > + if (cdev == NULL && cdev_in) { > > + /* Sequence of a component device, should > use > > + * the input cdev defined by sequence of its > > + * parent, the machine device. > > + */ > > + cdev = strdup(cdev_in); > > + if (cdev == NULL) > > + goto __fail_nomem; > > + > > + } else if (cdev == NULL) { > > char *playback_ctl = NULL; > > char *capture_ctl = NULL; > > > > @@ -405,7 +430,9 @@ static int execute_sequence(snd_use_case_mgr_t > *uc_mgr, > > free(capture_ctl); > > } else > > cdev = capture_ctl; > > + > > } > > + > > Looks like this formatting change was added by mistake ? Yes, it was added by mistake. I'll remove it. > > +/* Execute enable or disable sequence of a component device. > > + * > > + * For a component device (a codec or embedded DSP), its sequence > > +doesn't > > + * specify the sound card device 'cdev', because a component can be > > +reused > > + * by different sound cards (machines). So when executing its > > +sequence, a > > + * parameter 'cdev_in' is used to pass cdev defined by the sequence > > +of its > > + * parent, the machine device. > > + */ > > +static int execute_component_seq(snd_use_case_mgr_t *uc_mgr, > > + struct component_sequence *cmpt_seq, > > + struct list_head *value_list1, > > + struct list_head *value_list2, > > + struct list_head *value_list3, > > + char *cdev_in) > > +{ > > + struct use_case_device *device = cmpt_seq->device; > > + struct list_head *seq; > > + int err; > > + > > + > > + if (cmpt_seq->enable) > > + seq = &device->enable_list; > > + else > > + seq = &device->disable_list; > > What happens here if there is only an enable sequence and no disable > sequence ? i.e. will seq be NULL ? The device's enable_list or disable_list will be empty, assured by the UCM parser. And so 'seq' will be an empty list and the following execute_sequence() will exit without doing anything. > > > + > > + err = execute_sequence(uc_mgr, seq, > > + &device->value_list, > > + &uc_mgr->active_verb->value_list, > > + &uc_mgr->value_list, > > + cdev_in); > > + return err; > > +} > > + Thanks Mengdong _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel