一直在折腾wifi音箱相关的事情,multiroom也折腾了许久时间没有折腾下来。最近偶尔在google上看到了一个号称是MagicPlay的东西可以实现MultiRoom功能,于是去详细了解了一下,所谓的MagicPlay其实就是基于物联网协议alljoyn的一个东西,而它的安卓APP也是用了alljoyn实现了相关的功能。
一、首先参考alljoyn的wiki下载通过repo下载整个代码。
如果嫌官方的E文看得头晕可以参考如下步骤:
1、下载google的repo工具;当然由于我国的特色,我给出的链接很可能进不去,repo也就不能顺利下载了,可以去百度一个或者用我下面给出的方法
curl -x http://hx.gy:1080 https://storage.googleapis.com/Git-repo-downloads/repo > ~/bin/repo
2、repo下载好后,运行:
repo init -u https://git.allseenalliance.org/gerrit/devtools/manifest
repo init -u https://git.allseenalliance.org/gerrit/devtools/manifest
repo sync
代码下载完以后,应该包含如下几个目录:compliance core data devtools extras gateway lighting multimedia services
3、等待所有代码下载完以后,跟multiroom相关(或者说音乐推送)相关的service就是在multimedia目录下了;
cd core/alljoyn/services/
cp ../../../multimedia/audio/ ./ -r 将audio目录拷贝到了core/alljoyn/services目录下
4、由于audio service是自从14年以后,就一直没有更新过,而整个alljoyn框架代码在变化,所以有些接口有了变化,我们对audio service要做如下修改:
将core/alljoyn/services/audio/src/posix/ALSADevice.cc 第528行代码改成如下形式:
waitEvents.push_back(new Event(pfds[i].fd, Event::IO_READ));
将core/alljoyn/services/audio/samples/posix/SinkServices.cc,在main函数开始处加上如下语句: 否则编译完成后,运行程序会出现段错误
if (AllJoynInit() != ER_OK) {
return 1;
}
core/alljoyn/build_core/conf/linux/SConscript ——这个文件里面,会对编译做一些配置,我们需要对这个文件里的CXXFLAGS做一些更改,不然会因为程序中有些警告而导致整个编译过程停止
去掉CXXFLAGS中的-Wunused-parameter,加上-Wno-deprecated-declarations
二、alljoyn整个工程管理不是用的make,而是使用了scons所以编译代码前需要安装scons
1、进入到core/alljoyn/services/audio目录下,运行:
scons BINDINGS=cpp WS=off 等待编译完成!
三、在core/alljoyn/services/audio/build/linux/x86/debug/dist目录下,有编译好的程序,但是这时,还需要将编译好的库路径加入到LD_LIBRARY_PATH环境变量里面去
core/alljoyn/services/audio/build/linux/x86/debug/dist/audio/lib、core/alljoyn/services/audio/build/linux/x86/debug/dist/cpp/lib 这里i两个目录需要加入到LD_LIBRARY_PATH
先运行core/alljoyn/services/audio/build/linux/x86/debug/dist/cpp/bin/alljoyn-daemon
然后运行core/alljoyn/services/audio/build/linux/x86/debug/dist/audio/bin/SinkService
四、如果步骤三中的程序顺利运行起来,在doubleTwist应用的APP中就能顺利看到设备;如果需要测试multiroom功能,只需要在另外一台电脑上,同样跑起来上面两个程序,
在APP中同时连接这两台电脑,就能同步播放音乐了。