Audinate Browse 设备浏览API 小析

    • 前言
    • 调用
    • 软件运行架构
    • 初始化配置阶段
    • 动态刷新监控设备信息
    • 获取设备相关信息
    • 备注

前言

安装完audinate SDK 后,官方提供了若干个demo 供学习使用。 对于C系的api,说真的,没有一个详细的教程或者demo,上手还真的不是那么容易。 在学习的过程总结博客一遍,以供反思。


调用

Audiate的开发机制是基于 apple 公司的 mDNS 协议的,运行机制大致如下

应用层——> API层 ——>系统服务层(mDNS)

所以要想正常的运行软件,获取设备的相关信息,前提条件是你必须先安装audinate SDK 的服务 ,并且确保服务已经启动,否则调用相关函数时,会自动报错中断程序运行。

ps:如何确定服务已经启动了呢?

其实很简单,只要启动官方的Dante Controller 看看是否能够正常运行就行

如果提示找不到服务,通过: 我的电脑——鼠标右键:管理——服务于应用程序——服务 , 找到相关的dante 服务启动就行

dante SDK 是需要通过静态连接库调用的,与此同时,SDK 依赖于win32 的网络通信库(select调用),所以还必须添加:

  • ws2_32.lib
  • iphlpapi.lib

两个库才能让软件正常通过编译。因为官方库大量采用C系语言的用法,在VS 平台上会给出大量的警告信息,如果实在看得不顺眼,直接在属性栏debug 处关闭就行了。

软件运行架构

  • 初始化配置信息
  • 动态刷新监控网络中连入设备信息
  • 获取设备相关信息

初始化配置阶段

软件初始化主要有三个方面

  • 初始化环境
  • 创建一个browser 对象
  • 开始浏览配置

    期间涉及三个核心参数: type , config , * browser结构体.配置参数*

动态刷新监控设备信息

初始化的过程中需要配置两个回调函数, socket 变化通知函数 和network 变化通知函数。

  • db_browse_set_network_changed_callback(test.browse, db_test_network_changed);
  • db_browse_set_sockets_changed_callback(test.browse, db_test_sockets_changed);

在每次轮询刷新的时候,一旦检测network 或者 socket 发生了改变,则自动刷新。

官方的思路设计是通过一个 while 循环来监控,一旦监控有数据写入select)或者时间超时(通过每次记录本地时间和获取数据的时候提供的下一次刷新时间来判断是否超时)

    if (next_resolve_timeout.tv_sec || next_resolve_timeout.tv_usec)
    {
        aud_utime_t now;
        aud_utime_get(&now);
        if (aud_utime_compare(&next_resolve_timeout, &now) < 0)
        {
            processing_needed = AUD_TRUE;
        }
    }
    result = db_browse_process(test->browse,&curr_sockets,&next_resolve_timeout);

获取设备相关信息

        const db_browse_network_t * network = db_browse_get_network(test->browse);
        for (i = 0; i < db_browse_network_get_num_devices(network); i++)
        {
            db_browse_device_t * device = db_browse_network_device_at_index(network, i);
            const char * name = db_browse_device_get_name(device);
            result = db_browse_device_reconfirm(device, 0, AUD_FALSE);
            if (result != AUD_SUCCESS)
            {
                printf("Error reconfirming device ‘%s‘: %s\n", name, aud_error_message(result, test->errbuf));
                //return result;
            }
            printf("Reconfirming device ‘%s‘\n", name);
        }

通过 network 对象抽取去 db_browse_device_t * device 对象之后, 接下来的事情就是收割信息的时候. 只要获取到了device 句柄 之后,获取和配置设备的相关信息,就如同狼入羊群,虎入猪圈,爱怎么整就怎么整。由于官方提供的API 非常详细,而且调用起来也很方便,这里就不再赘述了

备注

在实际调试开发过程中,官方提供的动态刷新机制其实是有问题的,由于第二次

db_browse_process 提取的next_resolve_timeout值被自动置位0 了,导致无法定时刷新网络中的设备变化了。

导致这个问题的原因,可能是来自于官方的API 函数调用,无法获取正常的next_resolve_timeout时间,这个时间是设备的中的本地时间, 可能是没有同步时钟的缘故吧。

不过鉴于实际开发过程中并不需要依赖官方的设计架构,可自行通过配置一个定时器来完成无数据写入情况下定时的监控刷新

    result = db_browse_process(test->browse,&curr_sockets,&next_resolve_timeout);

