From 1007317c5fd9842036cd1641ffd60eda65034800 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 6 May 2012 11:11:33 +0000
Subject: [PATCH] Fixed broken MIDI host driver MIDI_Host_ReceiveEventPacket()
 function due to not unfreezing the MIDI data IN pipe before use (thanks to
 Michael Brown).

---
 LUFA/DoxygenPages/ChangeLog.txt             |  1 +
 LUFA/Drivers/USB/Class/Host/MIDIClassHost.c | 25 ++++++++++++++-------
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt
index 78867daaf..f78a00bfb 100644
--- a/LUFA/DoxygenPages/ChangeLog.txt
+++ b/LUFA/DoxygenPages/ChangeLog.txt
@@ -56,6 +56,7 @@
   *   - Fixed inverted LED logic in the USB2AX board LED driver
   *   - Fixed possible deadlock in the CDC device driver if the USB connection is dropped while the CDC_REQ_SetLineEncoding control request is being processed by
   *     the stack (thanks to Jonathan Hudgins)
+  *   - Fixed broken MIDI host driver MIDI_Host_ReceiveEventPacket() function due to not unfreezing the MIDI data IN pipe before use (thanks to Michael Brown)
   *  - Library Applications:
   *   - Fixed error in the AVRISP-MKII programmer when ISP mode is used at 64KHz (thanks to Ben R. Porter)
   *   - Fixed AVRISP-MKII programmer project failing to compile for the U4 chips when VTARGET_ADC_CHANNEL is defined to an invalid channel and NO_VTARGET_DETECT is
diff --git a/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c b/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c
index 0d33bfec4..1300577fc 100644
--- a/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c
+++ b/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c
@@ -192,18 +192,27 @@ bool MIDI_Host_ReceiveEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterface
 {
 	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive))
 	  return HOST_SENDCONTROL_DeviceDisconnected;
+	  
+	bool DataReady = false;
 
 	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
 
-	if (!(Pipe_IsReadWriteAllowed()))
-	  return false;
-
-	Pipe_Read_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL);
-
-	if (!(Pipe_IsReadWriteAllowed()))
-	  Pipe_ClearIN();
+	if (Pipe_IsINReceived())
+	{
+		if (Pipe_BytesInPipe())
+		{
+			Pipe_Read_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL);
+			DataReady = true;
+		}
 
-	return true;
+		if (!(Pipe_BytesInPipe()))
+		  Pipe_ClearIN();
+	}
+	
+	Pipe_Freeze();
+	
+	return DataReady;
 }
 
 #endif
-- 
GitLab