~cyphermox/+junk/bluez-debug

« back to all changes in this revision

Viewing changes to audio/avdtp.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2011-08-01 16:07:29 UTC
  • mfrom: (1.1.35 upstream)
  • Revision ID: james.westby@ubuntu.com-20110801160729-s7bv7bh6u4o5vhlc
Tags: 4.96-0ubuntu1
New upstream version

Show diffs side-by-side

added added

removed removed

Lines of Context:
378
378
        guint idle_timer;
379
379
        gboolean delay_reporting;
380
380
        uint16_t delay;         /* AVDTP 1.3 Delay Reporting feature */
 
381
        gboolean starting;      /* only valid while sep state == OPEN */
381
382
};
382
383
 
383
384
/* Structure describing an AVDTP connection between two devices */
1065
1066
                        avdtp_delay_report(session, stream, stream->delay);
1066
1067
                break;
1067
1068
        case AVDTP_STATE_OPEN:
 
1069
                stream->starting = FALSE;
1068
1070
                if (old_state > AVDTP_STATE_OPEN && session->auto_dc)
1069
1071
                        stream->idle_timer = g_timeout_add_seconds(STREAM_TIMEOUT,
1070
1072
                                                                stream_timeout,
1708
1710
 
1709
1711
                stream = sep->stream;
1710
1712
 
1711
 
                if (sep->state != AVDTP_STATE_OPEN) {
 
1713
                /* Also reject start cmd if we already initiated start */
 
1714
                if (sep->state != AVDTP_STATE_OPEN ||
 
1715
                                                stream->starting == TRUE) {
1712
1716
                        err = AVDTP_BAD_STATE;
1713
1717
                        goto failed;
1714
1718
                }
 
1719
                stream->starting = TRUE;
1715
1720
 
1716
1721
                if (sep->ind && sep->ind->start) {
1717
1722
                        if (!sep->ind->start(session, sep, stream, &err,
1726
1731
                                                AVDTP_START, NULL, 0);
1727
1732
 
1728
1733
failed:
 
1734
        DBG("Rejecting (%d)", err);
1729
1735
        memset(&rej, 0, sizeof(rej));
1730
1736
        rej.acp_seid = failed_seid;
1731
1737
        rej.error = err;
2580
2586
                break;
2581
2587
        case AVDTP_START:
2582
2588
                error("Start: %s (%d)", strerror(err), err);
2583
 
                if (lsep && lsep->cfm && lsep->cfm->start)
 
2589
                if (lsep && lsep->cfm && lsep->cfm->start) {
2584
2590
                        lsep->cfm->start(session, lsep, stream, &averr,
2585
2591
                                                lsep->user_data);
 
2592
                        if (stream)
 
2593
                                stream->starting = FALSE;
 
2594
                }
2586
2595
                break;
2587
2596
        case AVDTP_SUSPEND:
2588
2597
                error("Suspend: %s (%d)", strerror(err), err);
3087
3096
                        return FALSE;
3088
3097
                error("START request rejected: %s (%d)",
3089
3098
                                avdtp_strerror(&err), err.err.error_code);
3090
 
                if (sep && sep->cfm && sep->cfm->start)
 
3099
                if (sep && sep->cfm && sep->cfm->start) {
3091
3100
                        sep->cfm->start(session, sep, stream, &err,
3092
3101
                                        sep->user_data);
 
3102
                        stream->starting = FALSE;
 
3103
                }
3093
3104
                return TRUE;
3094
3105
        case AVDTP_SUSPEND:
3095
3106
                if (!stream_rej_to_err(buf, size, &err, &acp_seid))
3547
3558
int avdtp_start(struct avdtp *session, struct avdtp_stream *stream)
3548
3559
{
3549
3560
        struct start_req req;
 
3561
        int ret;
3550
3562
 
3551
3563
        if (!g_slist_find(session->streams, stream))
3552
3564
                return -EINVAL;
3559
3571
                return -EINVAL;
3560
3572
        }
3561
3573
 
 
3574
        if (stream->starting == TRUE) {
 
3575
                DBG("stream already started");
 
3576
                return -EINVAL;
 
3577
        }
 
3578
 
3562
3579
        memset(&req, 0, sizeof(req));
3563
3580
        req.first_seid.seid = stream->rseid;
3564
3581
 
3565
 
        return send_request(session, FALSE, stream, AVDTP_START,
 
3582
        ret = send_request(session, FALSE, stream, AVDTP_START,
3566
3583
                                                        &req, sizeof(req));
 
3584
        if (ret == 0)
 
3585
                stream->starting = TRUE;
 
3586
 
 
3587
        return ret;
3567
3588
}
3568
3589
 
3569
3590
int avdtp_close(struct avdtp *session, struct avdtp_stream *stream,