예제 #1
0
/*******************************************************************************
**
** Function         avdt_ccb_snd_msg
**
** Description
**
**
** Returns          void.
**
*******************************************************************************/
void avdt_ccb_snd_msg(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
{
    BT_HDR      *p_msg;
    UNUSED(p_data);

    /* if not congested */
    if (!p_ccb->cong)
    {
        /* are we sending a fragmented message? continue sending fragment */
        if (p_ccb->p_curr_msg != NULL)
        {
            avdt_msg_send(p_ccb, NULL);
        }
        /* do we have responses to send?  send them */
        else if (!GKI_queue_is_empty(&p_ccb->rsp_q))
        {
            while ((p_msg = (BT_HDR *) GKI_dequeue(&p_ccb->rsp_q)) != NULL)
            {
                if (avdt_msg_send(p_ccb, p_msg) == TRUE)
                {
                    /* break out if congested */
                    break;
                }
            }
        }

        /* do we have commands to send?  send next command */
        avdt_ccb_snd_cmd(p_ccb, NULL);
    }
}
예제 #2
0
/*******************************************************************************
**
** Function         avdt_ccb_ret_cmd
**
** Description      This function is called to retransmit the currently
**                  pending command.  The retransmission count is incremented.
**                  If the count reaches the maximum number of retransmissions,
**                  the event is treated as a response timeout.
**
**
** Returns          void.
**
*******************************************************************************/
void avdt_ccb_ret_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
{
    UINT8   err_code = AVDT_ERR_TIMEOUT;
    BT_HDR  *p_msg;

    p_ccb->ret_count++;
    if (p_ccb->ret_count == AVDT_RET_MAX)
    {
        /* command failed */
        p_ccb->ret_count = 0;
        avdt_ccb_cmd_fail(p_ccb, (tAVDT_CCB_EVT *) &err_code);

        /* go to next queued command */
        avdt_ccb_snd_cmd(p_ccb, p_data);
    }
    else
    {
        /* if command pending and we're not congested and not sending a fragment */
        if ((!p_ccb->cong) && (p_ccb->p_curr_msg == NULL) && (p_ccb->p_curr_cmd != NULL))
        {
            /* make copy of message in p_curr_cmd and send it */
            if ((p_msg = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID)) != NULL)
            {
                memcpy(p_msg, p_ccb->p_curr_cmd,
                       (sizeof(BT_HDR) + p_ccb->p_curr_cmd->offset + p_ccb->p_curr_cmd->len));
                avdt_msg_send(p_ccb, p_msg);
            }
        }

        /* restart timer */
        btu_start_timer(&p_ccb->timer_entry, BTU_TTYPE_AVDT_CCB_RET, avdt_cb.rcb.ret_tout);
    }
}
예제 #3
0
파일: avdt_ccb_act.c 프로젝트: tve/esp-idf
/*******************************************************************************
**
** Function         avdt_ccb_snd_cmd
**
** Description      This function is called the send the next command,
**                  if any, in the command queue.
**
**
** Returns          void.
**
*******************************************************************************/
void avdt_ccb_snd_cmd(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
{
    BT_HDR  *p_msg;
    UNUSED(p_data);

    /* do we have commands to send?  send next command;  make sure we're clear;
    ** not congested, not sending fragment, not waiting for response
    */
    if ((!p_ccb->cong) && (p_ccb->p_curr_msg == NULL) && (p_ccb->p_curr_cmd == NULL)) {
        if ((p_msg = (BT_HDR *) fixed_queue_try_dequeue(p_ccb->cmd_q)) != NULL) {
            /* make a copy of buffer in p_curr_cmd */
            if ((p_ccb->p_curr_cmd = (BT_HDR *) osi_malloc(AVDT_CMD_BUF_SIZE)) != NULL) {
                memcpy(p_ccb->p_curr_cmd, p_msg, (sizeof(BT_HDR) + p_msg->offset + p_msg->len));

                avdt_msg_send(p_ccb, p_msg);
            }
        }
    }
}