[pulseaudio-discuss] [PATCH v4 3/8] bluetooth: ofono: Detect if Connect has been called

Georg Chini georg at chini.tk
Wed May 3 19:04:41 UTC 2017


On 03.05.2017 19:18, Luiz Augusto von Dentz wrote:
> Hi Georg,
>
> On Sat, Apr 29, 2017 at 4:01 PM, Georg Chini <georg at chini.tk> wrote:
>> On 29.04.2017 13:28, Georg Chini wrote:
>>> On 26.04.2017 14:19, Luiz Augusto von Dentz wrote:
>>>> From: Luiz Augusto von Dentz <luiz.von.dentz at intel.com>
>>>>
>>>> This detects if profile has already been called and we are waiting
>>>> the response.
>>>> ---
>>>>    src/modules/bluetooth/backend-ofono.c | 19 ++++++++++++++++---
>>>>    1 file changed, 16 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git a/src/modules/bluetooth/backend-ofono.c
>>>> b/src/modules/bluetooth/backend-ofono.c
>>>> index 3fbf153..a847ad0 100644
>>>> --- a/src/modules/bluetooth/backend-ofono.c
>>>> +++ b/src/modules/bluetooth/backend-ofono.c
>>>> @@ -65,6 +65,7 @@ struct hf_audio_card {
>>>>        char *remote_address;
>>>>        char *local_address;
>>>>    +    bool connecting;
>>>>        int fd;
>>>>        uint8_t codec;
>>>>    @@ -156,12 +157,22 @@ static int
>>>> hf_audio_agent_transport_acquire(pa_bluetooth_transport *t, bool opti
>>>>        pa_assert(card);
>>>>          if (!optional && card->fd < 0) {
>>>> -        DBusMessage *m;
>>>> +        DBusMessage *m, *r;
>>>> +        DBusError derr;
>>>>    +        if (card->connecting)
>>>> +            return -1;
>>>> +
>>>> +        card->connecting = true;
>>>> +
>>>> +        dbus_error_init(&derr);
>>>>            pa_assert_se(m = dbus_message_new_method_call(t->owner,
>>>> t->path, "org.ofono.HandsfreeAudioCard", "Connect"));
>>>> -
>>>> pa_assert_se(dbus_connection_send(pa_dbus_connection_get(card->backend->connection),
>>>> m, NULL));
>>>> +        r =
>>>> dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(card->backend->connection),
>>>> m, -1, &derr);
>>>> +        if (!r)
>>>> +            return -1;
>>>>    -        return -1;
>>>> +        if (card->connecting)
>>>> +            return -1;
>>>>        }
>>>>          /* The correct block size should take into account the SCO MTU
>>>> from
>>>> @@ -535,6 +546,8 @@ static DBusMessage
>>>> *hf_audio_agent_new_connection(DBusConnection *c, DBusMessage
>>>>          card = pa_hashmap_get(backend->cards, path);
>>>>    +    card->connecting = false;
>>>
>>> Should card->connecting not be set to false immediately after entering
>>> hf_audio_agent_new_connection()? If you set it here, the card will never
>>> be able to connect again if the sender was wrong or
>>> dbus_message_get_args() fails. Or do you expect there will be another
>>> call to hf_audio_agent_new_connection() in these cases.
>> Sorry, I did not see that the card is not known before that point, so that
>> you can't set the flag before.
>> But nevertheless the question remains what to do if one of the
>> two errors occurs. Maybe you could do the dbus_message_get_args()
>> first to identify the card. I don't know enough about the DBUS API,
>> if only one argument is wrong in dbus_message_get_args(), will the other
>> values be set anyway? If yes you could even try after a failure
>> if the path is set.
>
> This is the earliest we can know that the NewConnection is for the
> card connecting since there could be multiple cards connecting we do
> need dbus_message_get_args to complete, and no I don't think it can
> parse partially as the signature doesn't match, anyway that would be
> something completely wrong with ofono or something is taking its name
> and pretending to be it, so I guess we are doing the right thing here,
> though we probably need to add a card->connection = false to
> hf_audio_agent_transport_release in case it never resumes.
>
>
>
Yes, you are right. It does not help much to swap the calls. So I'm OK
with the patch.



More information about the pulseaudio-discuss mailing list