void MidiEnumeratorPrivate::initAlsa() { qDebug() << Q_FUNC_INFO; if (snd_seq_open(&m_alsa, "default", SND_SEQ_OPEN_DUPLEX, 0) != 0) { qWarning() << "Unable to open ALSA interface!"; m_alsa = NULL; return; } /* Set current client information */ snd_seq_client_info_t* client = NULL; snd_seq_client_info_alloca(&client); snd_seq_set_client_name(m_alsa, "qlcplus"); snd_seq_get_client_info(m_alsa, client); /* Create an application-level port */ m_address = new snd_seq_addr_t; m_address->port = snd_seq_create_simple_port(m_alsa, "__QLC__", SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ | SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_MIDI_GENERIC); m_address->client = snd_seq_client_info_get_client(client); /* Create input thread */ m_inputThread = new AlsaMidiInputThread(m_alsa, m_address, this); }
void MIDIOut::initALSA() { snd_seq_client_info_t* client = NULL; /* Destroy the old handle */ if (m_alsa != NULL) snd_seq_close(m_alsa); m_alsa = NULL; /* Destroy the plugin's own address */ if (m_address != NULL) delete m_address; m_address = NULL; /* Open the sequencer interface */ if (snd_seq_open(&m_alsa, "default", SND_SEQ_OPEN_DUPLEX, 0) != 0) { qWarning() << "Unable to open ALSA interface!"; m_alsa = NULL; return; } /* Set current client information */ snd_seq_client_info_alloca(&client); snd_seq_set_client_name(m_alsa, name().toAscii()); snd_seq_get_client_info(m_alsa, client); /* Create an application-level port */ m_address = new snd_seq_addr_t; m_address->port = snd_seq_create_simple_port(m_alsa, "__QLC__output", SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC); m_address->client = snd_seq_client_info_get_client(client); }
/** * \brief add client event filter * \param seq sequencer handle * \param event_type event type to be added * \return 0 on success or negative error code * * \sa snd_seq_set_client_info() */ int snd_seq_set_client_event_filter(snd_seq_t *seq, int event_type) { snd_seq_client_info_t info; int err; if ((err = snd_seq_get_client_info(seq, &info)) < 0) return err; snd_seq_client_info_event_filter_add(&info, event_type); return snd_seq_set_client_info(seq, &info); }
/** * \brief set client name * \param seq sequencer handle * \param name name string * \return 0 on success or negative error code * * \sa snd_seq_set_client_info() */ int snd_seq_set_client_name(snd_seq_t *seq, const char *name) { snd_seq_client_info_t info; int err; if ((err = snd_seq_get_client_info(seq, &info)) < 0) return err; strncpy(info.name, name, sizeof(info.name) - 1); return snd_seq_set_client_info(seq, &info); }
int ALSAMidiIn::getalsaid() { if(midi_handle) { snd_seq_client_info_t *seq_info; snd_seq_client_info_malloc(&seq_info); snd_seq_get_client_info(midi_handle, seq_info); int id = snd_seq_client_info_get_client(seq_info); snd_seq_client_info_free(seq_info); return id; } return -1; }
void sys_alsa_do_open_midi(int nmidiin, int *midiinvec, int nmidiout, int *midioutvec) { char portname[50]; int err = 0; int client; int i; snd_seq_client_info_t *alsainfo; alsa_nmidiin = 0; alsa_nmidiout = 0; if (nmidiout == 0 && nmidiin == 0) return; if(nmidiin>MAXMIDIINDEV ) { post("midi input ports reduced to maximum %d", MAXMIDIINDEV); nmidiin=MAXMIDIINDEV; } if(nmidiout>MAXMIDIOUTDEV) { post("midi output ports reduced to maximum %d", MAXMIDIOUTDEV); nmidiout=MAXMIDIOUTDEV; } if (nmidiin>0 && nmidiout>0) err = snd_seq_open(&midi_handle,"default",SND_SEQ_OPEN_DUPLEX,0); else if (nmidiin > 0) err = snd_seq_open(&midi_handle,"default",SND_SEQ_OPEN_INPUT,0); else if (nmidiout > 0) err = snd_seq_open(&midi_handle,"default",SND_SEQ_OPEN_OUTPUT,0); if (err!=0) { sys_setalarm(1000000); post("couldn't open alsa sequencer"); return; } for (i=0;i<nmidiin;i++) { int port; sprintf(portname,"Pure Data Midi-In %d",i+1); port = snd_seq_create_simple_port(midi_handle,portname, SND_SEQ_PORT_CAP_WRITE |SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_APPLICATION); alsa_midiinfd[i] = port; if (port < 0) goto error; } for (i=0;i<nmidiout;i++) { int port; sprintf(portname,"Pure Data Midi-Out %d",i+1); port = snd_seq_create_simple_port(midi_handle,portname, SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_APPLICATION); alsa_midioutfd[i] = port; if (port < 0) goto error; } snd_seq_client_info_malloc(&alsainfo); snd_seq_get_client_info(midi_handle,alsainfo); snd_seq_client_info_set_name(alsainfo,"Pure Data"); client = snd_seq_client_info_get_client(alsainfo); snd_seq_set_client_info(midi_handle,alsainfo); snd_seq_client_info_free(alsainfo); post("Opened Alsa Client %d in:%d out:%d",client,nmidiin,nmidiout); sys_setalarm(0); snd_midi_event_new(ALSA_MAX_EVENT_SIZE,&midiev); alsa_nmidiout = nmidiout; alsa_nmidiin = nmidiin; return; error: sys_setalarm(1000000); post("couldn't open alsa MIDI output device"); return; }
int create_midi_hardware(GenesisContext *context, const char *client_name, void (*events_signal)(struct MidiHardware *), void (*on_devices_change)(struct MidiHardware *), void *userdata, struct MidiHardware **out_midi_hardware) { *out_midi_hardware = nullptr; struct MidiHardware *midi_hardware = create_zero<MidiHardware>(); if (!midi_hardware) { destroy_midi_hardware(midi_hardware); return GenesisErrorNoMem; } midi_hardware->context = context; midi_hardware->on_buffer_overrun = default_on_buffer_overrun; midi_hardware->events_signal = events_signal; midi_hardware->on_devices_change = on_devices_change; midi_hardware->userdata = userdata; if (!(midi_hardware->mutex = os_mutex_create())) { destroy_midi_hardware(midi_hardware); return GenesisErrorNoMem; } if (snd_seq_open(&midi_hardware->seq, "default", SND_SEQ_OPEN_DUPLEX, 0) < 0) { destroy_midi_hardware(midi_hardware); return GenesisErrorOpeningMidiHardware; } if (snd_seq_set_client_name(midi_hardware->seq, client_name) < 0) { destroy_midi_hardware(midi_hardware); return GenesisErrorOpeningMidiHardware; } snd_seq_client_info_malloc(&midi_hardware->client_info); snd_seq_port_info_malloc(&midi_hardware->port_info); if (!midi_hardware->client_info || !midi_hardware->port_info) { destroy_midi_hardware(midi_hardware); return GenesisErrorNoMem; } if (snd_seq_create_simple_port(midi_hardware->seq, "genesis", SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION) < 0) { destroy_midi_hardware(midi_hardware); return GenesisErrorOpeningMidiHardware; } int err = midi_hardware_refresh(midi_hardware); if (err) { destroy_midi_hardware(midi_hardware); return err; } if (!midi_hardware->system_announce_device) { destroy_midi_hardware(midi_hardware); return GenesisErrorOpeningMidiHardware; } if (snd_seq_connect_from(midi_hardware->seq, 0, midi_hardware->system_announce_device->client_id, midi_hardware->system_announce_device->port_id) < 0) { destroy_midi_hardware(midi_hardware); return GenesisErrorOpeningMidiHardware; } if (snd_seq_get_client_info(midi_hardware->seq, midi_hardware->client_info) < 0) { destroy_midi_hardware(midi_hardware); return GenesisErrorOpeningMidiHardware; } midi_hardware->client_id = snd_seq_client_info_get_client(midi_hardware->client_info); if (snd_seq_connect_from(midi_hardware->seq, 0, midi_hardware->client_id, 0) < 0) { destroy_midi_hardware(midi_hardware); return GenesisErrorOpeningMidiHardware; } if ((err = os_thread_create(midi_thread, midi_hardware, false, &midi_hardware->thread))) { destroy_midi_hardware(midi_hardware); return err; } *out_midi_hardware = midi_hardware; return 0; }