diff options
-rw-r--r-- | toxav/groupav.c | 40 | ||||
-rw-r--r-- | toxav/groupav.h | 9 | ||||
-rw-r--r-- | toxav/toxav_old.c | 15 |
3 files changed, 29 insertions, 35 deletions
diff --git a/toxav/groupav.c b/toxav/groupav.c index 15fdd534..4406e66b 100644 --- a/toxav/groupav.c +++ b/toxav/groupav.c | |||
@@ -33,13 +33,13 @@ | |||
33 | #define GROUP_JBUF_SIZE 6 | 33 | #define GROUP_JBUF_SIZE 6 |
34 | #define GROUP_JBUF_DEAD_SECONDS 4 | 34 | #define GROUP_JBUF_DEAD_SECONDS 4 |
35 | 35 | ||
36 | typedef struct { | 36 | typedef struct Group_Audio_Packet { |
37 | uint16_t sequnum; | 37 | uint16_t sequnum; |
38 | uint16_t length; | 38 | uint16_t length; |
39 | uint8_t data[]; | 39 | uint8_t data[]; |
40 | } Group_Audio_Packet; | 40 | } Group_Audio_Packet; |
41 | 41 | ||
42 | typedef struct { | 42 | typedef struct Group_JitterBuffer { |
43 | Group_Audio_Packet **queue; | 43 | Group_Audio_Packet **queue; |
44 | uint32_t size; | 44 | uint32_t size; |
45 | uint32_t capacity; | 45 | uint32_t capacity; |
@@ -56,13 +56,15 @@ static Group_JitterBuffer *create_queue(unsigned int capacity) | |||
56 | size *= 2; | 56 | size *= 2; |
57 | } | 57 | } |
58 | 58 | ||
59 | Group_JitterBuffer *q; | 59 | Group_JitterBuffer *q = (Group_JitterBuffer *)calloc(sizeof(Group_JitterBuffer), 1); |
60 | 60 | ||
61 | if (!(q = (Group_JitterBuffer *)calloc(sizeof(Group_JitterBuffer), 1))) { | 61 | if (!q) { |
62 | return nullptr; | 62 | return nullptr; |
63 | } | 63 | } |
64 | 64 | ||
65 | if (!(q->queue = (Group_Audio_Packet **)calloc(sizeof(Group_Audio_Packet *), size))) { | 65 | q->queue = (Group_Audio_Packet **)calloc(sizeof(Group_Audio_Packet *), size); |
66 | |||
67 | if (!q->queue) { | ||
66 | free(q); | 68 | free(q); |
67 | return nullptr; | 69 | return nullptr; |
68 | } | 70 | } |
@@ -159,21 +161,22 @@ static Group_Audio_Packet *dequeue(Group_JitterBuffer *q, int *success) | |||
159 | return nullptr; | 161 | return nullptr; |
160 | } | 162 | } |
161 | 163 | ||
162 | typedef struct { | 164 | typedef struct Group_AV { |
163 | const Logger *log; | 165 | const Logger *log; |
164 | Group_Chats *g_c; | 166 | Group_Chats *g_c; |
165 | OpusEncoder *audio_encoder; | 167 | OpusEncoder *audio_encoder; |
166 | 168 | ||
167 | unsigned int audio_channels, audio_sample_rate, audio_bitrate; | 169 | unsigned int audio_channels; |
170 | unsigned int audio_sample_rate; | ||
171 | unsigned int audio_bitrate; | ||
168 | 172 | ||
169 | uint16_t audio_sequnum; | 173 | uint16_t audio_sequnum; |
170 | 174 | ||
171 | void (*audio_data)(Messenger *m, uint32_t groupnumber, uint32_t peernumber, const int16_t *pcm, uint32_t samples, | 175 | audio_data_cb *audio_data; |
172 | uint8_t channels, unsigned int sample_rate, void *userdata); | ||
173 | void *userdata; | 176 | void *userdata; |
174 | } Group_AV; | 177 | } Group_AV; |
175 | 178 | ||
176 | typedef struct { | 179 | typedef struct Group_Peer_AV { |
177 | Group_JitterBuffer *buffer; | 180 | Group_JitterBuffer *buffer; |
178 | 181 | ||
179 | OpusDecoder *audio_decoder; | 182 | OpusDecoder *audio_decoder; |
@@ -228,8 +231,7 @@ static int recreate_encoder(Group_AV *group_av) | |||
228 | return 0; | 231 | return 0; |
229 | } | 232 | } |
230 | 233 | ||
231 | static Group_AV *new_group_av(const Logger *log, Group_Chats *g_c, void (*audio_callback)(Messenger *, uint32_t, | 234 | static Group_AV *new_group_av(const Logger *log, Group_Chats *g_c, audio_data_cb *audio_callback, void *userdata) |
232 | uint32_t, const int16_t *, unsigned int, uint8_t, uint32_t, void *), void *userdata) | ||
233 | { | 235 | { |
234 | if (!g_c) { | 236 | if (!g_c) { |
235 | return nullptr; | 237 | return nullptr; |
@@ -417,7 +419,7 @@ static int handle_group_audio_packet(void *object, uint32_t groupnumber, uint32_ | |||
417 | } | 419 | } |
418 | 420 | ||
419 | while (decode_audio_packet((Group_AV *)object, peer_av, groupnumber, friendgroupnumber) == 0) { | 421 | while (decode_audio_packet((Group_AV *)object, peer_av, groupnumber, friendgroupnumber) == 0) { |
420 | ; | 422 | continue; |
421 | } | 423 | } |
422 | 424 | ||
423 | return 0; | 425 | return 0; |
@@ -429,8 +431,7 @@ static int handle_group_audio_packet(void *object, uint32_t groupnumber, uint32_ | |||
429 | * return -1 on failure. | 431 | * return -1 on failure. |
430 | */ | 432 | */ |
431 | static int groupchat_enable_av(const Logger *log, Group_Chats *g_c, uint32_t groupnumber, | 433 | static int groupchat_enable_av(const Logger *log, Group_Chats *g_c, uint32_t groupnumber, |
432 | void (*audio_callback)(Messenger *, | 434 | audio_data_cb *audio_callback, void *userdata) |
433 | uint32_t, uint32_t, const int16_t *, unsigned int, uint8_t, uint32_t, void *), void *userdata) | ||
434 | { | 435 | { |
435 | Group_AV *group_av = new_group_av(log, g_c, audio_callback, userdata); | 436 | Group_AV *group_av = new_group_av(log, g_c, audio_callback, userdata); |
436 | 437 | ||
@@ -455,8 +456,7 @@ static int groupchat_enable_av(const Logger *log, Group_Chats *g_c, uint32_t gro | |||
455 | * return group number on success. | 456 | * return group number on success. |
456 | * return -1 on failure. | 457 | * return -1 on failure. |
457 | */ | 458 | */ |
458 | int add_av_groupchat(const Logger *log, Group_Chats *g_c, void (*audio_callback)(Messenger *, uint32_t, uint32_t, | 459 | int add_av_groupchat(const Logger *log, Group_Chats *g_c, audio_data_cb *audio_callback, void *userdata) |
459 | const int16_t *, unsigned int, uint8_t, uint32_t, void *), void *userdata) | ||
460 | { | 460 | { |
461 | int groupnumber = add_groupchat(g_c, GROUPCHAT_TYPE_AV); | 461 | int groupnumber = add_groupchat(g_c, GROUPCHAT_TYPE_AV); |
462 | 462 | ||
@@ -478,8 +478,7 @@ int add_av_groupchat(const Logger *log, Group_Chats *g_c, void (*audio_callback) | |||
478 | * returns -1 on failure. | 478 | * returns -1 on failure. |
479 | */ | 479 | */ |
480 | int join_av_groupchat(const Logger *log, Group_Chats *g_c, uint32_t friendnumber, const uint8_t *data, uint16_t length, | 480 | int join_av_groupchat(const Logger *log, Group_Chats *g_c, uint32_t friendnumber, const uint8_t *data, uint16_t length, |
481 | void (*audio_callback)(Messenger *, uint32_t, uint32_t, const int16_t *, unsigned int, uint8_t, uint32_t, void *), | 481 | audio_data_cb *audio_callback, void *userdata) |
482 | void *userdata) | ||
483 | { | 482 | { |
484 | int groupnumber = join_groupchat(g_c, friendnumber, GROUPCHAT_TYPE_AV, data, length); | 483 | int groupnumber = join_groupchat(g_c, friendnumber, GROUPCHAT_TYPE_AV, data, length); |
485 | 484 | ||
@@ -516,7 +515,8 @@ static int send_audio_packet(Group_Chats *g_c, uint32_t groupnumber, uint8_t *pa | |||
516 | 515 | ||
517 | uint8_t data[MAX_CRYPTO_DATA_SIZE]; | 516 | uint8_t data[MAX_CRYPTO_DATA_SIZE]; |
518 | uint8_t *ptr = data; | 517 | uint8_t *ptr = data; |
519 | *ptr++ = GROUP_AUDIO_PACKET_ID; | 518 | *ptr = GROUP_AUDIO_PACKET_ID; |
519 | ++ptr; | ||
520 | 520 | ||
521 | ptr += net_pack_u16(ptr, group_av->audio_sequnum); | 521 | ptr += net_pack_u16(ptr, group_av->audio_sequnum); |
522 | memcpy(ptr, packet, length); | 522 | memcpy(ptr, packet, length); |
diff --git a/toxav/groupav.h b/toxav/groupav.h index 42f2c578..4d9efafb 100644 --- a/toxav/groupav.h +++ b/toxav/groupav.h | |||
@@ -27,13 +27,15 @@ | |||
27 | 27 | ||
28 | #define GROUP_AUDIO_PACKET_ID 192 | 28 | #define GROUP_AUDIO_PACKET_ID 192 |
29 | 29 | ||
30 | typedef void audio_data_cb(void *tox, uint32_t groupnumber, uint32_t peernumber, const int16_t *pcm, | ||
31 | uint32_t samples, uint8_t channels, uint32_t sample_rate, void *userdata); | ||
32 | |||
30 | /* Create a new toxav group. | 33 | /* Create a new toxav group. |
31 | * | 34 | * |
32 | * return group number on success. | 35 | * return group number on success. |
33 | * return -1 on failure. | 36 | * return -1 on failure. |
34 | */ | 37 | */ |
35 | int add_av_groupchat(const Logger *log, Group_Chats *g_c, void (*audio_callback)(Messenger *, uint32_t, uint32_t, | 38 | int add_av_groupchat(const Logger *log, Group_Chats *g_c, audio_data_cb *audio_callback, void *userdata); |
36 | const int16_t *, unsigned int, uint8_t, uint32_t, void *), void *userdata); | ||
37 | 39 | ||
38 | /* Join a AV group (you need to have been invited first.) | 40 | /* Join a AV group (you need to have been invited first.) |
39 | * | 41 | * |
@@ -41,8 +43,7 @@ int add_av_groupchat(const Logger *log, Group_Chats *g_c, void (*audio_callback) | |||
41 | * returns -1 on failure. | 43 | * returns -1 on failure. |
42 | */ | 44 | */ |
43 | int join_av_groupchat(const Logger *log, Group_Chats *g_c, uint32_t friendnumber, const uint8_t *data, uint16_t length, | 45 | int join_av_groupchat(const Logger *log, Group_Chats *g_c, uint32_t friendnumber, const uint8_t *data, uint16_t length, |
44 | void (*audio_callback)(Messenger *, uint32_t, uint32_t, const int16_t *, unsigned int, uint8_t, uint32_t, void *), | 46 | audio_data_cb *audio_callback, void *userdata); |
45 | void *userdata); | ||
46 | 47 | ||
47 | 48 | ||
48 | /* Send audio to the group chat. | 49 | /* Send audio to the group chat. |
diff --git a/toxav/toxav_old.c b/toxav/toxav_old.c index 24b4f1ec..6c9032e7 100644 --- a/toxav/toxav_old.c +++ b/toxav/toxav_old.c | |||
@@ -35,13 +35,10 @@ | |||
35 | * | 35 | * |
36 | * Note that total size of pcm in bytes is equal to (samples * channels * sizeof(int16_t)). | 36 | * Note that total size of pcm in bytes is equal to (samples * channels * sizeof(int16_t)). |
37 | */ | 37 | */ |
38 | int toxav_add_av_groupchat(Tox *tox, void (*audio_callback)(void *, uint32_t, uint32_t, const int16_t *, unsigned int, | 38 | int toxav_add_av_groupchat(Tox *tox, audio_data_cb *audio_callback, void *userdata) |
39 | uint8_t, uint32_t, void *), void *userdata) | ||
40 | { | 39 | { |
41 | Messenger *m = (Messenger *)tox; | 40 | Messenger *m = (Messenger *)tox; |
42 | return add_av_groupchat(m->log, m->conferences_object, | 41 | return add_av_groupchat(m->log, m->conferences_object, audio_callback, userdata); |
43 | (void (*)(Messenger *, uint32_t, uint32_t, const int16_t *, unsigned int, uint8_t, uint32_t, void *))audio_callback, | ||
44 | userdata); | ||
45 | } | 42 | } |
46 | 43 | ||
47 | /* Join a AV group (you need to have been invited first.) | 44 | /* Join a AV group (you need to have been invited first.) |
@@ -55,14 +52,10 @@ int toxav_add_av_groupchat(Tox *tox, void (*audio_callback)(void *, uint32_t, ui | |||
55 | * Note that total size of pcm in bytes is equal to (samples * channels * sizeof(int16_t)). | 52 | * Note that total size of pcm in bytes is equal to (samples * channels * sizeof(int16_t)). |
56 | */ | 53 | */ |
57 | int toxav_join_av_groupchat(Tox *tox, uint32_t friendnumber, const uint8_t *data, uint16_t length, | 54 | int toxav_join_av_groupchat(Tox *tox, uint32_t friendnumber, const uint8_t *data, uint16_t length, |
58 | void (*audio_callback) | 55 | audio_data_cb *audio_callback, void *userdata) |
59 | (void *, uint32_t, uint32_t, const int16_t *, unsigned int, uint8_t, uint32_t, void *), | ||
60 | void *userdata) | ||
61 | { | 56 | { |
62 | Messenger *m = (Messenger *)tox; | 57 | Messenger *m = (Messenger *)tox; |
63 | return join_av_groupchat(m->log, m->conferences_object, friendnumber, data, length, | 58 | return join_av_groupchat(m->log, m->conferences_object, friendnumber, data, length, audio_callback, userdata); |
64 | (void (*)(Messenger *, uint32_t, uint32_t, const int16_t *, unsigned int, uint8_t, uint32_t, void *))audio_callback, | ||
65 | userdata); | ||
66 | } | 59 | } |
67 | 60 | ||
68 | /* Send audio to the group chat. | 61 | /* Send audio to the group chat. |