Skip to content

Commit

Permalink
Refine rpc protocol
Browse files Browse the repository at this point in the history
  • Loading branch information
gavv committed Apr 26, 2023
1 parent 8870b98 commit 86db1d6
Show file tree
Hide file tree
Showing 27 changed files with 4,288 additions and 1,712 deletions.
55 changes: 29 additions & 26 deletions driver/device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,19 @@
#include <fmt/core.h>
#include <spdlog/spdlog.h>

#include <cassert>

namespace rocvad {

namespace {

void populate_default_values(DeviceInfo& info)
{
if (info.config.name.empty()) {
info.config.name = fmt::format("Roc Virtual Device #{}", info.index);
}
}

aspl::DeviceParameters make_device_params(const DeviceConfig& config)
aspl::DeviceParameters make_device_params(const DeviceInfo& info)
{
aspl::DeviceParameters device_params;

device_params.Name = config.name;
device_params.Name = info.name;
device_params.Manufacturer = BuildInfo::driver_manufacturer;
device_params.DeviceUID = config.uid;
device_params.DeviceUID = info.uid;
device_params.ModelUID = BuildInfo::driver_bundle_id;
device_params.SampleRate = 44100; // TODO
device_params.ChannelCount = 2; // TODO
Expand All @@ -44,30 +39,36 @@ aspl::DeviceParameters make_device_params(const DeviceConfig& config)
Device::Device(std::shared_ptr<aspl::Plugin> plugin,
IndexAllocator& index_allocator,
UidGenerator& uid_generator,
const DeviceConfig& config)
const DeviceInfo& info)
: index_allocator_(index_allocator)
, uid_generator_(uid_generator)
, plugin_(plugin)
, info_(config)
, info_(info)
{
info_.index = index_allocator_.allocate();
if (info_.index == 0) {
info_.index = index_allocator_.allocate_and_acquire();
} else {
index_allocator_.acquire(info_.index);
}

if (info_.config.uid.empty()) {
info_.config.uid = uid_generator_.generate();
if (info_.uid.empty()) {
info_.uid = uid_generator_.generate();
}

populate_default_values(info_);
if (info_.name.empty()) {
info_.name = fmt::format("Roc Virtual Device #{}", info_.index);
}

spdlog::info("creating device object, index={} uid={} type={} name=\"{}\"",
info_.index,
info_.config.uid,
info_.config.type,
info_.config.name);
info_.uid,
info_.type,
info_.name);

device_ = std::make_shared<aspl::Device>(
plugin->GetContext(), make_device_params(info_.config));
device_ =
std::make_shared<aspl::Device>(plugin->GetContext(), make_device_params(info_));

device_->AddStreamWithControlsAsync(info_.config.type == DeviceType::Sender
device_->AddStreamWithControlsAsync(info_.type == DeviceType::Sender
? aspl::Direction::Output
: aspl::Direction::Input);

Expand All @@ -78,13 +79,15 @@ Device::~Device()
{
spdlog::info("destroying device object, index={} uid={} type={} name=\"{}\"",
info_.index,
info_.config.uid,
info_.config.type,
info_.config.name);
info_.uid,
info_.type,
info_.name);

plugin_->RemoveDevice(device_);

index_allocator_.release(info_.index);
if (info_.index != 0) {
index_allocator_.release(info_.index);
}
}

DeviceInfo Device::info()
Expand Down
2 changes: 1 addition & 1 deletion driver/device.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Device
Device(std::shared_ptr<aspl::Plugin> plugin,
IndexAllocator& index_allocator,
UidGenerator& uid_generator,
const DeviceConfig& config);
const DeviceInfo& info);
~Device();

Device(const Device&) = delete;
Expand Down
20 changes: 4 additions & 16 deletions driver/device_defs.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,15 @@ enum class DeviceType
Receiver,
};

// Device creation parameters.
struct DeviceConfig
// Device info.
struct DeviceInfo
{
DeviceType type = DeviceType::Sender;
std::string name;
std::string uid;
};

// Device run-time information
struct DeviceInfo
{
IndexAllocator::index_t index = 0;
std::string uid;

DeviceConfig config;

DeviceInfo() = default;

DeviceInfo(const DeviceConfig& config)
: config(config)
{
}
std::string name;
};

} // namespace rocvad
Expand Down
30 changes: 19 additions & 11 deletions driver/device_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,25 +52,33 @@ DeviceInfo DeviceManager::get_device(const std::string& uid)
return device->info();
}

