/* Send audio to the group chat. * * return 0 on success. * return -1 on failure. */ int group_send_audio(Group_Chats *g_c, int groupnumber, const int16_t *pcm, unsigned int samples, uint8_t channels, unsigned int sample_rate) { Group_AV *group_av = group_get_object(g_c, groupnumber); if (!group_av) return -1; if (channels != 1 && channels != 2) return -1; //TODO: allow different sample rates if (sample_rate != 48000) return -1; if (!group_av->audio_encoder || group_av->audio_channels != channels || group_av->audio_sample_rate != sample_rate) { group_av->audio_channels = channels; group_av->audio_sample_rate = sample_rate; group_av->audio_bitrate = 64000; //TODO: add way of adjusting bitrate if (recreate_encoder(group_av) == -1) return -1; } uint8_t encoded[1024]; int32_t size = opus_encode(group_av->audio_encoder, pcm, samples, encoded, sizeof(encoded)); if (size <= 0) return -1; return send_audio_packet(g_c, groupnumber, encoded, size); }
/* Send an encoded audio packet to the group chat. * * return 0 on success. * return -1 on failure. */ static int send_audio_packet(Group_Chats *g_c, int groupnumber, uint8_t *packet, uint16_t length) { if (!length) return -1; Group_AV *group_av = group_get_object(g_c, groupnumber); uint8_t data[1 + sizeof(uint16_t) + length]; data[0] = GROUP_AUDIO_PACKET_ID; uint16_t sequnum = htons(group_av->audio_sequnum); memcpy(data + 1, &sequnum, sizeof(sequnum)); memcpy(data + 1 + sizeof(sequnum), packet, length); if (send_group_lossy_packet(g_c, groupnumber, data, sizeof(data)) == -1) return -1; ++group_av->audio_sequnum; return 0; }