mirror of
https://github.com/Tha14/toxic.git
synced 2024-11-23 05:53:02 +01:00
more prep for audio groups
This commit is contained in:
parent
7a7e8a7f8d
commit
dd8c2caac7
@ -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);
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
@ -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;
|
||||||
|
37
src/help.c
37
src/help.c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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" },
|
||||||
|
@ -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 {
|
||||||
|
@ -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 */
|
||||||
|
@ -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)
|
||||||
|
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user