⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cardmi.c

📁 鼎力推荐!本程序是基于嵌入式LUNUX系统开发的源程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
{	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 + -