DeviceInfo DeviceManager::add_device(const DeviceConfig& config)
DeviceInfo DeviceManager::add_device(DeviceInfo info)
{
std::lock_guard lock(mutex_);

if (!config.uid.empty() && device_by_uid_.count(config.uid)) {
if (info.index != 0 && device_by_index_.count(info.index)) {
throw std::invalid_argument(
fmt::format("device with uid \"{}\" already exists", config.uid));
fmt::format("device with index {} already exists", info.index));
}

if (!info.uid.empty() && device_by_uid_.count(info.uid)) {
throw std::invalid_argument(
fmt::format("device with uid \"{}\" already exists", info.uid));
}

auto device =
std::make_shared<Device>(plugin_, index_allocator_, uid_generator_, config);
std::make_shared<Device>(plugin_, index_allocator_, uid_generator_, info);

auto info = device->info();
info = device->info();

assert(info.index != 0);
assert(!info.uid.empty());

assert(!device_by_index_.count(info.index));
assert(!device_by_uid_.count(info.config.uid));
assert(!device_by_uid_.count(info.uid));

device_by_index_[info.index] = device;
device_by_uid_[info.config.uid] = device;
device_by_uid_[info.uid] = device;

return info;
}
Expand All @@ -83,10 +91,10 @@ void DeviceManager::delete_device(index_t index)
auto info = device->info();

assert(device_by_index_.count(info.index));
assert(device_by_uid_.count(info.config.uid));
assert(device_by_uid_.count(info.uid));

device_by_index_.erase(info.index);
device_by_uid_.erase(info.config.uid);
device_by_uid_.erase(info.uid);
}

void DeviceManager::delete_device(const std::string& uid)
Expand All @@ -97,10 +105,10 @@ void DeviceManager::delete_device(const std::string& uid)
auto info = device->info();

assert(device_by_index_.count(info.index));
assert(device_by_uid_.count(info.config.uid));
assert(device_by_uid_.count(info.uid));

device_by_index_.erase(info.index);
device_by_uid_.erase(info.config.uid);
device_by_uid_.erase(info.uid);
}

std::shared_ptr<Device> DeviceManager::find_device_(index_t index)
Expand Down
2 changes: 1 addition & 1 deletion driver/device_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class DeviceManager
DeviceInfo get_device(index_t index);
DeviceInfo get_device(const std::string& uid);

DeviceInfo add_device(const DeviceConfig& config);
DeviceInfo add_device(DeviceInfo info);

