示例#1
0
/**@brief Open connection with the Audio service.
 *
 * @details The function opens the audio service and provides message
 *          handler function pointer.
 * @param[in] queue Queue of messages.
 * @param[in] service Pointer to ui service.
 * @return   none.
 */
void ui_audio_svc_open(void *queue, service_t *service)
{
    ui_svc = service;

    ui_audio_svc = cfw_client_init(queue,
                     ui_audio_svc_handle_message,
                     UISVC_AUDIO_CLIENT);
    if (ui_audio_svc == NULL) force_panic();

    cfw_open_service_conn(ui_audio_svc, AUDIO_SVC_ID, "UI SVC Audio");
}
示例#2
0
/**@brief Function to handle terminated audio streams.
 *
 * @details In this function played stream is freed. A new stream is
 *          initialized if necessary. Once all streams have been
 *          played, response message is built and sent.
 * @param[in]  msg  Request message.
 * @return   none
 */
static void ui_handle_as_stream_end(message_t * msg)
{
    rsp_message_t *resp;
    uint16_t resp_id;

    audio_stream_mgr_evt_msg *evt = (audio_stream_mgr_evt_msg *) msg;

    /* Need to filter MSG_ID_AS_STREAM_XX messages, as the UI SVC is not */
    /* the only one listening to them.                                   */
    if ((evt->sHandle != tone_stream) && (evt->sHandle != sps_stream))
        return;

    pr_debug(LOG_MODULE_UI_SVC,
        "Audio stream 0x%08x ended - reason %d",
        evt->sHandle,
        evt->sHandle->reason);

    if (tone_stream) {
        as_stream_destroy(tone_stream);
        tone_stream = NULL;
    }

    /* Check if more data to play. */
    if (sps_stream) {
        /* Play done. */
        as_stream_destroy(sps_stream);
        sps_stream = NULL;
        sps_id_stream_pending = 0;
    } else if (sps_id_stream_pending) {
        /* Play speech sequence. */
        ui_sps_play_init(sps_id_stream_pending, as_stream_priv);
    }

    if (!tone_stream && !sps_stream) {
        /* Request completed. */
        if (ui_audio_req->id == MSG_ID_UI_LPAL_REQ)
            resp_id = MSG_ID_UI_LPAL_RSP;
        else
            resp_id = MSG_ID_UI_ASR_RSP;

        resp = cfw_alloc_rsp_msg(ui_audio_req, resp_id, sizeof(*resp));
        if (resp == NULL) force_panic();

        resp->status = evt->sHandle->reason;
        cfw_send_message(resp);

        cfw_msg_free(ui_audio_req);
        ui_audio_req = NULL;
    }
}
示例#3
0
static void quark_svc_stop_scanning_req_handler(
	sensor_service_stop_sensor_scanning_req_t *	p_req,
	void *						param)
{
	if (!p_req) {
		SS_PRINT_ERR("err p_req msg");
		force_panic();
	}
	/* Process BOARD sensor scanning request */
	if (p_req->sensor_type_bit_map & BOARD_SENSOR_MASK) {
		ss_stop_sensor_scanning(p_sc_service_conn, NULL,
					p_req->sensor_type_bit_map);
	}
}
示例#4
0
/**@brief Function to broadcast to other clients ASR events coming
 *        from the Audio service.
 *
 * @details Broadcast message is built and passed to the framework which
 *          in turn sends it to all clients consumers of the event.
 * @param[in]  msg  Event message.
 * @return   none
 */
void ui_broadcast_svc_asr_event(message_t * msg)
{
    message_t *broadcast_msg;

    broadcast_msg = cfw_alloc_evt_msg(ui_svc,
                      MSG_ID_UI_ASR_EVT,
                      sizeof(ui_asr_evt_t));
    if (broadcast_msg == NULL) force_panic();

    ((ui_asr_evt_t *) broadcast_msg)->ui_asr_event_id =
        ((ui_asr_evt_t *) msg)->ui_asr_event_id;

    pr_debug(LOG_MODULE_UI_SVC,
            "Audio: broadcast ASR EVT:0x%x from src:%d",
            ((ui_asr_evt_t *) msg)->ui_asr_event_id,
            msg->src);

    cfw_send_event(broadcast_msg);

    /* Message cloned by the framework. Can be deleted now. */
    cfw_msg_free(broadcast_msg);
}
示例#5
0
static void quark_svc_sensor_subscribe_req_handler(
	ss_sensor_subscribe_data_req_t *p_req,
	void *				param)
{
	ss_sensor_subscribe_data_req_t *p_msg;

	p_msg = (ss_sensor_subscribe_data_req_t *)cfw_alloc_message_for_service(
		p_sc_service_conn,
		MSG_ID_SS_SENSOR_SUBSCRIBE_DATA_REQ,
		sizeof(*p_msg), NULL);
	if (p_msg == NULL) {
		SS_PRINT_ERR("err p_req msg");
		force_panic();
	}
	/* Fill Request Parameter */
	p_msg->sensor = p_req->sensor;
	p_msg->data_type = p_req->data_type;
	p_msg->sampling_interval = p_req->sampling_interval;
	p_msg->reporting_interval = p_req->reporting_interval;
	/* Send the message */
	cfw_send_message(p_msg);
}
示例#6
0
/**@brief Function to handle audio requests to play tone and/or sentence.
 *
 * @param[in]  msg  Request message.
 * @return   none
 */
