mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Fixed* api comments and some bugs
This commit is contained in:
parent
5c4f275686
commit
eb6e8aa290
|
@ -9,7 +9,6 @@
|
|||
#include <check.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <vpx/vpx_image.h>
|
||||
|
||||
|
@ -103,7 +102,7 @@ void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t
|
|||
(void) userdata;
|
||||
|
||||
if (length == 7 && memcmp("gentoo", data, 7) == 0) {
|
||||
assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0);
|
||||
ck_assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -133,13 +132,13 @@ START_TEST(test_AV_flows)
|
|||
TOX_ERR_NEW error;
|
||||
|
||||
bootstrap = tox_new(NULL, NULL, 0, &error);
|
||||
assert(error == TOX_ERR_NEW_OK);
|
||||
ck_assert(error == TOX_ERR_NEW_OK);
|
||||
|
||||
Alice = tox_new(NULL, NULL, 0, &error);
|
||||
assert(error == TOX_ERR_NEW_OK);
|
||||
ck_assert(error == TOX_ERR_NEW_OK);
|
||||
|
||||
Bob = tox_new(NULL, NULL, 0, &error);
|
||||
assert(error == TOX_ERR_NEW_OK);
|
||||
ck_assert(error == TOX_ERR_NEW_OK);
|
||||
}
|
||||
|
||||
printf("Created 3 instances of Tox\n");
|
||||
|
@ -153,7 +152,7 @@ START_TEST(test_AV_flows)
|
|||
tox_self_get_address(Alice, address);
|
||||
|
||||
|
||||
assert(tox_friend_add(Bob, address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0);
|
||||
ck_assert(tox_friend_add(Bob, address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0);
|
||||
|
||||
uint8_t off = 1;
|
||||
|
||||
|
@ -178,10 +177,10 @@ START_TEST(test_AV_flows)
|
|||
{
|
||||
TOXAV_ERR_NEW error;
|
||||
AliceAV = toxav_new(Alice, &error);
|
||||
assert(error == TOXAV_ERR_NEW_OK);
|
||||
ck_assert(error == TOXAV_ERR_NEW_OK);
|
||||
|
||||
BobAV = toxav_new(Bob, &error);
|
||||
assert(error == TOXAV_ERR_NEW_OK);
|
||||
ck_assert(error == TOXAV_ERR_NEW_OK);
|
||||
}
|
||||
|
||||
toxav_callback_call(AliceAV, t_toxav_call_cb, &AliceCC);
|
||||
|
@ -208,7 +207,7 @@ START_TEST(test_AV_flows)
|
|||
\
|
||||
if (rc != TOXAV_ERR_CALL_OK) { \
|
||||
printf("toxav_call failed: %d\n", rc); \
|
||||
exit(1); \
|
||||
ck_assert(0); \
|
||||
} \
|
||||
\
|
||||
\
|
||||
|
@ -223,7 +222,7 @@ START_TEST(test_AV_flows)
|
|||
\
|
||||
if (rc != TOXAV_ERR_ANSWER_OK) { \
|
||||
printf("toxav_answer failed: %d\n", rc); \
|
||||
exit(1); \
|
||||
ck_assert(0); \
|
||||
} \
|
||||
BobCC.incoming = false; \
|
||||
} else { \
|
||||
|
@ -236,7 +235,7 @@ START_TEST(test_AV_flows)
|
|||
\
|
||||
if (rc != TOXAV_ERR_CALL_CONTROL_OK) { \
|
||||
printf("toxav_call_control failed: %d\n", rc); \
|
||||
exit(1); \
|
||||
ck_assert(0); \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
|
@ -275,7 +274,7 @@ START_TEST(test_AV_flows)
|
|||
|
||||
if (rc != TOXAV_ERR_CALL_OK) {
|
||||
printf("toxav_call failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -289,7 +288,7 @@ START_TEST(test_AV_flows)
|
|||
|
||||
if (rc != TOXAV_ERR_CALL_CONTROL_OK) {
|
||||
printf("toxav_call_control failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -311,7 +310,7 @@ START_TEST(test_AV_flows)
|
|||
|
||||
if (rc != TOXAV_ERR_CALL_OK) {
|
||||
printf("toxav_call failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -325,7 +324,7 @@ START_TEST(test_AV_flows)
|
|||
|
||||
if (rc != TOXAV_ERR_CALL_CONTROL_OK) {
|
||||
printf("toxav_call_control failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -349,7 +348,7 @@ START_TEST(test_AV_flows)
|
|||
|
||||
if (rc != TOXAV_ERR_CALL_OK) {
|
||||
printf("toxav_call failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -357,10 +356,10 @@ START_TEST(test_AV_flows)
|
|||
iterate_tox(bootstrap, Alice, Bob);
|
||||
|
||||
/* At first try all stuff while in invalid state */
|
||||
assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL));
|
||||
assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL));
|
||||
assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL));
|
||||
ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL));
|
||||
ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL));
|
||||
ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL));
|
||||
|
||||
{
|
||||
TOXAV_ERR_ANSWER rc;
|
||||
|
@ -368,7 +367,7 @@ START_TEST(test_AV_flows)
|
|||
|
||||
if (rc != TOXAV_ERR_ANSWER_OK) {
|
||||
printf("toxav_answer failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -376,36 +375,36 @@ START_TEST(test_AV_flows)
|
|||
|
||||
/* Pause and Resume */
|
||||
printf("Pause and Resume\n");
|
||||
assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL));
|
||||
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL));
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state == TOXAV_CALL_STATE_PAUSED);
|
||||
assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL));
|
||||
ck_assert(BobCC.state == TOXAV_CALL_STATE_PAUSED);
|
||||
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL));
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state & (TOXAV_CALL_STATE_SENDING_A | TOXAV_CALL_STATE_SENDING_V));
|
||||
ck_assert(BobCC.state & (TOXAV_CALL_STATE_SENDING_A | TOXAV_CALL_STATE_SENDING_V));
|
||||
|
||||
/* Mute/Unmute single */
|
||||
printf("Mute/Unmute single\n");
|
||||
assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A);
|
||||
assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A);
|
||||
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A);
|
||||
ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A);
|
||||
|
||||
/* Mute/Unmute both */
|
||||
printf("Mute/Unmute both\n");
|
||||
assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A);
|
||||
assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL));
|
||||
ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A);
|
||||
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL));
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_V);
|
||||
assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_V);
|
||||
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL));
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A);
|
||||
assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL));
|
||||
ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A);
|
||||
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL));
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_V);
|
||||
ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_V);
|
||||
|
||||
{
|
||||
TOXAV_ERR_CALL_CONTROL rc;
|
||||
|
@ -413,12 +412,12 @@ START_TEST(test_AV_flows)
|
|||
|
||||
if (rc != TOXAV_ERR_CALL_CONTROL_OK) {
|
||||
printf("toxav_call_control failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
iterate_tox(bootstrap, Alice, Bob);
|
||||
assert(BobCC.state == TOXAV_CALL_STATE_END);
|
||||
ck_assert(BobCC.state == TOXAV_CALL_STATE_END);
|
||||
|
||||
printf("Success!\n");
|
||||
}
|
||||
|
|
|
@ -9,10 +9,11 @@
|
|||
#include <check.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <vpx/vpx_image.h>
|
||||
|
||||
#include "helpers.h"
|
||||
|
||||
#include "../toxcore/tox.h"
|
||||
#include "../toxcore/util.h"
|
||||
#include "../toxcore/logger.h"
|
||||
|
@ -97,7 +98,7 @@ void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t
|
|||
{
|
||||
(void) userdata;
|
||||
if (length == 7 && memcmp("gentoo", data, 7) == 0) {
|
||||
assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0);
|
||||
ck_assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,7 +111,7 @@ ToxAV* setup_av_instance(Tox* tox, CallControl *CC)
|
|||
TOXAV_ERR_NEW error;
|
||||
|
||||
ToxAV* av = toxav_new(tox, &error);
|
||||
assert(error == TOXAV_ERR_NEW_OK);
|
||||
ck_assert(error == TOXAV_ERR_NEW_OK);
|
||||
|
||||
toxav_callback_call(av, t_toxav_call_cb, CC);
|
||||
toxav_callback_call_state(av, t_toxav_call_state_cb, CC);
|
||||
|
@ -137,7 +138,7 @@ void* call_thread(void* pd)
|
|||
|
||||
if (rc != TOXAV_ERR_CALL_OK) {
|
||||
printf("toxav_call failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -150,7 +151,7 @@ void* call_thread(void* pd)
|
|||
|
||||
if (rc != TOXAV_ERR_ANSWER_OK) {
|
||||
printf("toxav_answer failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -167,7 +168,7 @@ void* call_thread(void* pd)
|
|||
memset(video_v, 0, sizeof(video_v));
|
||||
|
||||
time_t start_time = time(NULL);
|
||||
while(time(NULL) - start_time < 9) {
|
||||
while(time(NULL) - start_time < 4) {
|
||||
toxav_iterate(AliceAV);
|
||||
toxav_iterate(BobAV);
|
||||
|
||||
|
@ -186,11 +187,13 @@ void* call_thread(void* pd)
|
|||
|
||||
if (rc != TOXAV_ERR_CALL_CONTROL_OK) {
|
||||
printf("toxav_call_control failed: %d\n", rc);
|
||||
exit(1);
|
||||
ck_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
c_sleep(30);
|
||||
|
||||
printf ("Closing thread\n");
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
|
@ -206,19 +209,19 @@ START_TEST(test_AV_three_calls)
|
|||
TOX_ERR_NEW error;
|
||||
|
||||
bootstrap = tox_new(NULL, NULL, 0, &error);
|
||||
assert(error == TOX_ERR_NEW_OK);
|
||||
ck_assert(error == TOX_ERR_NEW_OK);
|
||||
|
||||
Alice = tox_new(NULL, NULL, 0, &error);
|
||||
assert(error == TOX_ERR_NEW_OK);
|
||||
ck_assert(error == TOX_ERR_NEW_OK);
|
||||
|
||||
Bobs[0] = tox_new(NULL, NULL, 0, &error);
|
||||
assert(error == TOX_ERR_NEW_OK);
|
||||
ck_assert(error == TOX_ERR_NEW_OK);
|
||||
|
||||
Bobs[1] = tox_new(NULL, NULL, 0, &error);
|
||||
assert(error == TOX_ERR_NEW_OK);
|
||||
ck_assert(error == TOX_ERR_NEW_OK);
|
||||
|
||||
Bobs[2] = tox_new(NULL, NULL, 0, &error);
|
||||
assert(error == TOX_ERR_NEW_OK);
|
||||
ck_assert(error == TOX_ERR_NEW_OK);
|
||||
}
|
||||
|
||||
printf("Created 5 instances of Tox\n");
|
||||
|
@ -232,9 +235,9 @@ START_TEST(test_AV_three_calls)
|
|||
tox_self_get_address(Alice, address);
|
||||
|
||||
|
||||
assert(tox_friend_add(Bobs[0], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0);
|
||||
assert(tox_friend_add(Bobs[1], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0);
|
||||
assert(tox_friend_add(Bobs[2], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0);
|
||||
ck_assert(tox_friend_add(Bobs[0], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0);
|
||||
ck_assert(tox_friend_add(Bobs[1], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0);
|
||||
ck_assert(tox_friend_add(Bobs[2], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0);
|
||||
|
||||
uint8_t off = 1;
|
||||
|
||||
|
@ -302,7 +305,7 @@ START_TEST(test_AV_three_calls)
|
|||
(void) pthread_detach(tids[2]);
|
||||
|
||||
time_t start_time = time(NULL);
|
||||
while (time(NULL) - start_time < 10) {
|
||||
while (time(NULL) - start_time < 5) {
|
||||
tox_iterate(Alice);
|
||||
tox_iterate(Bobs[0]);
|
||||
tox_iterate(Bobs[1]);
|
||||
|
@ -314,6 +317,7 @@ START_TEST(test_AV_three_calls)
|
|||
(void) pthread_join(tids[1], NULL);
|
||||
(void) pthread_join(tids[2], NULL);
|
||||
|
||||
printf ("Killing all instances\n");
|
||||
toxav_kill(BobsAV[0]);
|
||||
toxav_kill(BobsAV[1]);
|
||||
toxav_kill(BobsAV[2]);
|
||||
|
|
|
@ -79,7 +79,7 @@ typedef struct ToxAVCall_s {
|
|||
struct ToxAVCall_s *next;
|
||||
} ToxAVCall;
|
||||
|
||||
struct toxAV {
|
||||
struct ToxAV {
|
||||
Messenger* m;
|
||||
MSISession* msi;
|
||||
|
||||
|
@ -116,7 +116,7 @@ bool video_bit_rate_invalid(uint32_t bit_rate);
|
|||
void invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state);
|
||||
ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error);
|
||||
ToxAVCall* call_get(ToxAV* av, uint32_t friend_number);
|
||||
void call_remove(ToxAVCall* call);
|
||||
ToxAVCall* call_remove(ToxAVCall* call);
|
||||
bool call_prepare_transmission(ToxAVCall* call);
|
||||
void call_kill_transmission(ToxAVCall* call);
|
||||
void ba_set(ToxAvBitrateAdapter* ba, uint32_t bit_rate);
|
||||
|
@ -193,9 +193,9 @@ void toxav_kill(ToxAV* av)
|
|||
/* Msi kill will hang up all calls so just clean these calls */
|
||||
if (av->calls) {
|
||||
ToxAVCall* it = call_get(av, av->calls_head);
|
||||
for (; it; it = it->next) {
|
||||
while (it) {
|
||||
call_kill_transmission(it);
|
||||
call_remove(it); /* This will eventually free av->calls */
|
||||
it = call_remove(it); /* This will eventually free av->calls */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -318,6 +318,14 @@ void toxav_iterate(ToxAV* av)
|
|||
|
||||
bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_CALL* error)
|
||||
{
|
||||
if ((audio_bit_rate && audio_bit_rate_invalid(audio_bit_rate))
|
||||
||(video_bit_rate && video_bit_rate_invalid(video_bit_rate))
|
||||
) {
|
||||
if (error)
|
||||
*error = TOXAV_ERR_CALL_INVALID_BIT_RATE;
|
||||
return false;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(av->mutex);
|
||||
ToxAVCall* call = call_new(av, friend_number, error);
|
||||
if (call == NULL) {
|
||||
|
@ -368,7 +376,7 @@ bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, ui
|
|||
if ((audio_bit_rate && audio_bit_rate_invalid(audio_bit_rate))
|
||||
||(video_bit_rate && video_bit_rate_invalid(video_bit_rate))
|
||||
) {
|
||||
rc = TOXAV_ERR_CALL_INVALID_BIT_RATE;
|
||||
rc = TOXAV_ERR_ANSWER_INVALID_BIT_RATE;
|
||||
goto END;
|
||||
}
|
||||
|
||||
|
@ -379,7 +387,7 @@ bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, ui
|
|||
}
|
||||
|
||||
if (!call_prepare_transmission(call)) {
|
||||
rc = TOXAV_ERR_ANSWER_MALLOC;
|
||||
rc = TOXAV_ERR_ANSWER_CODEC_INITIALIZATION;
|
||||
goto END;
|
||||
}
|
||||
|
||||
|
@ -450,6 +458,9 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co
|
|||
|
||||
rtp_start_receiving(call->audio.first);
|
||||
rtp_start_receiving(call->video.first);
|
||||
} else {
|
||||
rc = TOXAV_ERR_CALL_CONTROL_NOT_PAUSED;
|
||||
goto END;
|
||||
}
|
||||
} break;
|
||||
|
||||
|
@ -472,6 +483,9 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co
|
|||
|
||||
rtp_stop_receiving(call->audio.first);
|
||||
rtp_stop_receiving(call->video.first);
|
||||
} else {
|
||||
rc = TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED;
|
||||
goto END;
|
||||
}
|
||||
} break;
|
||||
|
||||
|
@ -516,7 +530,7 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co
|
|||
}
|
||||
} break;
|
||||
|
||||
case TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO: {
|
||||
case TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO: {
|
||||
if (!call->active) {
|
||||
rc = TOXAV_ERR_CALL_CONTROL_FRIEND_NOT_IN_CALL;
|
||||
goto END;
|
||||
|
@ -589,7 +603,7 @@ bool toxav_set_video_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t video_
|
|||
goto END;
|
||||
}
|
||||
|
||||
if (call->video_bit_rate == video_bit_rate || call->vba.active || call->vba.bit_rate == video_bit_rate) {
|
||||
if (call->video_bit_rate == video_bit_rate || (call->vba.active && call->vba.bit_rate == video_bit_rate)) {
|
||||
pthread_mutex_unlock(av->mutex);
|
||||
goto END;
|
||||
}
|
||||
|
@ -599,6 +613,8 @@ bool toxav_set_video_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t video_
|
|||
if (video_bit_rate > call->video_bit_rate && !force)
|
||||
ba_set(&call->vba, video_bit_rate);
|
||||
else {
|
||||
/* Cancel any previous non forceful bitrate change request */
|
||||
memset(&call->vba, 0, sizeof(call->vba));
|
||||
call->video_bit_rate = video_bit_rate;
|
||||
|
||||
if (!force && av->vbcb.first)
|
||||
|
@ -646,16 +662,19 @@ bool toxav_set_audio_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t audio_
|
|||
goto END;
|
||||
}
|
||||
|
||||
if (call->audio_bit_rate == audio_bit_rate || call->aba.active || call->aba.bit_rate == audio_bit_rate) {
|
||||
if (call->audio_bit_rate == audio_bit_rate || (call->aba.active && call->aba.bit_rate == audio_bit_rate)) {
|
||||
pthread_mutex_unlock(av->mutex);
|
||||
goto END;
|
||||
}
|
||||
|
||||
|
||||
pthread_mutex_lock(call->mutex);
|
||||
|
||||
if (audio_bit_rate > call->audio_bit_rate && !force)
|
||||
ba_set(&call->aba, audio_bit_rate);
|
||||
else {
|
||||
/* Cancel any previous non forceful bitrate change request */
|
||||
memset(&call->aba, 0, sizeof(call->aba));
|
||||
call->audio_bit_rate = audio_bit_rate;
|
||||
|
||||
if (!force && av->abcb.first)
|
||||
|
@ -755,6 +774,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
|
|||
if (rtp_send_data(call->video.first, iter, part_size, false) < 0) {
|
||||
pthread_mutex_unlock(call->mutex_video);
|
||||
LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno));
|
||||
rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED;
|
||||
goto END;
|
||||
}
|
||||
}
|
||||
|
@ -807,6 +827,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
|
|||
if (rtp_send_data(call->video.first, pkt->data.frame.buf + i * 1300, 1300, true) < 0) {
|
||||
pthread_mutex_unlock(call->mutex_video);
|
||||
LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno));
|
||||
rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED;
|
||||
goto END;
|
||||
}
|
||||
}
|
||||
|
@ -815,6 +836,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
|
|||
if (rtp_send_data(call->video.first, pkt->data.frame.buf + parts * 1300, pkt->data.frame.sz % 1300, true) < 0) {
|
||||
pthread_mutex_unlock(call->mutex_video);
|
||||
LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno));
|
||||
rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED;
|
||||
goto END;
|
||||
}
|
||||
}
|
||||
|
@ -1157,10 +1179,10 @@ ToxAVCall* call_get(ToxAV* av, uint32_t friend_number)
|
|||
return av->calls[friend_number];
|
||||
}
|
||||
|
||||
void call_remove(ToxAVCall* call)
|
||||
ToxAVCall* call_remove(ToxAVCall* call)
|
||||
{
|
||||
if (call == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
uint32_t friend_number = call->friend_number;
|
||||
ToxAV* av = call->av;
|
||||
|
@ -1183,12 +1205,14 @@ void call_remove(ToxAVCall* call)
|
|||
else goto CLEAR;
|
||||
|
||||
av->calls[friend_number] = NULL;
|
||||
return;
|
||||
return next;
|
||||
|
||||
CLEAR:
|
||||
av->calls_head = av->calls_tail = 0;
|
||||
free(av->calls);
|
||||
av->calls = NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool call_prepare_transmission(ToxAVCall* call)
|
||||
|
|
|
@ -37,7 +37,7 @@ extern "C" {
|
|||
/**
|
||||
* The type of the Tox Audio/Video subsystem object.
|
||||
*/
|
||||
typedef struct toxAV ToxAV;
|
||||
typedef struct ToxAV ToxAV;
|
||||
#ifndef TOX_DEFINED
|
||||
#define TOX_DEFINED
|
||||
/**
|
||||
|
@ -92,8 +92,8 @@ Tox *toxav_get_tox(ToxAV *av);
|
|||
uint32_t toxav_iteration_interval(ToxAV const *av);
|
||||
/**
|
||||
* Main loop for the session. This function needs to be called in intervals of
|
||||
* toxav_iteration_interval() milliseconds. It is best called in the same loop
|
||||
* as tox_iterate.
|
||||
* toxav_iteration_interval() milliseconds. It is best called in the separate
|
||||
* thread from tox_iterate.
|
||||
*/
|
||||
void toxav_iterate(ToxAV *av);
|
||||
/*******************************************************************************
|
||||
|
@ -153,10 +153,11 @@ void toxav_callback_call(ToxAV *av, toxav_call_cb *function, void *user_data);
|
|||
typedef enum TOXAV_ERR_ANSWER {
|
||||
TOXAV_ERR_ANSWER_OK,
|
||||
/**
|
||||
* A resource allocation error occurred while trying to create the structures
|
||||
* required for the call.
|
||||
* Failed to initialize codecs for call session. Note that codec initiation
|
||||
* will fail if there is no receive callback registered for either audio or
|
||||
* video.
|
||||
*/
|
||||
TOXAV_ERR_ANSWER_MALLOC,
|
||||
TOXAV_ERR_ANSWER_CODEC_INITIALIZATION,
|
||||
/**
|
||||
* The friend number did not designate a valid friend.
|
||||
*/
|
||||
|
@ -174,8 +175,8 @@ typedef enum TOXAV_ERR_ANSWER {
|
|||
/**
|
||||
* Accept an incoming call.
|
||||
*
|
||||
* If an allocation error occurs while answering a call, both participants will
|
||||
* receive TOXAV_CALL_STATE_ERROR and the call will end.
|
||||
* If answering fails for any reason, the call will still be pending and it is
|
||||
* possible to try and answer it later.
|
||||
*
|
||||
* @param friend_number The friend number of the friend that is calling.
|
||||
* @param audio_bit_rate Audio bit rate in Kb/sec. Set this to 0 to disable
|
||||
|
@ -217,7 +218,8 @@ typedef enum TOXAV_CALL_STATE {
|
|||
*/
|
||||
TOXAV_CALL_STATE_END = 16,
|
||||
/**
|
||||
* Set by the AV core if an error occurred on the remote end.
|
||||
* Set by the AV core if an error occurred on the remote end. This call
|
||||
* state will never be triggered in combination with other call states.
|
||||
*/
|
||||
TOXAV_CALL_STATE_ERROR = 32768
|
||||
} TOXAV_CALL_STATE;
|
||||
|
@ -266,10 +268,10 @@ typedef enum TOXAV_CALL_CONTROL {
|
|||
* Request that the friend stops sending video. Regardless of the friend's
|
||||
* compliance, this will cause the `receive_video_frame` event to stop being
|
||||
* triggered on receiving an video frame from the friend. If the video was
|
||||
* already muted, calling this control will notify client to start sending
|
||||
* already hidden, calling this control will notify client to start sending
|
||||
* video again.
|
||||
*/
|
||||
TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO,
|
||||
TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO
|
||||
} TOXAV_CALL_CONTROL;
|
||||
typedef enum TOXAV_ERR_CALL_CONTROL {
|
||||
TOXAV_ERR_CALL_CONTROL_OK,
|
||||
|
@ -286,21 +288,12 @@ typedef enum TOXAV_ERR_CALL_CONTROL {
|
|||
* Attempted to resume a call that was not paused.
|
||||
*/
|
||||
TOXAV_ERR_CALL_CONTROL_NOT_PAUSED,
|
||||
/**
|
||||
* Attempted to resume a call that was paused by the other party. Also set if
|
||||
* the client attempted to send a system-only control.
|
||||
*/
|
||||
TOXAV_ERR_CALL_CONTROL_DENIED,
|
||||
/**
|
||||
* The call was already paused on this client. It is valid to pause if the
|
||||
* other party paused the call. The call will resume after both parties sent
|
||||
* the RESUME control.
|
||||
*/
|
||||
TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED,
|
||||
/**
|
||||
* Tried to unmute a call that was not already muted.
|
||||
*/
|
||||
TOXAV_ERR_CALL_CONTROL_NOT_MUTED
|
||||
TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED
|
||||
} TOXAV_ERR_CALL_CONTROL;
|
||||
/**
|
||||
* Sends a call control command to a friend.
|
||||
|
@ -351,7 +344,12 @@ typedef void toxav_audio_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, b
|
|||
*/
|
||||
void toxav_callback_audio_bit_rate_status(ToxAV *av, toxav_audio_bit_rate_status_cb *function, void *user_data);
|
||||
/**
|
||||
* Set the audio bit rate to be used in subsequent audio frames.
|
||||
* Set the audio bit rate to be used in subsequent audio frames. If the passed
|
||||
* bit rate is the same as the current bit rate this function will return true
|
||||
* without calling a callback. If there is an active non forceful setup with the
|
||||
* passed audio bit rate and the new set request is forceful, the bit rate is
|
||||
* forcefully set and the previous non forceful request is cancelled. The active
|
||||
* non forceful setup will be canceled in favour of new non forceful setup.
|
||||
*
|
||||
* @param friend_number The friend number of the friend for which to set the
|
||||
* audio bit rate.
|
||||
|
@ -380,7 +378,12 @@ typedef void toxav_video_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, b
|
|||
*/
|
||||
void toxav_callback_video_bit_rate_status(ToxAV *av, toxav_video_bit_rate_status_cb *function, void *user_data);
|
||||
/**
|
||||
* Set the video bit rate to be used in subsequent video frames.
|
||||
* Set the video bit rate to be used in subsequent video frames. If the passed
|
||||
* bit rate is the same as the current bit rate this function will return true
|
||||
* without calling a callback. If there is an active non forceful setup with the
|
||||
* passed bit rate and the new set request is forceful, the bit rate is
|
||||
* forcefully set and the previous non forceful request is cancelled. The active
|
||||
* non forceful setup will be canceled in favour of new non forceful setup.
|
||||
*
|
||||
* @param friend_number The friend number of the friend for which to set the
|
||||
* video bit rate.
|
||||
|
@ -413,11 +416,6 @@ typedef enum TOXAV_ERR_SEND_FRAME {
|
|||
* This client is currently not in a call with the friend.
|
||||
*/
|
||||
TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL,
|
||||
/**
|
||||
* No video frame had been requested through the `video_frame_request` event,
|
||||
* but the client tried to send one, anyway.
|
||||
*/
|
||||
TOXAV_ERR_SEND_FRAME_NOT_REQUESTED,
|
||||
/**
|
||||
* One of the frame parameters was invalid. E.g. the resolution may be too
|
||||
* small or too large, or the audio sampling rate may be unsupported.
|
||||
|
@ -431,8 +429,6 @@ typedef enum TOXAV_ERR_SEND_FRAME {
|
|||
/**
|
||||
* Send a video frame to a friend.
|
||||
*
|
||||
* This is called in response to receiving the `video_frame_request` event.
|
||||
*
|
||||
* Y - plane should be of size: height * width
|
||||
* U - plane should be of size: (height/2) * (width/2)
|
||||
* V - plane should be of size: (height/2) * (width/2)
|
||||
|
@ -452,8 +448,6 @@ bool toxav_send_video_frame(ToxAV *av, uint32_t friend_number,
|
|||
/**
|
||||
* Send an audio frame to a friend.
|
||||
*
|
||||
* This is called in response to receiving the `audio_frame_request` event.
|
||||
*
|
||||
* The expected format of the PCM data is: [s1c1][s1c2][...][s2c1][s2c2][...]...
|
||||
* Meaning: sample 1 for channel 1, sample 1 for channel 2, ...
|
||||
* For mono audio, this has no meaning, every sample is subsequent. For stereo,
|
||||
|
@ -467,9 +461,7 @@ bool toxav_send_video_frame(ToxAV *av, uint32_t friend_number,
|
|||
* @param sample_count Number of samples in this frame. Valid numbers here are
|
||||
* ((sample rate) * (audio length) / 1000), where audio length can be
|
||||
* 2.5, 5, 10, 20, 40 or 60 millseconds.
|
||||
* @param channels Number of audio channels. Must be at least 1 for mono.
|
||||
* For voice over IP, more than 2 channels (stereo) typically doesn't make
|
||||
* sense, but up to 255 channels are supported.
|
||||
* @param channels Number of audio channels. Supported values are 1 and 2.
|
||||
* @param sampling_rate Audio sampling rate used in this frame. Valid sampling
|
||||
* rates are 8000, 12000, 16000, 24000, or 48000.
|
||||
*/
|
||||
|
|
|
@ -87,6 +87,7 @@ VCSession* vc_new(ToxAV* av, uint32_t friend_number, toxav_receive_video_frame_c
|
|||
vc->vcb.second = cb_data;
|
||||
vc->friend_number = friend_number;
|
||||
vc->peer_video_frame_piece_size = mvfpsz;
|
||||
vc->av = av;
|
||||
|
||||
return vc;
|
||||
|
||||
|
@ -294,7 +295,7 @@ int vc_reconfigure_encoder(VCSession* vc, int32_t bit_rate, uint16_t width, uint
|
|||
return -1;
|
||||
|
||||
vpx_codec_enc_cfg_t cfg = *vc->encoder->config.enc;
|
||||
if (cfg.rc_target_bitrate == bit_rate && cfg.g_w == width && cfg.g_h == height)
|
||||
if (cfg.rc_target_bitrate == (uint32_t) bit_rate && cfg.g_w == width && cfg.g_h == height)
|
||||
return 0; /* Nothing changed */
|
||||
|
||||
cfg.rc_target_bitrate = bit_rate;
|
||||
|
@ -315,7 +316,7 @@ int vc_reconfigure_test_encoder(VCSession* vc, int32_t bit_rate, uint16_t width,
|
|||
return -1;
|
||||
|
||||
vpx_codec_enc_cfg_t cfg = *vc->test_encoder->config.enc;
|
||||
if (cfg.rc_target_bitrate == bit_rate && cfg.g_w == width && cfg.g_h == height)
|
||||
if (cfg.rc_target_bitrate == (uint32_t) bit_rate && cfg.g_w == width && cfg.g_h == height)
|
||||
return 0; /* Nothing changed */
|
||||
|
||||
cfg.rc_target_bitrate = bit_rate;
|
||||
|
|
Loading…
Reference in New Issue
Block a user