Skip to content

Commit 65c30eb

Browse files
committed
osc: work on adding more features to rate limiter
1 parent 4fd602a commit 65c30eb

File tree

10 files changed

+116
-10
lines changed

10 files changed

+116
-10
lines changed

3rdparty/libossia

Submodule libossia updated 66 files

src/plugins/score-plugin-protocols/Protocols/CoAP/CoAPDevice.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ bool CoAPDevice::reconnect()
4646
{
4747
if(stgs.rate)
4848
{
49+
ossia::net::rate_limiter_configuration conf{
50+
.duration = std::chrono::milliseconds(*stgs.rate)};
4951
auto rate = std::make_unique<ossia::net::rate_limiting_protocol>(
50-
std::chrono::milliseconds{*stgs.rate}, std::move(proto));
52+
conf, std::move(proto));
5153
m_dev = std::make_unique<ossia::net::generic_device>(std::move(rate), name);
5254
}
5355
else

src/plugins/score-plugin-protocols/Protocols/MQTT/MQTTDevice.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ bool MQTTDevice::reconnect()
4545
{
4646
if(stgs.rate)
4747
{
48+
ossia::net::rate_limiter_configuration conf{
49+
.duration = std::chrono::milliseconds(*stgs.rate)};
4850
auto rate = std::make_unique<ossia::net::rate_limiting_protocol>(
49-
std::chrono::milliseconds{*stgs.rate}, std::move(proto));
51+
conf, std::move(proto));
5052
m_dev = std::make_unique<ossia::net::generic_device>(std::move(rate), name);
5153
}
5254
else

src/plugins/score-plugin-protocols/Protocols/Minuit/MinuitDevice.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ bool MinuitDevice::reconnect()
4646

4747
if(stgs.rate)
4848
{
49+
ossia::net::rate_limiter_configuration conf{
50+
.duration = std::chrono::milliseconds(*stgs.rate)};
4951
ossia_settings = std::make_unique<ossia::net::rate_limiting_protocol>(
50-
std::chrono::milliseconds{*stgs.rate}, std::move(ossia_settings));
52+
conf, std::move(ossia_settings));
5153
}
5254

