0

これを行うことで CoreAudio の MIDIPacketListAdd を使用しようとしています (Mac の場合):

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

メソッドを送信する前に複数回呼び出して、packetListに1つ以上のパケットが含まれるようにすることを考えていました。ただし、これを行うと、numPackets が増加することはなく、packetList->packet[0] が増加し続け、packet[0].data が増加します。

1) この方法を使用する正しい方法は何ですか? 「Learning Core Audio」の例を含め、いくつかの例を見てきましたが、それらはすべて 1 つのパケットだけを送信しているようです。

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かどうかを確認してください。

複数のパケットを 1 つのパケット リストに入れるとパフォーマンスが向上するはずです。これは、MIDI サーバーへのクロスプロセス リクエストが少なくなるためです。

編集:これがあなたが間違っていることです。

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、予想通りの増加が見られました。

ただし、次の 2 つの点に注意してください。

  • MIDI データをすぐに送信したい場合は、タイムスタンプ0.

  • MIDIPacketListAdd前の呼び出しと同じタイムスタンプで呼び出すと、データが前のパケットに連結されるだけです。あなたは見packetList->numPacketscurrentPacket、同じままですが、currentPacket->length増加します。

増加が見られなかったのはそのためですpacketList->numPackets。のアドレスmach_absolute_timeは一定であるため、「タイムスタンプ」は毎回同じでした。

于 2013-04-10T17:18:13.187 に答える