void ui_handle_audio_req(message_t * msg)
{
    uint32_t audio_data;
    uint8_t sps_id;
    uint8_t tone_id;

    ui_audio_req = cfw_clone_message(msg);
    if (ui_audio_req == NULL) force_panic();

    /* Tone and sequence identifiers are coded as follows:      */
    /*   Byte #3    | Byte #2 | Byte #1           | Byte #0     */
    /*   future use | Tone id | Domain id  4 bits | Sentence id */
    /*              |         | Request id 4 bits |             */

    if (msg->id == MSG_ID_UI_LPAL_REQ) {
        audio_data = ((ui_lpal_evt_rsp_t *) msg)->ui_lpal_event_rsp_id;
    } else if (MSG_ID_UI_ASR_REQ) {
        audio_data = ((ui_asr_evt_rsp_t *) msg)->ui_asr_event_rsp_id;
    }

    sps_id = audio_data & RESP_ID_MASK_SENTENCE;
    sps_id_stream_pending = sps_id;

    audio_data = audio_data >> 16;
    tone_id = audio_data & RESP_ID_MASK_TONE;

    if (tone_id)
        /* Play tone first. */
        ui_tone_play_init(tone_id, msg->priv);
    else if (sps_id)
        /* Play speech sequence. */
        ui_sps_play_init(sps_id, msg->priv);
    else
        /* Empty request. */
        pr_error(LOG_MODULE_UI_SVC,
            "No tone or speech sentence in request");
}
示例#7
0
/**@brief Function to handle messages from framework.
 *
 * @details In this function are handled messages of
 *          communications with the Audio service.
 * @param[in]  msg   Message from framework.
 * @param[in]  param Additional data. NULL if not used.
 * @return   none.
 */
void ui_audio_svc_handle_message(message_t * msg, void *param)
{
    int client_events[4];
    cfw_open_conn_rsp_msg_t *cnf = NULL;
    audio_stream_mgr_evt_msg *evt = NULL;

    pr_debug(LOG_MODULE_UI_SVC,
        "Audio: received msg: %d src: %d dst: %d",
        msg->id,
        msg->src,
        msg->dst);

    /* Dump message content. */
    cfw_dump_message(msg);

    ui_port = msg->dst;

    switch (msg->id) {
    case MSG_ID_CFW_OPEN_SERVICE_RSP:{
        cnf = (cfw_open_conn_rsp_msg_t *) msg;
        if (cnf == NULL) force_panic();

        audio_client_cfw_hdl = cnf->service_conn;
        if (audio_client_cfw_hdl == NULL) force_panic();

        client_events[0] = MSG_ID_AS_LPAL_EVT;
        client_events[1] = MSG_ID_AS_ASR_EVT;
        client_events[2] = MSG_ID_AS_STREAM_STOPPED_EVT;
        client_events[3] = MSG_ID_AS_STREAM_TERMINATED_EVT;

        /* Events registration. */
        cfw_register_events(audio_client_cfw_hdl,
                    client_events, 4, msg->priv);

        pr_info(LOG_MODULE_UI_SVC,
            "Audio: Audio service id %lu opened",
            UI_SVC_ID);
        }
        break;
    case MSG_ID_CFW_CLOSE_SERVICEi_RSP:
        pr_info(LOG_MODULE_UI_SVC,
            "Audio: Audio service has been closed");
        break;
    case MSG_ID_CFW_REGISTER_EVT_RSP:
        pr_debug(LOG_MODULE_UI_SVC,
            "Audio: Events registered for Audio service");
        break;
    case MSG_ID_AS_LPAL_EVT:
        ui_broadcast_svc_lpal_event(msg);
        break;
    case MSG_ID_AS_ASR_EVT:
        ui_broadcast_svc_asr_event(msg);
        break;
    case MSG_ID_AS_STREAM_STOPPED_EVT:
        /* Need to filter MSG_ID_AS_STREAM_XX messages, as the UI SVC is */
        /* not the only one listening to them.                           */
        /* If not tone or speech sequence initialized, msg is ignored.   */
        evt = (audio_stream_mgr_evt_msg *)msg;

        if ((evt->sHandle == tone_stream) || (evt->sHandle == sps_stream)) {
            pr_debug(LOG_MODULE_UI_SVC,
                "Audio: stream 0x%08x stopped, reason %d",
                evt->sHandle,
                evt->sHandle->reason);

            if (evt->sHandle->reason == AUDIO_STREAM_STATE_INIT_SUCCESS) {
                if (tone_stream)
                    ui_tone_play_start();
                else if (sps_stream)
                    ui_sps_play_start();
            }
        }
        break;
    case MSG_ID_AS_STREAM_TERMINATED_EVT:
        ui_handle_as_stream_end(msg);
        break;
    default:
        break;
    }

    cfw_msg_free(msg);
}