5355
m_dev = std::make_unique<ossia::net::generic_device>(

src/plugins/score-plugin-protocols/Protocols/OSC/OSCDevice.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,14 @@ osc_protocols make_osc_protocol(
128128

129129
if(stgs.rate)
130130
{
131+
auto rate_stgs = *stgs.rate;
132+
if(stgs.configuration.bundle_strategy
133+
== ossia::net::osc_protocol_configuration::ALWAYS_BUNDLE)
134+
{
135+
rate_stgs.bundle = true;
136+
}
131137
auto rl = std::make_unique<ossia::net::rate_limiting_protocol>(
132-
std::chrono::milliseconds{*stgs.rate}, std::move(protos.ret));
138+
rate_stgs, std::move(protos.ret));
133139
protos.ratelimit = rl.get();
134140
protos.ret = std::move(rl);
135141
}

src/plugins/score-plugin-protocols/Protocols/OSC/OSCProtocolSettingsWidget.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,8 @@ Device::DeviceSettings OSCProtocolSettingsWidget::getSettings() const
232232
osc.configuration.bundle_strategy = this->m_bundle->isChecked()
233233
? osc_bundle_t::ALWAYS_BUNDLE
234234
: osc_bundle_t::NEVER_BUNDLE;
235-
osc.rate = m_rate->rate();
235+
236+
osc.rate = m_rate->configuration();
236237
osc.bonjour = m_bonjour->isChecked();
237238
osc.oscquery = m_oscquery->value();
238239
if(osc.oscquery.value() <= 0)
@@ -276,7 +277,7 @@ void OSCProtocolSettingsWidget::setSettings(const Device::DeviceSettings& settin
276277
= decltype(ossia::net::osc_protocol_configuration::bundle_strategy);
277278
m_settings = settings.deviceSpecificSettings.value<OSCSpecificSettings>();
278279
m_oscVersion->setCurrentIndex(m_settings.configuration.version);
279-
m_rate->setRate(m_settings.rate);
280+
m_rate->setConfiguration(m_settings.rate);
280281
m_bonjour->setChecked(m_settings.bonjour);
281282
m_bundle->setChecked(
282283
m_settings.configuration.bundle_strategy == osc_bundle_t::ALWAYS_BUNDLE);

src/plugins/score-plugin-protocols/Protocols/OSC/OSCSpecificSettings.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22
#include <ossia/detail/optional.hpp>
3+
#include <ossia/network/rate_limiter_configuration.hpp>
34
#include <ossia/protocols/osc/osc_factory.hpp>
45

56
#include <QString>
@@ -11,7 +12,7 @@ namespace Protocols
1112
struct OSCSpecificSettings
1213
{
1314
ossia::net::osc_protocol_configuration configuration;
14-
std::optional<int> rate{};
15+
std::optional<ossia::net::rate_limiter_configuration> rate{};
1516
bool bonjour{};
1617
std::optional<int> oscquery{};
1718

src/plugins/score-plugin-protocols/Protocols/OSC/OSCSpecificSettingsSerialization.cpp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,45 @@ void JSONWriter::write(ossia::net::osc_protocol_configuration& n)
415415
n.transport <<= obj["Transport"];
416416
}
417417

418+
// Note: bundle is already in osc_protocol_configuration
419+
template <>
420+
void DataStreamReader::read(const ossia::net::rate_limiter_configuration& n)
421+
{
422+
m_stream << std::chrono::duration_cast<std::chrono::milliseconds>(n.duration).count()
423+
<< n.send_all << n.repeat;
424+
insertDelimiter();
425+
}
426+
427+
template <>
428+
void DataStreamWriter::write(ossia::net::rate_limiter_configuration& n)
429+
{
430+
int dur{};
431+
m_stream >> dur >> n.send_all >> n.repeat;
432+
n.duration = std::chrono::milliseconds{dur};
433+
checkDelimiter();
434+
}
435+
436+
template <>
437+
void JSONReader::read(const ossia::net::rate_limiter_configuration& n)
438+
{
439+
stream.StartObject();
440+
obj["Duration"]
441+
= std::chrono::duration_cast<std::chrono::milliseconds>(n.duration).count();
442+
obj["SendAll"] = n.send_all;
443+
obj["Repeat"] = n.repeat;
444+
stream.EndObject();
445+
}
446+
447+
template <>
448+
void JSONWriter::write(ossia::net::rate_limiter_configuration& n)
449+
{
450+
int dur{};
451+
dur <<= obj["Duration"];
452+
n.duration = std::chrono::milliseconds{dur};
453+
n.send_all <<= obj["SendAll"];
454+
n.repeat <<= obj["Repeat"];
455+
}
456+
418457
template <>
419458
void DataStreamReader::read(const Protocols::OSCSpecificSettings& n)
420459
{
@@ -464,7 +503,22 @@ void JSONWriter::write(Protocols::OSCSpecificSettings& n)
464503
}
465504

466505
if(auto it = obj.tryGet("Rate"))
467-
n.rate = it->toInt();
506+
{
507+
508+
if(it->obj.IsInt())
509+
{
510+
// pre v3.4.1
511+
n.rate = ossia::net::rate_limiter_configuration{
512+
.duration = std::chrono::milliseconds{it->toInt()}};
513+
}
514+
else
515+
{
516+
// post v3.4.1
517+
ossia::net::rate_limiter_configuration conf;
518+
conf <<= *it;
519+
n.rate = conf;
520+
}
521+
}
468522

469523
assign_with_default(n.bonjour, obj.tryGet("Bonjour"), false);
470524

src/plugins/score-plugin-protocols/Protocols/OSCQuery/OSCQueryDevice.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,10 @@ void OSCQueryDevice::slot_createDevice()
221221

222222
if(stgs.rate)
223223
{
224+
ossia::net::rate_limiter_configuration conf{
225+
.duration = std::chrono::milliseconds(*stgs.rate)};
224226
ossia_settings = std::make_unique<ossia::net::rate_limiting_protocol>(
225-
std::chrono::milliseconds{*stgs.rate}, std::move(ossia_settings));
227+
conf, std::move(ossia_settings));
226228
}
227229

228230
// run the commands in the Qt event loop

src/plugins/score-plugin-protocols/Protocols/RateWidget.hpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <score/widgets/MarginLess.hpp>
33

44
#include <ossia/detail/optional.hpp>
5+
#include <ossia/network/rate_limiter_configuration.hpp>
56

67
#include <QCheckBox>
78
#include <QHBoxLayout>
@@ -20,11 +21,15 @@ class RateWidget final : public QWidget
2021
: QWidget{parent}
2122
, m_check{new QCheckBox{this}}
2223
, m_spin{new QSpinBox{this}}
24+
, m_repeat{new QCheckBox{tr("Repeat"), this}}
25+
, m_send_all{new QCheckBox{tr("Send all"), this}}
2326
{
2427
auto lay = new score::MarginLess<QHBoxLayout>;
2528

2629
lay->addWidget(m_check);
2730
lay->addWidget(m_spin);
31+
lay->addWidget(m_repeat);
32+
lay->addWidget(m_send_all);
2833
m_spin->setSizePolicy(QSizePolicy::MinimumExpanding, {});
2934
m_spin->setSuffix("ms");
3035
m_spin->setRange(1, 5000);
@@ -42,6 +47,35 @@ class RateWidget final : public QWidget
4247
setLayout(lay);
4348
}
4449

50+
std::optional<ossia::net::rate_limiter_configuration> configuration() const noexcept
51+
{
52+
if(!m_check->isChecked())
53+
{
54+
return std::optional<ossia::net::rate_limiter_configuration>{};
55+
}
56+
57+
ossia::net::rate_limiter_configuration res;
58+
res.duration = std::chrono::milliseconds{m_spin->value()};
59+
res.repeat = m_repeat->isChecked();
60+
res.send_all = m_send_all->isChecked();
61+
return res;
62+
}
63+
64+
void setConfiguration(std::optional<ossia::net::rate_limiter_configuration> r) noexcept
65+
{
66+
if(r)
67+
{
68+
m_check->setChecked(true);
69+
m_spin->setValue(r->duration.count());
70+
m_repeat->setChecked(r->repeat);
71+
m_send_all->setChecked(r->send_all);
72+
}
73+
else
74+
{
75+
m_check->setChecked(false);
76+
}
77+
}
78+
4579
std::optional<int> rate() const noexcept
4680
{
4781
if(!m_check->isChecked())
@@ -72,6 +106,8 @@ class RateWidget final : public QWidget
72106
private:
73107
QCheckBox* m_check{};
74108
QSpinBox* m_spin{};
109+
QCheckBox* m_repeat{};
110+
QCheckBox* m_send_all{};
75111
};
76112

77113
}

0 commit comments

Comments
 (0)