int jni_aa_cmd (int cmd_len, char * cmd_buf, int res_max, char * res_buf) { if (ena_log_extra || cmd_len >= 1) logd ("cmd_len: %d cmd_buf %p res_max: %d res_buf: %p", cmd_len, cmd_buf, res_max, res_buf); int res_len = 0; int ret = 0; int vid_bufs = vid_buf_buf_tail - vid_buf_buf_head; int aud_bufs = vid_buf_buf_tail - vid_buf_buf_head; if (cmd_buf != NULL && cmd_len == 3 && cmd_buf [0] == 121) { // If onCreate() hu_tra:transport_start() byte ep_in_addr = cmd_buf [1]; byte ep_out_addr = cmd_buf [2]; // Get endpoints passed ret = hu_aap_start (ep_in_addr, ep_out_addr); // Start USB/ACC/OAP, AA Protocol aap_state_starts ++; // Count error starts too if (ret == 0) { logd ("hu_aap_start() success aap_state_starts: %d", aap_state_starts); } else { loge ("hu_aap_start() error aap_state_starts: %d", aap_state_starts); aap_state_start_error = 1; return (-1); } } /* Functions code Params: Transport Start hu_aap_start() USB EPs Poll/Handle 1 Rcv Msg hu_aap_recv_process() - Send: Send Mic hu_aap_enc_send() mic data Send Touch hu_aap_enc_send() touch data Send Ctrl hu_aap_enc_send()/hu_aap_stop() ctrl data Returns: Audio Mic Start/Stop Audio Out Start/Stop Video Audio */ else if (cmd_buf != NULL && cmd_len >= 4) { // If encrypted command to send... int chan = 0;//cmd_buf [0]; if (cmd_len > 63) // If Microphone audio... chan = AA_CH_MIC; else if (cmd_len > 6 && cmd_buf [4] == 0x80 && cmd_buf [5] == 1) // If Touch event... chan = AA_CH_TOU; else // If Byebye or other control packet... chan = AA_CH_CTR; if (chan != cmd_buf [0]) { loge ("chan: %d != cmd_buf[0]: %d", chan, cmd_buf [0]); chan = cmd_buf [0]; } //hex_dump ("JNITX: ", 16, cmd_buf, cmd_len); ret = hu_aap_enc_send (chan, & cmd_buf [4], cmd_len - 4); // Send if (cmd_buf != NULL && cmd_len >= 8 && cmd_buf [5] == 15) { // If byebye... logd ("Byebye"); ms_sleep (100); ret = hu_aap_stop (); } } else { if (vid_bufs > 0 || aud_bufs > 0) // If any queue audio or video... ret = 0; // Do nothing (don't wait for recv iaap_tra_recv_tmo) else ret = hu_aap_recv_process (); // Else Process 1 message w/ iaap_tra_recv_tmo } if (ret < 0) { return (ret); // If error then done w/ error } if (vid_bufs <= 0 && aud_bufs <= 0) { // If no queued audio or video... ret = hu_aap_mic_get (); if (ret >= 1) {// && ret <= 2) { // If microphone start (2) or stop (1)... return (ret); // Done w/ mic notification: start (2) or stop (1) } // Else if no microphone state change... if (hu_aap_out_get (AA_CH_AUD) >= 0) // If audio out stop... return (3); // Done w/ audio out notification 0 if (hu_aap_out_get (AA_CH_AU1) >= 0) // If audio out stop... return (4); // Done w/ audio out notification 1 if (hu_aap_out_get (AA_CH_AU2) >= 0) // If audio out stop... return (5); // Done w/ audio out notification 2 } byte * dq_buf = NULL; dq_buf = aud_read_head_buf_get (& res_len); // Get audio if ready if (dq_buf == NULL) // If no audio... (Audio has priority over video) dq_buf = vid_read_head_buf_get (& res_len); // Get video if ready else { // If audio if (dq_buf [0] == 0 && dq_buf [1] == 0 && dq_buf [2] == 0 && dq_buf [3] == 1) { dq_buf [3] = 0; // If audio happened to have magic video signature... (rare), then 0 the 1 loge ("magic video signature in audio"); } //hu_uti.c: #define aud_buf_BUFS_SIZE 65536 * 4 // Up to 256 Kbytes } if (ena_log_extra || (ena_log_verbo && dq_buf != NULL)) logd ("dq_buf: %p", dq_buf); if (dq_buf == NULL || res_len <= 0) { if (ena_log_extra) logd ("No data dq_buf: %p res_len: %d", dq_buf, res_len); return (0); } memcpy (res_buf, dq_buf, res_len); if (ena_log_verbo) logd ("res_len: %d", res_len); return (res_len); }
gboolean touch_poll_event(gpointer data) { int mic_ret = hu_aap_mic_get (); if (mic_change_state == 0 && mic_ret == 2) { printf("SHAI1 : Mic Started\n"); mic_change_state = 2; gst_element_set_state (mic_pipeline, GST_STATE_PLAYING); } if (mic_change_state == 2 && mic_ret == 1) { printf("SHAI1 : Mic Stopped\n"); mic_change_state = 0; gst_element_set_state (mic_pipeline, GST_STATE_READY); } struct input_event event[64]; const size_t ev_size = sizeof(struct input_event); const size_t buffer_size = ev_size * 64; ssize_t size; gst_app_t *app = (gst_app_t *)data; fd_set set; struct timeval timeout; int unblocked; FD_ZERO(&set); FD_SET(mTouch.fd, &set); timeout.tv_sec = 0; timeout.tv_usec = 10000; unblocked = select(mTouch.fd + 1, &set, NULL, NULL, &timeout); if (unblocked == -1) { printf("Error in read...\n"); g_main_loop_quit(app->loop); return FALSE; } else if (unblocked == 0) { return TRUE; } size = read(mTouch.fd, &event, buffer_size); if (size == 0 || size == -1) return FALSE; if (size < ev_size) { printf("Error size when reading\n"); g_main_loop_quit(app->loop); return FALSE; } int num_chars = size / ev_size; int i; for (i=0;i < num_chars;i++) { switch (event[i].type) { case EV_ABS: switch (event[i].code) { case ABS_MT_POSITION_X: mTouch.x = event[i].value * 800/4095; break; case ABS_MT_POSITION_Y: mTouch.y = event[i].value * 480/4095; break; } break; case EV_KEY: if (event[i].code == BTN_TOUCH) { mTouch.action_recvd = 1; if (event[i].value == 1) { mTouch.action = ACTION_DOWN; } else { mTouch.action = ACTION_UP; } } break; case EV_SYN: if (mTouch.action_recvd == 0) { mTouch.action = ACTION_MOVE; aa_touch_event(mTouch.action, mTouch.x, mTouch.y); } else { aa_touch_event(mTouch.action, mTouch.x, mTouch.y); mTouch.action_recvd = 0; } break; } } return TRUE; }