#osc #creative-coding #service-discovery #networking #http-service #oscquery

oscq_rs

用于在网络中提供 OSC 端点发现的 OSCQuery 实现

3 个版本

0.0.3 2023 年 8 月 22 日
0.0.2 2023 年 5 月 7 日
0.0.1-pre2023 年 4 月 9 日

网络编程 中排名 #976

MIT 许可证

57KB
1K SLoC

oscq_rs

OSC (Open Sound Control) 是一种用于实时音乐表演、多媒体系统和涉及时间关键数据交换的其它应用的计算机网络协议。它为分布式系统中软件和硬件组件之间发送消息和数据提供了一种标准化的方式。OSCQuery 是 OSC 协议的扩展,允许动态发现可用的 OSC 端点和它们的属性。请参阅此介绍 OSCQuery

oscq_rs 库是 OSCQuery 协议的 Rust 实现,它提供了一种简单的方法,可以从端点描述列表生成 OSCQuery 描述,并回答 OSCQuery 请求。它允许开发者快速构建支持 OSC 的应用程序,这些应用程序可以在网络上动态发现并通过 OSC 控制。

入门

安装

要在 Rust 项目中使用 oscq_rs,您可以将其添加到您的 Cargo.toml 文件中

[dependencies]
oscq_rs = "0.1.0"
rosc = "0.10.0"
serde_json = "1.0.95"

用法

以下是如何创建一个 OSCNode 树、将其序列化,并使用集成的 HTTP 服务作为 OSCQuery 服务器的一个示例


use oscq_rs::{OscHostInfo, OscQueryParameter, OSCAccess, OSCUnit, OSCNode};
use rosc::OscType;
use std::net::SocketAddr;

fn main() {
    let info = OscHostInfo::new("OSCQuery Test".to_string(),  "127.0.0.1".to_string(), 6666)
        .with_ext_access()
        .with_ext_unit()
        .with_ext_value()
        .with_ext_description()
        .with_ext_range();

    let mut root = OSCNode::root(Some(Box::new(info)));

    let par1 = OscQueryParameter::new(
        "/group/test".to_string(),
        OscType::Float(1f32),
    )
    .with_description("My First Description".to_string())
    .with_min_max(0f32, 10f32)
    .with_access(OSCAccess::ReadWrite)
    .with_unit(OSCUnit::Distance(crate::OSCDistance::Centimeter));

    let par2 = OscQueryParameter::new(
        "/group/test2".to_string(),
        OscType::Float(1f32),
    )
    .with_description("My Second Description".to_string())
    .with_min_max(0f32, 10f32)
    .with_access(OSCAccess::ReadWrite)
    .with_unit(OSCUnit::Distance(crate::OSCDistance::Meter));

    root.add(par1).unwrap();
    root.add(par2).unwrap();

    // example output
    let serialized_tree = serde_json::to_string(&root).unwrap();
    println!("{}", serialized_tree);


    // Set the IP address and port number for the oscquery service
    let addr: SocketAddr = ([127, 0, 0, 1], 3000).into();

    // Run the oscquery service and get the futures for the server and the zeroconf server
    spawn_oscquery_service(root, addr);

    loop {
        // ... 
        // the oscquery service will run in the background
    }
}

这创建了一个具有两个端点 /group/test 和 /group/test2 的 OSCNode 树,这两个端点都是 Float 类型。然后使用 oscq_rs::serve_oscquery 函数提供的集成 HTTP 服务将该树作为 OSCQuery 服务器提供服务。在此示例中,服务器在 http://127.0.0.1:3000 上监听传入的 OSCQuery 请求。

请注意,在此示例中,我们只添加了 Float 端点,但 oscq_rs 还支持其他类型,例如 Int、Bool 和 String。

限制

  • 目前,仅支持 OscType 参数的浮点类型。
  • 尚未支持所有 OSCQuery 扩展。
  • OSCNode 树数据结构只构建一次,无法轻松动态更新。
  • 该库尚未在生产环境中广泛测试。

未来工作

  • 测试和实现所有 OSC 数据类型

请注意,这不是限制和未来工作的详尽列表,库的开发可能会随着新功能和改进的识别而发展。

贡献

欢迎贡献!请随时在 GitHub 上提交问题和拉取请求。我欢迎反馈和任何新想法。

总结

总结来说,oscq_rs 库为 Rust 项目实现 OSCQuery 提供了一种简单的方式。它的实现相对容易理解,对于想要构建可以通过网络上的 OSC 动态发现和控制的应用程序的开发商来说,是一个良好的起点。尽管该库存在一些限制,例如仅支持 'float' 类型以及难以动态更新 OSCNode 树,但未来有可能解决这些限制并为库添加更多功能。总的来说,oscq_rs 是构建 Rust 中 OSCQuery 功能应用的可靠工具。

依赖项

~7–15MB
~202K SLoC