1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-09-28 00:25:35 +02:00

more prep for audio groups

This commit is contained in:
Jfreegman 2014-11-14 20:13:08 -05:00
parent 7a7e8a7f8d
commit dd8c2caac7
No known key found for this signature in database
GPG Key ID: 3627F3144076AE63
13 changed files with 150 additions and 30 deletions

View File

@ -180,10 +180,10 @@ void read_device_callback (const int16_t* captured, uint32_t size, void* data)
} }
} }
void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int size, void* userdata) void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int size, void* userdata)
{ {
(void)userdata; (void)userdata;
if (call_index >= 0 && ASettins.calls[call_index].ttas) { if (call_index >= 0 && ASettins.calls[call_index].ttas) {
ToxAvCSettings csettings = ASettins.cs; ToxAvCSettings csettings = ASettins.cs;
toxav_get_peer_csettings(av, call_index, 0, &csettings); toxav_get_peer_csettings(av, call_index, 0, &csettings);
@ -194,37 +194,37 @@ void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int siz
int start_transmission(ToxWindow *self) int start_transmission(ToxWindow *self)
{ {
if ( !ASettins.av || self->call_idx == -1 ) return -1; if ( !ASettins.av || self->call_idx == -1 ) return -1;
/* Don't provide support for video */ /* Don't provide support for video */
if ( 0 != toxav_prepare_transmission(ASettins.av, self->call_idx, av_jbufdc * 2, av_VADd, 0) ) { if ( 0 != toxav_prepare_transmission(ASettins.av, self->call_idx, av_jbufdc * 2, av_VADd, 0) ) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Could not prepare transmission"); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Could not prepare transmission");
} }
if ( !toxav_capability_supported(ASettins.av, self->call_idx, AudioDecoding) || if ( !toxav_capability_supported(ASettins.av, self->call_idx, AudioDecoding) ||
!toxav_capability_supported(ASettins.av, self->call_idx, AudioEncoding) ) !toxav_capability_supported(ASettins.av, self->call_idx, AudioEncoding) )
return -1; return -1;
if (set_call(&ASettins.calls[self->call_idx], true) == -1) if (set_call(&ASettins.calls[self->call_idx], true) == -1)
return -1; return -1;
ToxAvCSettings csettings; ToxAvCSettings csettings;
toxav_get_peer_csettings(ASettins.av, self->call_idx, 0, &csettings); toxav_get_peer_csettings(ASettins.av, self->call_idx, 0, &csettings);
if ( open_primary_device(input, &ASettins.calls[self->call_idx].in_idx, if ( open_primary_device(input, &ASettins.calls[self->call_idx].in_idx,
csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels) != de_None ) csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels) != de_None )
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to open input device!"); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to open input device!");
if ( register_device_callback(self->call_idx, ASettins.calls[self->call_idx].in_idx, if ( register_device_callback(self->call_idx, ASettins.calls[self->call_idx].in_idx,
read_device_callback, &self->call_idx, true) != de_None) read_device_callback, &self->call_idx, true) != de_None)
/* Set VAD as true for all; TODO: Make it more dynamic */ /* Set VAD as true for all; TODO: Make it more dynamic */
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to register input handler!"); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to register input handler!");
if ( open_primary_device(output, &ASettins.calls[self->call_idx].out_idx, if ( open_primary_device(output, &ASettins.calls[self->call_idx].out_idx,
csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels) != de_None ) { csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels) != de_None ) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to open output device!"); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to open output device!");
ASettins.calls[self->call_idx].has_output = 0; ASettins.calls[self->call_idx].has_output = 0;
} }
return 0; return 0;
} }
@ -295,7 +295,7 @@ void callback_call_started ( void* av, int32_t call_index, void* arg )
ToxWindow* windows = arg; ToxWindow* windows = arg;
int i; int i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) for (i = 0; i < MAX_WINDOWS_NUM; ++i)
if (windows[i].onStart != NULL && windows[i].call_idx == call_index) { if (windows[i].onStart != NULL && windows[i].call_idx == call_index) {
windows[i].onStart(&windows[i], ASettins.av, call_index); windows[i].onStart(&windows[i], ASettins.av, call_index);
if ( 0 != start_transmission(&windows[i]) ) {/* YEAH! */ if ( 0 != start_transmission(&windows[i]) ) {/* YEAH! */
line_info_add(&windows[i], NULL, NULL, NULL, SYS_MSG, 0, 0, "Error starting transmission!"); line_info_add(&windows[i], NULL, NULL, NULL, SYS_MSG, 0, 0, "Error starting transmission!");

View File

@ -34,9 +34,7 @@ typedef enum _AudioError {
ae_StartingCoreAudio = 1 << 2 ae_StartingCoreAudio = 1 << 2
} AudioError; } AudioError;
/* You will have to pass pointer to first member of 'windows' /* You will have to pass pointer to first member of 'windows' declared in windows.c */
* declared in windows.c otherwise undefined behaviour will
*/
ToxAv *init_audio(ToxWindow *self, Tox *tox); ToxAv *init_audio(ToxWindow *self, Tox *tox);
void terminate_audio(); void terminate_audio();

View File

@ -351,7 +351,7 @@ DeviceError register_device_callback( int32_t call_idx, uint32_t device_idx, Dat
return de_None; return de_None;
} }
inline__ DeviceError write_out(uint32_t device_idx, int16_t* data, uint32_t lenght, uint8_t channels) inline__ DeviceError write_out(uint32_t device_idx, int16_t* data, uint32_t length, uint8_t channels)
{ {
if (device_idx >= MAX_DEVICES) return de_InvalidSelection; if (device_idx >= MAX_DEVICES) return de_InvalidSelection;
@ -380,7 +380,7 @@ inline__ DeviceError write_out(uint32_t device_idx, int16_t* data, uint32_t leng
} }
alBufferData(bufid, device->sound_mode, data, lenght * 2 * channels, device->sample_rate); alBufferData(bufid, device->sound_mode, data, length * 2 * channels, device->sample_rate);
alSourceQueueBuffers(device->source, 1, &bufid); alSourceQueueBuffers(device->source, 1, &bufid);
ALint state; ALint state;

View File

@ -81,7 +81,7 @@ DeviceError open_device(DeviceType type, int32_t selection, uint32_t* device_idx
DeviceError close_device(DeviceType type, uint32_t device_idx); DeviceError close_device(DeviceType type, uint32_t device_idx);
/* Write data to device */ /* Write data to device */
DeviceError write_out(uint32_t device_idx, int16_t* data, uint32_t lenght, uint8_t channels); DeviceError write_out(uint32_t device_idx, int16_t* data, uint32_t length, uint8_t channels);
void print_devices(ToxWindow* self, DeviceType type); void print_devices(ToxWindow* self, DeviceType type);

View File

@ -74,7 +74,14 @@ static struct cmd_func chat_commands[] = {
{ "/answer", cmd_answer }, { "/answer", cmd_answer },
{ "/reject", cmd_reject }, { "/reject", cmd_reject },
{ "/hangup", cmd_hangup }, { "/hangup", cmd_hangup },
{ "/sdev", cmd_ccur_device }, { "/mute", cmd_mute },
{ "/sense", cmd_sense },
#endif /* AUDIO */
{ NULL, NULL },
};
static struct cmd_func group_commands[] = {
#ifdef AUDIO
{ "/mute", cmd_mute }, { "/mute", cmd_mute },
{ "/sense", cmd_sense }, { "/sense", cmd_sense },
#endif /* AUDIO */ #endif /* AUDIO */
@ -165,6 +172,8 @@ void execute(WINDOW *w, ToxWindow *self, Tox *m, const char *input, int mode)
break; break;
case GROUPCHAT_COMMAND_MODE: case GROUPCHAT_COMMAND_MODE:
if (do_command(w, self, m, num_args, group_commands, args) == 0)
return;
break; break;
} }

View File

@ -54,8 +54,41 @@ static int max_groupchat_index = 0;
extern struct user_settings *user_settings; extern struct user_settings *user_settings;
extern struct Winthread Winthread; extern struct Winthread Winthread;
/* temporary until group chats have unique commands */ #ifdef AUDIO
extern const char glob_cmd_list[AC_NUM_GLOB_COMMANDS][MAX_CMDNAME_SIZE]; #define AC_NUM_GROUP_COMMANDS 21
#else
#define AC_NUM_GROUP_COMMANDS 17
#endif /* AUDIO */
/* Array of groupchat command names used for tab completion. */
static const char group_cmd_list[AC_NUM_GROUP_COMMANDS][MAX_CMDNAME_SIZE] = {
{ "/accept" },
{ "/add" },
{ "/avatar" },
{ "/clear" },
{ "/close" },
{ "/connect" },
{ "/decline" },
{ "/exit" },
{ "/group" },
{ "/help" },
{ "/log" },
{ "/myid" },
{ "/nick" },
{ "/note" },
{ "/quit" },
{ "/requests" },
{ "/status" },
#ifdef AUDIO
{ "/lsdev" },
{ "/sdev" },
{ "/mute" },
{ "/sense" },
#endif /* AUDIO */
};
int init_groupchat_win(ToxWindow *prompt, Tox *m, int groupnum, uint8_t type) int init_groupchat_win(ToxWindow *prompt, Tox *m, int groupnum, uint8_t type)
{ {
@ -497,7 +530,7 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
} else if (wcsncmp(ctx->line, L"/avatar \"", wcslen(L"/avatar \"")) == 0) { } else if (wcsncmp(ctx->line, L"/avatar \"", wcslen(L"/avatar \"")) == 0) {
diff = dir_match(self, m, ctx->line, L"/avatar"); diff = dir_match(self, m, ctx->line, L"/avatar");
} else { } else {
diff = complete_line(self, glob_cmd_list, AC_NUM_GLOB_COMMANDS, MAX_CMDNAME_SIZE); diff = complete_line(self, group_cmd_list, AC_NUM_GROUP_COMMANDS, MAX_CMDNAME_SIZE);
} }
if (diff != -1) { if (diff != -1) {
@ -645,6 +678,22 @@ static void groupchat_onInit(ToxWindow *self, Tox *m)
wmove(self->window, y2 - CURS_Y_OFFSET, 0); wmove(self->window, y2 - CURS_Y_OFFSET, 0);
} }
#ifdef AUDIO
void groupchat_onWriteDevice(ToxWindow *self, Tox *m, int groupnum, int peernum, const int16_t *pcm,
unsigned int samples, uint8_t channels, unsigned int sample_rate)
{
// if (groupnum != self->num)
// return;
// if (peernum < 0 || channels == 0 || channels > 2)
// return;
// uint32_t length = samples * channels * sizeof(int16_t);
}
#endif /* AUDIO */
ToxWindow new_group_chat(Tox *m, int groupnum) ToxWindow new_group_chat(Tox *m, int groupnum)
{ {
ToxWindow ret; ToxWindow ret;
@ -660,6 +709,11 @@ ToxWindow new_group_chat(Tox *m, int groupnum)
ret.onGroupNamelistChange = &groupchat_onGroupNamelistChange; ret.onGroupNamelistChange = &groupchat_onGroupNamelistChange;
ret.onGroupAction = &groupchat_onGroupAction; ret.onGroupAction = &groupchat_onGroupAction;
#ifdef AUDIO
ret.onWriteDevice = &groupchat_onWriteDevice;
ret.device_selection[0] = ret.device_selection[1] = -1;
#endif
snprintf(ret.name, sizeof(ret.name), "Group %d", groupnum); snprintf(ret.name, sizeof(ret.name), "Group %d", groupnum);
ChatContext *chatwin = calloc(1, sizeof(ChatContext)); ChatContext *chatwin = calloc(1, sizeof(ChatContext));

View File

@ -25,11 +25,16 @@
#include "toxic.h" #include "toxic.h"
#include "windows.h" #include "windows.h"
#include "audio_call.h"
#define SIDEBAR_WIDTH 16 #define SIDEBAR_WIDTH 16
#define SDBAR_OFST 2 /* Offset for the peer number box at the top of the statusbar */ #define SDBAR_OFST 2 /* Offset for the peer number box at the top of the statusbar */
#define MAX_GROUPCHAT_NUM MAX_WINDOWS_NUM - 2 #define MAX_GROUPCHAT_NUM MAX_WINDOWS_NUM - 2
#ifdef AUDIO
#define MAX_GROUP_PEERS 256 /* arbitrary limit, only used for audio */
#endif
typedef struct { typedef struct {
int chatwin; int chatwin;
bool active; bool active;

View File

@ -27,7 +27,7 @@
#include "help.h" #include "help.h"
#include "misc_tools.h" #include "misc_tools.h"
#define HELP_MENU_HEIGHT 8 #define HELP_MENU_HEIGHT 9
#define HELP_MENU_WIDTH 26 #define HELP_MENU_WIDTH 26
void help_init_menu(ToxWindow *self) void help_init_menu(ToxWindow *self)
@ -86,6 +86,12 @@ static void help_draw_menu(ToxWindow *self)
wattroff(win, A_BOLD | COLOR_PAIR(BLUE)); wattroff(win, A_BOLD | COLOR_PAIR(BLUE));
wprintw(win, "hat commands\n"); wprintw(win, "hat commands\n");
wprintw(win, " g");
wattron(win, A_BOLD | COLOR_PAIR(BLUE));
wprintw(win, "r");
wattroff(win, A_BOLD | COLOR_PAIR(BLUE));
wprintw(win, "oup commands\n");
wattron(win, A_BOLD | COLOR_PAIR(BLUE)); wattron(win, A_BOLD | COLOR_PAIR(BLUE));
wprintw(win, " f"); wprintw(win, " f");
wattroff(win, A_BOLD | COLOR_PAIR(BLUE)); wattroff(win, A_BOLD | COLOR_PAIR(BLUE));
@ -194,7 +200,7 @@ static void help_draw_chat(ToxWindow *self)
wprintw(win, " /hangup : Hangup active call\n"); wprintw(win, " /hangup : Hangup active call\n");
wprintw(win, " /sdev <type> <id> : Change active device\n"); wprintw(win, " /sdev <type> <id> : Change active device\n");
wprintw(win, " /mute <type> : Mute active device if in call\n"); wprintw(win, " /mute <type> : Mute active device if in call\n");
wprintw(win, " /sense <n> : VAD sensitivity treshold\n"); wprintw(win, " /sense <n> : VAD sensitivity threshold\n");
#endif /* AUDIO */ #endif /* AUDIO */
help_draw_bottom_menu(win); help_draw_bottom_menu(win);
@ -227,6 +233,25 @@ static void help_draw_keys(ToxWindow *self)
wrefresh(win); wrefresh(win);
} }
static void help_draw_group(ToxWindow *self)
{
WINDOW *win = self->help->win;
wmove(win, 1, 1);
wattron(win, A_BOLD | COLOR_PAIR(RED));
wprintw(win, "Group audio commands:\n");
wattroff(win, A_BOLD | COLOR_PAIR(RED));
wprintw(win, " /mute <type> : Mute active device where type: in | out\n");
wprintw(win, " /sense <n> : VAD sensitivity threshold\n\n");
help_draw_bottom_menu(win);
box(win, ACS_VLINE, ACS_HLINE);
wrefresh(win);
}
static void help_draw_contacts(ToxWindow *self) static void help_draw_contacts(ToxWindow *self)
{ {
WINDOW *win = self->help->win; WINDOW *win = self->help->win;
@ -275,6 +300,13 @@ void help_onKey(ToxWindow *self, wint_t key)
self->help->type = HELP_GLOBAL; self->help->type = HELP_GLOBAL;
break; break;
#ifdef AUDIO /* remove if/when we add non-audio group commands */
case 'r':
help_init_window(self, 7, 80);
self->help->type = HELP_GROUP;
break;
#endif
case 'f': case 'f':
help_init_window(self, 10, 80); help_init_window(self, 10, 80);
self->help->type = HELP_CONTACTS; self->help->type = HELP_CONTACTS;
@ -318,6 +350,7 @@ void help_onDraw(ToxWindow *self)
break; break;
case HELP_GROUP: case HELP_GROUP:
help_draw_group(self);
break; break;
} }
} }

View File

@ -48,13 +48,18 @@ extern struct Winthread Winthread;
FriendRequests FrndRequests; FriendRequests FrndRequests;
#ifdef AUDIO
#define AC_NUM_GLOB_COMMANDS 18
#else
#define AC_NUM_GLOB_COMMANDS 16
#endif /* AUDIO */
/* Array of global command names used for tab completion. */ /* Array of global command names used for tab completion. */
const char glob_cmd_list[AC_NUM_GLOB_COMMANDS][MAX_CMDNAME_SIZE] = { static const char glob_cmd_list[AC_NUM_GLOB_COMMANDS][MAX_CMDNAME_SIZE] = {
{ "/accept" }, { "/accept" },
{ "/add" }, { "/add" },
{ "/avatar" }, { "/avatar" },
{ "/clear" }, { "/clear" },
{ "/close" }, /* rm /close when groupchats gets its own list */
{ "/connect" }, { "/connect" },
{ "/decline" }, { "/decline" },
{ "/exit" }, { "/exit" },

View File

@ -26,12 +26,6 @@
#include "toxic.h" #include "toxic.h"
#include "windows.h" #include "windows.h"
#ifdef AUDIO
#define AC_NUM_GLOB_COMMANDS 19
#else
#define AC_NUM_GLOB_COMMANDS 17
#endif /* AUDIO */
#define MAX_FRIEND_REQUESTS 32 #define MAX_FRIEND_REQUESTS 32
struct friend_request { struct friend_request {

View File

@ -115,4 +115,9 @@ void on_file_data(Tox *m, int32_t friendnumber, uint8_t filenumber, const uint8_
void on_typing_change(Tox *m, int32_t friendnumber, uint8_t is_typing, void *userdata); void on_typing_change(Tox *m, int32_t friendnumber, uint8_t is_typing, void *userdata);
void on_read_receipt(Tox *m, int32_t, uint32_t, void *userdata); void on_read_receipt(Tox *m, int32_t, uint32_t, void *userdata);
#ifdef AUDIO
void on_write_device(Tox *m, int groupnum, int peernum, const int16_t *pcm, unsigned int samples,
uint8_t channels, unsigned int sample_rate, void *userdata);
#endif /* AUDIO */
#endif /* #define TOXIC_H */ #endif /* #define TOXIC_H */

View File

@ -253,6 +253,22 @@ void on_read_receipt(Tox *m, int32_t friendnumber, uint32_t receipt, void *userd
windows[i].onReadReceipt(&windows[i], m, friendnumber, receipt); windows[i].onReadReceipt(&windows[i], m, friendnumber, receipt);
} }
} }
#ifdef AUDIO
void on_write_device(Tox *m, int groupnum, int peernum, const int16_t *pcm, unsigned int samples,
uint8_t channels, unsigned int sample_rate, void *userdata)
{
int i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onWriteDevice != NULL)
windows[i].onWriteDevice(&windows[i], m, groupnum, peernum, pcm, samples, channels, samples);
}
}
#endif /* AUDIO */
/* CALLBACKS END */ /* CALLBACKS END */
int add_window(Tox *m, ToxWindow w) int add_window(Tox *m, ToxWindow w)

View File

@ -136,6 +136,7 @@ struct ToxWindow {
void(*onEnd)(ToxWindow *, ToxAv *, int); void(*onEnd)(ToxWindow *, ToxAv *, int);
void(*onRequestTimeout)(ToxWindow *, ToxAv *, int); void(*onRequestTimeout)(ToxWindow *, ToxAv *, int);
void(*onPeerTimeout)(ToxWindow *, ToxAv *, int); void(*onPeerTimeout)(ToxWindow *, ToxAv *, int);
void(*onWriteDevice)(ToxWindow *, Tox *, int, int, const int16_t *, unsigned int, uint8_t, unsigned int);
int call_idx; /* If in a call will have this index set, otherwise it's -1. int call_idx; /* If in a call will have this index set, otherwise it's -1.
* Don't modify outside av callbacks. */ * Don't modify outside av callbacks. */