Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Cocoa类中使用核心音频_Objective C_Macos_Cocoa_Core Audio_Coremidi - Fatal编程技术网

Objective c 在Cocoa类中使用核心音频

Objective c 在Cocoa类中使用核心音频,objective-c,macos,cocoa,core-audio,coremidi,Objective C,Macos,Cocoa,Core Audio,Coremidi,我一直在研究书中的例子。这本书很好地解释了API及其工作原理,但并没有真正讨论如何将它们集成到Cocoa项目中 我真的不知道如何将核心音频/midi编程与obj-c类混合使用。有没有好的教程可以解释这方面的标准实践 此时此刻,我脑海中的一些问题是: 如果我需要一个userdata结构,我可以用某种类型的obj-c实例变量或@properties来替换它,还是必须是一个c结构 我应该将音频回调函数放在代码中的什么位置?他们能坐在@implementation之外的某个地方吗 由于回调函数是用C编

我一直在研究书中的例子。这本书很好地解释了API及其工作原理,但并没有真正讨论如何将它们集成到Cocoa项目中

我真的不知道如何将核心音频/midi编程与obj-c类混合使用。有没有好的教程可以解释这方面的标准实践

此时此刻,我脑海中的一些问题是:

  • 如果我需要一个userdata结构,我可以用某种类型的obj-c实例变量或@properties来替换它,还是必须是一个c结构
  • 我应该将音频回调函数放在代码中的什么位置?他们能坐在@implementation之外的某个地方吗
  • 由于回调函数是用C编写的,如果我想调用objective-C函数或访问其中的类属性,该怎么办

通常的做法是,如果回调声明类实例为void*,则将其作为userdata传递。然后,您的回调可以将其强制转换为对象,并调用其中的任何方法。

C是Objective C的适当子集。因此,您可以使用C数据类型和调用约定将核心音频与Cocoa集成。C源代码可以放在单独的.C文件中,也可以放在目标C实现中。可以将目标C对象视为指向C回调中C结构的指针


此外,不建议在实时核心音频回调中使用Objective C消息传递。

Objective-C对象与C结构基本上没有区别。如果使用ARC,您可能需要
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。重要的是,你可以得到一个指向你想要传递的内容的指针。你可以把你的音频回调函数放在任何你想放的地方,如果你愿意,甚至可以放在
@实现
中。您可以在
@implementation
中使用C定义,而不影响运行时。此外,如果您的文件使用.m扩展名,您可以在其他类似C的函数中使用Objective-C。我没有意识到将C函数放在@implementation中是可以的!我正在使用的源文件确实有.m扩展名,但由于某些原因,当我尝试访问类属性时,xcode不会自动完成它,好像它超出了范围或其他什么?您也可以将它们放在
@实现
之外(但无论如何都放在同一个文件内)。这真的没关系。但是,您不能从自由C函数访问实例变量:您需要将对象作为参数。除了在核心音频实时线程的回调(例如渲染回调)中,您真的不应该执行任何调用Objective-C运行时的操作。您可以使用object->variable语法直接访问实例变量,只要它们是使用@public.Ahh声明的,这是有意义的。我没有意识到,将对象作为一个空洞传递,然后将其抛回是可以的。我要做个实验@AndrewMadsen所以我猜在进行实时音频处理时,出于性能的考虑,最好是将回调操作严格控制在C语言中?有一个回调,我认为它不会那么重要,它类似于MIDIReadProc,比如我想使用IBOutlet属性更新UI,我不确定MIDIReadProc。我认为只要回调不是在实时线程上调用,您就可以了。我认为调用实时线程的主要地方是渲染回调。(我远非核心音频专家。我从克里斯·亚当森(Chris Adamson)的书和博客文章中学到了我所知道的一切。)@tom1990你永远不应该从次要线程更新Cocoa UI。您应该使用
-performSelectorOnMainThread:
来更新UI。我认为MIDIReadProc仍然是一种实时情况,您不想删除任何MIDI事件,因为回调时间太长