void toxav_thread(void *args) { ToxAV *av = args; toxav_thread_init = 1; debug("Toxav thread init\n"); while (1) { if(toxav_thread_msg) { TOX_MSG *msg = &toxav_msg; if(msg->msg == UTOXAV_KILL) { break; } switch(msg->msg) { case UTOXAV_START_CALL: { FRIEND *f = &friend[msg->param1]; toxaudio_postmessage(AUDIO_STOP_RINGTONE, msg->param1, 0, NULL); toxaudio_postmessage(AUDIO_START, msg->param1, 0, NULL); f->call_state_self = ( TOXAV_FRIEND_CALL_STATE_SENDING_A | TOXAV_FRIEND_CALL_STATE_ACCEPTING_A ); if (msg->param2) { toxvideo_postmessage(VIDEO_RECORD_START, msg->param1, 0, NULL); f->call_state_self |= (TOXAV_FRIEND_CALL_STATE_SENDING_V | TOXAV_FRIEND_CALL_STATE_ACCEPTING_V); } break; } case UTOXAV_END_CALL: { FRIEND *f = &friend[msg->param1]; toxaudio_postmessage(AUDIO_STOP_RINGTONE, msg->param1, 0, NULL); toxaudio_postmessage(AUDIO_END, msg->param1, 0, NULL); if ((f->call_state_self | TOXAV_FRIEND_CALL_STATE_SENDING_V | TOXAV_FRIEND_CALL_STATE_ACCEPTING_V)){ toxvideo_postmessage(VIDEO_RECORD_STOP, msg->param1, 0, NULL); } break; } case UTOXAV_START_PREVIEW: { toxvideo_postmessage(VIDEO_PREVIEW_START, 0, 0, NULL); break; } case UTOXAV_END_PREVIEW: { toxvideo_postmessage(VIDEO_PREVIEW_STOP, 0, 0, NULL); break; } } } toxav_thread_msg = 0; toxav_iterate(av); yieldcpu(toxav_iteration_interval(av)); } toxav_thread_msg = 0; toxav_thread_init = 0; debug("UTOXAV:\tClean thread exit!\n"); return; }
void *thread_av(void *data) { ToxAV *av = (ToxAV *) data; while (true) { pthread_mutex_lock(&Winthread.lock); toxav_iterate(av); pthread_mutex_unlock(&Winthread.lock); usleep(toxav_iteration_interval(av) * 1000); } }
void CoreAV::process() { toxav_iterate(toxav); iterateTimer->start(toxav_iteration_interval(toxav)); }
static void *call_thread(void *pd) { ToxAV *AliceAV = ((thread_data *) pd)->AliceAV; ToxAV *BobAV = ((thread_data *) pd)->BobAV; CallControl *AliceCC = ((thread_data *) pd)->AliceCC; CallControl *BobCC = ((thread_data *) pd)->BobCC; uint32_t friend_number = ((thread_data *) pd)->friend_number; memset(AliceCC, 0, sizeof(CallControl)); memset(BobCC, 0, sizeof(CallControl)); { /* Call */ TOXAV_ERR_CALL rc; toxav_call(AliceAV, friend_number, 48, 3000, &rc); if (rc != TOXAV_ERR_CALL_OK) { printf("toxav_call failed: %d\n", rc); ck_assert(0); } } while (!BobCC->incoming) { c_sleep(10); } { /* Answer */ TOXAV_ERR_ANSWER rc; toxav_answer(BobAV, 0, 8, 500, &rc); if (rc != TOXAV_ERR_ANSWER_OK) { printf("toxav_answer failed: %d\n", rc); ck_assert(0); } } c_sleep(30); int16_t *PCM = (int16_t *)calloc(960, sizeof(int16_t)); uint8_t *video_y = (uint8_t *)calloc(800 * 600, sizeof(uint8_t)); uint8_t *video_u = (uint8_t *)calloc(800 * 600 / 4, sizeof(uint8_t)); uint8_t *video_v = (uint8_t *)calloc(800 * 600 / 4, sizeof(uint8_t)); time_t start_time = time(NULL); while (time(NULL) - start_time < 4) { toxav_iterate(AliceAV); toxav_iterate(BobAV); toxav_audio_send_frame(AliceAV, friend_number, PCM, 960, 1, 48000, NULL); toxav_audio_send_frame(BobAV, 0, PCM, 960, 1, 48000, NULL); toxav_video_send_frame(AliceAV, friend_number, 800, 600, video_y, video_u, video_v, NULL); toxav_video_send_frame(BobAV, 0, 800, 600, video_y, video_u, video_v, NULL); c_sleep(10); } { /* Hangup */ TOXAV_ERR_CALL_CONTROL rc; toxav_call_control(AliceAV, friend_number, TOXAV_CALL_CONTROL_CANCEL, &rc); if (rc != TOXAV_ERR_CALL_CONTROL_OK) { printf("toxav_call_control failed: %d %p %p\n", rc, (void *)AliceAV, (void *)BobAV); } } c_sleep(30); free(PCM); free(video_y); free(video_u); free(video_v); printf("Closing thread\n"); pthread_exit(NULL); }