时间: 2024-10-11 08:09:35

Audinate Browse 设备浏览API 小析的相关文章

微信小程序把玩(三十八)获取设备信息 API

原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx.onAccelerometerChange, 罗盘数据wx.onCompassChange wxml <button type="primary" bindtap="getNetWorkType">获取网络类型</button> <butt

设备树API

设备树API通常以of_开头,实现代码位于drivers/of目录下. 参考: 1. linux设备树语法 2. ARM Linux 3.x的设备树(Device Tree)

Python之美[从菜鸟到高手]--NotImplemented小析

今天写代码时无意碰到NotImplemented,我一愣,难道是NotImplementedError的胞弟,所以稍微研究了一下. NotImplemented故名思议,就是"未实现",一般是用在一些比较算法中的,如class的__eq__,__lt__等,注意NotImplemented并不是异常,所以不能 使用raise,当没有实现时应该是return NotImplemented. 我们可以看看django中的Field的实现, @total_ordering class Fie

ios设备突破微信小视频6S限制的方法

刷微信朋友圈只发文字和图片怎能意犹未竟,微信小视频是一个很好的补充,音视频到位,流行流行最流行.但小视频时长不能超过6S,没有滤镜等是很大的遗憾.but有人突破限制玩出了花样,用ios设备在朋友圈晒出超时长.带滤镜甚至慢镜头拍摄的小视频.随ytkah一起看看他们是怎么玩的吧 未越狱ios设备在微信朋友圈上传延时.慢动作.滤镜.超时长小视频的方法: 第①步,将iPhone拍摄好的延时.超时长或者慢动作的视频保存到本地电脑,并同时截取一张视频画面保存.(PS:添加滤镜效果可以通过iMovie等App

Poco logger 日志使用小析

Poco logger 日志使用小析 Poco logger 日志使用小析 日志 logger 库选择 Pocologger 架构简析 步骤一 生成消息 步骤二 写入logger 步骤三 导入channel 步骤四 写文件 使用 h file cpp file main 入口函数 备注 拓展 总结 转载请注明本文链接 日志 在软件开发过程中,为了定位软件运行过程中可能出现的错误,一种常用的做法是在潜在的错误位置,设置防御代码,并且将错误代码执行后的错误信息记录下来,以供后续改进代码提供支持. 在

Jquery判断是不是移动设备浏览

首先,只判断是否是用移动设备浏览的: // Mobile 这里是只有不再移动设备上访问时,才给相应元素加上 mouseenter  和  mouseleave  事件. if (!navigator.userAgent.match(/mobile/i)) { $('.nav-dots span').mouseenter(function() { $(this).css('background-color', 'rgba(0, 0, 0, 0.2) !important'); }); $('.na

sonarqube7.2版本web api简析

sonarqube7.2版本web api简析 本文介绍sonarqube的部分实用Web API,并试图联系实际进行分析,方便集成.以7.2版本为例,下载移步官网. Web API文档路径 安装并部署7.2版本的sonar之后(推荐在linux上安装),在浏览器上打开sonar,默认是ip:9000端口. http://{ip}:9000/web_api即是sonar的api文档. 由于国内资源较少,当时在官网看了半天文档又查了一堆才发现这个预设的路径.这也是为什么写这篇文章,我认为这样的工具

《ServerSuperIO Designer IDE使用教程》- 5.树形结构管理设备驱动,小版本更新。发布:v4.2.3.1版本

v4.2.3.1 更新内容:1.选择和管理设备驱动,增加树状结构显示.2.优化ide代码,核心代码没有改动.下载地址:官方下载 5. 树形结构管理设备驱动,小版本更新 5.1    概述 此次升级主要是对增加设备驱动的树形结构显示,方便按类选择设备驱动.涉及到增加设备驱动和管理设备驱动两个功能.此次是小版本更新,不影响以前版本的使用. 5.2    树形结构管理设备驱动 增加设备驱动功能,按树形结构选择.现阶段主要驱动包括:Modbus Serial.Modbus Tcp.SuperLink(网

ASP.NET 异步Web API + jQuery Ajax 文件上传代码小析

该示例中实际上应用了 jquery ajax(web client) + async web api 双异步. jquery ajax post 1 $.ajax({ 2 type: "POST", 3 url: "/api/FileUpload", 4 contentType: false, 5 processData: false, 6 data: data, 7 success: function (results) { 8 ShowUploadControl