Skip to content

Commit

Permalink
--max-retry および --retry-interval オプションを追加
Browse files Browse the repository at this point in the history
  • Loading branch information
melpon committed May 15, 2023
1 parent 661ce04 commit 208d87c
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 9 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
- @melpon
- [ADD] `--duration` および `--repeat-interval` オプションを追加
- @melpon
- [ADD] `--max-retry` および `--retry-interval` オプションを追加
- @melpon
- [FIX] 廃止になった `--sora-audio-opus-params-clock-rate` を削除する
- @torikizi
- [FIX] "data-channels" の "interval" 項目を指定するとエラーになる問題を修正
Expand Down
6 changes: 6 additions & 0 deletions src/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,10 @@ void Util::ParseArgs(const std::vector<std::string>& cargs,
"(Experimental) Duration of virtual client running in seconds");
app.add_option("--repeat-interval", config.repeat_interval,
"(Experimental) Interval to reconnect after disconnection");
app.add_option("--max-retry", config.max_retry,
"(Experimental) Max retries when a connection fails");
app.add_option("--retry-interval", config.retry_interval,
"(Experimental) Interval to reconnect after connection fails");

app.add_flag("--no-video-device", config.no_video_device,
"Do not use video device");
Expand Down Expand Up @@ -481,6 +485,8 @@ std::vector<std::vector<std::string>> Util::NodeToArgs(const YAML::Node& inst) {
DEF_DOUBLE(inst, "", "vcs-hatch-rate");
DEF_DOUBLE(inst, "", "duration");
DEF_DOUBLE(inst, "", "repeat-interval");
DEF_INTEGER(inst, "", "max-retry");
DEF_INTEGER(inst, "", "retry-interval");
DEF_FLAG(inst, "", "no-video-device");
DEF_FLAG(inst, "", "no-audio-device");
DEF_FLAG(inst, "", "fake-capture-device");
Expand Down
46 changes: 38 additions & 8 deletions src/virtual_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,10 @@

std::shared_ptr<VirtualClient> VirtualClient::Create(
VirtualClientConfig config) {
auto vc = std::make_shared<VirtualClient>();
vc->config_ = std::move(config);

return vc;
return std::shared_ptr<VirtualClient>(new VirtualClient(config));
}
VirtualClient::VirtualClient(const VirtualClientConfig& config)
: config_(config), retry_timer_(*config.sora_config.io_context) {}

void VirtualClient::Connect() {
if (closing_) {
Expand All @@ -37,6 +36,8 @@ void VirtualClient::Connect() {
return;
}

retry_timer_.cancel();

if (config_.audio_type != VirtualClientConfig::AudioType::NoAudio) {
cricket::AudioOptions ao;
if (config_.disable_echo_cancellation)
Expand Down Expand Up @@ -91,6 +92,7 @@ void VirtualClient::Close() {
}

void VirtualClient::Clear() {
retry_timer_.cancel();
signaling_.reset();
}

Expand Down Expand Up @@ -153,9 +155,37 @@ void VirtualClient::OnSetOffer(std::string offer) {
void VirtualClient::OnDisconnect(sora::SoraSignalingErrorCode ec,
std::string message) {
signaling_.reset();
closing_ = false;
if (need_reconnect_) {
need_reconnect_ = false;
Connect();
retry_timer_.cancel();

if (!closing_) {
// VirtualClient の外から明示的に呼び出されていない、つまり不意に接続が切れた場合にここに来る
// この場合は、設定次第で再接続を試みる
if (retry_count_ < config_.max_retry) {
retry_count_ += 1;
retry_timer_.expires_from_now(boost::posix_time::milliseconds(
(int)(config_.retry_interval * 1000)));
retry_timer_.async_wait([this](boost::system::error_code ec) {
if (ec) {
return;
}
need_reconnect_ = false;
Connect();
});
}
} else {
closing_ = false;
if (need_reconnect_) {
need_reconnect_ = false;
Connect();
}
}
}
void VirtualClient::OnNotify(std::string text) {
auto json = boost::json::parse(text);
if (json.at("event_type").as_string() == "connection.created") {
// 接続できたらリトライ数をリセットする
// 他人が接続された時もリセットされることになるけど、
// その時は 0 のままになってるはずなので問題ない
retry_count_ = 0;
}
}
9 changes: 8 additions & 1 deletion src/virtual_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ struct VirtualClientConfig {
rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> capturer;
sora::SoraSignalingConfig sora_config;

int max_retry = 0;
double retry_interval = 60;

bool fixed_resolution = false;

std::string priority = "BALANCE";
Expand Down Expand Up @@ -75,7 +78,7 @@ class VirtualClient : public std::enable_shared_from_this<VirtualClient>,
void OnSetOffer(std::string offer) override;
void OnDisconnect(sora::SoraSignalingErrorCode ec,
std::string message) override;
void OnNotify(std::string text) override {}
void OnNotify(std::string text) override;
void OnPush(std::string text) override {}
void OnMessage(std::string label, std::string data) override {}

Expand All @@ -87,9 +90,13 @@ class VirtualClient : public std::enable_shared_from_this<VirtualClient>,
void OnDataChannel(std::string label) override {}

private:
VirtualClient(const VirtualClientConfig& config);

VirtualClientConfig config_;
bool closing_ = false;
bool need_reconnect_ = false;
int retry_count_ = 0;
boost::asio::deadline_timer retry_timer_;
std::shared_ptr<sora::SoraSignaling> signaling_;
rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track_;
rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track_;
Expand Down
2 changes: 2 additions & 0 deletions src/zakuro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,8 @@ int Zakuro::Run() {
VirtualClientConfig vc_config;
sora::SoraSignalingConfig& sora_config = vc_config.sora_config;
vc_config.capturer = capturer;
vc_config.max_retry = config_.max_retry;
vc_config.retry_interval = config_.retry_interval;
vc_config.no_video_device = config_.no_video_device;
vc_config.fixed_resolution = config_.fixed_resolution;
vc_config.priority = config_.priority;
Expand Down
2 changes: 2 additions & 0 deletions src/zakuro.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ struct ZakuroConfig {
double vcs_hatch_rate = 1.0;
double duration = 0;
double repeat_interval = 0;
int max_retry = 0;
double retry_interval = 60;

bool no_video_device = false;
bool no_audio_device = false;
Expand Down

0 comments on commit 208d87c

Please sign in to comment.