mmlibs/mmfw/MIDI/src/midicustomcommandparser.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/MIDI/src/midicustomcommandparser.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,1009 @@
+// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <mmf/common/midistandardcustomcommands.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <mmf/common/midieventreceiver.h>
+#include <mmf/common/mmfmidiconfig.h>
+#endif
+const TInt KMimeTypeLength = 256;
+
+
+/**
+Creates a new MIDI custom command parser capable of handling MIDI controller commands.
+
+@param	aImplementor A reference to the controller plugin that owns this new object.
+@leave	This function may leave with one of the system-wide error codes.
+*/
+EXPORT_C CMidiCustomCommandParser* CMidiCustomCommandParser::NewL(MMidiCustomCommandImplementor& aImplementor)
+	{
+	return new(ELeave) CMidiCustomCommandParser(aImplementor);
+	}
+
+CMidiCustomCommandParser::CMidiCustomCommandParser(MMidiCustomCommandImplementor& aImplementor) :
+	CMMFCustomCommandParserBase(KUidInterfaceMidi),
+	iImplementor(aImplementor)
+	{
+	}
+
+/**
+Destructor.
+*/
+EXPORT_C CMidiCustomCommandParser::~CMidiCustomCommandParser()
+	{
+	delete iMidiEventReceiver;
+	delete iInstrumentName;
+	delete iPercussionKeyName;
+	iMidiEvents.ResetAndDestroy();
+	iMidiEvents.Close();
+	}
+
+/**
+Handles a request from the client. Called by the controller framework.
+
+@param aMessage The message to be handled.
+*/
+void CMidiCustomCommandParser::HandleRequest(TMMFMessage& aMessage)
+	{
+	if (aMessage.Destination().InterfaceId() == KUidInterfaceMidi)
+		{
+		TRAPD(error, DoHandleRequestL(aMessage));
+		if (error)
+			aMessage.Complete(error);
+		}
+	else
+		{
+		aMessage.Complete(KErrNotSupported);
+		}
+	}
+
+void CMidiCustomCommandParser::DoHandleRequestL(TMMFMessage& aMessage)
+	{
+	TBool complete = ETrue;
+	switch (aMessage.Function())
+		{
+	case EMMFMidiControllerSetPositionMicroBeats:
+		complete = DoSetPositionMicroBeatsL(aMessage);
+		break;
+	case EMMFMidiControllerPositionMicroBeats:
+		complete = DoPositionMicroBeatsL(aMessage);
+		break;
+	case EMMFMidiControllerPlayNote:
+		complete = DoPlayNoteL(aMessage);
+		break;
+	case EMMFMidiControllerPlayNoteWithStartTime:
+		complete = DoPlayNoteWithStartTimeL(aMessage);
+		break;
+	case EMMFMidiControllerStopNotes:
+		complete = DoStopNotesL(aMessage);
+		break;
+	case EMMFMidiControllerNoteOn:
+		complete = DoNoteOnL(aMessage);
+		break;
+	case EMMFMidiControllerNoteOff:
+		complete = DoNoteOffL(aMessage);
+		break;
+	case EMMFMidiControllerPlaybackRate:
+		complete = DoPlaybackRateL(aMessage);
+		break;
+	case EMMFMidiControllerSetPlaybackRate:
+		complete = DoSetPlaybackRateL(aMessage);
+		break;
+	case EMMFMidiControllerMaxPlaybackRate:
+		complete = DoMaxPlaybackRateL(aMessage);
+		break;
+	case EMMFMidiControllerMinPlaybackRate:
+		complete = DoMinPlaybackRateL(aMessage);
+		break;
+	case EMMFMidiControllerTempo:
+		complete = DoTempoMicroBeatsPerMinuteL(aMessage);
+		break;
+	case EMMFMidiControllerSetTempo:
+		complete = DoSetTempoL(aMessage);
+		break;
+	case EMMFMidiControllerPitch:
+		complete = DoPitchTranspositionCentsL(aMessage);
+		break;
+	case EMMFMidiControllerSetPitch:
+		complete = DoSetPitchTranspositionL(aMessage);
+		break;
+	case EMMFMidiControllerDurationMicroBeats:
+		complete = DoDurationMicroBeatsL(aMessage);
+		break;
+	case EMMFMidiControllerNumTracks:
+		complete = DoNumTracksL(aMessage);
+		break;
+	case EMMFMidiControllerSetTrackMute:
+		complete = DoSetTrackMuteL(aMessage);
+		break;
+	case EMMFMidiControllerMimeType:
+		complete = DoMimeTypeL(aMessage);
+		break;
+	case EMMFMidiControllerSetSyncUpdateCallbackInterval:
+		complete = DoSetSyncUpdateCallbackIntervalL(aMessage);
+		break;
+	case EMMFMidiControllerSendMessage:
+		complete = DoSendMessageL(aMessage);
+		break;
+	case EMMFMidiControllerSendMessageWithTimeStamp:
+		complete = DoSendMessageWithTimeStampL(aMessage);
+		break;
+	case EMMFMidiControllerSendMipMessage:
+		complete = DoSendMipMessageL(aMessage);
+		break;
+	case EMMFMidiControllerNumberOfBanks:
+		complete = DoNumberOfBanksL(aMessage);
+		break;
+	case EMMFMidiControllerGetBankId:
+		complete = DoGetBankIdL(aMessage);
+		break;
+	case EMMFMidiControllerLoadCustomBank:
+		complete = DoLoadCustomBankL(aMessage);
+		break;
+	case EMMFMidiControllerLoadCustomBankData:
+		complete = DoLoadCustomBankDataL(aMessage);
+		break;
+	case EMMFMidiControllerUnloadCustomBank:
+		complete = DoUnloadCustomBankL(aMessage);
+		break;
+	case EMMFMidiControllerCustomBankLoaded:
+		complete = DoCustomBankLoadedL(aMessage);
+		break;
+	case EMMFMidiControllerUnloadAllCustomBanks:
+		complete = DoUnloadAllCustomBanksL(aMessage);
+		break;
+	case EMMFMidiControllerNumberOfInstruments:
+		complete = DoNumberOfInstrumentsL(aMessage);
+		break;
+	case EMMFMidiControllerGetInstrumentId:
+		complete = DoGetInstrumentIdL(aMessage);
+		break;
+	case EMMFMidiControllerInstrumentName:
+		complete = DoInstrumentNameL(aMessage);
+		break;
+	case EMMFMidiControllerCopyInstrumentName:
+		complete = DoCopyInstrumentNameL(aMessage);
+		break;
+	case EMMFMidiControllerSetInstrument:
+		complete = DoSetInstrumentL(aMessage);
+		break;
+	case EMMFMidiControllerLoadCustomInstrument:
+		complete = DoLoadCustomInstrumentL(aMessage);
+		break;
+	case EMMFMidiControllerLoadCustomInstrumentData:
+		complete = DoLoadCustomInstrumentDataL(aMessage);
+		break;
+	case EMMFMidiControllerUnloadCustomInstrument:
+		complete = DoUnloadCustomInstrumentL(aMessage);
+		break;
+	case EMMFMidiControllerPercussionKeyName:
+		complete = DoPercussionKeyNameL(aMessage);
+		break;
+	case EMMFMidiControllerCopyPercussionKeyName:
+		complete = DoCopyPercussionKeyNameL(aMessage);
+		break;
+	case EMMFMidiControllerStopTime:
+		complete = DoStopTimeL(aMessage);
+		break;
+	case EMMFMidiControllerSetStopTime:
+		complete = DoSetStopTimeL(aMessage);
+		break;
+	case EMMFMidiControllerPolyphony:
+		complete = DoPolyphonyL(aMessage);
+		break;
+	case EMMFMidiControllerChannelsSupported:
+		complete = DoChannelsSupportedL(aMessage);
+		break;
+	case EMMFMidiControllerChannelVolume:
+		complete = DoChannelVolumeL(aMessage);
+		break;
+	case EMMFMidiControllerMaxChannelVolume:
+		complete = DoMaxChannelVolumeL(aMessage);
+		break;
+	case EMMFMidiControllerSetChannelVolume:
+		complete = DoSetChannelVolumeL(aMessage);
+		break;
+	case EMMFMidiControllerSetChannelMute:
+		complete = DoSetChannelMuteL(aMessage);
+		break;
+	case EMMFMidiControllerVolume:
+		complete = DoVolumeL(aMessage);
+		break;
+	case EMMFMidiControllerMaxVolume:
+		complete = DoMaxVolumeL(aMessage);
+		break;
+	case EMMFMidiControllerSetVolume:
+		complete = DoSetVolumeL(aMessage);
+		break;
+	case EMMFMidiControllerSetVolumeRamp:
+		complete = DoSetVolumeRampL(aMessage);
+		break;
+	case EMMFMidiControllerGetBalance:
+		complete = DoGetBalanceL(aMessage);
+		break;
+	case EMMFMidiControllerSetBalance:
+		complete = DoSetBalanceL(aMessage);
+		break;
+	case EMMFMidiControllerSetMaxPolyphony:
+		complete = DoSetMaxPolyphonyL(aMessage);
+		break;
+	case EMMFMidiControllerGetRepeats:
+		complete = DoGetRepeatsL(aMessage);
+		break;
+	case EMMFMidiControllerSetRepeats:
+		complete = DoSetRepeatsL(aMessage);
+		break;
+	case EMMFMidiControllerSetBank:
+		DoSetBankL(aMessage);
+		break;
+	case EMMFMidiControllerIsTrackMute:
+		DoIsTrackMuteL(aMessage);
+		break;
+	case EMMFMidiControllerIsChannelMute:
+		DoIsChannelMuteL(aMessage);
+		break;
+	case EMMFMidiControllerGetInstrument:
+		DoGetInstrumentL(aMessage);
+		break;
+	case EMMFMidiControllerClose:
+		complete = DoCloseL(aMessage);
+		break;
+	case EMMFMidiControllerStop:
+		complete = DoStopL(aMessage);
+		break;
+	case EMMFMidiControllerReceiveEvents:
+		complete = DoReceiveEventsL(aMessage);
+		break;
+	case EMMFMidiControllerRetrieveEvent:
+		complete = DoRetrieveEventL(aMessage);
+		break;
+	case EMMFMidiControllerCancelReceiveEvents:
+		complete = DoCancelReceiveEventsL(aMessage);
+		break;
+	case EMMFMidiControllerMaxPolyphony:
+		complete = DoMaxPolyphonyL(aMessage);
+		break;
+	default:
+		User::Leave(KErrNotSupported);
+		break;
+		}
+	if (complete)
+		aMessage.Complete(KErrNone);
+	}
+
+TBool CMidiCustomCommandParser::DoSetPositionMicroBeatsL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetPositionMicroBeatsL(pckg().iPositionMicroBeats);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoPositionMicroBeatsL(TMMFMessage& aMessage)
+	{
+	TInt64 microBeats = 0;
+	iImplementor.MmcPositionMicroBeatsL(microBeats);
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	pckg().iPositionMicroBeats = microBeats;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoPlayNoteL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcPlayNoteL(pckg().iChannel, pckg().iNote, pckg().iDurationMicroSeconds, pckg().iNoteOnVelocity, pckg().iNoteOffVelocity);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoPlayNoteWithStartTimeL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcPlayNoteL(pckg().iChannel, pckg().iNote, pckg().iStartTime, pckg().iDurationMicroSeconds, pckg().iNoteOnVelocity, pckg().iNoteOffVelocity);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoStopNotesL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcStopNotesL(pckg().iChannel);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoNoteOnL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcNoteOnL(pckg().iChannel, pckg().iNote, pckg().iNoteOnVelocity);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoNoteOffL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcNoteOffL(pckg().iChannel, pckg().iNote, pckg().iNoteOffVelocity);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoPlaybackRateL(TMMFMessage& aMessage)
+	{
+	TInt playBackRate;
+	iImplementor.MmcPlaybackRateL(playBackRate);
+	TPckgBuf<TMMFMidiConfig3> pckg;
+	pckg().iPlayBackRate = playBackRate;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetPlaybackRateL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig3> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetPlaybackRateL(pckg().iPlayBackRate);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoMaxPlaybackRateL(TMMFMessage& aMessage)
+	{
+	TInt maxRate;
+	iImplementor.MmcMaxPlaybackRateL(maxRate);
+	TPckgBuf<TMMFMidiConfig3> pckg;
+	pckg().iPlayBackMaxRate = maxRate;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoMinPlaybackRateL(TMMFMessage& aMessage)
+	{
+	TInt minRate;
+	iImplementor.MmcMinPlaybackRateL(minRate);
+	TPckgBuf<TMMFMidiConfig3> pckg;
+	pckg().iPlayBackMinRate = minRate;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoTempoMicroBeatsPerMinuteL(TMMFMessage& aMessage)
+	{
+	TInt microBeatsPerMinute;
+	iImplementor.MmcTempoMicroBeatsPerMinuteL(microBeatsPerMinute);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iTempo = microBeatsPerMinute;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetTempoL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetTempoL(pckg().iTempo);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoPitchTranspositionCentsL(TMMFMessage& aMessage)
+	{
+	TInt pitch;
+	iImplementor.MmcPitchTranspositionCentsL(pitch);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iPitch = pitch;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetPitchTranspositionL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt centsApplied;
+	iImplementor.MmcSetPitchTranspositionL(pckg().iPitch, centsApplied);
+	pckg().iPitch = centsApplied;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoDurationMicroBeatsL(TMMFMessage& aMessage)
+	{
+	TInt64 duration;
+	iImplementor.MmcDurationMicroBeatsL(duration);
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	pckg().iDurationMicroBeats = duration;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoNumTracksL(TMMFMessage& aMessage)
+	{
+	TInt numTracks;
+	iImplementor.MmcNumTracksL(numTracks);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iNumTracks = numTracks;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetTrackMuteL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetTrackMuteL(pckg().iTrack, pckg().iMuted);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoMimeTypeL(TMMFMessage& aMessage)
+	{
+	HBufC8* mimeType = HBufC8::NewL(KMimeTypeLength);
+	TPtr8 des = mimeType->Des();
+	CleanupStack::PushL(mimeType);
+	iImplementor.MmcMimeTypeL(des);
+	aMessage.WriteDataToClientL(des);
+	CleanupStack::PopAndDestroy();//mimeType
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetSyncUpdateCallbackIntervalL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig3> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetSyncUpdateCallbackIntervalL(pckg().iCallbackIntervalMicroSeconds, pckg().iCallbackIntervalMicroBeats);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSendMessageL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig3> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt bytesProcessed;
+	iImplementor.MmcSendMessageL(*(pckg().iMidiMessage), bytesProcessed);
+	pckg().iBytesProcessed = bytesProcessed;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSendMessageWithTimeStampL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig3> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt bytesProcessed;
+	iImplementor.MmcSendMessageL(*(pckg().iMidiMessage), pckg().iTimeStamp, bytesProcessed);
+	pckg().iBytesProcessed = bytesProcessed;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSendMipMessageL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSendMipMessageL(*(pckg().iMipMessage));
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoNumberOfBanksL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt numBanks;
+	iImplementor.MmcNumberOfBanksL(pckg().iCustom, numBanks);
+	pckg().iNumBanks = numBanks;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoGetBankIdL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt bankId;
+	iImplementor.MmcGetBankIdL(pckg().iCustom, pckg().iBankIndex, bankId);
+	pckg().iBankId = bankId;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoLoadCustomBankL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt bankId;
+	iImplementor.MmcLoadCustomBankL(*(pckg().iFileName), bankId);
+	pckg().iBankId = bankId;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoLoadCustomBankDataL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt bankId;
+	iImplementor.MmcLoadCustomBankDataL(*(pckg().iBankData), bankId);
+	pckg().iBankId = bankId;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoUnloadCustomBankL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcUnloadCustomBankL(pckg().iBankId);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoCustomBankLoadedL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TBool bankLoaded;
+	iImplementor.MmcCustomBankLoadedL(pckg().iBankId, bankLoaded);
+	pckg().iBankLoaded = bankLoaded;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoUnloadAllCustomBanksL(TMMFMessage& /*aMessage*/)
+	{
+	iImplementor.MmcUnloadAllCustomBanksL();
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoNumberOfInstrumentsL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt numInstruments;
+	iImplementor.MmcNumberOfInstrumentsL(pckg().iBankId, pckg().iCustom, numInstruments);	
+	pckg().iNumInstruments = numInstruments;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoGetInstrumentIdL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt instrumentId;
+	iImplementor.MmcGetInstrumentIdL(pckg().iBankId, pckg().iCustom, pckg().iInstrumentIndex, instrumentId);
+	pckg().iInstrumentId = instrumentId;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoInstrumentNameL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+
+	// Prevent memory leaks by deleting old instrument name - something must have gone wrong in the client
+	// if it already exists
+	delete iInstrumentName;
+	iInstrumentName = NULL;
+
+	// Get the instrument name from the controller
+	const TDesC& instrumentName = iImplementor.MmcInstrumentNameL(pckg().iBankId, pckg().iCustom, pckg().iInstrumentId);
+
+	iInstrumentName = CBufFlat::NewL(32);
+	RBufWriteStream stream;
+	stream.Open(*iInstrumentName);
+	CleanupClosePushL(stream);
+	stream << instrumentName;
+	CleanupStack::PopAndDestroy();//s
+
+	// Write the size of the descriptor back to the client
+	TPckgBuf<TInt> descriptorSizePckg(iInstrumentName->Ptr(0).Length());	
+	aMessage.WriteDataToClientL(descriptorSizePckg);
+
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoCopyInstrumentNameL(TMMFMessage& aMessage)
+	{
+	if (!iInstrumentName)
+		User::Leave(KErrNotReady);
+
+	// Copy the instrument name back to the client
+	aMessage.WriteDataToClientL(iInstrumentName->Ptr(0));
+	delete iInstrumentName;
+	iInstrumentName = NULL;
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetInstrumentL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetInstrumentL(pckg().iChannel, pckg().iBankId, pckg().iInstrumentId);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoLoadCustomInstrumentL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcLoadCustomInstrumentL(*(pckg().iFileName), pckg().iBankId, pckg().iInstrumentId, pckg().iMemoryBankId,  pckg().iMemoryInstrumentId);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoLoadCustomInstrumentDataL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcLoadCustomInstrumentDataL(*(pckg().iInstrumentData), pckg().iBankId, pckg().iInstrumentId, pckg().iMemoryBankId,  pckg().iMemoryInstrumentId);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoUnloadCustomInstrumentL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcUnloadCustomInstrumentL(pckg().iBankId, pckg().iInstrumentId);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoPercussionKeyNameL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+
+	// Prevent memory leaks by deleting old key name - something must have gone wrong in the client
+	// if it already exists
+	delete iPercussionKeyName;
+	iPercussionKeyName = NULL;
+
+	const TDesC& percussionKeyName = iImplementor.MmcPercussionKeyNameL(pckg().iNote, pckg().iBankId, pckg().iCustom, pckg().iInstrumentId);
+
+	iPercussionKeyName = CBufFlat::NewL(32);
+	RBufWriteStream stream;
+	stream.Open(*iPercussionKeyName);
+	CleanupClosePushL(stream);
+	stream << percussionKeyName;
+	CleanupStack::PopAndDestroy();//s
+
+	// Write the size of the descriptor back to the client
+	TPckgBuf<TInt> descriptorSizePckg(iPercussionKeyName->Ptr(0).Length());	
+	aMessage.WriteDataToClientL(descriptorSizePckg);	
+	
+	return ETrue;
+	}
+
+
+TBool CMidiCustomCommandParser::DoCopyPercussionKeyNameL(TMMFMessage& aMessage)
+	{
+	if (!iPercussionKeyName)
+		User::Leave(KErrNotReady);
+
+	// Copy the instrument name back to the client
+	aMessage.WriteDataToClientL(iPercussionKeyName->Ptr(0));
+	delete iPercussionKeyName;
+	iPercussionKeyName = NULL;
+	return ETrue;
+	}
+
+
+TBool CMidiCustomCommandParser::DoStopTimeL(TMMFMessage& aMessage)
+	{
+	TTimeIntervalMicroSeconds stopTime;
+	iImplementor.MmcStopTimeL(stopTime);
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	pckg().iStopTime = stopTime;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetStopTimeL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetStopTimeL(pckg().iStopTime);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoPolyphonyL(TMMFMessage& aMessage)
+	{
+	TInt numNotes;
+	iImplementor.MmcPolyphonyL(numNotes);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iNumNotes = numNotes;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoMaxPolyphonyL(TMMFMessage& aMessage)
+	{
+	TInt maxNotes;
+	iImplementor.MmcMaxPolyphonyL(maxNotes);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iMaxNotes = maxNotes;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoChannelsSupportedL(TMMFMessage& aMessage)
+	{
+	TInt channels;
+	iImplementor.MmcChannelsSupportedL(channels);
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	pckg().iChannel = channels;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoChannelVolumeL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TReal32 channelVol;
+	iImplementor.MmcChannelVolumeL(pckg().iChannel, channelVol);
+	pckg().iChannelVol = channelVol;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoMaxChannelVolumeL(TMMFMessage& aMessage)
+	{
+	TReal32 maxVol;
+	iImplementor.MmcMaxChannelVolumeL(maxVol);
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	pckg().iMaxChannelVol = maxVol;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetChannelVolumeL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetChannelVolumeL(pckg().iChannel, pckg().iChannelVol);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetChannelMuteL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetChannelMuteL(pckg().iChannel, pckg().iMuted);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoVolumeL(TMMFMessage& aMessage)
+	{
+	TInt vol;  
+	iImplementor.MmcVolumeL(vol);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iVolume = vol;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoMaxVolumeL(TMMFMessage& aMessage)
+	{
+	TInt maxVol;
+	iImplementor.MmcMaxVolumeL(maxVol);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iMaxVolume = maxVol;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetVolumeL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetVolumeL(pckg().iVolume);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetVolumeRampL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetVolumeRampL(pckg().iRampDuration);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoGetBalanceL(TMMFMessage& aMessage)
+	{
+	TInt balance;
+	iImplementor.MmcGetBalanceL(balance);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iBalance = balance;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetBalanceL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetBalanceL(pckg().iBalance);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetMaxPolyphonyL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetMaxPolyphonyL(pckg().iMaxNotes);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoGetRepeatsL(TMMFMessage& aMessage)
+	{
+	TInt numRepeats;
+	iImplementor.MmcGetRepeatsL(numRepeats);
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	pckg().iNumRepeats = numRepeats;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetRepeatsL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig3> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetRepeatsL(pckg().iRepeatNumberOfTimes, pckg().iTrailingSilence);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoSetBankL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcSetBankL(pckg().iCustom);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoIsTrackMuteL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TBool mute;
+	iImplementor.MmcIsTrackMuteL(pckg().iTrack, mute);
+	pckg().iMuted = mute;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoIsChannelMuteL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TBool mute;
+	iImplementor.MmcIsChannelMuteL(pckg().iChannel, mute);
+	pckg().iMuted = mute;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoGetInstrumentL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig2> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	TInt instrumentId;
+	TInt bankId;
+	iImplementor.MmcGetInstrumentL(pckg().iChannel, instrumentId, bankId);
+	pckg().iInstrumentId = instrumentId;
+	pckg().iBankId = bankId;
+	aMessage.WriteDataToClientL(pckg);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoCloseL(TMMFMessage& /*aMessage*/)
+	{
+	iImplementor.MmcCloseL();
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoStopL(TMMFMessage& aMessage)
+	{
+	TPckgBuf<TMMFMidiConfig1> pckg;
+	aMessage.ReadData1FromClientL(pckg);
+	iImplementor.MmcStopL(pckg().iFadeOutDuration);
+	return ETrue;
+	}
+
+TBool CMidiCustomCommandParser::DoReceiveEventsL(TMMFMessage& aMessage)
+	{
+	if (iMidiEventReceiver)
+		{
+		if (iMidiEventReceiver->IsWaitingToSendEvent())
+			{
+			//Something must have gone wrong in the client
+			// - we're waiting to get a RetrieveEvent() call, but it didn't come.
+			// So, delete the existing event receiver
+			delete iMidiEventReceiver;
+			iMidiEventReceiver = NULL;
+			}
+		else
+			{
+			User::Leave(KErrAlreadyExists);
+			}
+		}
+	ASSERT(!iMidiEventReceiver);
+	iMidiEventReceiver = CMidiEventReceiver::NewL(aMessage);
+	//send the next cached event (if any) to the client
+	if (iMidiEvents.Count() > 0)
+		{
+		CMMFMidiEvent* midiEvent = iMidiEvents[0];
+		iMidiEventReceiver->PrepareEventL(*midiEvent);
+		iMidiEvents.Remove(0);
+		delete midiEvent;
+		}
+	return EFalse;
+	}
+
+TBool CMidiCustomCommandParser::DoRetrieveEventL(TMMFMessage& aMessage)
+	{
+	if (iMidiEventReceiver)
+		{
+		iMidiEventReceiver->SendEventL(aMessage);
+		delete iMidiEventReceiver;
+		iMidiEventReceiver = NULL;
+		}
+	else
+		{
+		User::Leave(KErrNotReady);
+		}
+
+	return ETrue;
+	}
+
+/**
+Sent a MIDI event back to the client.
+
+@param aEvent MIDI event to be sent to the client.
+@return One of the system-wide error codes.
+*/
+TInt CMidiCustomCommandParser::SendMidiEventToClient(const CMMFMidiEvent& aEvent)
+	{
+	TInt error = KErrNone;
+	if (iMidiEventReceiver && !iMidiEventReceiver->IsWaitingToSendEvent())
+		{
+		//prepare to send event to client
+		TRAP(error, iMidiEventReceiver->PrepareEventL(aEvent));
+		}
+	else
+		{
+		//queue the request for later
+		CMMFMidiEvent* midiEvent = new CMMFMidiEvent();
+		if (!midiEvent)
+			return KErrNoMemory;
+
+		// coverity[leave_without_push]
+		TRAP(error, midiEvent->CopyL(aEvent));
+		//if we've exceeded the max number of cached messages, delete the first and append this one to the end
+		if (!error)
+			{
+			error = iMidiEvents.Append(midiEvent);
+			}
+
+		if(error != KErrNone)
+			delete midiEvent;
+		}
+	return error;
+	}
+
+
+TBool CMidiCustomCommandParser::DoCancelReceiveEventsL(TMMFMessage& /*aMessage*/)
+	{
+	delete iMidiEventReceiver;
+	iMidiEventReceiver = NULL;
+	return ETrue;
+	}