mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
parent
343be7503a
commit
43603dd75d
2 changed files with 39 additions and 9 deletions
|
|
@ -55,8 +55,9 @@ struct impl {
|
||||||
HANDLE_LDAC_BT ldac;
|
HANDLE_LDAC_BT ldac;
|
||||||
#ifdef ENABLE_LDAC_ABR
|
#ifdef ENABLE_LDAC_ABR
|
||||||
HANDLE_LDAC_ABR ldac_abr;
|
HANDLE_LDAC_ABR ldac_abr;
|
||||||
bool enable_abr;
|
|
||||||
#endif
|
#endif
|
||||||
|
bool enable_abr;
|
||||||
|
|
||||||
struct rtp_header *header;
|
struct rtp_header *header;
|
||||||
struct rtp_payload *payload;
|
struct rtp_payload *payload;
|
||||||
|
|
||||||
|
|
@ -274,11 +275,11 @@ static int update_frame_info(struct impl *this)
|
||||||
static int codec_reduce_bitpool(void *data)
|
static int codec_reduce_bitpool(void *data)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_LDAC_ABR
|
#ifdef ENABLE_LDAC_ABR
|
||||||
return -EINVAL;
|
return -ENOTSUP;
|
||||||
#else
|
#else
|
||||||
struct impl *this = data;
|
struct impl *this = data;
|
||||||
int res;
|
int res;
|
||||||
if (this->eqmid == LDACBT_EQMID_BITRATE_330000)
|
if (this->eqmid == LDACBT_EQMID_BITRATE_330000 || !this->enable_abr)
|
||||||
return this->eqmid;
|
return this->eqmid;
|
||||||
res = ldacBT_alter_eqmid_priority(this->ldac, LDACBT_EQMID_INC_CONNECTION);
|
res = ldacBT_alter_eqmid_priority(this->ldac, LDACBT_EQMID_INC_CONNECTION);
|
||||||
update_frame_info(this);
|
update_frame_info(this);
|
||||||
|
|
@ -289,10 +290,12 @@ static int codec_reduce_bitpool(void *data)
|
||||||
static int codec_increase_bitpool(void *data)
|
static int codec_increase_bitpool(void *data)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_LDAC_ABR
|
#ifdef ENABLE_LDAC_ABR
|
||||||
return -EINVAL;
|
return -ENOTSUP;
|
||||||
#else
|
#else
|
||||||
struct impl *this = data;
|
struct impl *this = data;
|
||||||
int res;
|
int res;
|
||||||
|
if (!this->enable_abr)
|
||||||
|
return this->eqmid;
|
||||||
res = ldacBT_alter_eqmid_priority(this->ldac, LDACBT_EQMID_INC_QUALITY);
|
res = ldacBT_alter_eqmid_priority(this->ldac, LDACBT_EQMID_INC_QUALITY);
|
||||||
update_frame_info(this);
|
update_frame_info(this);
|
||||||
return res;
|
return res;
|
||||||
|
|
@ -311,6 +314,20 @@ static int codec_get_block_size(void *data)
|
||||||
return this->codesize;
|
return this->codesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int string_to_eqmid(const char * eqmid)
|
||||||
|
{
|
||||||
|
if (!strcmp("auto", eqmid))
|
||||||
|
return LDACBT_EQMID_ABR;
|
||||||
|
else if (!strcmp("hq", eqmid))
|
||||||
|
return LDACBT_EQMID_HQ;
|
||||||
|
else if (!strcmp("sq", eqmid))
|
||||||
|
return LDACBT_EQMID_SQ;
|
||||||
|
else if (!strcmp("mq", eqmid))
|
||||||
|
return LDACBT_EQMID_MQ;
|
||||||
|
else
|
||||||
|
return LDACBT_EQMID_ABR;
|
||||||
|
}
|
||||||
|
|
||||||
static void *codec_init(const struct a2dp_codec *codec, uint32_t flags,
|
static void *codec_init(const struct a2dp_codec *codec, uint32_t flags,
|
||||||
void *config, size_t config_len, const struct spa_audio_info *info,
|
void *config, size_t config_len, const struct spa_audio_info *info,
|
||||||
const struct spa_dict *settings, size_t mtu)
|
const struct spa_dict *settings, size_t mtu)
|
||||||
|
|
@ -318,6 +335,7 @@ static void *codec_init(const struct a2dp_codec *codec, uint32_t flags,
|
||||||
struct impl *this;
|
struct impl *this;
|
||||||
a2dp_ldac_t *conf = config;
|
a2dp_ldac_t *conf = config;
|
||||||
int res;
|
int res;
|
||||||
|
const char *str;
|
||||||
|
|
||||||
this = calloc(1, sizeof(struct impl));
|
this = calloc(1, sizeof(struct impl));
|
||||||
if (this == NULL)
|
if (this == NULL)
|
||||||
|
|
@ -333,7 +351,14 @@ static void *codec_init(const struct a2dp_codec *codec, uint32_t flags,
|
||||||
goto error_errno;
|
goto error_errno;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
this->eqmid = LDACBT_EQMID_SQ;
|
if ((str = spa_dict_lookup(settings, "bluez5.a2dp.ldac.quality")) == NULL)
|
||||||
|
str = "auto";
|
||||||
|
|
||||||
|
if ((this->eqmid = string_to_eqmid(str)) == LDACBT_EQMID_ABR) {
|
||||||
|
this->eqmid = LDACBT_EQMID_SQ;
|
||||||
|
this->enable_abr = true;
|
||||||
|
}
|
||||||
|
|
||||||
this->mtu = mtu;
|
this->mtu = mtu;
|
||||||
this->frequency = info->info.raw.rate;
|
this->frequency = info->info.raw.rate;
|
||||||
this->codesize = info->info.raw.channels;
|
this->codesize = info->info.raw.channels;
|
||||||
|
|
@ -397,8 +422,6 @@ static void *codec_init(const struct a2dp_codec *codec, uint32_t flags,
|
||||||
LDAC_ABR_THRESHOLD_SAFETY_FOR_HQSQ);
|
LDAC_ABR_THRESHOLD_SAFETY_FOR_HQSQ);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
this->enable_abr = true;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
update_frame_info(this);
|
update_frame_info(this);
|
||||||
|
|
@ -441,7 +464,7 @@ static int codec_abr_process(void *data, size_t unsent)
|
||||||
update_frame_info(this);
|
update_frame_info(this);
|
||||||
return res;
|
return res;
|
||||||
#else
|
#else
|
||||||
return -EINVAL;
|
return -ENOTSUP;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,14 @@ rules = [
|
||||||
# Actions can update properties on the matched object.
|
# Actions can update properties on the matched object.
|
||||||
update-props = {
|
update-props = {
|
||||||
# MSBC is not expected to work on all headset + adapter combinations.
|
# MSBC is not expected to work on all headset + adapter combinations.
|
||||||
#bluez5.msbc-support = true
|
#bluez5.msbc-support = false
|
||||||
|
|
||||||
|
# LDAC encoding quality
|
||||||
|
# Available values: auto (Adaptive Bitrate, default)
|
||||||
|
# hq (High Quality, 990/909kbps)
|
||||||
|
# sq (Standard Quality, 660/606kbps)
|
||||||
|
# mq (Mobile use Quality, 330/303kbps)
|
||||||
|
#bluez5.a2dp.ldac.quality = auto
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue