108 lines
3.8 KiB
C++
108 lines
3.8 KiB
C++
#include "connection_handler.hpp"
|
|
|
|
#include "ts_client.hpp"
|
|
|
|
namespace com::teamspeak
|
|
{
|
|
/* We'll be using the create() function instead */
|
|
Connection_Handler::Connection_Handler(uint64_t connection_id)
|
|
: _connection_id(connection_id)
|
|
{}
|
|
|
|
Connection_Handler::~Connection_Handler()
|
|
{
|
|
if (auto error = ts3client_destroyServerConnectionHandler(_connection_id); error != ERROR_ok)
|
|
print_error(error, "Error destroying connection", _connection_id);
|
|
}
|
|
|
|
/*static*/ std::unique_ptr<Connection_Handler> Connection_Handler::create()
|
|
{
|
|
auto connection_id = uint64_t{ 0 };
|
|
if (auto error = ts3client_spawnNewServerConnectionHandler(0, &connection_id); error != ERROR_ok)
|
|
{
|
|
print_error(error, "Error spawning server connection handler", 0);
|
|
return {};
|
|
}
|
|
return std::make_unique<Connection_Handler>(connection_id);
|
|
}
|
|
|
|
uint32_t Connection_Handler::connect()
|
|
{
|
|
/* Connect to server on localhost:9987 with nickname "client", no default channel, no default channel password and server password "secret" */
|
|
if (auto error = ts3client_startConnection(
|
|
_connection_id,
|
|
_connection_data.identity.c_str(),
|
|
_connection_data.address.c_str(),
|
|
_connection_data.port,
|
|
_connection_data.nick.c_str(),
|
|
nullptr,
|
|
"",
|
|
_connection_data.pw.c_str());
|
|
error != ERROR_ok)
|
|
{
|
|
print_error(error, "Error connecting to server", _connection_id);
|
|
return error;
|
|
}
|
|
return ERROR_ok;
|
|
}
|
|
|
|
uint32_t Connection_Handler::disconnect(std::string_view reason)
|
|
{
|
|
if (auto error = ts3client_stopConnection(_connection_id, reason.data()); error != ERROR_ok)
|
|
{
|
|
printf("Error stopping connection: %d\n", error);
|
|
return error;
|
|
}
|
|
return ERROR_ok;
|
|
}
|
|
|
|
void Connection_Handler::on_connect_status_change(ConnectStatus status, uint32_t error)
|
|
{
|
|
if (TS_Client::_do_autoreconnect && ConnectStatus::STATUS_DISCONNECTED == status)
|
|
{
|
|
// TODO: maybe should be timer-delayed?
|
|
connect();
|
|
}
|
|
}
|
|
|
|
uint32_t Connection_Handler::open_audio(Audio_IO audio_io, std::string_view mode, std::string_view device_id)
|
|
{
|
|
if (Audio_IO::Capture == audio_io)
|
|
{
|
|
if (auto error = ts3client_openPlaybackDevice(_connection_id, mode.data(), device_id.data()); error != ERROR_ok)
|
|
{
|
|
print_error(error, "Error opening playback device.", _connection_id);
|
|
return error;
|
|
}
|
|
}
|
|
else if (Audio_IO::Playback == audio_io)
|
|
{
|
|
if (auto error = ts3client_openCaptureDevice(_connection_id, mode.data(), device_id.data()); error != ERROR_ok)
|
|
{
|
|
print_error(error, "Error opening capture device.", _connection_id);
|
|
return error;
|
|
}
|
|
|
|
// Turn off any DSP, except a very low power based Voice Activity Detection
|
|
|
|
/* Adjust "vad_mode" value to use power */
|
|
print_error(
|
|
ts3client_setPreProcessorConfigValue(_connection_id, "vad_mode", "1"),
|
|
"Error setting vad_mode value to hybrid.", _connection_id);
|
|
|
|
/* Adjust "voiceactivation_level" value */
|
|
print_error(
|
|
ts3client_setPreProcessorConfigValue(_connection_id, "voiceactivation_level", "-50"),
|
|
"Error setting voiceactivation_level.", _connection_id);
|
|
|
|
/* turn on vad */
|
|
print_error(
|
|
ts3client_setPreProcessorConfigValue(_connection_id, "vad", "true"),
|
|
"Couldn't turn on VAD.", _connection_id);
|
|
|
|
// TODO: Turn off denoiser etc. no matter the default value
|
|
}
|
|
return ERROR_ok;
|
|
}
|
|
}
|