@@ -771,8 +771,9 @@ static void unicast_client_ep_set_status(struct bt_audio_ep *ep,
771
771
old_state = ep -> status .state ;
772
772
ep -> status = * status ;
773
773
774
- BT_DBG ("ep %p handle 0x%04x id 0x%02x state %s -> %s" , ep , ep -> client .handle ,
775
- status -> id , bt_audio_ep_state_str (old_state ),
774
+ BT_DBG ("ep %p handle 0x%04x id 0x%02x dir %u state %s -> %s" , ep ,
775
+ ep -> client .handle , status -> id , ep -> dir ,
776
+ bt_audio_ep_state_str (old_state ),
776
777
bt_audio_ep_state_str (status -> state ));
777
778
778
779
switch (status -> state ) {
@@ -794,58 +795,103 @@ static void unicast_client_ep_set_status(struct bt_audio_ep *ep,
794
795
BT_WARN ("Invalid state transition: %s -> %s" ,
795
796
bt_audio_ep_state_str (old_state ),
796
797
bt_audio_ep_state_str (ep -> status .state ));
798
+ return ;
797
799
}
800
+
798
801
unicast_client_ep_config_state (ep , buf );
799
802
break ;
800
803
case BT_AUDIO_EP_STATE_QOS_CONFIGURED :
801
- switch (old_state ) {
802
- /* Valid only if ASE_State field = 0x01 (Codec Configured) */
803
- case BT_AUDIO_EP_STATE_CODEC_CONFIGURED :
804
- /* or 0x02 (QoS Configured) */
805
- case BT_AUDIO_EP_STATE_QOS_CONFIGURED :
806
- break ;
807
- default :
808
- BT_WARN ("Invalid state transition: %s -> %s" ,
809
- bt_audio_ep_state_str (old_state ),
810
- bt_audio_ep_state_str (ep -> status .state ));
804
+ /* QoS configured have different allowed states depending on the endpoint type */
805
+ if (ep -> dir == BT_AUDIO_DIR_SOURCE ) {
806
+ switch (old_state ) {
807
+ /* Valid only if ASE_State field = 0x01 (Codec Configured) */
808
+ case BT_AUDIO_EP_STATE_CODEC_CONFIGURED :
809
+ /* or 0x02 (QoS Configured) */
810
+ case BT_AUDIO_EP_STATE_QOS_CONFIGURED :
811
+ /* or 0x05 (Disabling) */
812
+ case BT_AUDIO_EP_STATE_DISABLING :
813
+ break ;
814
+ default :
815
+ BT_WARN ("Invalid state transition: %s -> %s" ,
816
+ bt_audio_ep_state_str (old_state ),
817
+ bt_audio_ep_state_str (ep -> status .state ));
818
+ return ;
819
+ }
820
+ } else {
821
+ switch (old_state ) {
822
+ /* Valid only if ASE_State field = 0x01 (Codec Configured) */
823
+ case BT_AUDIO_EP_STATE_CODEC_CONFIGURED :
824
+ /* or 0x02 (QoS Configured) */
825
+ case BT_AUDIO_EP_STATE_QOS_CONFIGURED :
826
+ /* or 0x03 (Enabling) */
827
+ case BT_AUDIO_EP_STATE_ENABLING :
828
+ /* or 0x04 (Streaming)*/
829
+ case BT_AUDIO_EP_STATE_STREAMING :
830
+ break ;
831
+ default :
832
+ BT_WARN ("Invalid state transition: %s -> %s" ,
833
+ bt_audio_ep_state_str (old_state ),
834
+ bt_audio_ep_state_str (ep -> status .state ));
835
+ return ;
836
+ }
811
837
}
838
+
812
839
unicast_client_ep_qos_state (ep , buf );
813
840
break ;
814
841
case BT_AUDIO_EP_STATE_ENABLING :
842
+ switch (old_state ) {
815
843
/* Valid only if ASE_State field = 0x02 (QoS Configured) */
816
- if (old_state != BT_AUDIO_EP_STATE_QOS_CONFIGURED ) {
844
+ case BT_AUDIO_EP_STATE_QOS_CONFIGURED :
845
+ /* or 0x03 (Enabling) */
846
+ case BT_AUDIO_EP_STATE_ENABLING :
847
+ break ;
848
+ default :
817
849
BT_WARN ("Invalid state transition: %s -> %s" ,
818
850
bt_audio_ep_state_str (old_state ),
819
851
bt_audio_ep_state_str (ep -> status .state ));
852
+ return ;
820
853
}
854
+
821
855
unicast_client_ep_enabling_state (ep , buf );
822
856
break ;
823
857
case BT_AUDIO_EP_STATE_STREAMING :
824
858
switch (old_state ) {
825
- /* Valid only if ASE_State field = 0x02 (QoS Configured) */
826
- case BT_AUDIO_EP_STATE_QOS_CONFIGURED :
827
- /* or 0x03 (Enabling)*/
859
+ /* Valid only if ASE_State field = 0x03 (Enabling)*/
828
860
case BT_AUDIO_EP_STATE_ENABLING :
861
+ /* or 0x04 (Streaming)*/
862
+ case BT_AUDIO_EP_STATE_STREAMING :
829
863
break ;
830
864
default :
831
865
BT_WARN ("Invalid state transition: %s -> %s" ,
832
866
bt_audio_ep_state_str (old_state ),
833
867
bt_audio_ep_state_str (ep -> status .state ));
868
+ return ;
834
869
}
870
+
835
871
unicast_client_ep_streaming_state (ep , buf );
836
872
break ;
837
873
case BT_AUDIO_EP_STATE_DISABLING :
838
- switch (old_state ) {
839
- /* Valid only if ASE_State field = 0x03 (Enabling) */
840
- case BT_AUDIO_EP_STATE_ENABLING :
841
- /* or 0x04 (Streaming) */
842
- case BT_AUDIO_EP_STATE_STREAMING :
843
- break ;
844
- default :
874
+ if (ep -> dir == BT_AUDIO_DIR_SOURCE ) {
875
+ switch (old_state ) {
876
+ /* Valid only if ASE_State field = 0x03 (Enabling) */
877
+ case BT_AUDIO_EP_STATE_ENABLING :
878
+ /* or 0x04 (Streaming) */
879
+ case BT_AUDIO_EP_STATE_STREAMING :
880
+ break ;
881
+ default :
882
+ BT_WARN ("Invalid state transition: %s -> %s" ,
883
+ bt_audio_ep_state_str (old_state ),
884
+ bt_audio_ep_state_str (ep -> status .state ));
885
+ return ;
886
+ }
887
+ } else {
888
+ /* Sinks cannot go into the disabling state */
845
889
BT_WARN ("Invalid state transition: %s -> %s" ,
846
- bt_audio_ep_state_str (old_state ),
847
- bt_audio_ep_state_str (ep -> status .state ));
890
+ bt_audio_ep_state_str (old_state ),
891
+ bt_audio_ep_state_str (ep -> status .state ));
892
+ return ;
848
893
}
894
+
849
895
unicast_client_ep_disabling_state (ep , buf );
850
896
break ;
851
897
case BT_AUDIO_EP_STATE_RELEASING :
@@ -858,14 +904,21 @@ static void unicast_client_ep_set_status(struct bt_audio_ep *ep,
858
904
case BT_AUDIO_EP_STATE_ENABLING :
859
905
/* or 0x04 (Streaming) */
860
906
case BT_AUDIO_EP_STATE_STREAMING :
907
+ break ;
861
908
/* or 0x04 (Disabling) */
862
909
case BT_AUDIO_EP_STATE_DISABLING :
863
- break ;
910
+ if (ep -> dir == BT_AUDIO_DIR_SOURCE ) {
911
+ break ;
912
+ } /* else fall through for sink */
913
+
914
+ /* fall through */
864
915
default :
865
916
BT_WARN ("Invalid state transition: %s -> %s" ,
866
917
bt_audio_ep_state_str (old_state ),
867
918
bt_audio_ep_state_str (ep -> status .state ));
919
+ return ;
868
920
}
921
+
869
922
unicast_client_ep_releasing_state (ep , buf );
870
923
break ;
871
924
}
0 commit comments