Re: [RFC BlueZ 1/2] A2DP: Mark start flag if resume happen while in configured state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Luiz,

On Tue, Feb 19, 2013 at 4:30 PM, Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
> Hi Mikel,
>
> On Tue, Feb 19, 2013 at 5:06 PM, Mikel Astiz <mikel.astiz.oss@xxxxxxxxx> wrote:
>> Hi Luiz,
>>
>> On Tue, Feb 19, 2013 at 3:33 PM, Luiz Augusto von Dentz
>> <luiz.dentz@xxxxxxxxx> wrote:
>>> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>>>
>>> If SEP is in configured state that means OPEN is about to happen so just
>>> mark start flag and send START once OPEN completes.
>>> ---
>>>  profiles/audio/a2dp.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++
>>>  1 file changed, 54 insertions(+)
>>>
>>> diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
>>> index f1646ee..d9680a7 100644
>>> --- a/profiles/audio/a2dp.c
>>> +++ b/profiles/audio/a2dp.c
>>> @@ -336,6 +336,20 @@ static struct a2dp_setup *find_setup_by_dev(struct audio_device *dev)
>>>         return NULL;
>>>  }
>>>
>>> +static struct a2dp_setup *find_setup_by_stream(struct avdtp_stream *stream)
>>> +{
>>> +       GSList *l;
>>> +
>>> +       for (l = setups; l != NULL; l = l->next) {
>>> +               struct a2dp_setup *setup = l->data;
>>> +
>>> +               if (setup->stream == stream)
>>> +                       return setup;
>>> +       }
>>> +
>>> +       return NULL;
>>> +}
>>> +
>>>  static void stream_state_changed(struct avdtp_stream *stream,
>>>                                         avdtp_state_t old_state,
>>>                                         avdtp_state_t new_state,
>>> @@ -344,6 +358,29 @@ static void stream_state_changed(struct avdtp_stream *stream,
>>>  {
>>>         struct a2dp_sep *sep = user_data;
>>>
>>> +       if (new_state == AVDTP_STATE_OPEN) {
>>> +               struct a2dp_setup *setup;
>>> +               int err;
>>> +
>>> +               setup = find_setup_by_stream(stream);
>>> +               if (!setup || !setup->start)
>>> +                       return;
>>> +
>>> +               setup->start = FALSE;
>>> +
>>> +               err = avdtp_start(setup->session, stream);
>>> +               if (err < 0 && err != -EINPROGRESS) {
>>> +                       error("avdtp_start: %s (%d)", strerror(-err), -err);
>>> +                       finalize_setup_errno(setup, err, finalize_resume,
>>> +                                                                       NULL);
>>> +                       return;
>>> +               }
>>> +
>>> +               sep->starting = TRUE;
>>> +
>>> +               return;
>>> +       }
>>> +
>>
>> Shouldn't you handle the error case here? Any other transition from
>> AVDTP_STATE_CONFIGURED should probably be considered a failure.
>
> The failure case is where OPEN fails, which is handled by open_ind and
> open_cfm, or if stream connection timeout which will generate an ABORT
> that takes care of terminating the setup.
>
>>>         if (new_state != AVDTP_STATE_IDLE)
>>>                 return;
>>>
>>> @@ -661,6 +698,12 @@ static gboolean open_ind(struct avdtp *session, struct avdtp_local_sep *sep,
>>>
>>>         finalize_config(setup);
>>>
>>> +       if (!setup->start || !err)
>>> +               return TRUE;
>>> +
>>> +       setup->start = FALSE;
>>> +       finalize_resume(setup);
>>> +
>>>         return TRUE;
>>>  }
>>>
>>> @@ -689,6 +732,14 @@ static void open_cfm(struct avdtp *session, struct avdtp_local_sep *sep,
>>>         }
>>>
>>>         finalize_config(setup);
>>> +
>>> +       if (!setup->start || !err)
>>> +               return;
>>> +
>>> +       setup->start = FALSE;
>>> +       finalize_resume(setup);
>>> +
>>> +       return;
>>>  }
>>>
>>>  static gboolean suspend_timeout(struct a2dp_sep *sep)
>>> @@ -1718,6 +1769,9 @@ unsigned int a2dp_resume(struct avdtp *session, struct a2dp_sep *sep,
>>>         case AVDTP_STATE_IDLE:
>>>                 goto failed;
>>>                 break;
>>> +       case AVDTP_STATE_CONFIGURED:
>>> +               setup->start = TRUE;
>>> +               break;
>>>         case AVDTP_STATE_OPEN:
>>>                 if (avdtp_start(session, sep->stream) < 0) {
>>>                         error("avdtp_start failed");
>>> --
>>
>> This alternative has the obvious advantage of not introducing an
>> additional state to the transport and simpler APIs are generally good.
>>
>> However, I see little benefit in the client's side and the
>> implementation gets a bit tricky in the server's side (BlueZ and
>> oFono).
>>
>> I'd personally prefer to go simple and make this state explicit,
>> instead of trying to internally defer the operation.
>
> I don't see this as being so complicated, in fact it is probably less
> code than having to deal with another state because nothing has to be
> changed in the clients, start flag is actually already there in case
> the client resume while we are waiting for suspend to complete and for
> HFP there is probably no  mapping to configuring state since the SCO
> configuration is managed by the kernel.

Ack from my side.

Cheers,
Mikel
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux