1
1
/*
2
2
* BlueALSA - a2dp.c
3
- * Copyright (c) 2016-2022 Arkadiusz Bokowy
3
+ * Copyright (c) 2016-2023 Arkadiusz Bokowy
4
4
*
5
5
* This file is a part of bluez-alsa.
6
6
*
@@ -628,15 +628,21 @@ int a2dp_select_configuration(
628
628
return errno = EINVAL , -1 ;
629
629
}
630
630
631
+ a2dp_t tmp ;
632
+ /* save original capabilities blob for later */
633
+ memcpy (& tmp , capabilities , size );
634
+
635
+ /* Narrow capabilities to values supported by BlueALSA. */
636
+ if (a2dp_filter_capabilities (codec , capabilities , size ) != 0 )
637
+ return -1 ;
638
+
631
639
switch (codec -> codec_id ) {
632
640
case A2DP_CODEC_SBC : {
633
-
634
641
a2dp_sbc_t * cap = capabilities ;
635
- unsigned int cap_chm = cap -> channel_mode ;
636
- unsigned int cap_freq = cap -> frequency ;
637
642
643
+ const unsigned int cap_chm = cap -> channel_mode ;
638
644
if ((cap -> channel_mode = a2dp_codec_select_channel_mode (codec , cap_chm , false)) == 0 ) {
639
- error ("SBC: No supported channel modes: %#x" , cap_chm );
645
+ error ("SBC: No supported channel modes: %#x" , tmp . sbc . channel_mode );
640
646
goto fail ;
641
647
}
642
648
@@ -645,72 +651,77 @@ int a2dp_select_configuration(
645
651
if (cap_chm & SBC_CHANNEL_MODE_DUAL_CHANNEL )
646
652
cap -> channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL ;
647
653
else
648
- warn ("SBC XQ: Dual channel mode not supported: %#x" , cap_chm );
654
+ warn ("SBC XQ: Dual channel mode not supported: %#x" , tmp . sbc . channel_mode );
649
655
}
650
656
657
+ const unsigned int cap_freq = cap -> frequency ;
651
658
if ((cap -> frequency = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) == 0 ) {
652
- error ("SBC: No supported sampling frequencies: %#x" , cap_freq );
659
+ error ("SBC: No supported sampling frequencies: %#x" , tmp . sbc . frequency );
653
660
goto fail ;
654
661
}
655
662
656
- if (cap -> block_length & SBC_BLOCK_LENGTH_16 )
663
+ const uint8_t cap_block_length = cap -> block_length ;
664
+ if (cap_block_length & SBC_BLOCK_LENGTH_16 )
657
665
cap -> block_length = SBC_BLOCK_LENGTH_16 ;
658
- else if (cap -> block_length & SBC_BLOCK_LENGTH_12 )
666
+ else if (cap_block_length & SBC_BLOCK_LENGTH_12 )
659
667
cap -> block_length = SBC_BLOCK_LENGTH_12 ;
660
- else if (cap -> block_length & SBC_BLOCK_LENGTH_8 )
668
+ else if (cap_block_length & SBC_BLOCK_LENGTH_8 )
661
669
cap -> block_length = SBC_BLOCK_LENGTH_8 ;
662
- else if (cap -> block_length & SBC_BLOCK_LENGTH_4 )
670
+ else if (cap_block_length & SBC_BLOCK_LENGTH_4 )
663
671
cap -> block_length = SBC_BLOCK_LENGTH_4 ;
664
672
else {
665
- error ("SBC: No supported block lengths: %#x" , cap -> block_length );
673
+ error ("SBC: No supported block lengths: %#x" , tmp . sbc . block_length );
666
674
goto fail ;
667
675
}
668
676
669
- if (cap -> subbands & SBC_SUBBANDS_8 )
677
+ const uint8_t cap_subbands = cap -> subbands ;
678
+ if (cap_subbands & SBC_SUBBANDS_8 )
670
679
cap -> subbands = SBC_SUBBANDS_8 ;
671
- else if (cap -> subbands & SBC_SUBBANDS_4 )
680
+ else if (cap_subbands & SBC_SUBBANDS_4 )
672
681
cap -> subbands = SBC_SUBBANDS_4 ;
673
682
else {
674
- error ("SBC: No supported sub-bands: %#x" , cap -> subbands );
683
+ error ("SBC: No supported sub-bands: %#x" , tmp . sbc . subbands );
675
684
goto fail ;
676
685
}
677
686
678
- if (cap -> allocation_method & SBC_ALLOCATION_LOUDNESS )
687
+ const uint8_t cap_allocation_method = cap -> allocation_method ;
688
+ if (cap_allocation_method & SBC_ALLOCATION_LOUDNESS )
679
689
cap -> allocation_method = SBC_ALLOCATION_LOUDNESS ;
680
- else if (cap -> allocation_method & SBC_ALLOCATION_SNR )
690
+ else if (cap_allocation_method & SBC_ALLOCATION_SNR )
681
691
cap -> allocation_method = SBC_ALLOCATION_SNR ;
682
692
else {
683
- error ("SBC: No supported allocation method: %#x" , cap -> allocation_method );
693
+ error ("SBC: No supported allocation method: %#x" , tmp . sbc . allocation_method );
684
694
goto fail ;
685
695
}
686
696
687
- cap -> min_bitpool = MAX (codec -> capabilities .sbc .min_bitpool , cap -> min_bitpool );
688
- cap -> max_bitpool = MIN (codec -> capabilities .sbc .max_bitpool , cap -> max_bitpool );
689
-
690
697
break ;
691
698
}
692
699
693
700
#if ENABLE_MPEG
694
701
case A2DP_CODEC_MPEG12 : {
695
-
696
702
a2dp_mpeg_t * cap = capabilities ;
697
- unsigned int cap_chm = cap -> channel_mode ;
698
- unsigned int cap_freq = cap -> frequency ;
699
703
700
- if (cap -> layer & MPEG_LAYER_MP3 )
704
+ const uint8_t cap_layer = cap -> layer ;
705
+ if (cap_layer & MPEG_LAYER_MP3 )
701
706
cap -> layer = MPEG_LAYER_MP3 ;
707
+ else if (cap_layer & MPEG_LAYER_MP2 )
708
+ cap -> layer = MPEG_LAYER_MP2 ;
709
+ else if (cap_layer & MPEG_LAYER_MP1 )
710
+ cap -> layer = MPEG_LAYER_MP1 ;
702
711
else {
703
- error ("MPEG: No supported layer: %#x" , cap -> layer );
712
+ error ("MPEG: No supported layer: %#x" , tmp . mpeg . layer );
704
713
goto fail ;
705
714
}
706
715
716
+ const unsigned int cap_chm = cap -> channel_mode ;
707
717
if ((cap -> channel_mode = a2dp_codec_select_channel_mode (codec , cap_chm , false)) == 0 ) {
708
- error ("MPEG: No supported channel modes: %#x" , cap_chm );
718
+ error ("MPEG: No supported channel modes: %#x" , tmp . mpeg . channel_mode );
709
719
goto fail ;
710
720
}
711
721
722
+ const unsigned int cap_freq = cap -> frequency ;
712
723
if ((cap -> frequency = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) == 0 ) {
713
- error ("MPEG: No supported sampling frequencies: %#x" , cap_freq );
724
+ error ("MPEG: No supported sampling frequencies: %#x" , tmp . mpeg . frequency );
714
725
goto fail ;
715
726
}
716
727
@@ -725,34 +736,34 @@ int a2dp_select_configuration(
725
736
726
737
#if ENABLE_AAC
727
738
case A2DP_CODEC_MPEG24 : {
728
-
729
739
a2dp_aac_t * cap = capabilities ;
730
- unsigned int cap_chm = cap -> channels ;
731
- unsigned int cap_freq = AAC_GET_FREQUENCY (* cap );
732
740
733
- if (cap -> object_type & AAC_OBJECT_TYPE_MPEG4_AAC_SCA )
741
+ const uint8_t cap_object_type = cap -> object_type ;
742
+ if (cap_object_type & AAC_OBJECT_TYPE_MPEG4_AAC_SCA )
734
743
cap -> object_type = AAC_OBJECT_TYPE_MPEG4_AAC_SCA ;
735
- else if (cap -> object_type & AAC_OBJECT_TYPE_MPEG4_AAC_LTP )
744
+ else if (cap_object_type & AAC_OBJECT_TYPE_MPEG4_AAC_LTP )
736
745
cap -> object_type = AAC_OBJECT_TYPE_MPEG4_AAC_LTP ;
737
- else if (cap -> object_type & AAC_OBJECT_TYPE_MPEG4_AAC_LC )
746
+ else if (cap_object_type & AAC_OBJECT_TYPE_MPEG4_AAC_LC )
738
747
cap -> object_type = AAC_OBJECT_TYPE_MPEG4_AAC_LC ;
739
- else if (cap -> object_type & AAC_OBJECT_TYPE_MPEG2_AAC_LC )
748
+ else if (cap_object_type & AAC_OBJECT_TYPE_MPEG2_AAC_LC )
740
749
cap -> object_type = AAC_OBJECT_TYPE_MPEG2_AAC_LC ;
741
750
else {
742
- error ("AAC: No supported object type: %#x" , cap -> object_type );
751
+ error ("AAC: No supported object type: %#x" , tmp . aac . object_type );
743
752
goto fail ;
744
753
}
745
754
755
+ const unsigned int cap_chm = cap -> channels ;
746
756
if ((cap -> channels = a2dp_codec_select_channel_mode (codec , cap_chm , false)) == 0 ) {
747
- error ("AAC: No supported channels: %#x" , cap_chm );
757
+ error ("AAC: No supported channels: %#x" , tmp . aac . channels );
748
758
goto fail ;
749
759
}
750
760
751
761
unsigned int freq ;
762
+ const unsigned int cap_freq = AAC_GET_FREQUENCY (* cap );
752
763
if ((freq = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) != 0 )
753
764
AAC_SET_FREQUENCY (* cap , freq );
754
765
else {
755
- error ("AAC: No supported sampling frequencies: %#x" , cap_freq );
766
+ error ("AAC: No supported sampling frequencies: %#x" , AAC_GET_FREQUENCY ( tmp . aac ) );
756
767
goto fail ;
757
768
}
758
769
@@ -772,18 +783,17 @@ int a2dp_select_configuration(
772
783
773
784
#if ENABLE_APTX
774
785
case A2DP_CODEC_VENDOR_APTX : {
775
-
776
786
a2dp_aptx_t * cap = capabilities ;
777
- unsigned int cap_chm = cap -> channel_mode ;
778
- unsigned int cap_freq = cap -> frequency ;
779
787
788
+ const unsigned int cap_chm = cap -> channel_mode ;
780
789
if ((cap -> channel_mode = a2dp_codec_select_channel_mode (codec , cap_chm , false)) == 0 ) {
781
- error ("apt-X: No supported channel modes: %#x" , cap_chm );
790
+ error ("apt-X: No supported channel modes: %#x" , tmp . aptx . channel_mode );
782
791
goto fail ;
783
792
}
784
793
794
+ const unsigned int cap_freq = cap -> frequency ;
785
795
if ((cap -> frequency = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) == 0 ) {
786
- error ("apt-X: No supported sampling frequencies: %#x" , cap_freq );
796
+ error ("apt-X: No supported sampling frequencies: %#x" , tmp . aptx . frequency );
787
797
goto fail ;
788
798
}
789
799
@@ -793,18 +803,17 @@ int a2dp_select_configuration(
793
803
794
804
#if ENABLE_APTX_HD
795
805
case A2DP_CODEC_VENDOR_APTX_HD : {
796
-
797
806
a2dp_aptx_hd_t * cap = capabilities ;
798
- unsigned int cap_chm = cap -> aptx .channel_mode ;
799
- unsigned int cap_freq = cap -> aptx .frequency ;
800
807
808
+ const unsigned int cap_chm = cap -> aptx .channel_mode ;
801
809
if ((cap -> aptx .channel_mode = a2dp_codec_select_channel_mode (codec , cap_chm , false)) == 0 ) {
802
- error ("apt-X HD: No supported channel modes: %#x" , cap_chm );
810
+ error ("apt-X HD: No supported channel modes: %#x" , tmp . aptx_hd . aptx . channel_mode );
803
811
goto fail ;
804
812
}
805
813
814
+ const unsigned int cap_freq = cap -> aptx .frequency ;
806
815
if ((cap -> aptx .frequency = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) == 0 ) {
807
- error ("apt-X HD: No supported sampling frequencies: %#x" , cap_freq );
816
+ error ("apt-X HD: No supported sampling frequencies: %#x" , tmp . aptx_hd . aptx . frequency );
808
817
goto fail ;
809
818
}
810
819
@@ -814,23 +823,24 @@ int a2dp_select_configuration(
814
823
815
824
#if ENABLE_FASTSTREAM
816
825
case A2DP_CODEC_VENDOR_FASTSTREAM : {
817
-
818
826
a2dp_faststream_t * cap = capabilities ;
819
- unsigned int cap_freq = cap -> frequency_music ;
820
- unsigned int cap_freq_bc = cap -> frequency_voice ;
821
827
828
+ const unsigned int cap_freq = cap -> frequency_music ;
822
829
if ((cap -> frequency_music = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) == 0 ) {
823
- error ("FastStream: No supported sampling frequencies: %#x" , cap_freq );
830
+ error ("FastStream: No supported sampling frequencies: %#x" ,
831
+ tmp .faststream .frequency_music );
824
832
goto fail ;
825
833
}
826
834
835
+ const unsigned int cap_freq_bc = cap -> frequency_voice ;
827
836
if ((cap -> frequency_voice = a2dp_codec_select_sampling_freq (codec , cap_freq_bc , true)) == 0 ) {
828
- error ("FastStream: No supported back-channel sampling frequencies: %#x" , cap_freq_bc );
837
+ error ("FastStream: No supported back-channel sampling frequencies: %#x" ,
838
+ tmp .faststream .frequency_voice );
829
839
goto fail ;
830
840
}
831
841
832
842
if ((cap -> direction & (FASTSTREAM_DIRECTION_MUSIC | FASTSTREAM_DIRECTION_VOICE )) == 0 ) {
833
- error ("FastStream: No supported directions: %#x" , cap -> direction );
843
+ error ("FastStream: No supported directions: %#x" , tmp . faststream . direction );
834
844
}
835
845
836
846
break ;
@@ -839,32 +849,33 @@ int a2dp_select_configuration(
839
849
840
850
#if ENABLE_LC3PLUS
841
851
case A2DP_CODEC_VENDOR_LC3PLUS : {
842
-
843
852
a2dp_lc3plus_t * cap = capabilities ;
844
- unsigned int cap_chm = cap -> channels ;
845
- unsigned int cap_freq = LC3PLUS_GET_FREQUENCY (* cap );
846
853
847
- if (cap -> frame_duration & LC3PLUS_FRAME_DURATION_100 )
854
+ const uint8_t cap_frame_duration = cap -> frame_duration ;
855
+ if (cap_frame_duration & LC3PLUS_FRAME_DURATION_100 )
848
856
cap -> frame_duration = LC3PLUS_FRAME_DURATION_100 ;
849
- else if (cap -> frame_duration & LC3PLUS_FRAME_DURATION_050 )
857
+ else if (cap_frame_duration & LC3PLUS_FRAME_DURATION_050 )
850
858
cap -> frame_duration = LC3PLUS_FRAME_DURATION_050 ;
851
- else if (cap -> frame_duration & LC3PLUS_FRAME_DURATION_025 )
859
+ else if (cap_frame_duration & LC3PLUS_FRAME_DURATION_025 )
852
860
cap -> frame_duration = LC3PLUS_FRAME_DURATION_025 ;
853
861
else {
854
- error ("LC3plus: No supported frame duration: %#x" , cap -> frame_duration );
862
+ error ("LC3plus: No supported frame duration: %#x" , tmp . lc3plus . frame_duration );
855
863
goto fail ;
856
864
}
857
865
866
+ const unsigned int cap_chm = cap -> channels ;
858
867
if ((cap -> channels = a2dp_codec_select_channel_mode (codec , cap_chm , false)) == 0 ) {
859
- error ("LC3plus: No supported channels: %#x" , cap_chm );
868
+ error ("LC3plus: No supported channels: %#x" , tmp . lc3plus . channels );
860
869
goto fail ;
861
870
}
862
871
863
872
unsigned int freq ;
873
+ const unsigned int cap_freq = LC3PLUS_GET_FREQUENCY (* cap );
864
874
if ((freq = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) != 0 )
865
875
LC3PLUS_SET_FREQUENCY (* cap , freq );
866
876
else {
867
- error ("LC3plus: No supported sampling frequencies: %#x" , cap_freq );
877
+ error ("LC3plus: No supported sampling frequencies: %#x" ,
878
+ LC3PLUS_GET_FREQUENCY (tmp .lc3plus ));
868
879
goto fail ;
869
880
}
870
881
@@ -874,18 +885,17 @@ int a2dp_select_configuration(
874
885
875
886
#if ENABLE_LDAC
876
887
case A2DP_CODEC_VENDOR_LDAC : {
877
-
878
888
a2dp_ldac_t * cap = capabilities ;
879
- unsigned int cap_chm = cap -> channel_mode ;
880
- unsigned int cap_freq = cap -> frequency ;
881
889
890
+ const unsigned int cap_chm = cap -> channel_mode ;
882
891
if ((cap -> channel_mode = a2dp_codec_select_channel_mode (codec , cap_chm , false)) == 0 ) {
883
- error ("LDAC: No supported channel modes: %#x" , cap_chm );
892
+ error ("LDAC: No supported channel modes: %#x" , tmp . ldac . channel_mode );
884
893
goto fail ;
885
894
}
886
895
896
+ const unsigned int cap_freq = cap -> frequency ;
887
897
if ((cap -> frequency = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) == 0 ) {
888
- error ("LDAC: No supported sampling frequencies: %#x" , cap_freq );
898
+ error ("LDAC: No supported sampling frequencies: %#x" , tmp . ldac . frequency );
889
899
goto fail ;
890
900
}
891
901
0 commit comments