void delete_device(index_t index);
void delete_device(const std::string& uid);
Expand Down
89 changes: 61 additions & 28 deletions driver/driver_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,55 @@ namespace rocvad {

namespace {

void device_config_from_rpc(DeviceConfig& out, const MesgDeviceConfig& in)
void device_info_from_rpc(DeviceInfo& out, const PrDeviceInfo& in)
{
out.type =
in.type() == MesgDeviceConfig::SENDER ? DeviceType::Sender : DeviceType::Receiver;
out.uid = in.uid();
out.name = in.name();
switch (in.type()) {
case PR_DEVICE_TYPE_SENDER:
out.type = DeviceType::Sender;
break;

case PR_DEVICE_TYPE_RECEIVER:
out.type = DeviceType::Receiver;
break;

default:
throw std::invalid_argument(
fmt::format("device type should be either PR_DEVICE_TYPE_SENDER or "
"PR_DEVICE_TYPE_RECEIVER"));
}

if (in.has_index()) {
if (in.index() == 0) {
throw std::invalid_argument(
fmt::format("device index should be either unset or non-zero"));
}
out.index = in.index();
}

if (in.has_uid()) {
if (in.uid().empty()) {
throw std::invalid_argument(
fmt::format("device uid should be either unset or non-empty"));
}
out.uid = in.uid();
}

if (in.has_name()) {
if (in.name().empty()) {
throw std::invalid_argument(
fmt::format("device name should be either unset or non-empty"));
}
out.name = in.name();
}
}

void device_info_to_rpc(MesgDeviceInfo& out, const DeviceInfo& in)
void device_info_to_rpc(PrDeviceInfo& out, const DeviceInfo& in)
{
out.set_type(
in.type == DeviceType::Sender ? PR_DEVICE_TYPE_SENDER : PR_DEVICE_TYPE_RECEIVER);
out.set_index(in.index);
out.mutable_config()->set_type(in.config.type == DeviceType::Sender
? MesgDeviceConfig::SENDER
: MesgDeviceConfig::RECEIVER);
out.mutable_config()->set_uid(in.config.uid);
out.mutable_config()->set_name(in.config.name);
out.set_uid(in.uid);
out.set_name(in.name);
}

} // namespace
Expand All @@ -49,17 +82,17 @@ DriverService::DriverService(std::shared_ptr<LogManager> log_manager,
}

grpc::Status DriverService::ping(grpc::ServerContext* context,
const MesgNone* request,
MesgNone* response)
const PrNone* request,
PrNone* response)
{
return execute_command_("ping", [=]() {
// no-op
});
}

grpc::Status DriverService::driver_info(grpc::ServerContext* context,
const MesgNone* request,
MesgDriverInfo* response)
const PrNone* request,
PrDriverInfo* response)
{
return execute_command_("driver_info", [=]() {
response->set_version(BuildInfo::git_version);
Expand All @@ -68,8 +101,8 @@ grpc::Status DriverService::driver_info(grpc::ServerContext* context,
}

grpc::Status DriverService::stream_logs(grpc::ServerContext* context,
const MesgNone* request,
grpc::ServerWriter<MesgLogEntry>* writer)
const PrNone* request,
grpc::ServerWriter<PrLogEntry>* writer)
{
return execute_command_("stream_logs", [=]() {
auto log_sender = log_manager_->attach_sender(*writer);
Expand All @@ -83,8 +116,8 @@ grpc::Status DriverService::stream_logs(grpc::ServerContext* context,
}

grpc::Status DriverService::get_all_devices(grpc::ServerContext* context,
const MesgNone* request,
MesgDeviceList* response)
const PrNone* request,
PrDeviceList* response)
{
return execute_command_("get_all_devices", [=]() {
const auto devices = device_manager_->get_all_devices();
Expand All @@ -96,8 +129,8 @@ grpc::Status DriverService::get_all_devices(grpc::ServerContext* context,
}

grpc::Status DriverService::get_device(grpc::ServerContext* context,
const MesgDeviceSelector* request,
MesgDeviceInfo* response)
const PrDeviceSelector* request,
PrDeviceInfo* response)
{
return execute_command_("get_device", [=]() {
const auto device_info = request->has_index()
Expand All @@ -109,21 +142,21 @@ grpc::Status DriverService::get_device(grpc::ServerContext* context,
}

grpc::Status DriverService::add_device(grpc::ServerContext* context,
const MesgDeviceConfig* request,
MesgDeviceInfo* response)
const PrDeviceInfo* request,
PrDeviceInfo* response)
{
return execute_command_("add_device", [=]() {
DeviceConfig device_config;
device_config_from_rpc(device_config, *request);
DeviceInfo device_info;
device_info_from_rpc(device_info, *request);

const auto device_info = device_manager_->add_device(device_config);
device_info = device_manager_->add_device(device_info);
device_info_to_rpc(*response, device_info);
});
}

grpc::Status DriverService::delete_device(grpc::ServerContext* context,
const MesgDeviceSelector* request,
MesgNone* response)
const PrDeviceSelector* request,
PrNone* response)
{
return execute_command_("delete_device", [=]() {
if (request->has_index()) {
Expand Down
Loading

0 comments on commit 86db1d6

Please sign in to comment.