📄 cardmi.c
字号:
{ switch (data & 0xf0) { case 0x80: case 0x90: case 0xA0: case 0xB0: case 0xE0: card_mpuin->curstate = STIN_3BYTE; break; case 0xC0: case 0xD0: card_mpuin->curstate = STIN_2BYTE; break; case 0xF0: /* System messages do not affect the previous running status! */ switch (data & 0x0f) { case 0x0: card_mpuin->laststate = card_mpuin->curstate; card_mpuin->curstate = STIN_SYS_EX_NORM; if (card_mpuin->firstmidiq) { struct midi_queue *midiq; midiq = card_mpuin->firstmidiq; *midiq->midibyte = data; --midiq->sizeLeft; ++midiq->midibyte; } return CTSTATUS_NEXT_BYTE; case 0x7: emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, 0xf7, 0); return -1; case 0x2: card_mpuin->laststate = card_mpuin->curstate; card_mpuin->curstate = STIN_SYS_COMMON_3; break; case 0x1: case 0x3: card_mpuin->laststate = card_mpuin->curstate; card_mpuin->curstate = STIN_SYS_COMMON_2; break; default: /* includes 0xF4 - 0xF6, 0xF8 - 0xFF */ return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data); } break; default: DPF(2, "BUG: default case hit\n"); return -1; } return midistatefn[card_mpuin->curstate].Fn(card_mpuin, data);}static int sblive_miState3Byte(struct emu10k1_mpuin *card_mpuin, u8 data){ u8 temp = data & 0xf0; if (temp < 0x80) { return midistatefn[STIN_3BYTE_KEY].Fn(card_mpuin, data); } else if (temp <= 0xe0 && temp != 0xc0 && temp != 0xd0) { card_mpuin->status = data; card_mpuin->curstate = STIN_3BYTE_KEY; return CTSTATUS_NEXT_BYTE; } return midistatefn[STIN_PARSE].Fn(card_mpuin, data);}static int sblive_miState3ByteKey(struct emu10k1_mpuin *card_mpuin, u8 data)/* byte 1 */{ unsigned long tmp; if (data > 0x7f) { /* Real-time messages check */ if (data > 0xf7) return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data); /* Invalid data! */ DPF(2, "Invalid data!\n"); card_mpuin->curstate = STIN_PARSE; tmp = ((unsigned long) data) << 8; tmp |= (unsigned long) card_mpuin->status; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0); return -1; } card_mpuin->data = data; card_mpuin->curstate = STIN_3BYTE_VEL; return CTSTATUS_NEXT_BYTE;}static int sblive_miState3ByteVel(struct emu10k1_mpuin *card_mpuin, u8 data)/* byte 2 */{ unsigned long tmp; if (data > 0x7f) { /* Real-time messages check */ if (data > 0xf7) return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data); /* Invalid data! */ DPF(2, "Invalid data!\n"); card_mpuin->curstate = STIN_PARSE; tmp = ((unsigned long) data) << 8; tmp |= card_mpuin->data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->status; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0); return -1; } card_mpuin->curstate = STIN_3BYTE; tmp = (unsigned long) data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->status; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 3); return 0;}static int sblive_miState2Byte(struct emu10k1_mpuin *card_mpuin, u8 data){ u8 temp = data & 0xf0; if ((temp == 0xc0) || (temp == 0xd0)) { card_mpuin->status = data; card_mpuin->curstate = STIN_2BYTE_KEY; return CTSTATUS_NEXT_BYTE; } if (temp < 0x80) return midistatefn[STIN_2BYTE_KEY].Fn(card_mpuin, data); return midistatefn[STIN_PARSE].Fn(card_mpuin, data);}static int sblive_miState2ByteKey(struct emu10k1_mpuin *card_mpuin, u8 data)/* byte 1 */{ unsigned long tmp; if (data > 0x7f) { /* Real-time messages check */ if (data > 0xf7) return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data); /* Invalid data! */ DPF(2, "Invalid data!\n"); card_mpuin->curstate = STIN_PARSE; tmp = (unsigned long) data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->status; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0); return -1; } card_mpuin->curstate = STIN_2BYTE; tmp = (unsigned long) data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->status; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 2); return 0;}static int sblive_miStateSysCommon2(struct emu10k1_mpuin *card_mpuin, u8 data){ card_mpuin->fstatus = data; card_mpuin->curstate = STIN_SYS_COMMON_2_KEY; return CTSTATUS_NEXT_BYTE;}static int sblive_miStateSysCommon2Key(struct emu10k1_mpuin *card_mpuin, u8 data)/* byte 1 */{ unsigned long tmp; if (data > 0x7f) { /* Real-time messages check */ if (data > 0xf7) return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data); /* Invalid data! */ DPF(2, "Invalid data!\n"); card_mpuin->curstate = card_mpuin->laststate; tmp = (unsigned long) data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->fstatus; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0); return -1; } card_mpuin->curstate = card_mpuin->laststate; tmp = (unsigned long) data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->fstatus; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 2); return 0;}static int sblive_miStateSysCommon3(struct emu10k1_mpuin *card_mpuin, u8 data){ card_mpuin->fstatus = data; card_mpuin->curstate = STIN_SYS_COMMON_3_KEY; return CTSTATUS_NEXT_BYTE;}static int sblive_miStateSysCommon3Key(struct emu10k1_mpuin *card_mpuin, u8 data)/* byte 1 */{ unsigned long tmp; if (data > 0x7f) { /* Real-time messages check */ if (data > 0xf7) return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data); /* Invalid data! */ DPF(2, "Invalid data!\n"); card_mpuin->curstate = card_mpuin->laststate; tmp = (unsigned long) data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->fstatus; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0); return -1; } card_mpuin->data = data; card_mpuin->curstate = STIN_SYS_COMMON_3_VEL; return CTSTATUS_NEXT_BYTE;}static int sblive_miStateSysCommon3Vel(struct emu10k1_mpuin *card_mpuin, u8 data)/* byte 2 */{ unsigned long tmp; if (data > 0x7f) { /* Real-time messages check */ if (data > 0xf7) return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data); /* Invalid data! */ DPF(2, "Invalid data!\n"); card_mpuin->curstate = card_mpuin->laststate; tmp = (unsigned long) data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->fstatus; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0); return -1; } card_mpuin->curstate = card_mpuin->laststate; tmp = (unsigned long) data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->data; tmp = tmp << 8; tmp |= (unsigned long) card_mpuin->fstatus; emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 3); return 0;}static int sblive_miStateSysExNorm(struct emu10k1_mpuin *card_mpuin, u8 data){ unsigned long flags; if ((data > 0x7f) && (data != 0xf7)) { /* Real-time messages check */ if (data > 0xf7) return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data); /* Invalid Data! */ DPF(2, "Invalid data!\n"); card_mpuin->curstate = card_mpuin->laststate; if (card_mpuin->firstmidiq) { struct midi_queue *midiq; midiq = card_mpuin->firstmidiq; *midiq->midibyte = data; --midiq->sizeLeft; ++midiq->midibyte; spin_lock_irqsave(&card_mpuin->lock, flags); card_mpuin->firstmidiq = midiq->next; if (card_mpuin->firstmidiq == NULL) card_mpuin->lastmidiq = NULL; spin_unlock_irqrestore(&card_mpuin->lock, flags); emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGERROR, (unsigned long) midiq, 0); kfree(midiq); } return -1; } if (card_mpuin->firstmidiq) { struct midi_queue *midiq; midiq = card_mpuin->firstmidiq; *midiq->midibyte = data; --midiq->sizeLeft; ++midiq->midibyte; } if (data == 0xf7) { /* End of Sysex buffer */ /* Send down the buffer */ card_mpuin->curstate = card_mpuin->laststate; if (card_mpuin->firstmidiq) { struct midi_queue *midiq; midiq = card_mpuin->firstmidiq; spin_lock_irqsave(&card_mpuin->lock, flags); card_mpuin->firstmidiq = midiq->next; if (card_mpuin->firstmidiq == NULL) card_mpuin->lastmidiq = NULL; spin_unlock_irqrestore(&card_mpuin->lock, flags); emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGDATA, (unsigned long) midiq, 0); kfree(midiq); } return 0; } if (card_mpuin->firstmidiq) { struct midi_queue *midiq; midiq = card_mpuin->firstmidiq; if (midiq->sizeLeft == 0) { /* Special case */ spin_lock_irqsave(&card_mpuin->lock, flags); card_mpuin->firstmidiq = midiq->next; if (card_mpuin->firstmidiq == NULL) card_mpuin->lastmidiq = NULL; spin_unlock_irqrestore(&card_mpuin->lock, flags); emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGDATA, (unsigned long) midiq, 0); kfree(midiq); return CTSTATUS_NEXT_BYTE; } } return CTSTATUS_NEXT_BYTE;}static int sblive_miStateSysReal(struct emu10k1_mpuin *card_mpuin, u8 data){ emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, data, 1); return CTSTATUS_NEXT_BYTE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -