int avctp_send_vendordep(struct avctp *session, uint8_t transaction, uint8_t code, uint8_t subunit, uint8_t *operands, size_t operand_count) { return avctp_send(session, transaction, AVCTP_RESPONSE, code, subunit, AVC_OP_VENDORDEP, operands, operand_count); }
static int process_control(void *data) { struct avctp_control_req *req = data; struct avctp_pending_req *p = req->p; return avctp_send(p->chan, p->transaction, AVCTP_COMMAND, req->code, req->subunit, req->op, req->operands, req->operand_count); }
int avctp_send_vendordep(struct avctp *session, uint8_t transaction, uint8_t code, uint8_t subunit, uint8_t *operands, size_t operand_count) { struct avctp_channel *control = session->control; if (control == NULL) return -ENOTCONN; return avctp_send(control, transaction, AVCTP_RESPONSE, code, subunit, AVC_OP_VENDORDEP, operands, operand_count); }
static int process_passthrough(void *data) { struct avctp_control_req *req = data; struct avctp_pending_req *p = req->p; int ret; ret = avctp_send(p->queue->chan, p->transaction, AVCTP_COMMAND, req->code, req->subunit, req->op, req->operands, req->operand_count); if (ret < 0) return ret; p->timeout = g_timeout_add_seconds(AVC_PRESS_TIMEOUT, req_timeout, p->queue); return 0; }
static int avctp_send_req(struct avctp *session, uint8_t code, uint8_t subunit, uint8_t opcode, uint8_t *operands, size_t operand_count, avctp_rsp_cb func, void *user_data) { struct avctp_channel *control = session->control; struct avctp_queue *queue; struct avctp_pending_req *p; struct avctp_control_req *req; if (control == NULL) return -ENOTCONN; /* If the request set a callback send it directly */ if (!func) return avctp_send(session->control, -1, AVCTP_COMMAND, code, subunit, opcode, operands, operand_count); req = g_new0(struct avctp_control_req, 1); req->code = code; req->subunit = subunit; req->op = opcode; req->func = func; req->operands = g_memdup(operands, operand_count); req->operand_count = operand_count; req->user_data = user_data; if (opcode == AVC_OP_PASSTHROUGH) { queue = g_slist_nth_data(control->queues, PASSTHROUGH_QUEUE); p = pending_create(queue, process_passthrough, req, control_req_destroy); } else { queue = g_slist_nth_data(control->queues, CONTROL_QUEUE); p = pending_create(queue, process_control, req, control_req_destroy); } req->p = p; g_queue_push_tail(queue->queue, p); if (queue->process_id == 0) queue->process_id = g_idle_add(process_queue, queue); return 0; }
int avctp_send_vendordep_req(struct avctp *session, uint8_t code, uint8_t subunit, uint8_t *operands, size_t operand_count, avctp_rsp_cb func, void *user_data) { struct avctp_rsp_handler *handler; int err; err = avctp_send(session, id, AVCTP_COMMAND, code, subunit, AVC_OP_VENDORDEP, operands, operand_count); if (err < 0) return err; handler = g_new0(struct avctp_rsp_handler, 1); handler->id = id; handler->func = func; handler->user_data = user_data; session->handlers = g_slist_prepend(session->handlers, handler); id++; return 0; }