Как правильно открыть MidiDevice и отправить MidiMessage в Android? - PullRequest
1 голос
/ 01 апреля 2019

Я работаю над приложением, которое отправляет миди-сообщения со смартфона Android на интерфейс USB2.0-MIDI-кабеля, который соединен с телефоном через OTG-кабель. Я все еще застрял при открытии портов MidiInput / Output, без которых я не могу двигаться дальше. Я уже перепробовал все, что пришло мне в голову. Библиотека MIDI не очень хорошо освещена, я провел огромное исследование, прочитал несколько примеров Android Midi, но в конце здесь я прошу помощи. Кажется, моя реализация верна, очень похожа на то, что Android представляет в исходных примерах MidiScope и MidiSynth.

В данный момент каждый шаг процесса регистрируется. Я обнаружил, что пока не вызывается метод device.openInputPort (номер порта), все работает правильно. После этого больше ничего не происходит. helperIN остается с нулевым назначенным , хотя событие mOpenDevice правильно открывается со всеми свойствами;

mManager.openDevice(midiDeviceInfo,
new MidiManager.OnDeviceOpenedListener() {
    @Override
    public void onDeviceOpened(MidiDevice device) {
        Log.i("OnDeviceOpened", "before if");
        if (device == null) {
            Log.e("OnDeviceOpened", "cound not open" + midiDeviceInfo);
        } else {
            mOpenDevice = device;
            Log.i("OnDeviceOpened", "opened: " + mOpenDevice.getInfo().getProperties().getString(MidiDeviceInfo.PROPERTY_NAME));

            mListInput = new LinkedList<>();
            MidiInputPort helperIN = null;
            Log.i("OpenInputPort", "inPort Count: " + mOpenDevice.getInfo().getInputPortCount());

            for (int i = 0; i < mOpenDevice.getInfo().getInputPortCount(); i++) {
                Log.i("OpenInputPort", "Trying to open inPort nr: " + i); //last log seen
                helperIN = device.openInputPort(i); //stuck right here!
                Log.i("OpenInputPort", "Opened inPort nr: " + i); //this not seen
                mListInput.add(helperIN);
                if (helperIN == null) {
                    Log.e("openInputPort", "cound not open input port nr: " + i + " " + midiDeviceInfo.getPorts());
                    return;
                }else
                    Log.i("openInputPort", "Port nr: " + i + "connected");
                helperIN = null;
            }
        }
    }
}, null);

Редактировать 1: Журналы:

через несколько часов, когда телефон подключился к Android, чтобы еще раз запустить приложение и получить логи, первое, что я заметил, было это. Это довольно странно, кажется, что потребовалось много времени, чтобы окончательно решить не открывать порт.

 04-01 09:13:43.733 7627-7639/com.example.anthonylp.midiandoridtest I/OpenInputPort: Opened inPort nr: 0
 04-01 09:13:43.733 7627-7639/com.example.anthonylp.midiandoridtest E/openInputPort: cound not open input port nr: 0 
 [Landroid.media.midi.MidiDeviceInfo$PortInfo;@e7303d4

Актуальные журналы здесь:

04-01 09:42:11.704 3712-3712/com.example.anthonylp.midiandoridtest I/MidiWhenAdded: Class created
04-01 09:42:52.788 3712-3712/com.example.anthonylp.midiandoridtest I/Midi Info: Name: null
Name: USB2.0-MIDI
04-01 09:42:52.788 3712-3712/com.example.anthonylp.midiandoridtest I/openMidiDevice: midiDeviceInfo not null
04-01 09:42:52.789 3712-3741/com.example.anthonylp.midiandoridtest I/OnDeviceOpened: before if
opened: USB2.0-MIDI
04-01 09:42:52.789 3712-3741/com.example.anthonylp.midiandoridtest I/OpenInputPort: inPort Count: 2
Trying to open inPort nr: 0

Ничего более не получается из этого. Я ожидаю, что код откроет устройство MidiInputPort и назначит его helperIN, после этого добавьте его в mListInput. Большое спасибо за помощь!

...