From 82162c710c3c26739c07b41b20048c30cce78943 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 20 May 2012 13:04:26 +0000
Subject: Additional fixes to the MIDI host driver due to not
 unfreezing/re-freezing pipes correctly (thanks to Michael Brown).

---
 Demos/Host/LowLevel/MIDIHost/MIDIHost.c     |  6 ++++++
 LUFA/Drivers/USB/Class/Host/MIDIClassHost.c | 20 ++++++++++++++++----
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/Demos/Host/LowLevel/MIDIHost/MIDIHost.c b/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
index f4a52accd..f6b607a97 100644
--- a/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
+++ b/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
@@ -167,6 +167,7 @@ void MIDIHost_Task(void)
 	  return;
 
 	Pipe_SelectPipe(MIDI_DATA_IN_PIPE);
+	Pipe_Unfreeze();
 
 	if (Pipe_IsINReceived())
 	{
@@ -187,8 +188,11 @@ void MIDIHost_Task(void)
 																				   MIDIEvent.Data2, MIDIEvent.Data3);
 		}
 	}
+	
+	Pipe_Freeze();
 
 	Pipe_SelectPipe(MIDI_DATA_OUT_PIPE);
+	Pipe_Unfreeze();
 
 	if (Pipe_IsOUTReady())
 	{
@@ -251,6 +255,8 @@ void MIDIHost_Task(void)
 			Pipe_ClearOUT();
 		}
 
+		Pipe_Freeze();
+
 		/* Save previous joystick value for next joystick change detection */
 		PrevJoystickStatus = JoystickStatus;
 	}
diff --git a/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c b/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c
index 1300577fc..b1abb68d7 100644
--- a/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c
+++ b/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c
@@ -156,15 +156,21 @@ uint8_t MIDI_Host_Flush(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo)
 	uint8_t ErrorCode;
 
 	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataOUTPipe.Address);
-
+	Pipe_Unfreeze();
+	
 	if (Pipe_BytesInPipe())
 	{
 		Pipe_ClearOUT();
 
 		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)
-		  return ErrorCode;
+		{
+			Pipe_Freeze();
+			return ErrorCode;
+		}
 	}
 
+	Pipe_Freeze();
+
 	return PIPE_READYWAIT_NoError;
 }
 
@@ -177,13 +183,19 @@ uint8_t MIDI_Host_SendEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterface
 	uint8_t ErrorCode;
 
 	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataOUTPipe.Address);
-
+	Pipe_Unfreeze();
+	
 	if ((ErrorCode = Pipe_Write_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL)) != PIPE_RWSTREAM_NoError)
-	  return ErrorCode;
+	{
+		Pipe_Freeze();
+		return ErrorCode;
+	}
 
 	if (!(Pipe_IsReadWriteAllowed()))
 	  Pipe_ClearOUT();
 
+	Pipe_Freeze();
+
 	return PIPE_RWSTREAM_NoError;
 }
 
-- 
cgit v1.2.3