Beispiel #1
0
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
}
Beispiel #2
0
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);
}