2016-07-14 5 views
2

엑스 코드 8 베타 2/스위프트 3 :MIDIThruConnectionCreate는 항상 지속적인 MIDI 쓰루 연결을 생성합니까?

따르면 Apple's CoreMIDI API documentation에/연결을 통해 미디은 (앱이 종료하고 시스템을 재부팅 후에도 영원히 장소에서 숙박) 지속적으로 설립 할 수있다 또는 비 영구적 인 임시 (귀하의 응용 프로그램이 소유하고 응용 프로그램 종료시 자동으로 파괴).

내가 끼고있는 문제는 입니다. Apple의 지침을 따르고 있어도 비 영구 연결을 만들 수 없습니다.

이 내려 this API에 온다 : 당신은 스위프트 선택 사항입니다 inPersistentOwnerID에 널 (nil)를 전달하면

func MIDIThruConnectionCreate(_ inPersistentOwnerID: CFString?, 
         _ inConnectionParams: CFData, 
         _ outConnection: UnsafeMutablePointer<MIDIThruConnectionRef>) -> OSStatus 

는 연결 일시적으로 만들어야합니다. 그러나 nil 또는 String을 전달하는지 여부에 관계없이 항상 연결은 영구적으로 만들어집니다. (나는 CoreMIDI의 지속적인 연결을 통해 확인하여이를 확인할 수 있습니다.) 내 코드의

요약 : 내가 잘못 뭘하는지

public class OTMIDIConnectedThru { 
    var connectionRef = MIDIThruConnectionRef() 

    init?(sourceEndpoints: [MIDIEndpointRef], destinationEndpoints: [MIDIEndpointRef], persistentOwnerID: String? = nil) { 
     var params = MIDIThruConnectionParams() 
     MIDIThruConnectionParamsInitialize(&params) // fill with defaults 

     // (... snip: code to prepare parameters here ...) 

     let paramsData = withUnsafePointer(&params) { p in 
      NSData(bytes: p, length: MIDIThruConnectionParamsSize(&params)) 
     } 

     result = MIDIThruConnectionCreate(persistentOwnerID, paramsData, &connectionRef) 
     guard result == noErr else { return nil } 
    } 
} 

어떤 생각을? 이것은 API의 버그 일 수 없습니다.

답변

1

나는 똑같은 문제가 있었고, 그렇다고 항상 영구 연결을 만드는 것으로 생각합니다. 빈 문자열을 가진 MIDIThruConnectionFind가 모든 지속적인 연결을 반환하기 때문에 아마 NULL의 ID는 빈 문자열과 같습니다. 그래서, API 또는 문서의 버그!

내가 진짜 persistentID를 사용하는 것이 좋습니다, 당신이 당신의 MIDI 물건 초기화 할 때 기존의 모든/오래된 연결을 제거하는 것입니다 : 답장을

CFDataRef data; 
MIDIThruConnectionFind(CFSTR("com.yourcompany.yourapp"), &data); 
unsigned long n = CFDataGetLength(data)/sizeof(MIDIThruConnectionRef); 
MIDIThruConnectionRef * con = (MIDIThruConnectionRef*)CFDataGetBytePtr(data); 
for(int i=0;i<n;i++) { 
    MIDIThruConnectionDispose(*con); 
    con++; 
} 
+0

감사합니다. 나는 앱 발사 및 종료시 자체적으로 'persistendID'와 연결 관계를 모두 처리하는 것을 고려해 왔지만, 해결 방법이 더 많으며 분명히 앱이 충돌 할 경우와 같이 모든 경우를 다루지는 않습니다 원하지 않을 수도있는 연결을 통해 고아가되었습니다. Objective-C에서도 비 지속성 쓰루 연결을 생성 할 수 없다고 말했습니까? 그러면 Swift API 래퍼 레이어의 버그가 아니라 실제로 버그 또는 오해의 소지가있는 API 버그를 지적하게됩니다. – stef

+0

위 아이디어는 새로운 앱을 만들기 전에 앱을 시작할 때 이전 연결을 정리하는 것입니다. 나는 그들이 외부 엔드 포인트 사이에서만 만들어진 경우를 제외하고는 앱이 충돌 한 후에 커넥션을 통해 고아가 된 것으로 간주하지 않는다. 그러면 "위험"은 엔드 포인트가 계속 연결되어있는 것입니다. 지금 개발중인 앱에서는 위의 제안대로하고 있습니다. 이는 내 가상의 끝점과 연결하거나 연결하기 때문에 제대로 작동하므로 앱이 중단 되더라도 끝점은 계속 살아있을 수 없습니다. –

+0

Swift3에서이 작업을 수행하는 방법에 대한 아이디어가 있습니까? Swift가 두 번째 매개 변수에 대해 원하는'Unmanaged '옵션에 대한 포인터를 만드는 방법을 이해할 수 없습니다. – Alnitak

관련 문제