0

我正在尝试通过这样做(在 Mac 上)使用 CoreAudio 的 MIDIPacketListAdd:

MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time, len, data);

我正在考虑在发送之前多次调用该方法,以便我的 packetList 中包含 > 1 个数据包。但是,当我这样做时,numPackets 永远不会增加,而我得到的是 packetList->packet[0] 和不断增加的 packet[0].data。

1)使用这种方法的正确方法是什么?我看过几个例子,包括“Learning Core Audio”中的一个——它们似乎都只发送一个数据包。

2) 如果我在 1 个数据包列表中打包多个数据包而不是多次发送 1 个数据包列表和 1 个数据包,是否有任何性能改进?

谢谢,感谢您对此的任何帮助。

后续编辑:这是我初始化数据包列表的方式

#define PACKETLIST_SIZE 512

- (void) initPacketList {

    if (packetList) {
        free(packetList);
        packetList = NULL;
    }

    packetList = (MIDIPacketList *)malloc(PACKETLIST_SIZE * sizeof(char));
    currentPacket = MIDIPacketListInit(packetList);
}

- (void) clearPacketList {

    packetList->numPackets = 0;
        currentPacket = MIDIPacketListInit(packetList);
}

- (void) addPacketToPacketList:(Byte*) data ofLength:(int) len {

    NSLog(@"length %d", len); 
    //NSLog(@"%lld", mach_absolute_time());
    currentPacket = MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time, len, data);

    //if (!currentPacket) exit(1);

}
4

1 回答 1

4

答案在MIDIPacketListAdd.

返回值

如果数据包中没有空间用于事件,则返回 null;否则返回一个数据包指针,该指针应在后续调用此函数时作为 curPacket 传递。

所以你可能想要这样的东西:

currentPacket = MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time, len, data);

currentPacket每次之后一定要检查是否为NULL。

如果您将多个数据包放在一个数据包列表中,性能应该会更好,因为您向 MIDI 服务器发出的跨进程请求更少,但老实说,在现代 Mac 上不太可能引起注意。

编辑:这就是你做错了什么。

packetList = (MIDIPacketList *)malloc(PACKETLIST_SIZE * sizeof(char));

sizeof(char)根据定义,在 C 语言中始终为 1。malloc(PACKETLIST_SIZE)是你所需要的全部。

currentPacket = MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time, len, data);

这给了我一个编译器警告,因为您传递的是函数的地址mach_absolute_time,而不是调用函数。你的意思是:

currentPacket = MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time(), len, data);

一旦我这样做了,我就看到packetList->numPackets了预期的增长。

但是,请注意两点:

  • 如果您想立即发送 MIDI 数据,只需提供0.

  • 如果您MIDIPacketListAdd使用与前一个调用相同的时间戳进行调用,那么它只会将您的数据连接到前一个数据包。你会看到packetList->numPacketscurrentPacket保持不变,但currentPacket->length会增加。

这就是为什么你没有看到packetList->numPackets增加:地址mach_absolute_time是一个常数,所以你的“时间戳”每次都是一样的。

于 2013-04-10T17:18:13.187 回答