#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ogg/ogg.h>
static const char* account_uuid = TOXMOD_ACCOUNT_ID;
static const char* api_key = TOXMOD_API_KEY;
static const char* single_tenant_prefix = "dev";
static const char* player_name = "test_player";
static const char* session_name = "test_session";
const char* input_filename = "test_clip.opus";
#define packet_length_ms 20
#define maximum_packets_in_circular_buffer (1000 / packet_length_ms)
static const unsigned int maximum_opus_packet_size = 80;
#define error_handler(err) \
if(err) { \
fprintf(stderr, "Tox server error %s\n", tox_server_error_name(err)); \
return 1; \
}
int get_page(ogg_sync_state* sync_state, ogg_page* page, FILE* clip_file) {
const unsigned int chunk_size = 1024;
while((ogg_sync_pageout(sync_state, page) != 1)) {
char* buffer = ogg_sync_buffer(sync_state, chunk_size);
const unsigned long bytes_read = (unsigned long)fread(buffer, 1, chunk_size, clip_file);
if(bytes_read == 0)
return 0;
ogg_sync_wrote(sync_state, bytes_read);
}
return 1;
}
int check_is_opus_header(const unsigned char* packet, unsigned int packet_size) {
if(packet_size < 8)
return 0;
return (packet[0] == 0x4f) && (packet[1] == 0x70);
}
int main(void) {
if(!strcmp(account_uuid, "your account uuid here")) {
fprintf(stderr, "Account UUID has not been set. Please set your account_uuid, api_key, "
"and (if applicable) single_tenant_prefix in this example program's "
"source code file before using it.\n");
return 1;
}
if(!strcmp(api_key, "your api key here")) {
fprintf(stderr, "API Key has not been set. Please set your account_uuid, api_key, "
"and (if applicable) single_tenant_prefix in this example program's "
"source code file before using it.\n");
return 1;
}
printf("Running Opus packets from %s through tox_server\n", input_filename);
error_handler(err);
error_handler(err);
int current_uploads = 0;
{
ogg_sync_state sync_state;
ogg_stream_state stream_state;
ogg_page page;
ogg_packet packet;
ogg_sync_init(&sync_state);
FILE* clip_file = fopen(input_filename, "rb");
if(!clip_file) {
fprintf(stderr, "Failed to open clip file %s\n", input_filename);
return 2;
}
while(1) {
const int read_successful = get_page(&sync_state, &page, clip_file);
if(!read_successful)
break;
if(ogg_page_bos(&page)) {
const int serial_number = ogg_page_serialno(&page);
ogg_stream_init(&stream_state, serial_number);
}
ogg_stream_pagein(&stream_state, &page);
while(ogg_stream_packetout(&stream_state, &packet) != 0) {
if(!check_is_opus_header(packet.packet, packet.bytes)) {
error_handler(err);
error_handler(err);
error_handler(err);
error_handler(err);
}
}
}
fclose(clip_file);
ogg_sync_clear(&sync_state);
ogg_stream_clear(&stream_state);
}
while(current_uploads > 0) {
error_handler(err);
}
error_handler(err);
error_handler(err);
return 0;
}
Definition tox_server.h:147
const char * session_name_unique
Definition tox_server.h:157
unsigned long circular_buffer_max_num_packets
Definition tox_server.h:163
const char * player_name_unique
Definition tox_server.h:152
unsigned long max_packet_size
Definition tox_server.h:168
Definition tox_server.h:136
TOX_SERVER_ERROR tox_server_add_packet(tox_server_instance_t *tox_instance_ptr, const unsigned char *packet, unsigned int packet_size)
TOX_SERVER_ERROR tox_server_destroy_instance(tox_server_instance_t *tox_instance_ptr)
TOX_SERVER_ERROR tox_server_begin_upload(tox_server_instance_t *tox_instance_ptr)
TOX_SERVER_ERROR tox_server_create_instance(tox_server_instance_t *tox_instance_ptr, const tox_server_config_t *tox_server_config_ptr)
TOX_SERVER_ERROR
Definition tox_server.h:55
TOX_SERVER_ERROR tox_server_global_init(const char *account_uuid, const char *api_key, const char *single_tenant_prefix)
TOX_SERVER_ERROR tox_server_global_cleanup(void)
TOX_SERVER_ERROR tox_server_run_all_uploads_with_timeout(int *num_running_uploads, int wait_timeout_milliseconds)
TOX_SERVER_ERROR tox_server_run_buffer_copy(tox_server_instance_t *tox_instance_ptr)