gpt4 book ai didi

cocoa - 在 void 指针上使用桥转换的 CoreMIDI 回调函数问题

转载 作者:行者123 更新时间:2023-12-03 16:41:11 24 4
gpt4 key购买 nike

背景:我正在尝试编写一个程序,该程序将从我的合成器中获取 MIDI 信息,并用它来做各种音乐上的事情。我已经连接了键盘以便接收 MIDI 数据。在我的 midiInputCallback() 方法(生成 MIDI 数据时调用的方法)中,它需要 3 个参数:MIDIPacketList、来自“外部”的任何对象以及 MIDI 信息的输入源。我正在尝试使用第二个参数传入 UIButton。目前,我使用 UIButtons 作为钢琴键。当我在合成器上演奏时,我希望它(在我的 GUI 上)显示某个音符已被演奏。为了显示这一点,与键盘上的键关联的按钮将显示为“已按下”。

问题:为了测试这个过程,我尝试传入一个名为 test 的 NSNumber。

- (void)awakeFromNib {
MIDIClientRef midiClient;
checkError(MIDIClientCreate(CFSTR("MIDI client"), NULL, NULL, &midiClient), "MIDI client creation error");


test = [NSNumber numberWithInt:4];


MIDIPortRef inputPort;
checkError(MIDIInputPortCreate(midiClient, CFSTR("Input"), midiInputCallback, &test, &inputPort), "MIDI input port error");

unsigned long sourceCount = MIDIGetNumberOfSources();
for (int i = 0; i < sourceCount; ++i) {
MIDIEndpointRef endPoint = MIDIGetSource(i);
CFStringRef endpointName = NULL;
checkError(MIDIObjectGetStringProperty(endPoint, kMIDIPropertyName, &endpointName), "String property not found");
checkError(MIDIPortConnectSource(inputPort, endPoint, NULL), "MIDI not connected");
}
}

我将test传递给MIDIInputPortCreate(),它将回调方法设置为midiInputCallback()。

这是 midiInputCallBack() 的样子:

static void midiInputCallback(const MIDIPacketList *list, void *procRef, void *srcRef) {
NSNumber *test = (__bridge_transfer NSNumber*)procRef;
NSLog(@"%@", test);
...

我一开始尝试了常规转换: NSNumber test = (NSNUmber) procRef,但后来 XCode 说要使用一些桥转换。我已经阅读了一些内容,有人建议使用 __bridge_transfer 而不仅仅是 __bridge。每次运行此命令时,我都会在 midiInputCallback() 中的 NSLog() 中收到 EXC_BAD_ACCESS(code=1, address=0x43f) 错误,并且我不知道如何继续。如果您需要更多信息,请与我们联系。我对 Mac 开发还很陌生。预先感谢!

最佳答案

不久前在编写接收 MIDI 输入并将其记录到控制台的类似应用程序时遇到了同样的问题。

假设您正在使用 ARC。

已解决问题如下:

首先,我进行了以下转换(这将在您的 awakeFromNib 方法中,而 &test 将是 some_object):

SomeClass *some_object = [[SomeClass alloc] init];

MIDIInputPortCreate(midiClient, CFSTR("Input"), midiInputCallback, (__bridge_retained void *)some_object, &inputPort);

然后,在 midiInputCallback 中,我将其转换回来:

SomeClass *some_object = (__bridge SomeClass*)procRef;

希望我这里没有任何拼写错误,只是快速复制并粘贴了此答案的上下文并进行了一些修改。

查看以下问题及其答案,帮助我更好地理解它:

关于cocoa - 在 void 指针上使用桥转换的 CoreMIDI 回调函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20926939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com