summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--toxav/groupav.c40
-rw-r--r--toxav/groupav.h9
-rw-r--r--toxav/toxav_old.c15
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
36typedef struct { 36typedef 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
42typedef struct { 42typedef 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
162typedef struct { 164typedef 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
176typedef struct { 179typedef 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
231static Group_AV *new_group_av(const Logger *log, Group_Chats *g_c, void (*audio_callback)(Messenger *, uint32_t, 234static 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 */
431static int groupchat_enable_av(const Logger *log, Group_Chats *g_c, uint32_t groupnumber, 433static 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 */
458int add_av_groupchat(const Logger *log, Group_Chats *g_c, void (*audio_callback)(Messenger *, uint32_t, uint32_t, 459int 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 */
480int join_av_groupchat(const Logger *log, Group_Chats *g_c, uint32_t friendnumber, const uint8_t *data, uint16_t length, 480int 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
30typedef 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 */
35int add_av_groupchat(const Logger *log, Group_Chats *g_c, void (*audio_callback)(Messenger *, uint32_t, uint32_t, 38int 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 */
43int join_av_groupchat(const Logger *log, Group_Chats *g_c, uint32_t friendnumber, const uint8_t *data, uint16_t length, 45int 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 */
38int toxav_add_av_groupchat(Tox *tox, void (*audio_callback)(void *, uint32_t, uint32_t, const int16_t *, unsigned int, 38int 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 */
57int toxav_join_av_groupchat(Tox *tox, uint32_t friendnumber, const uint8_t *data, uint16_t length, 54int 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.