11/*
22 * BlueALSA - a2dp.c
3- * Copyright (c) 2016-2022 Arkadiusz Bokowy
3+ * Copyright (c) 2016-2023 Arkadiusz Bokowy
44 *
55 * This file is a part of bluez-alsa.
66 *
@@ -628,15 +628,21 @@ int a2dp_select_configuration(
628628 return errno = EINVAL , -1 ;
629629 }
630630
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+
631639 switch (codec -> codec_id ) {
632640 case A2DP_CODEC_SBC : {
633-
634641 a2dp_sbc_t * cap = capabilities ;
635- unsigned int cap_chm = cap -> channel_mode ;
636- unsigned int cap_freq = cap -> frequency ;
637642
643+ const unsigned int cap_chm = cap -> channel_mode ;
638644 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 );
640646 goto fail ;
641647 }
642648
@@ -645,72 +651,77 @@ int a2dp_select_configuration(
645651 if (cap_chm & SBC_CHANNEL_MODE_DUAL_CHANNEL )
646652 cap -> channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL ;
647653 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 );
649655 }
650656
657+ const unsigned int cap_freq = cap -> frequency ;
651658 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 );
653660 goto fail ;
654661 }
655662
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 )
657665 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 )
659667 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 )
661669 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 )
663671 cap -> block_length = SBC_BLOCK_LENGTH_4 ;
664672 else {
665- error ("SBC: No supported block lengths: %#x" , cap -> block_length );
673+ error ("SBC: No supported block lengths: %#x" , tmp . sbc . block_length );
666674 goto fail ;
667675 }
668676
669- if (cap -> subbands & SBC_SUBBANDS_8 )
677+ const uint8_t cap_subbands = cap -> subbands ;
678+ if (cap_subbands & SBC_SUBBANDS_8 )
670679 cap -> subbands = SBC_SUBBANDS_8 ;
671- else if (cap -> subbands & SBC_SUBBANDS_4 )
680+ else if (cap_subbands & SBC_SUBBANDS_4 )
672681 cap -> subbands = SBC_SUBBANDS_4 ;
673682 else {
674- error ("SBC: No supported sub-bands: %#x" , cap -> subbands );
683+ error ("SBC: No supported sub-bands: %#x" , tmp . sbc . subbands );
675684 goto fail ;
676685 }
677686
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 )
679689 cap -> allocation_method = SBC_ALLOCATION_LOUDNESS ;
680- else if (cap -> allocation_method & SBC_ALLOCATION_SNR )
690+ else if (cap_allocation_method & SBC_ALLOCATION_SNR )
681691 cap -> allocation_method = SBC_ALLOCATION_SNR ;
682692 else {
683- error ("SBC: No supported allocation method: %#x" , cap -> allocation_method );
693+ error ("SBC: No supported allocation method: %#x" , tmp . sbc . allocation_method );
684694 goto fail ;
685695 }
686696
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-
690697 break ;
691698 }
692699
693700#if ENABLE_MPEG
694701 case A2DP_CODEC_MPEG12 : {
695-
696702 a2dp_mpeg_t * cap = capabilities ;
697- unsigned int cap_chm = cap -> channel_mode ;
698- unsigned int cap_freq = cap -> frequency ;
699703
700- if (cap -> layer & MPEG_LAYER_MP3 )
704+ const uint8_t cap_layer = cap -> layer ;
705+ if (cap_layer & MPEG_LAYER_MP3 )
701706 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 ;
702711 else {
703- error ("MPEG: No supported layer: %#x" , cap -> layer );
712+ error ("MPEG: No supported layer: %#x" , tmp . mpeg . layer );
704713 goto fail ;
705714 }
706715
716+ const unsigned int cap_chm = cap -> channel_mode ;
707717 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 );
709719 goto fail ;
710720 }
711721
722+ const unsigned int cap_freq = cap -> frequency ;
712723 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 );
714725 goto fail ;
715726 }
716727
@@ -725,34 +736,34 @@ int a2dp_select_configuration(
725736
726737#if ENABLE_AAC
727738 case A2DP_CODEC_MPEG24 : {
728-
729739 a2dp_aac_t * cap = capabilities ;
730- unsigned int cap_chm = cap -> channels ;
731- unsigned int cap_freq = AAC_GET_FREQUENCY (* cap );
732740
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 )
734743 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 )
736745 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 )
738747 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 )
740749 cap -> object_type = AAC_OBJECT_TYPE_MPEG2_AAC_LC ;
741750 else {
742- error ("AAC: No supported object type: %#x" , cap -> object_type );
751+ error ("AAC: No supported object type: %#x" , tmp . aac . object_type );
743752 goto fail ;
744753 }
745754
755+ const unsigned int cap_chm = cap -> channels ;
746756 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 );
748758 goto fail ;
749759 }
750760
751761 unsigned int freq ;
762+ const unsigned int cap_freq = AAC_GET_FREQUENCY (* cap );
752763 if ((freq = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) != 0 )
753764 AAC_SET_FREQUENCY (* cap , freq );
754765 else {
755- error ("AAC: No supported sampling frequencies: %#x" , cap_freq );
766+ error ("AAC: No supported sampling frequencies: %#x" , AAC_GET_FREQUENCY ( tmp . aac ) );
756767 goto fail ;
757768 }
758769
@@ -772,18 +783,17 @@ int a2dp_select_configuration(
772783
773784#if ENABLE_APTX
774785 case A2DP_CODEC_VENDOR_APTX : {
775-
776786 a2dp_aptx_t * cap = capabilities ;
777- unsigned int cap_chm = cap -> channel_mode ;
778- unsigned int cap_freq = cap -> frequency ;
779787
788+ const unsigned int cap_chm = cap -> channel_mode ;
780789 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 );
782791 goto fail ;
783792 }
784793
794+ const unsigned int cap_freq = cap -> frequency ;
785795 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 );
787797 goto fail ;
788798 }
789799
@@ -793,18 +803,17 @@ int a2dp_select_configuration(
793803
794804#if ENABLE_APTX_HD
795805 case A2DP_CODEC_VENDOR_APTX_HD : {
796-
797806 a2dp_aptx_hd_t * cap = capabilities ;
798- unsigned int cap_chm = cap -> aptx .channel_mode ;
799- unsigned int cap_freq = cap -> aptx .frequency ;
800807
808+ const unsigned int cap_chm = cap -> aptx .channel_mode ;
801809 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 );
803811 goto fail ;
804812 }
805813
814+ const unsigned int cap_freq = cap -> aptx .frequency ;
806815 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 );
808817 goto fail ;
809818 }
810819
@@ -814,23 +823,24 @@ int a2dp_select_configuration(
814823
815824#if ENABLE_FASTSTREAM
816825 case A2DP_CODEC_VENDOR_FASTSTREAM : {
817-
818826 a2dp_faststream_t * cap = capabilities ;
819- unsigned int cap_freq = cap -> frequency_music ;
820- unsigned int cap_freq_bc = cap -> frequency_voice ;
821827
828+ const unsigned int cap_freq = cap -> frequency_music ;
822829 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 );
824832 goto fail ;
825833 }
826834
835+ const unsigned int cap_freq_bc = cap -> frequency_voice ;
827836 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 );
829839 goto fail ;
830840 }
831841
832842 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 );
834844 }
835845
836846 break ;
@@ -839,32 +849,33 @@ int a2dp_select_configuration(
839849
840850#if ENABLE_LC3PLUS
841851 case A2DP_CODEC_VENDOR_LC3PLUS : {
842-
843852 a2dp_lc3plus_t * cap = capabilities ;
844- unsigned int cap_chm = cap -> channels ;
845- unsigned int cap_freq = LC3PLUS_GET_FREQUENCY (* cap );
846853
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 )
848856 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 )
850858 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 )
852860 cap -> frame_duration = LC3PLUS_FRAME_DURATION_025 ;
853861 else {
854- error ("LC3plus: No supported frame duration: %#x" , cap -> frame_duration );
862+ error ("LC3plus: No supported frame duration: %#x" , tmp . lc3plus . frame_duration );
855863 goto fail ;
856864 }
857865
866+ const unsigned int cap_chm = cap -> channels ;
858867 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 );
860869 goto fail ;
861870 }
862871
863872 unsigned int freq ;
873+ const unsigned int cap_freq = LC3PLUS_GET_FREQUENCY (* cap );
864874 if ((freq = a2dp_codec_select_sampling_freq (codec , cap_freq , false)) != 0 )
865875 LC3PLUS_SET_FREQUENCY (* cap , freq );
866876 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 ));
868879 goto fail ;
869880 }
870881
@@ -874,18 +885,17 @@ int a2dp_select_configuration(
874885
875886#if ENABLE_LDAC
876887 case A2DP_CODEC_VENDOR_LDAC : {
877-
878888 a2dp_ldac_t * cap = capabilities ;
879- unsigned int cap_chm = cap -> channel_mode ;
880- unsigned int cap_freq = cap -> frequency ;
881889
890+ const unsigned int cap_chm = cap -> channel_mode ;
882891 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 );
884893 goto fail ;
885894 }
886895
896+ const unsigned int cap_freq = cap -> frequency ;
887897 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 );
889899 goto fail ;
890900 }
891901
0 commit comments