[pulseaudio-discuss] [PATCH v13 07/10] bluetooth: Add more variants of SBC codec
Georg Chini
georg at chini.tk
Sun Feb 2 17:46:24 UTC 2020
On 02.02.20 14:08, Pali Rohár wrote:
> On Thursday 23 January 2020 12:29:15 Georg Chini wrote:
>>> On Tuesday 21 January 2020 16:17:16 Georg Chini wrote:
>> ...
>>>>> +}
>>>>> +
>>>>> +static bool can_accept_capabilities_xq2(const uint8_t *capabilities_buffer, uint8_t capabilities_size, bool for_encoding) {
>>>>> + return can_accept_capabilities_table(capabilities_buffer, capabilities_size, sbc_xq2_caps_table, PA_ELEMENTSOF(sbc_xq2_caps_table));
>>>>> +}
>>>>> +
>>>>> +static const char *choose_remote_endpoint_table(const pa_hashmap *capabilities_hashmap, const pa_sample_spec *default_sample_spec, const a2dp_sbc_t capabilities_table[], unsigned capabilities_table_elements) {
>>>>> const pa_a2dp_codec_capabilities *a2dp_capabilities;
>>>>> + const a2dp_sbc_t *capabilities;
>>>>> const char *key;
>>>>> void *state;
>>>>> + unsigned i;
>>>>> + uint8_t table_range;
>>>>> + uint8_t current_range;
>>>>> + const char *best_key = NULL;
>>>>> + uint8_t best_range = 0;
>>>>> + uint8_t frequency = 0;
>>>>> + bool is_mono = (default_sample_spec->channels <= 1);
>>>>> +
>>>>> + static const struct {
>>>>> + uint32_t rate;
>>>>> + uint8_t cap;
>>>>> + } freq_table[] = {
>>>>> + { 16000U, SBC_SAMPLING_FREQ_16000 },
>>>>> + { 32000U, SBC_SAMPLING_FREQ_32000 },
>>>>> + { 44100U, SBC_SAMPLING_FREQ_44100 },
>>>>> + { 48000U, SBC_SAMPLING_FREQ_48000 }
>>>>> + };
>>>>> +
>>>>> + for (i = 0; i < PA_ELEMENTSOF(freq_table); i++) {
>>>>> + if (freq_table[i].rate == default_sample_spec->rate) {
>>>> Is an exact match necessary here? Or would >= be OK as well?
>>> For fixed SBC profiles we need to check for exact frequency. As there
>>> are specific bitpool values for specific frequency.
>> Sure, in the end we will use one of the specific frequencies.
>> But need the default_sample_spec already contain the exact frequency?
>> Or can we choose the one nearest to default_sample_spec->rate?
> Here we compare SBC freq capability with pulseaudio internal frequency.
> So non-exact nearest frequency could be used too.
I think you do that for the other codecs as well.
>>>>> +
>>>>> + table_range = capabilities_table[i].max_bitpool - capabilities_table[i].min_bitpool;
>>>>> +
>>>>> + /* use current remote capabilities if its bitpool range is closer to bitpool range in table */
>>>>> + if (!best_key || abs((int)current_range - (int)(table_range)) < abs((int)best_range - (int)(table_range))) {
>>>>> + best_range = current_range;
>>>>> + best_key = key;
>>>>> + }
>>>> Does that best_key evaluation really make sense? current_range and
>>>> table_range will both be 0 in all
>>>> cases except for the sbc_auto_caps case and in that case there is only one
>>>> possible element in the table.
>>> I written this code prior to defining final list of SBC profiles. So
>>> code was prepared to work with any list of SBC definitions.
>>>
>>> Maybe you are right that for currently defined SBC profiles it is not
>>> needed, but I wanted that current code would work with any SBC profile
>>> table definition.
>> I don't think that makes sense. In are_configs_compatible() you rely on the
>> fact that the table entries only contain a single bitpool value.
> That is because all currently defined profiles (except auto) have fixed
> bitpool value.
Do you intend to add any other profile which would require a variable
bitpool?
If you don't have any use case, please drop it.
More information about the pulseaudio-discuss
mailing list