我想为音频交互的实时接口做一个概念,因此真正的低延迟是必不可少的.我在上周已经阅读了很多关于这个主题的内容,但是在如此短的时间内无法获得真实的概述.所以在我深挖之前,我需要评估这个项目的可行性.
我已经阅读了很多关于Android和低延迟音频应用程序的问题,我知道iOS在这个领域是优越的,但我希望在可能的情况下使用Android.(我没有开发iOS必不可少的mac,我更喜欢更开放'Andoid更多)
所以我的问题是:
坏的低延迟行为是否仅与实际音频缓冲/处理有关,还是仅影响midi或OSC应用程序?对我来说,接口是重要的部分 - 这意味着我可以获得在单独的PC中处理的midi/OSC命令.
我需要较低的总体延迟(从手指触摸事件到命令输出).与iOS相比,这也是Android的问题吗?
我已成功将UDPreceive功能合并到我的应用程序中.然而!我无法弄清楚如何阻止UDP侦听器无限运行.OSCPack库内置了Break()和AsynchronousBreak(),但我无法实现这些.
在oscpack中的udpSocket.cpp文件中:
void Run() //the listener function (WORKING!)
{
break_ = false;
//UDP Listener Code
void Break()
{
break_ = true;
}
void AsynchronousBreak()
{
break_ = true;
// Send a termination message to the asynchronous break pipe, so select() will return
write( breakPipe_[1], "!", 1 );
}
}
Run Code Online (Sandbox Code Playgroud)
尽管编译器建议正确调用所有内容,但我尝试从数据包Listener类调用Break()似乎没有做任何事情:
SocketReceiveMultiplexer s;
s.Break();
Run Code Online (Sandbox Code Playgroud)
我尝试过的另一种方法是根据RunUntilSigInt()函数引发中断标志.在数据包监听器类中:
raise(SIGINT);
Run Code Online (Sandbox Code Playgroud)
但这会终止整个程序,而不是仅仅打破UDPListener.作为参考,这里是udpSocket.cpp中的RunUntilSigInt()代码:
void SocketReceiveMultiplexer::RunUntilSigInt()
{
assert( multiplexerInstanceToAbortWithSigInt_ == 0 ); /* at present we support only one multiplexer instance running until sig int */
multiplexerInstanceToAbortWithSigInt_ = …Run Code Online (Sandbox Code Playgroud) 我知道有一些工具可以在Python中使用Pure Data(Pd),因此您可以在不使用GUI的情况下编程和使用Pd.我想知道是否有人尝试过相反的事情.我想将排序信息发送到Python并使用我的Python脚本进行处理.然后我想把信息发送给Pd.
到目前为止,我已经使用Pd中的[msgfile]对象将序列写入文本文件.这些可以用Python打开和操作,但这涉及切换到IDLE并手动运行程序,再次写入文本文件,最后从Pd中读取文件.如果Pd可以执行Python脚本,这将节省我在C或C++中编写自己的对象或在程序之间切换和手动运行脚本的工作量.
我正在处理的代码是抛出上述异常.我对多线程编程不是很有经验,而且我没有很多运气对此进行故障排除.
该程序使用Processing和OSC用Java编写.主要的OSC事件处理程序是向Vector添加元素.它是在用户输入时触发的,因此非常难以预测.此Vector也在Processing的动画线程中进行迭代和更新,该线程每秒约60次非常频繁地发生.
有时,在动画线程中迭代Vector时会调用OSC事件处理程序并抛出异常.
我已经尝试将" synchronized"修饰符添加到OSC事件处理程序中.我还试图提示对Vector的更改,直到动画线程的下一帧(时间步长),但我发现它最终会延迟抛出的异常.
我该怎么做才能防止这种行为?有没有办法只访问Vector,如果它还没有被使用?
更新: 两个答案表明列表在迭代时添加或删除了元素.这实际上是由于OSC正在从迭代列表的线程以外的线程触发处理程序的事实.我正在寻找一种方法来防止这种情况.
这是一些伪代码:
Vector<String> list = new Vector<String>();
Vector<Particle> completedParticles = new Vector<Particle>();
public void oscEvent( OSCMessage message )
{
list.add( new Particle( message.x, message.y ) );
}
public void draw()
{
completedParticles.clear();
for( Particle p : list )
{
p.draw();
if( p.isComplete ) {
completedParticles.add( p );
}
}
list.removeAll( completedParticles );
}
Run Code Online (Sandbox Code Playgroud) 我正在使用SDK for android 4.0编写一个Android应用程序
我想知道在android SDK中是否有用于发送OSC消息(Open Sound Control)的API,或者我应该只使用java OSC SDK.
我尝试浏览http://opensoundcontrol.org/introduction-osc ,在实现中我发现了以下内容:http://www.illposed.com/software/javaosc.html
所以我只是想知道我是否应该使用JavaOSC,其他一些库,或者如果android自带API来发送OSC消息.
任何有关该问题的信息将不胜感激.
谢谢
幼狮
我需要在NodeJS中创建一个支持OSC over UDP的测试服务器.快速搜索后,似乎有很多选择.任何人都可以在NodeJS中推荐OSC模块吗?
我在kivy上做了一个简单的OSC测试,看起来我在Android手机上运行它们时遇到了问题.为了更好地理解Kivy和OSC是如何工作的,我做了一个小测试,它应该显示应用程序和另一台计算机之间的通信.一个服务器
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import *
from kivy.uix.button import Button
from kivy.clock import Clock
from kivy.lib.osc import oscAPI
class CButton(Button):
def __init__(self, **kwargs):
kwargs['text'] = kwargs.get('text', 'empty')
super(CButton, self).__init__(**kwargs)
class OscWidget(GridLayout):
def __init__(self, **kwargs):
super(OscWidget, self).__init__(**kwargs)
def callback(self, instance, *args):
self.oscbutton.text = instance[2]
oscAPI.sendMsg('/current/reply', dataArray=['answer'], ipAddr='192.168.1.101', port=8889)
class OscButtonApp(App):
def buttpress(self, *args):
oscAPI.sendMsg('/current/reply', dataArray=['call'], ipAddr='192.168.1.101', port=8889)
def build(self):
btnapp = OscWidget()
oscAPI.init()
oscid = oscAPI.listen(port=8889)
osc.bind(oscid, btnapp.callback, '/test/reply')
Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0)
return …Run Code Online (Sandbox Code Playgroud)