2013-04-10 5 views
0
나는 (Mac에서) 이렇게의 CoreAudio의 MIDIPacketListAdd를 사용하려고 해요

:적절한 사용 (CoreMIDI)

MIDIPacketListAdd (있는 packetlist, PACKETLIST_SIZE, currentPacket, mach_absolute_time, 렌, 데이터);

내 packetList가> 1 패킷을 포함 할 수 있도록이 메서드를 여러 번 호출하기 전에 생각했습니다. 그러나 이렇게 할 때 numPackets은 증가하지 않으며, 점점 증가하는 패킷 [0] .data가있는 packetList-> packet [0]이됩니다.

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

The answer is in the documentation for 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)은 정의상 항상 1입니다. malloc(PACKETLIST_SIZE) 만 있으면됩니다. 당신이 함수를 호출하지의 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의 주소는 상수, 그래서 당신의 "타임 스탬프는"매번 같은했다.

+0

안녕하세요 Kurt, 위와 똑같은 일을하고 있지만 디버거를 사용하여 데이터를 검사 할 때 데이터가 여전히 하나의 패킷에 채워져 있습니다. 다음 데이터 패킷이 다음 패킷 패킷 [1]에 있어야 할 때 packetList-> packet [0] -> data가 길어집니다. – lppier

+0

또 다른 질문은, 만약 내 packetList-> packet [0] -> data가 9 바이트라면, 그것을 보내고있는 신디/버추얼 인스트루먼트는 마지막 6 바이트를 무시하겠습니까? – lppier

+0

디버거가 오해의 소지가 있습니다. 'MIDIPacket '은 가변 길이 구조입니다 - 6 바이트의 헤더 (4 바이트'timeStamp', 2 바이트'length'), 그리고 1에서 65535 바이트의 데이터를가집니다. 'MIDIPacketList'는 메모리에 연속적으로 저장된 하나 이상의 'MIDIPackets'입니다. 문제는 : C에서 가변 길이 구조를 실제로 표현할 수 없다는 것입니다. 따라서 두 번째 패킷을 얻으려면'packet [1] '이라고 말할 수 없습니다. 컴파일러 나 디버거가 올바른 일을하지는 않습니다. 'MIDIPacketListNext'를 사용하거나 원시 메모리를 직접보십시오. –