void HUServer::hu_thread_main() { pthread_setname_np(pthread_self(), "hu_thread_main"); int transportFD = transport->GetReadFD(); int errorfd = transport->GetErrorFD(); while(!hu_thread_quit_flag) { fd_set sock_set; FD_ZERO(&sock_set); FD_SET(command_read_fd, &sock_set); FD_SET(transportFD, &sock_set); int maxfd = std::max(command_read_fd, transportFD); if (errorfd >= 0) { maxfd = std::max(maxfd, errorfd); FD_SET(errorfd, &sock_set); } int ret = select(maxfd+1, &sock_set, NULL, NULL, NULL); if (ret <= 0) { loge("Select failed %d", ret); return; } if (errorfd >= 0 && FD_ISSET(errorfd, &sock_set)) { logd("Got errorfd"); hu_thread_quit_flag = true; callbacks.DisconnectionOrError(); } else { if (FD_ISSET(command_read_fd, &sock_set)) { logd("Got command_read_fd"); IHUAnyThreadInterface::HUThreadCommand* ptr = nullptr; if(ptr = hu_pop_command()) { logd("Running %p", ptr); (*ptr)(*this); delete ptr; } } if (FD_ISSET(transportFD, &sock_set)) { //data ready logd("Got transportFD"); ret = hu_aap_recv_process(iaap_tra_recv_tmo); if (ret < 0) { loge("hu_aap_recv_process failed %d", ret); hu_aap_stop(); } } } } logd("hu_thread_main exit"); }
static gboolean read_data(gst_app_t *app) { GstBuffer *buffer; guint8 *ptr; GstFlowReturn ret; int iret; char *vbuf; char *abuf; int res_len = 0; iret = hu_aap_recv_process (); if (iret != 0) { printf("hu_aap_recv_process() iret: %d\n", iret); g_main_loop_quit(app->loop); return FALSE; } /* Is there a video buffer queued? */ vbuf = vid_read_head_buf_get (&res_len); if (vbuf != NULL) { //buffer = gst_buffer_new(); //gst_buffer_set_data(buffer, vbuf, res_len); buffer = gst_buffer_new_and_alloc(res_len); memcpy(GST_BUFFER_DATA(buffer),vbuf,res_len); ret = gst_app_src_push_buffer(app->src, buffer); if(ret != GST_FLOW_OK){ printf("push buffer returned %d for %d bytes \n", ret, res_len); return FALSE; } } /* Is there an audio buffer queued? */ abuf = aud_read_head_buf_get (&res_len); if (abuf != NULL) { //buffer = gst_buffer_new(); //gst_buffer_set_data(buffer, abuf, res_len); buffer = gst_buffer_new_and_alloc(res_len); memcpy(GST_BUFFER_DATA(buffer),abuf,res_len); if (res_len <= 2048 + 96) ret = gst_app_src_push_buffer((GstAppSrc *)au1_src, buffer); else ret = gst_app_src_push_buffer((GstAppSrc *)aud_src, buffer); if(ret != GST_FLOW_OK){ printf("push buffer returned %d for %d bytes \n", ret, res_len); return FALSE; } } return TRUE; }
int HUServer::hu_aap_start (HU_TRANSPORT_TYPE transportType, bool waitForDevice) { // Starts Transport/USBACC/OAP, then AA protocol w/ VersReq(1), SSL handshake, Auth Complete if (iaap_state == hu_STATE_STARTED || iaap_state == hu_STATE_STARTIN) { loge ("CHECK: iaap_state: %d (%s)", iaap_state, state_get (iaap_state)); return (0); } pthread_setname_np(pthread_self(), "main_thread"); iaap_state = hu_STATE_STARTIN; logd (" SET: iaap_state: %d (%s)", iaap_state, state_get (iaap_state)); int ret = ihu_tra_start (transportType, waitForDevice); // Start Transport/USBACC/OAP if (ret) { iaap_state = hu_STATE_STOPPED; logd (" SET: iaap_state: %d (%s)", iaap_state, state_get (iaap_state)); return (ret); // Done if error } byte vr_buf [] = { 0, 1, 0, 1}; // Version Request ret = hu_aap_unenc_send_blob(0, AA_CH_CTR, HU_INIT_MESSAGE::VersionRequest, vr_buf, sizeof (vr_buf), 2000); if (ret < 0) { loge ("Version request send ret: %d", ret); return (-1); } while(iaap_state == hu_STATE_STARTIN) { ret = hu_aap_recv_process(2000); if (ret < 0) { hu_aap_shutdown(); return (ret); } } int pipefd[2]; ret = pipe2(pipefd, O_DIRECT); if (ret < 0) { loge ("pipe2 failed ret: %d %i", ret, errno); hu_aap_shutdown (); return (-1); } logw("Starting HU thread"); command_read_fd = pipefd[0]; command_write_fd = pipefd[1]; hu_thread_quit_flag = false; hu_thread = std::thread([this] { this->hu_thread_main(); }); return (0); }
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; 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]; 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); } } if (cmd_buf != NULL && cmd_len >= 4) { // If encrypted command to send... int chan = cmd_buf [0]; 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... loge ("Byebye"); ms_sleep (100); ret = hu_aap_stop (); } } else { ret = hu_aap_recv_process (); // Process 1 message } if (ret < 0) { return (ret); } byte * dq_buf = read_head_buffer_get (& res_len); 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); }
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); }