void Core::onAvStart(void* _toxav, int32_t call_index, void* core) { ToxAv* toxav = static_cast<ToxAv*>(_toxav); int friendId = toxav_get_peer_id(toxav, call_index, 0); if (friendId < 0) { qWarning() << "Core: Received invalid AV start"; return; } ToxAvCSettings* transSettings = new ToxAvCSettings; int err = toxav_get_peer_csettings(toxav, call_index, 0, transSettings); if (err != av_ErrorNone) { qWarning() << "Core::onAvStart: error getting call type"; delete transSettings; return; } if (transSettings->call_type == av_TypeVideo) { qDebug() << QString("Core: AV start from %1 with video").arg(friendId); prepareCall(friendId, call_index, toxav, true); emit static_cast<Core*>(core)->avStart(friendId, call_index, true); } else { qDebug() << QString("Core: AV start from %1 without video").arg(friendId); prepareCall(friendId, call_index, toxav, false); emit static_cast<Core*>(core)->avStart(friendId, call_index, false); } delete transSettings; }
void Core::answerCall(int32_t callId) { int friendId = toxav_get_peer_id(toxav, callId, 0); if (friendId < 0) { qWarning() << "Core: Received invalid AV answer peer ID"; return; } ToxAvCSettings* transSettings = new ToxAvCSettings; int err = toxav_get_peer_csettings(toxav, callId, 0, transSettings); if (err != av_ErrorNone) { qWarning() << "Core::answerCall: error getting call settings"; delete transSettings; return; } if (transSettings->call_type == av_TypeVideo) { qDebug() << QString("Core: answering call %1 with video").arg(callId); toxav_answer(toxav, callId, transSettings); } else { qDebug() << QString("Core: answering call %1 without video").arg(callId); toxav_answer(toxav, callId, transSettings); } delete transSettings; }
int start_transmission(ToxWindow *self) { if ( !ASettins.av || self->call_idx == -1 ) return -1; /* Don't provide support for video */ 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"); } if ( !toxav_capability_supported(ASettins.av, self->call_idx, AudioDecoding) || !toxav_capability_supported(ASettins.av, self->call_idx, AudioEncoding) ) return -1; set_call(&ASettins.calls[self->call_idx], _True); ToxAvCSettings csettings; toxav_get_peer_csettings(ASettins.av, self->call_idx, 0, &csettings); 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 ) 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, read_device_callback, &self->call_idx, _True) != de_None) /* 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!"); 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 ) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to open output device!"); ASettins.calls[self->call_idx].has_output = 0; } return 0; }
void callback_av_audio(ToxAv *av, int32_t call_index, const int16_t *data, uint16_t samples, void *that) { //qDebug() << "was called"; ToxAvCSettings dest; if(toxav_get_peer_csettings(av, call_index, 0, &dest) == 0) { audio_play(call_index, data, samples, dest.audio_channels, dest.audio_sample_rate); } }
void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int size, void* userdata) { (void)userdata; if (call_index >= 0 && ASettins.calls[call_index].ttas) { ToxAvCSettings csettings = ASettins.cs; toxav_get_peer_csettings(av, call_index, 0, &csettings); write_out(ASettins.calls[call_index].out_idx, data, size, csettings.audio_channels); } }
void Core::playCallAudio(ToxAv* toxav, int32_t callId, int16_t *data, int samples, void *user_data) { Q_UNUSED(user_data); if (!calls[callId].active) return; ToxAvCSettings dest; if(toxav_get_peer_csettings(toxav, callId, 0, &dest) == 0) playAudioBuffer(callId, data, samples, dest.audio_channels, dest.audio_sample_rate); }
void write_device_callback(void *agent, int32_t call_index, const int16_t* PCM, uint16_t size, void* arg) { (void)arg; (void)agent; if (call_index >= 0 && ASettins.calls[call_index].ttas) { ToxAvCSettings csettings = ASettins.cs; toxav_get_peer_csettings(ASettins.av, call_index, 0, &csettings); write_out(ASettins.calls[call_index].out_idx, PCM, size, csettings.audio_channels); } }
void Core::playCallAudio(void* toxav, int32_t callId, const int16_t *data, uint16_t samples, void *user_data) { Q_UNUSED(user_data); if (!calls[callId].active) return; if (!calls[callId].alSource) alGenSources(1, &calls[callId].alSource); ToxAvCSettings dest; if (toxav_get_peer_csettings((ToxAv*)toxav, callId, 0, &dest) == 0) playAudioBuffer(calls[callId].alSource, data, samples, dest.audio_channels, dest.audio_sample_rate); }
void callback_av_start(ToxAv *av, int32_t call_index, void *that) { qDebug() << "was called"; Cyanide *cyanide = (Cyanide*)that; ToxAvCSettings peer_settings; int fid = toxav_get_peer_id(av, call_index, 0); toxav_get_peer_csettings(av, call_index, 0, &peer_settings); bool video = peer_settings.call_type == av_TypeVideo; if(toxav_prepare_transmission(av, call_index, 1) == 0) { // call started } else { qDebug() << "toxav_prepare_transmission() failed"; return; } }
void callback_av_invite(ToxAv *av, int32_t call_index, void *that) { qDebug() << "was called"; Cyanide *cyanide = (Cyanide*)that; int fid = toxav_get_peer_id(av, call_index, 0); Friend *f = &cyanide->friends[fid]; ToxAvCSettings peer_settings ; toxav_get_peer_csettings(av, call_index, 0, &peer_settings); bool video = peer_settings.call_type == av_TypeVideo; f->call_index = call_index; f->callstate = -2; emit cyanide->signal_friend_callstate(fid, f->callstate); emit cyanide->signal_av_invite(fid); }
void Core::onAvMediaChange(void* toxav, int32_t callId, void* core) { ToxAvCSettings settings; toxav_get_peer_csettings((ToxAv*)toxav, callId, 0, &settings); int friendId = toxav_get_peer_id((ToxAv*)toxav, callId, 0); qWarning() << "Core: Received media change from friend "<<friendId; if (settings.call_type == TypeAudio) { calls[callId].videoEnabled = false; calls[callId].sendVideoTimer->stop(); Widget::getInstance()->getCamera()->unsuscribe(); emit ((Core*)core)->avMediaChange(friendId, callId, false); } else { Widget::getInstance()->getCamera()->suscribe(); calls[callId].videoEnabled = true; calls[callId].sendVideoTimer->start(); emit ((Core*)core)->avMediaChange(friendId, callId, true); } }
void callback_call_type_change ( void *av, int32_t call_index, void *_arg ) { ToxAvCSettings csettings; toxav_get_peer_csettings(av, call_index, 0, &csettings); printf("New settings: \n" "Type: %u \n" "Video bitrate: %u \n" "Video height: %u \n" "Video width: %u \n" "Audio bitrate: %u \n" "Audio framedur: %u \n" "Audio sample rate: %u \n" "Audio channels: %u \n", csettings.call_type, csettings.video_bitrate, csettings.max_video_height, csettings.max_video_width, csettings.audio_bitrate, csettings.audio_frame_duration, csettings.audio_sample_rate, csettings.audio_channels ); }
void cmd_ccur_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { const char *error_str; if ( argc != 2 ) { if ( argc < 1 ) error_str = "Type must be specified!"; else if ( argc < 2 ) error_str = "Must have id!"; else error_str = "Only two arguments allowed!"; goto on_error; } DeviceType type; if ( strcmp(argv[1], "in") == 0 ) /* Input devices */ type = input; else if ( strcmp(argv[1], "out") == 0 ) /* Output devices */ type = output; else { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); return; } char *end; long int selection = strtol(argv[2], &end, 10); if ( *end ) { error_str = "Invalid input"; goto on_error; } if ( selection_valid(type, selection) == de_InvalidSelection ) { error_str="Invalid selection!"; goto on_error; } /* If call is active, change device */ if ( self->call_idx > -1) { Call* this_call = &ASettins.calls[self->call_idx]; if (this_call->ttas) { ToxAvCSettings csettings; toxav_get_peer_csettings(ASettins.av, self->call_idx, 0, &csettings); if (type == output) { pthread_mutex_lock(&this_call->mutex); close_device(output, this_call->out_idx); this_call->has_output = open_device(output, selection, &this_call->out_idx, csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels) == de_None ? 1 : 0; pthread_mutex_unlock(&this_call->mutex); } else { /* TODO: check for failure */ close_device(input, this_call->in_idx); open_device(input, selection, &this_call->in_idx, csettings.audio_sample_rate, csettings.audio_frame_duration, csettings.audio_channels); /* Set VAD as true for all; TODO: Make it more dynamic */ register_device_callback(self->call_idx, this_call->in_idx, read_device_callback, &self->call_idx, true); } } } self->device_selection[type] = selection; return; on_error: print_err (self, error_str); }