Я работаю над небольшим хаком, отправляя MIDI-сообщения из приложения, используя RtMidi в качестве оболочки. для CoreMIDI в OS X. Я использую RtMidiOut :: openVirtualPort ("MyAwesomePort")
, поэтому я могу выбрать свое приложение в качестве источника ввода в DAW.
Однако, если моя программа закрывается и я открываю ее снова, моя DAW не распознает устройство ввода как тот же порт, несмотря на то, что ей присвоено то же имя.
Изначально я использовал pyrtmidi, поэтому пошел и проверил поведение, написанное на C ++, напрямую с помощью RtMidi. «Моя DAW» в данном случае - это Reaper 4, но я продублировал поведение в Pro Tools, Logic и MuLab.
Я знаю, что можно сохранить некоторую уникальность виртуального midi-порта, поскольку MidiKeys ведет себя так же, как я бы хотел, чтобы мое приложение вело себя: мои DAW запоминают это, даже если MidiKeys закрывается и открывается повторно, пока моя DAW все еще работает.
Итак, я покопался в исходном коде RtMidi, и оболочка CoreMIDI показалась мне достаточно простой. Все, что запрашивает MIDISourceCreate
, - это строка. Параметр client - это (что я предполагаю после просмотра документации) идентификатор моего приложения, которое является клиентом служб CoreMIDI.
void RtMidiOut :: openVirtualPort( std::string portName )
{
CoreMidiData *data = static_cast (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 и прочитал следующее:
После создания виртуального источника неплохо было бы присвоить ему тот же уникальный идентификатор, что и в последний раз, когда ваше приложение создавало его. (Хотя вы должны быть готовы к тому, что это приведет к сбою в маловероятном случае коллизии.) Это позволит другим клиентам легче сохранять постоянные ссылки на ваш виртуальный источник.
Похоже, это именно то, что я ищу. Только я понятия не имею, как присвоить источнику уникальный идентификатор. Параметр вывода для MIDISourceCreate
- это MIDIEndpointRef
, который, согласно документации, просто определяется типом для UInt32
в дальнейшем. Поэтому я предположил, что, возможно, мне стоит отслеживать этот UInt32, но это кажется плохой идеей.
Покопавшись во всем этом, я чувствую, что наткнулся на кирпичную стену. Как мне сохранить уникальность моего MIDI-порта между запусками моего приложения?