mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	Changed MIDI event structure MIDI_EventPacket_t to use a single field for the combined virtual cable index and command ID, to prevent bitfield packing issues on some architectures (thanks to Darren Gibbs).
This commit is contained in:
		
							parent
							
								
									5b5b73ce58
								
							
						
					
					
						commit
						e875d7cf9f
					
				| @ -78,7 +78,7 @@ int main(void) | |||||||
| 		MIDI_EventPacket_t ReceivedMIDIEvent; | 		MIDI_EventPacket_t ReceivedMIDIEvent; | ||||||
| 		while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent)) | 		while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent)) | ||||||
| 		{ | 		{ | ||||||
| 			if ((ReceivedMIDIEvent.Command == (MIDI_COMMAND_NOTE_ON >> 4)) && (ReceivedMIDIEvent.Data3 > 0)) | 			if ((ReceivedMIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)) && (ReceivedMIDIEvent.Data3 > 0)) | ||||||
| 			  LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2); | 			  LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2); | ||||||
| 			else | 			else | ||||||
| 			  LEDs_SetAllLEDs(LEDS_NO_LEDS); | 			  LEDs_SetAllLEDs(LEDS_NO_LEDS); | ||||||
| @ -155,8 +155,7 @@ void CheckJoystickMovement(void) | |||||||
| 	{ | 	{ | ||||||
| 		MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | 		MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | ||||||
| 			{ | 			{ | ||||||
| 				.CableNumber = 0, | 				.Event       = MIDI_EVENT(0, MIDICommand), | ||||||
| 				.Command     = (MIDICommand >> 4), |  | ||||||
| 
 | 
 | ||||||
| 				.Data1       = MIDICommand | Channel, | 				.Data1       = MIDICommand | Channel, | ||||||
| 				.Data2       = MIDIPitch, | 				.Data2       = MIDIPitch, | ||||||
|  | |||||||
| @ -160,8 +160,7 @@ void MIDI_Task(void) | |||||||
| 		{ | 		{ | ||||||
| 			MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | 			MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | ||||||
| 				{ | 				{ | ||||||
| 					.CableNumber = 0, | 					.Event       = MIDI_EVENT(0, MIDICommand), | ||||||
| 					.Command     = (MIDICommand >> 4), |  | ||||||
| 
 | 
 | ||||||
| 					.Data1       = MIDICommand | Channel, | 					.Data1       = MIDICommand | Channel, | ||||||
| 					.Data2       = MIDIPitch, | 					.Data2       = MIDIPitch, | ||||||
| @ -191,7 +190,7 @@ void MIDI_Task(void) | |||||||
| 		Endpoint_Read_Stream_LE(&MIDIEvent, sizeof(MIDIEvent), NULL); | 		Endpoint_Read_Stream_LE(&MIDIEvent, sizeof(MIDIEvent), NULL); | ||||||
| 
 | 
 | ||||||
| 		/* Check to see if the sent command is a note on message with a non-zero velocity */ | 		/* Check to see if the sent command is a note on message with a non-zero velocity */ | ||||||
| 		if ((MIDIEvent.Command == (MIDI_COMMAND_NOTE_ON >> 4)) && (MIDIEvent.Data3 > 0)) | 		if ((MIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)) && (MIDIEvent.Data3 > 0)) | ||||||
| 		{ | 		{ | ||||||
| 			/* Change LEDs depending on the pitch of the sent note */ | 			/* Change LEDs depending on the pitch of the sent note */ | ||||||
| 			LEDs_SetAllLEDs(MIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2); | 			LEDs_SetAllLEDs(MIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2); | ||||||
|  | |||||||
| @ -111,8 +111,8 @@ void JoystickHost_Task(void) | |||||||
| 	MIDI_EventPacket_t MIDIEvent; | 	MIDI_EventPacket_t MIDIEvent; | ||||||
| 	while (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent)) | 	while (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent)) | ||||||
| 	{ | 	{ | ||||||
| 		bool NoteOnEvent  = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_ON  >> 4)); | 		bool NoteOnEvent  = (MIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)); | ||||||
| 		bool NoteOffEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_OFF >> 4)); | 		bool NoteOffEvent = (MIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_OFF)); | ||||||
| 
 | 
 | ||||||
| 		/* Display note events from the host */ | 		/* Display note events from the host */ | ||||||
| 		if (NoteOnEvent || NoteOffEvent) | 		if (NoteOnEvent || NoteOffEvent) | ||||||
| @ -173,8 +173,7 @@ void CheckJoystickMovement(void) | |||||||
| 	{ | 	{ | ||||||
| 		MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | 		MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | ||||||
| 			{ | 			{ | ||||||
| 				.CableNumber = 0, | 				.Event       = MIDI_EVENT(0, MIDICommand), | ||||||
| 				.Command     = (MIDICommand >> 4), |  | ||||||
| 
 | 
 | ||||||
| 				.Data1       = MIDICommand | Channel, | 				.Data1       = MIDICommand | Channel, | ||||||
| 				.Data2       = MIDIPitch, | 				.Data2       = MIDIPitch, | ||||||
|  | |||||||
| @ -177,8 +177,8 @@ void MIDIHost_Task(void) | |||||||
| 		if (!(Pipe_BytesInPipe())) | 		if (!(Pipe_BytesInPipe())) | ||||||
| 		  Pipe_ClearIN(); | 		  Pipe_ClearIN(); | ||||||
| 
 | 
 | ||||||
| 		bool NoteOnEvent  = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_ON  >> 4)); | 		bool NoteOnEvent  = (MIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)); | ||||||
| 		bool NoteOffEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_OFF >> 4)); | 		bool NoteOffEvent = (MIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_OFF)); | ||||||
| 
 | 
 | ||||||
| 		if (NoteOnEvent || NoteOffEvent) | 		if (NoteOnEvent || NoteOffEvent) | ||||||
| 		{ | 		{ | ||||||
| @ -237,8 +237,7 @@ void MIDIHost_Task(void) | |||||||
| 		{ | 		{ | ||||||
| 			MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | 			MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | ||||||
| 				{ | 				{ | ||||||
| 					.CableNumber = 0, | 					.Event       = MIDI_EVENT(0, MIDICommand), | ||||||
| 					.Command     = (MIDICommand >> 4), |  | ||||||
| 
 | 
 | ||||||
| 					.Data1       = MIDICommand | Channel, | 					.Data1       = MIDICommand | Channel, | ||||||
| 					.Data2       = MIDIPitch, | 					.Data2       = MIDIPitch, | ||||||
|  | |||||||
| @ -33,6 +33,8 @@ | |||||||
|   *   - The Pipe_ConfigurePipe() function no longer takes a number of banks as a special mask; the number of banks is now specified as an integer parameter |   *   - The Pipe_ConfigurePipe() function no longer takes a number of banks as a special mask; the number of banks is now specified as an integer parameter | ||||||
|   *   - Pipes are now configured via instances of a new struct USB_Pipe_Table_t in all host mode class drivers, rather than a list of pipe parameters |   *   - Pipes are now configured via instances of a new struct USB_Pipe_Table_t in all host mode class drivers, rather than a list of pipe parameters | ||||||
|   *   - Added support for various assert and debugging macros for the UC3 devices |   *   - Added support for various assert and debugging macros for the UC3 devices | ||||||
|  |   *   - Changed MIDI event structure MIDI_EventPacket_t to use a single field for the combined virtual cable index and command ID, to prevent bitfield packing issues | ||||||
|  |   *     on some architectures (thanks to Darren Gibbs). | ||||||
|   *  - Library Applications: |   *  - Library Applications: | ||||||
|   *   - Raised the guard bits in the AVRISP-MKII clone project when in PDI and TPI to 32, to prevent communication errors on low quality connections to a target |   *   - Raised the guard bits in the AVRISP-MKII clone project when in PDI and TPI to 32, to prevent communication errors on low quality connections to a target | ||||||
|   *   - Added additional bootloader API data to expose the bootloader start address and class to the DFU and CDC class bootloaders |   *   - Added additional bootloader API data to expose the bootloader start address and class to the DFU and CDC class bootloaders | ||||||
|  | |||||||
| @ -27,6 +27,9 @@ | |||||||
|  *      to update their class driver struct instantiation to match the new scheme (see \ref USB_Endpoint_Table_t). |  *      to update their class driver struct instantiation to match the new scheme (see \ref USB_Endpoint_Table_t). | ||||||
|  *    - The \c ENDPOINT_BANKS_SUPPORTED() and \c ENDPOINT_MAX_ENDPOINT_SIZE() macros have been removed, as these do not function correctly with the new addressing |  *    - The \c ENDPOINT_BANKS_SUPPORTED() and \c ENDPOINT_MAX_ENDPOINT_SIZE() macros have been removed, as these do not function correctly with the new addressing | ||||||
|  *      scheme for the endpoint APIs. Please refer to the target device's datasheet for the maximum bank size of each endpoint. |  *      scheme for the endpoint APIs. Please refer to the target device's datasheet for the maximum bank size of each endpoint. | ||||||
|  |  *    - The MIDI class driver \ref MIDI_EventPacket_t event packet no longer contains seperate \c CableIndex and \c Command entries; these have been combined | ||||||
|  |  *      into a single \c Event element which can be contructed using the new macro \ref MIDI_EVENT(). Existing applications should use the new macro and structure | ||||||
|  |  *      element name. | ||||||
|  * |  * | ||||||
|  *  <b>Host Mode</b> |  *  <b>Host Mode</b> | ||||||
|  *    - The Android Accessory Host class driver property strings are now a array of \c char* rather than a struct of named pointers. Existing applications |  *    - The Android Accessory Host class driver property strings are now a array of \c char* rather than a struct of named pointers. Existing applications | ||||||
| @ -38,6 +41,9 @@ | |||||||
|  *      calls to use full pipe addresses when required within the device. |  *      calls to use full pipe addresses when required within the device. | ||||||
|  *    - All host mode class drivers have been updated to use a new unified pipe description structure for all pipes; existing applications will need to update |  *    - All host mode class drivers have been updated to use a new unified pipe description structure for all pipes; existing applications will need to update | ||||||
|  *      their class driver struct instantiation to match the new scheme (see \ref USB_Pipe_Table_t). |  *      their class driver struct instantiation to match the new scheme (see \ref USB_Pipe_Table_t). | ||||||
|  |  *    - The MIDI class driver \ref MIDI_EventPacket_t event packet no longer contains seperate \c CableIndex and \c Command entries; these have been combined | ||||||
|  |  *      into a single \c Event element which can be contructed using the new macro \ref MIDI_EVENT(). Existing applications should use the new macro and structure | ||||||
|  |  *      element name. | ||||||
|  * |  * | ||||||
|  *  \section Sec_Migration120219 Migrating from 111009 to 120219 |  *  \section Sec_Migration120219 Migrating from 111009 to 120219 | ||||||
|  *  <b>USB Core</b> |  *  <b>USB Core</b> | ||||||
|  | |||||||
| @ -84,9 +84,21 @@ | |||||||
| 		 *  addresses are zero-indexed. This converts a natural MIDI channel number into the logical channel address. | 		 *  addresses are zero-indexed. This converts a natural MIDI channel number into the logical channel address. | ||||||
| 		 * | 		 * | ||||||
| 		 *  \param[in] channel  MIDI channel number to address. | 		 *  \param[in] channel  MIDI channel number to address. | ||||||
|  | 		 * | ||||||
|  | 		 *  \return Constructed MIDI channel ID. | ||||||
| 		 */ | 		 */ | ||||||
| 		#define MIDI_CHANNEL(channel)        ((channel) - 1) | 		#define MIDI_CHANNEL(channel)        ((channel) - 1) | ||||||
| 		 | 		 | ||||||
|  | 		/** Constructs a MIDI event ID from a given MIDI command and a virtual MIDI cable index. This can then be
 | ||||||
|  | 		 *  used to create and decode \ref MIDI_EventPacket_t MIDI event packets. | ||||||
|  | 		 * | ||||||
|  | 		 *  \param[in] virtualcable  Index of the virtual MIDI cable the event relates to | ||||||
|  | 		 *  \param[in] command       MIDI command to send through the virtual MIDI cable | ||||||
|  | 		 * | ||||||
|  | 		 *  \return Constructed MIDI event ID. | ||||||
|  | 		 */ | ||||||
|  | 		#define MIDI_EVENT(virtualcable, command) ((virtualcable << 4) | (command >> 4)) | ||||||
|  | 
 | ||||||
| 	/* Enums: */ | 	/* Enums: */ | ||||||
| 		/** Enum for the possible MIDI jack types in a MIDI device jack descriptor. */ | 		/** Enum for the possible MIDI jack types in a MIDI device jack descriptor. */ | ||||||
| 		enum MIDI_JackTypes_t | 		enum MIDI_JackTypes_t | ||||||
| @ -290,8 +302,7 @@ | |||||||
| 		 */ | 		 */ | ||||||
| 		typedef struct | 		typedef struct | ||||||
| 		{ | 		{ | ||||||
| 			unsigned Command     : 4; /**< Upper nibble of the MIDI command being sent or received in the event packet. */ | 			uint8_t Event; /**< MIDI event type, constructed with the \ref MIDI_EVENT() macro. */ | ||||||
| 			unsigned CableNumber : 4; /**< Virtual cable number of the event being sent or received in the given MIDI interface. */ |  | ||||||
| 
 | 
 | ||||||
| 			uint8_t  Data1; /**< First byte of data in the MIDI event. */ | 			uint8_t  Data1; /**< First byte of data in the MIDI event. */ | ||||||
| 			uint8_t  Data2; /**< Second byte of data in the MIDI event. */ | 			uint8_t  Data2; /**< Second byte of data in the MIDI event. */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera