Как сохранить уникальность виртуального источника MIDI из MIDISourceCreate ()?

Я работаю над небольшим хаком, отправляя 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-порта между запусками моего приложения?

6
задан michael.bartnett 4 October 2011 в 00:27
поделиться