@@ -473,156 +473,163 @@ void toxav_callback_call_state(ToxAV *av, toxav_call_state_cb *callback, void *u
473473 av -> scb_user_data = user_data ;
474474 pthread_mutex_unlock (av -> mutex );
475475}
476- bool toxav_call_control ( ToxAV * av , uint32_t friend_number , Toxav_Call_Control control , Toxav_Err_Call_Control * error )
476+ static Toxav_Err_Call_Control call_control_handle_resume ( const ToxAVCall * call )
477477{
478- pthread_mutex_lock (av -> mutex );
479- Toxav_Err_Call_Control rc = TOXAV_ERR_CALL_CONTROL_OK ;
480- ToxAVCall * call ;
478+ /* Only act if paused and had media transfer active before */
479+ if (call -> msi_call -> self_capabilities != 0 || call -> previous_self_capabilities == 0 ) {
480+ return TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
481+ }
481482
482- if (m_friend_exists (av -> m , friend_number ) == 0 ) {
483- rc = TOXAV_ERR_CALL_CONTROL_FRIEND_NOT_FOUND ;
484- goto RETURN ;
483+ if (msi_change_capabilities (call -> msi_call , call -> previous_self_capabilities ) == -1 ) {
484+ return TOXAV_ERR_CALL_CONTROL_SYNC ;
485485 }
486486
487- call = call_get (av , friend_number );
487+ rtp_allow_receiving (call -> audio_rtp );
488+ rtp_allow_receiving (call -> video_rtp );
488489
489- if (call == nullptr || (!call -> active && control != TOXAV_CALL_CONTROL_CANCEL )) {
490- rc = TOXAV_ERR_CALL_CONTROL_FRIEND_NOT_IN_CALL ;
491- goto RETURN ;
490+ return TOXAV_ERR_CALL_CONTROL_OK ;
491+ }
492+ static Toxav_Err_Call_Control call_control_handle_pause (ToxAVCall * call )
493+ {
494+ /* Only act if not already paused */
495+ if (!call -> msi_call -> self_capabilities ) {
496+ return TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
492497 }
493498
494- switch (control ) {
495- case TOXAV_CALL_CONTROL_RESUME : {
496- /* Only act if paused and had media transfer active before */
497- if (call -> msi_call -> self_capabilities == 0 &&
498- call -> previous_self_capabilities ) {
499-
500- if (msi_change_capabilities (call -> msi_call ,
501- call -> previous_self_capabilities ) == -1 ) {
502- rc = TOXAV_ERR_CALL_CONTROL_SYNC ;
503- goto RETURN ;
504- }
505-
506- rtp_allow_receiving (call -> audio_rtp );
507- rtp_allow_receiving (call -> video_rtp );
508- } else {
509- rc = TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
510- goto RETURN ;
511- }
499+ call -> previous_self_capabilities = call -> msi_call -> self_capabilities ;
512500
513- break ;
514- }
501+ if (msi_change_capabilities (call -> msi_call , 0 ) == -1 ) {
502+ return TOXAV_ERR_CALL_CONTROL_SYNC ;
503+ }
515504
516- case TOXAV_CALL_CONTROL_PAUSE : {
517- /* Only act if not already paused */
518- if (call -> msi_call -> self_capabilities ) {
519- call -> previous_self_capabilities = call -> msi_call -> self_capabilities ;
505+ rtp_stop_receiving (call -> audio_rtp );
506+ rtp_stop_receiving (call -> video_rtp );
520507
521- if (msi_change_capabilities (call -> msi_call , 0 ) == -1 ) {
522- rc = TOXAV_ERR_CALL_CONTROL_SYNC ;
523- goto RETURN ;
524- }
508+ return TOXAV_ERR_CALL_CONTROL_OK ;
509+ }
510+ static Toxav_Err_Call_Control call_control_handle_cancel (ToxAVCall * call )
511+ {
512+ /* Hang up */
513+ pthread_mutex_lock (call -> toxav_call_mutex );
525514
526- rtp_stop_receiving (call -> audio_rtp );
527- rtp_stop_receiving (call -> video_rtp );
528- } else {
529- rc = TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
530- goto RETURN ;
531- }
515+ if (msi_hangup (call -> msi_call ) != 0 ) {
516+ pthread_mutex_unlock (call -> toxav_call_mutex );
517+ return TOXAV_ERR_CALL_CONTROL_SYNC ;
518+ }
532519
533- break ;
534- }
520+ call -> msi_call = nullptr ;
521+ pthread_mutex_unlock ( call -> toxav_call_mutex );
535522
536- case TOXAV_CALL_CONTROL_CANCEL : {
537- /* Hang up */
538- pthread_mutex_lock (call -> toxav_call_mutex );
523+ /* No matter the case, terminate the call */
524+ call_kill_transmission ( call );
525+ call_remove (call );
539526
540- if (msi_hangup (call -> msi_call ) != 0 ) {
541- rc = TOXAV_ERR_CALL_CONTROL_SYNC ;
542- pthread_mutex_unlock (call -> toxav_call_mutex );
543- goto RETURN ;
544- }
527+ return TOXAV_ERR_CALL_CONTROL_OK ;
528+ }
529+ static Toxav_Err_Call_Control call_control_handle_mute_audio (const ToxAVCall * call )
530+ {
531+ if (!(call -> msi_call -> self_capabilities & MSI_CAP_R_AUDIO )) {
532+ return TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
533+ }
545534
546- call -> msi_call = nullptr ;
547- pthread_mutex_unlock (call -> toxav_call_mutex );
535+ if (msi_change_capabilities (call -> msi_call , call ->
536+ msi_call -> self_capabilities ^ MSI_CAP_R_AUDIO ) == -1 ) {
537+ return TOXAV_ERR_CALL_CONTROL_SYNC ;
548538
549- /* No mather the case, terminate the call */
550- call_kill_transmission (call );
551- call_remove (call );
539+ }
552540
553- break ;
554- }
541+ rtp_stop_receiving (call -> audio_rtp );
542+ return TOXAV_ERR_CALL_CONTROL_OK ;
543+ }
544+ static Toxav_Err_Call_Control call_control_handle_unmute_audio (const ToxAVCall * call )
545+ {
546+ if (!(call -> msi_call -> self_capabilities ^ MSI_CAP_R_AUDIO )) {
547+ return TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
548+ }
555549
556- case TOXAV_CALL_CONTROL_MUTE_AUDIO : {
557- if (call -> msi_call -> self_capabilities & MSI_CAP_R_AUDIO ) {
558- if (msi_change_capabilities (call -> msi_call , call ->
559- msi_call -> self_capabilities ^ MSI_CAP_R_AUDIO ) == -1 ) {
560- rc = TOXAV_ERR_CALL_CONTROL_SYNC ;
561- goto RETURN ;
562- }
563-
564- rtp_stop_receiving (call -> audio_rtp );
565- } else {
566- rc = TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
567- goto RETURN ;
568- }
550+ if (msi_change_capabilities (call -> msi_call , call ->
551+ msi_call -> self_capabilities | MSI_CAP_R_AUDIO ) == -1 ) {
552+ return TOXAV_ERR_CALL_CONTROL_SYNC ;
553+ }
569554
570- break ;
571- }
555+ rtp_allow_receiving (call -> audio_rtp );
556+ return TOXAV_ERR_CALL_CONTROL_OK ;
557+ }
558+ static Toxav_Err_Call_Control call_control_handle_hide_video (const ToxAVCall * call )
559+ {
560+ if (!(call -> msi_call -> self_capabilities & MSI_CAP_R_VIDEO )) {
561+ return TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
562+ }
572563
573- case TOXAV_CALL_CONTROL_UNMUTE_AUDIO : {
574- if (call -> msi_call -> self_capabilities ^ MSI_CAP_R_AUDIO ) {
575- if (msi_change_capabilities (call -> msi_call , call ->
576- msi_call -> self_capabilities | MSI_CAP_R_AUDIO ) == -1 ) {
577- rc = TOXAV_ERR_CALL_CONTROL_SYNC ;
578- goto RETURN ;
579- }
580-
581- rtp_allow_receiving (call -> audio_rtp );
582- } else {
583- rc = TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
584- goto RETURN ;
585- }
564+ if (msi_change_capabilities (call -> msi_call , call ->
565+ msi_call -> self_capabilities ^ MSI_CAP_R_VIDEO ) == -1 ) {
566+ return TOXAV_ERR_CALL_CONTROL_SYNC ;
567+ }
586568
587- break ;
588- }
569+ rtp_stop_receiving (call -> video_rtp );
570+ return TOXAV_ERR_CALL_CONTROL_OK ;
571+ }
572+ static Toxav_Err_Call_Control call_control_handle_show_video (const ToxAVCall * call )
573+ {
574+ if (!(call -> msi_call -> self_capabilities ^ MSI_CAP_R_VIDEO )) {
575+ return TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
576+ }
589577
590- case TOXAV_CALL_CONTROL_HIDE_VIDEO : {
591- if (call -> msi_call -> self_capabilities & MSI_CAP_R_VIDEO ) {
592- if (msi_change_capabilities (call -> msi_call , call ->
593- msi_call -> self_capabilities ^ MSI_CAP_R_VIDEO ) == -1 ) {
594- rc = TOXAV_ERR_CALL_CONTROL_SYNC ;
595- goto RETURN ;
596- }
597-
598- rtp_stop_receiving (call -> video_rtp );
599- } else {
600- rc = TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
601- goto RETURN ;
602- }
578+ if (msi_change_capabilities (call -> msi_call , call ->
579+ msi_call -> self_capabilities | MSI_CAP_R_VIDEO ) == -1 ) {
580+ return TOXAV_ERR_CALL_CONTROL_SYNC ;
581+ }
603582
604- break ;
605- }
583+ rtp_allow_receiving (call -> video_rtp );
584+ return TOXAV_ERR_CALL_CONTROL_OK ;
585+ }
586+ static Toxav_Err_Call_Control call_control_handle (ToxAVCall * call , Toxav_Call_Control control )
587+ {
588+ switch (control ) {
589+ case TOXAV_CALL_CONTROL_RESUME :
590+ return call_control_handle_resume (call );
606591
607- case TOXAV_CALL_CONTROL_SHOW_VIDEO : {
608- if (call -> msi_call -> self_capabilities ^ MSI_CAP_R_VIDEO ) {
609- if (msi_change_capabilities (call -> msi_call , call ->
610- msi_call -> self_capabilities | MSI_CAP_R_VIDEO ) == -1 ) {
611- rc = TOXAV_ERR_CALL_CONTROL_SYNC ;
612- goto RETURN ;
613- }
614-
615- rtp_allow_receiving (call -> video_rtp );
616- } else {
617- rc = TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
618- goto RETURN ;
619- }
592+ case TOXAV_CALL_CONTROL_PAUSE :
593+ return call_control_handle_pause (call );
620594
621- break ;
622- }
595+ case TOXAV_CALL_CONTROL_CANCEL :
596+ return call_control_handle_cancel (call );
597+
598+ case TOXAV_CALL_CONTROL_MUTE_AUDIO :
599+ return call_control_handle_mute_audio (call );
600+
601+ case TOXAV_CALL_CONTROL_UNMUTE_AUDIO :
602+ return call_control_handle_unmute_audio (call );
603+
604+ case TOXAV_CALL_CONTROL_HIDE_VIDEO :
605+ return call_control_handle_hide_video (call );
606+
607+ case TOXAV_CALL_CONTROL_SHOW_VIDEO :
608+ return call_control_handle_show_video (call );
623609 }
624610
625- RETURN :
611+ return TOXAV_ERR_CALL_CONTROL_INVALID_TRANSITION ;
612+ }
613+ static Toxav_Err_Call_Control call_control (ToxAV * av , uint32_t friend_number , Toxav_Call_Control control )
614+ {
615+ if (m_friend_exists (av -> m , friend_number ) == 0 ) {
616+ return TOXAV_ERR_CALL_CONTROL_FRIEND_NOT_FOUND ;
617+ }
618+
619+ ToxAVCall * call = call_get (av , friend_number );
620+
621+ if (call == nullptr || (!call -> active && control != TOXAV_CALL_CONTROL_CANCEL )) {
622+ return TOXAV_ERR_CALL_CONTROL_FRIEND_NOT_IN_CALL ;
623+ }
624+
625+ return call_control_handle (call , control );
626+ }
627+ bool toxav_call_control (ToxAV * av , uint32_t friend_number , Toxav_Call_Control control , Toxav_Err_Call_Control * error )
628+ {
629+ pthread_mutex_lock (av -> mutex );
630+
631+ Toxav_Err_Call_Control rc = call_control (av , friend_number , control );
632+
626633 pthread_mutex_unlock (av -> mutex );
627634
628635 if (error ) {
0 commit comments