int usbctrl_set_rumble(int port, uint8_t l, uint8_t r) { usbctrl_softc_t * softc = getcontroller(port); if(softc == NULL) return -1; usbdev_t *dev = softc->dev; usbreq_t *ur; unsigned xdata_len; uint8_t* buf = NULL; if(softc->is_wireless) { buf = usb_dma_alloc(0xC); if (buf == NULL) { printf("couldn't alloc buffer\n"); /* Could not allocate a buffer, fail. */ return -1; } uint8_t xdata[0xC] = { 0x00, 0x01, 0x0f, 0xc0, 0x00, l, r, 0x00, 0x00, 0x00, 0x00, 0x00 }; xdata_len = 0xC; memcpy(buf, &xdata, 0xC); } else { buf = usb_dma_alloc(0x8); if (buf == NULL) { printf("couldn't alloc buffer\n"); /* Could not allocate a buffer, fail. */ return -1; } uint8_t xdata[0x8] = { 0x00, 0x08, 0x00, l, r, 0x00, 0x00, 0x00 }; xdata_len = 0x8; memcpy(buf, &xdata, 0x8); } ur = usb_make_request(dev, softc->uhid_ipipe_tx, buf, xdata_len, UR_FLAG_OUT); ur->ur_callback = usbctrl_set_led_callback; usb_queue_request(ur); return 0; }
/* * Get the midi command,channel and parameters */ void ALSAMidiIn::getmidicmd(MidiCmdType &cmdtype, unsigned char &cmdchan, int *cmdparams) { snd_seq_event_t *midievent = NULL; cmdtype = MidiNull; if(inputok == false) { /* The input is broken. We need to block for a while anyway so other non-RT threads get a chance to run. */ sleep(1); return; } snd_seq_event_input(midi_handle, &midievent); if(midievent == NULL) return; switch(midievent->type) { case SND_SEQ_EVENT_NOTEON: cmdtype = MidiNoteON; cmdchan = midievent->data.note.channel; cmdparams[0] = midievent->data.note.note; cmdparams[1] = midievent->data.note.velocity; break; case SND_SEQ_EVENT_NOTEOFF: cmdtype = MidiNoteOFF; cmdchan = midievent->data.note.channel; cmdparams[0] = midievent->data.note.note; break; case SND_SEQ_EVENT_PITCHBEND: cmdtype = MidiController; cmdchan = midievent->data.control.channel; cmdparams[0] = C_pitchwheel; //Pitch Bend cmdparams[1] = midievent->data.control.value; break; case SND_SEQ_EVENT_CONTROLLER: cmdtype = MidiController; cmdchan = midievent->data.control.channel; cmdparams[0] = getcontroller(midievent->data.control.param); cmdparams[1] = midievent->data.control.value; //fprintf(stderr,"t=%d val=%d\n",midievent->data.control.param,midievent->data.control.value); break; } }
/* * Get the midi command,channel and parameters */ void OSSMidiIn::getmidicmd(MidiCmdType &cmdtype,unsigned char &cmdchan,int *cmdparams){ unsigned char tmp,i; if (inputok==0) { cmdtype=MidiNull; return; }; i=0; if (lastmidicmd==0){//asteapta prima data pana cand vine prima comanda midi while (tmp<0x80) tmp=getmidibyte(); lastmidicmd=tmp; }; tmp=getmidibyte(); if (tmp>=0x80) { lastmidicmd=tmp; tmp=getmidibyte(); }; if ((lastmidicmd>=0x80)&&(lastmidicmd<=0x8f)){//Note OFF cmdtype=MidiNoteOFF; cmdchan=lastmidicmd%16; cmdparams[0]=tmp;//note number }; if ((lastmidicmd>=0x90)&&(lastmidicmd<=0x9f)){//Note ON cmdtype=MidiNoteON; cmdchan=lastmidicmd%16; cmdparams[0]=tmp;//note number cmdparams[1]=getmidibyte();//velocity if (cmdparams[1]==0) cmdtype=MidiNoteOFF;//if velocity==0 then is note off }; if ((lastmidicmd>=0xB0)&&(lastmidicmd<=0xBF)){//Controllers cmdtype=MidiController; cmdchan=lastmidicmd%16; cmdparams[0]=getcontroller(tmp); cmdparams[1]=getmidibyte(); }; if ((lastmidicmd>=0xE0)&&(lastmidicmd<=0xEF)){//Pitch Wheel cmdtype=MidiController; cmdchan=lastmidicmd%16; cmdparams[0]=C_pitchwheel; cmdparams[1]=(tmp+getmidibyte()*(int) 128)-8192;//hope this is correct }; };