gpt4 book ai didi

ios - 如何从 MIDISourceCreate() 中保留虚拟 MIDI 源的唯一性?

转载 作者:可可西里 更新时间:2023-11-01 04:40:29 24 4
gpt4 key购买 nike

我正在研究一个小技巧,使用 RtMidi 作为 OS X 上 CoreMIDI 的包装器从应用程序发送 MIDI 消息。我使用 RtMidiOut::openVirtualPort("MyAwesomePort") 所以我可以选择我的应用程序作为 DAW 中的输入源。

但是,如果我的程序关闭并再次打开它,我的 DAW 不会将输入设备识别为相同的端口,尽管被赋予了相同的名称。

我本来是用pyrtmidi的,所以直接用RtMidi验证了用C++写的行为。在这种情况下,“我的 DAW”是 Reaper 4,但我在 Pro Tools、Logic 和 MuLab 中复制了该行为。

我知道保留虚拟 MIDI 端口的一些独特性是可能的,因为 MidiKeys就像我希望我的应用程序的行为一样:即使 MidiKeys 在我的 DAW 仍在运行时关闭并重新打开,我的 DAW 也会记住它。

所以我深入研究了 RtMidi 源代码,发现 CoreMIDI 包装器看起来很简单。 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。 (尽管您应该准备好在不太可能发生的碰撞事件中失败。)这将允许其他客户端更容易地保留对您的虚拟源的持久引用。

这似乎正是我要找的。除了我不知道如何为源分配唯一 ID。 MIDISourceCreate 的输出参数是一个 MIDIEndpointRef,根据文档,它只是 typedef'd to a UInt32 down the line。所以我假设也许我应该跟踪这个 UInt32,但这似乎是个坏主意。

在深入了解所有这些内容之后,我觉得自己有点碰壁了。如何在我的应用程序运行之间保持我的 MIDI 端口的唯一性?

最佳答案

根据docs ,

kMIDIPropertyUniqueID

The system assigns unique ID's to all objects. Creators of virtual endpoints may set this property on their endpoints, though doing so may fail if the chosen ID is not unique.

所以也许是这样的:

// 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。我假设 0 是一个无效的唯一 ID,这至少对于连接是正确的(kMIDIPropertyConnectionUniqueID 的文档说它“不存在,如果没有连接则为 0”)。

我不确定您如何仅使用 32 位来保持长期唯一性,但希望它足以重新启动您的应用。

关于ios - 如何从 MIDISourceCreate() 中保留虚拟 MIDI 源的唯一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7642136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com