-
- 前言
- 调用
- 软件运行架构
- 初始化配置阶段
- 动态刷新监控设备信息
- 获取设备相关信息
- 备注
前言
安装完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);