2011-10-04 12 views
5

मैं ओएस एक्स पर CoreMIDI के लिए एक रैपर के रूप में आरटीएमडीआई का उपयोग करके एक ऐप से एमआईडीआई संदेश भेजने वाले एक छोटे से हैक पर काम कर रहा हूं। मैं RtMidiOut::openVirtualPort("MyAwesomePort") का उपयोग करता हूं, इसलिए मैं अपने ऐप को डीएडब्ल्यू में इनपुट स्रोत के रूप में चुन सकता हूं।MIDISourceCreate() से वर्चुअल MIDI स्रोत की विशिष्टता को आप कैसे बनाए रखते हैं?

हालांकि, यदि मेरा प्रोग्राम बंद हो जाता है और मैं इसे फिर से खोलता हूं, तो मेरा डीएडब्ल्यू उसी नाम के बावजूद इनपुट डिवाइस को उसी पोर्ट के रूप में नहीं पहचानता है।

मैं मूल रूप से पाइरमिटिडी का उपयोग कर रहा था, इसलिए सीटीएस में व्यवहार लेखन को सीधे आरटीएमडी के साथ चला गया और सत्यापित किया। इस मामले में "माई डीएडब्ल्यू" रीपर 4 है, लेकिन मैंने प्रो टूल्स, लॉजिक और मुलाब में व्यवहार को दोहराया है।

मुझे पता है कि वर्चुअल मिडी पोर्ट की कुछ विशिष्टता बरकरार रखना संभव है, क्योंकि MidiKeys व्यवहार करता है जैसा कि मैं अपने आवेदन को व्यवहार करना चाहता हूं: मेरे डीएडब्ल्यू इसे याद करते हैं, भले ही मिडीकी बंद हो जाए और फिर भी खुल जाए, जबकि मेरा डीएडब्ल्यू अभी भी चल रहा है ।

तो मैंने आरटीएमआईडीआई स्रोत में खोद दिया, और कोरमिडी रैपर काफी सरल लग रहा था। MIDISourceCreate के लिए पूछता है कि एक स्ट्रिंग है। क्लाइंट पैरामीटर (जो दस्तावेज़ों को ब्राउज़ करने के बाद मुझे लगता है) मेरे आवेदन के लिए एक पहचानकर्ता है, यह CoreMIDI सेवाओं का एक ग्राहक है।

void RtMidiOut :: openVirtualPort(std::string portName) 
{ 
    CoreMidiData *data = static_cast<CoreMidiData *> (apiData_); 

    if (data->endpoint) { 
    errorString_ = "RtMidiOut::openVirtualPort: a virtual output port already exists!"; 
    error(RtError::WARNING); 
    return; 
    } 

    // Create a virtual MIDI output source. 
    MIDIEndpointRef endpoint; 
    OSStatus result = MIDISourceCreate(data->client, 
             CFStringCreateWithCString(NULL, portName.c_str(), kCFStringEncodingASCII), 
             &endpoint); 
    if (result != noErr) { 
    errorString_ = "RtMidiOut::initialize: error creating OS-X virtual MIDI source."; 
    error(RtError::DRIVER_ERROR); 
    } 

    // Save our api-specific connection information. 
    data->endpoint = endpoint; 
} 

तो मैं MIDISourceCreate प्रलेखन को देखा है, और इस पढ़ें:

एक आभासी स्रोत बनाने के बाद, यह एक अच्छा विचार है यह निर्दिष्ट करने के लिए एक ही अद्वितीय ID पिछली बार आपके आवेदन यह बनाई गई थी। (हालांकि आपको टकराव की संभावना की स्थिति में असफल होने के लिए तैयार रहना चाहिए।) यह अन्य क्लाइंट को आपके वर्चुअल स्रोत पर लगातार संदर्भ बनाए रखने की अनुमति देगा।

ऐसा लगता है कि मैं वास्तव में क्या देख रहा हूं। सिवाय मुझे नहीं पता कि स्रोत को एक अद्वितीय आईडी कैसे असाइन करें। MIDISourceCreate के लिए आउट पैरामीटर MIDIEndpointRef है, जो दस्तावेज़ों के अनुसार लाइन के नीचे UInt32 पर टाइप किया गया है। तो मैंने अनुमान लगाया कि शायद मुझे इस UInt32 का ट्रैक रखना चाहिए, लेकिन यह एक बुरा विचार की तरह लगता है।

इस सब के माध्यम से खोदने के बाद मुझे लगता है कि मैं एक ईंट की दीवार को मार रहा हूं। मैं अपने एमआईडीआई बंदरगाह की विशिष्टता को अपने आवेदन के रनों के बीच कैसे बनाए रखूं?

उत्तर

5

docs के अनुसार,

kMIDIPropertyUniqueID

प्रणाली अद्वितीय ID के प्रदान करती है सभी वस्तुओं के लिए। वर्चुअल एंडपॉइंट्स के निर्माता इस संपत्ति को अपने एंडपॉइंट्स पर सेट कर सकते हैं, हालांकि ऐसा करना विफल हो सकता है यदि चयनित आईडी अद्वितीय नहीं है।

तो शायद कुछ इस तरह:

// Try to set the ID if it's saved. 
if (savedUniqueId) { 
    OSStatus result = MIDIObjectSetIntegerProperty(endpoint, kMIDIPropertyUniqueID, myUniqueId); 
    if (result == kMIDIIDNotUnique) { 
    savedUniqueId = 0; 
    } 
} 
// If not saved, record the system-assigned ID 
if (!savedUniqueId) { 
    OSStatus result = MIDIObjectGetIntegerProperty(endpoint, kMIDIPropertyUniqueID, &savedUniqueId); 
    // Handle the error? 
} 

अद्वितीय ID एक SInt32 को typedefed है। मैंने धारणा की है कि 0 एक अमान्य अद्वितीय आईडी है, जो कम से कम कनेक्शन के लिए सच है (kMIDIPropertyConnectionUniqueID के लिए दस्तावेज़ कहते हैं कि यह "अस्तित्वहीन नहीं है या 0 यदि कोई कनेक्शन नहीं है")।

मुझे यकीन नहीं है कि आप केवल 32 बिट्स के साथ लंबी अवधि की विशिष्टता कैसे बनाए रखते हैं, लेकिन यह आपके ऐप के रिलांच के लिए पर्याप्त रूप से पर्याप्त होगा।

+0

आह, तो वह वही था। मैं इस सप्ताह के अंत में एक परीक्षा दे दूंगा। धन्यवाद! –

संबंधित मुद्दे