void QMidi::outSendMsg(qint32 msg) { #if defined(Q_OS_WIN) midiOutShortMsg(midiOutPtr,(DWORD)msg); #elif defined(Q_OS_LINUX) snd_seq_event_t ev; snd_midi_event_t* mev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, 0); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); snd_midi_event_new(sizeof(msg), &mev); snd_midi_event_resize_buffer(mev, sizeof(msg)); snd_midi_event_encode(mev,(unsigned char*)&msg, sizeof(msg), &ev); snd_seq_event_output(midiOutPtr, &ev); snd_seq_drain_output(midiOutPtr); #elif defined(Q_OS_HAIKU) midiOutLocProd->SprayData((void*)&msg,sizeof(msg),true); #endif }
void Alsa::sendMessage(const std::vector<uint8_t> *msg_ ) { int result; unsigned int nBytes = msg_->size(); if ( nBytes > _apiData->bufferSize ) { _apiData->bufferSize = nBytes; result = snd_midi_event_resize_buffer ( _apiData->coder, nBytes); if ( result != 0 ) { std::cerr << "error: CxxMidi::Output::Alsa::sendMessage: ALSA error resizing MIDI event buffer" << std::endl; } free (_apiData->buffer); _apiData->buffer = (unsigned char *) malloc( _apiData->bufferSize ); if ( _apiData->buffer == NULL ) { std::cerr << "error: CxxMidi::Output::Alsa::sendMessage: error allocating buffer memory" << std::endl; } } snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, _apiData->vport); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); for ( unsigned int i=0; i<nBytes; ++i ) _apiData->buffer[i] = msg_->at(i); result = snd_midi_event_encode( _apiData->coder, _apiData->buffer, (long)nBytes, &ev ); if ( result < (int)nBytes ) { std::cerr << "error: CxxMidi::Output::Alsa::sendMessage: event parsing error" << std::endl; return; } // Send the event. result = snd_seq_event_output(_apiData->seq, &ev); if ( result < 0 ) { std::cerr << "error: CxxMidi::Output::Alsa::sendMessage: error sending MIDI message to port" << std::endl; } snd_seq_drain_output(_apiData->seq); }