sl@0: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0: // All rights reserved.
sl@0: // This component and the accompanying materials are made available
sl@0: // under the terms of "Eclipse Public License v1.0"
sl@0: // which accompanies this distribution, and is available
sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0: //
sl@0: // Initial Contributors:
sl@0: // Nokia Corporation - initial contribution.
sl@0: //
sl@0: // Contributors:
sl@0: //
sl@0: // Description:
sl@0: //
sl@0: 
sl@0: #ifndef __MIDICLIENTUTILITYBODY_H__
sl@0: #define __MIDICLIENTUTILITYBODY_H__
sl@0: 
sl@0: #include <midiclientutility.h>
sl@0: #include <mmf/common/midistandardcustomcommands.h>
sl@0: #include <mmf/server/mmffile.h>
sl@0: #include <mmf/server/mmfdes.h>
sl@0: #include "mmfclientutility.h"
sl@0: 
sl@0: 
sl@0: /**
sl@0: Mixin class to allow notification that the timed silence has finished.
sl@0: */
sl@0: class MRepeatTrailingSilenceTimerObs
sl@0: 	{
sl@0: public:
sl@0: 	virtual void RepeatTrailingSilenceTimerComplete() = 0;
sl@0: 	};
sl@0: 
sl@0: /**
sl@0: CTimer-based active object that waits the requested time before notifying its observer.
sl@0: */
sl@0: class CRepeatTrailingSilenceTimer : public CTimer
sl@0: 	{
sl@0: public:
sl@0: 	static CRepeatTrailingSilenceTimer* NewL(MRepeatTrailingSilenceTimerObs& aObs);
sl@0: 	void RunL();
sl@0: private:
sl@0: 	CRepeatTrailingSilenceTimer(MRepeatTrailingSilenceTimerObs& aObs);
sl@0: private:
sl@0: 	MRepeatTrailingSilenceTimerObs& iObs;
sl@0: 	};
sl@0: 
sl@0: 
sl@0: class MMidiControllerEventMonitorObserver
sl@0: 	{
sl@0: public: 
sl@0: 	virtual void HandleMidiEvent(const CMMFMidiEvent& aEvent) = 0;
sl@0: 	};
sl@0: 
sl@0: 
sl@0: class CMidiControllerEventMonitor : public CActive
sl@0: 	{
sl@0: public:
sl@0: 	static CMidiControllerEventMonitor* NewL(MMidiControllerEventMonitorObserver& aMidiObserver, 
sl@0: 		RMidiControllerCustomCommands& aMidiControllerCustomCommands,
sl@0: 		const CMidiClientUtility& aParent);
sl@0: 	~CMidiControllerEventMonitor();
sl@0: 	void Start();
sl@0: 	void SelfComplete(TInt aError);
sl@0: private:
sl@0: 	void ConstructL();
sl@0: 	void RunL();
sl@0: 	void DoCancel();
sl@0: 	TInt RunError(TInt aError);
sl@0: 	CMidiControllerEventMonitor(MMidiControllerEventMonitorObserver& aObserver, 
sl@0: 	RMidiControllerCustomCommands& aMidiControllerCustomCommands, const CMidiClientUtility& aParent);
sl@0: private:
sl@0: 	MMidiControllerEventMonitorObserver& iMidiObserver;
sl@0: 	RMidiControllerCustomCommands& iMidiControllerCustomCommands;
sl@0: 	TPckgBuf<TInt> iSizeOfEvent;
sl@0: 	const CMidiClientUtility& iParent;
sl@0: 	CMMFMidiEvent* iMidiEvent;
sl@0: 	};
sl@0: 
sl@0: 
sl@0: class CMidiEventMonitor : public CActive
sl@0: 	{
sl@0: public:
sl@0: 	static CMidiEventMonitor* NewL(MMidiControllerEventMonitorObserver& aMidiObserver,
sl@0: 								   const CMidiClientUtility& aParent);
sl@0: 	~CMidiEventMonitor();
sl@0: 	void SelfComplete(TInt aError);
sl@0: private:
sl@0: 	void ConstructL();
sl@0: 	void RunL();
sl@0: 	void DoCancel();
sl@0: 	TInt RunError(TInt aError);
sl@0: 	CMidiEventMonitor(MMidiControllerEventMonitorObserver& aObserver,
sl@0: 					  const CMidiClientUtility& aParent);
sl@0: private:
sl@0: 	MMidiControllerEventMonitorObserver& iMidiObserver;
sl@0: 	const CMidiClientUtility& iParent;
sl@0: 	CMMFMidiEvent* iMidiEvent;
sl@0: 	};
sl@0: 
sl@0: 
sl@0: class CContent;
sl@0: class CData;
sl@0: /**
sl@0: */
sl@0: class CMidiClientUtility::CBody : public CBase, 
sl@0: 								  public MMidiControllerEventMonitorObserver,
sl@0: 								  public MRepeatTrailingSilenceTimerObs,
sl@0: 								  public MMMFAddDataSourceSinkAsyncObserver
sl@0: 	{
sl@0: public:
sl@0: 	static CMidiClientUtility::CBody* NewL(CMidiClientUtility* aParent,
sl@0: 										   MMidiClientUtilityObserver& aObserver,
sl@0: 										   TInt aPriority,
sl@0: 										   TInt aPref,
sl@0: 										   TBool aUseSharedHeap);
sl@0: 	
sl@0: 
sl@0: /**
sl@0: 	Destructor
sl@0: */
sl@0: 	~CBody();
sl@0: 
sl@0: 	void OpenFile(const TDesC& aFileSource);
sl@0: 	void OpenFile(RFile& aFile);
sl@0: 	void OpenFile(const TMMSource& aFileSource);
sl@0: 	void OpenDes(const TDesC8& aDescriptor);
sl@0: 	void OpenUrl(const TDesC& aUrl,TInt aIapId = KUseDefaultIap,const TDesC8& aMimeType=KNullDesC8);
sl@0: 	void Close();
sl@0: 	void Play();
sl@0: 	void Stop(const TTimeIntervalMicroSeconds& aFadeOutDuration);
sl@0: 	TMidiState State() const;
sl@0: 	void PlayNoteL(TInt aChannel,TInt aNote,const TTimeIntervalMicroSeconds& aDuration,TInt aNoteOnVelocity,TInt aNoteOffVelocity);
sl@0: 	void PlayNoteL(TInt aChannel,TInt aNote,const TTimeIntervalMicroSeconds& aStartTime,const TTimeIntervalMicroSeconds& aDuration,TInt aNoteOnVelocity,TInt aNoteOffVelocity);
sl@0: 	void StopNotes(TInt aChannel);
sl@0: 	void NoteOnL(TInt aChannel,TInt aNote,TInt aVelocity);
sl@0: 	void NoteOffL(TInt aChannel,TInt aNote,TInt aVelocity);
sl@0: 	TInt PlaybackRateL() const;
sl@0: 	void SetPlaybackRateL(TInt aRate);
sl@0: 	TInt MaxPlaybackRateL() const;
sl@0: 	TInt MinPlaybackRateL() const;
sl@0: 	TInt TempoMicroBeatsPerMinuteL() const;
sl@0: 	void SetTempoL(TInt aMicroBeatsPerMinute);
sl@0: 	TInt PitchTranspositionCentsL() const;
sl@0: 	TInt SetPitchTranspositionL(TInt aCents);
sl@0: 	TTimeIntervalMicroSeconds DurationMicroSecondsL() const;
sl@0: 	TInt64 DurationMicroBeatsL() const;
sl@0: 	TInt NumTracksL() const;
sl@0: 	void SetTrackMuteL(TInt aTrack,TBool aMuted) const;
sl@0: 	const TDesC8& MimeTypeL();
sl@0: 	TTimeIntervalMicroSeconds PositionMicroSecondsL() const;
sl@0: 	void SetPositionMicroSecondsL(const TTimeIntervalMicroSeconds& aPosition);
sl@0: 	TInt64 PositionMicroBeatsL() const;
sl@0: 	void SetPositionMicroBeatsL(TInt64 aMicroBeats);
sl@0: 	void SetSyncUpdateCallbackIntervalL(const TTimeIntervalMicroSeconds& aMicroSeconds,TInt64 aMicroBeats=0);
sl@0: 	TInt SendMessageL(const TDesC8& aMidiMessage);
sl@0: 	TInt SendMessageL(const TDesC8& aMidiMessage,const TTimeIntervalMicroSeconds& aTime);
sl@0: 	void SendMipMessageL(const RArray<TMipMessageEntry>& aEntry);
sl@0: 	TInt NumberOfBanksL(TBool aCustom) const;
sl@0: 	TInt GetBankIdL(TBool aCustom,TInt aBankIndex) const;
sl@0: 	void LoadCustomBankL(const TDesC& aFileName,TInt& aBankCollectionIndex);
sl@0: 	void UnloadCustomBankL(TInt aBankCollectionIndex);
sl@0: 	TBool CustomBankLoadedL(TInt aBankCollectionIndex) const;
sl@0: 	void UnloadAllCustomBanksL();
sl@0: 	TInt NumberOfInstrumentsL(TInt aBankId,TBool aCustom) const;
sl@0: 	TInt GetInstrumentIdL(TInt aBankId,TBool aCustom,TInt aInstrumentIndex) const;
sl@0: 	HBufC* InstrumentNameL(TInt aBankId, TBool aCustom, TInt aInstrumentId) const;
sl@0: 	void SetInstrumentL(TInt aChannel,TInt aBankId,TInt aInstrumentId);
sl@0: 	void LoadCustomInstrumentL(const TDesC& aFileName,TInt aFileBankId,TInt aFileInstrumentId,TInt aMemoryBankId,TInt aMemoryInstrumentId);
sl@0: 	void UnloadCustomInstrumentL(TInt aCustomBankId,TInt aInstrumentId);
sl@0: 	HBufC* PercussionKeyNameL(TInt aNote, TInt aBankId, TBool aCustom, TInt aInstrumentId) const;
sl@0: 	void StopTimeL(TTimeIntervalMicroSeconds& aStopTime) const;
sl@0: 	void SetStopTimeL(const TTimeIntervalMicroSeconds& aStopTime);
sl@0: 	void SetRepeatsL(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence);
sl@0: 	TInt PolyphonyL() const;
sl@0: 	TInt ChannelsSupportedL() const;
sl@0: 	TReal32 ChannelVolumeL(TInt aChannel) const;
sl@0: 	TReal32 MaxChannelVolumeL() const;
sl@0: 	void SetChannelVolumeL(TInt aChannel,TReal32 aVolume);
sl@0: 	void SetChannelMuteL(TInt aChannel,TBool aMuted);
sl@0: 	TInt VolumeL() const;
sl@0: 	TInt MaxVolumeL() const;
sl@0: 	void SetVolumeL(TInt aVolume);
sl@0: 	void SetVolumeRampL(const TTimeIntervalMicroSeconds& aRampDuration);
sl@0: 	TInt GetBalanceL() const;
sl@0: 	void SetBalanceL(TInt aBalance = KMMFBalanceCenter);
sl@0: 	void SetPriorityL(TInt aPriority, TInt aPref);
sl@0: 	TInt NumberOfMetaDataEntriesL() const;
sl@0: 	CMMFMetaDataEntry* GetMetaDataEntryL(TInt aMetaDataIndex) const;
sl@0: 	void SetMaxPolyphonyL(TInt aMaxVoices);
sl@0: 	TInt GetRepeats();
sl@0: 	void LoadCustomBankDataL(const TDesC8& aBankData,TInt& aBankCollectionIndex);
sl@0: 	void LoadCustomInstrumentDataL(const TDesC8& aInstrumentData, TInt aBankDataId, TInt aInstrumentDataId, TInt aMemoryBankId, TInt aMemoryInstrumentId);
sl@0: 	void SetBankL(TBool aCustom);
sl@0: 	TBool IsTrackMuteL(TInt aTrack) const;
sl@0: 	TBool IsChannelMuteL(TInt aChannel) const;
sl@0: 	void GetInstrumentL(TInt aChannel, TInt& aInstrumentId, TInt& aBankId);
sl@0: 	TInt MaxPolyphonyL() const;
sl@0: 	void CustomCommandSyncL(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom);
sl@0: 	void CustomCommandSyncL(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2);
sl@0: 	void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus);
sl@0: 	void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus);
sl@0: 
sl@0: 	MMMFDRMCustomCommand* GetDRMCustomCommand();
sl@0: 
sl@0: 	virtual void RepeatTrailingSilenceTimerComplete();
sl@0: 	//From MMMFControllerEventMonitorObserver
sl@0: 	virtual void HandleMidiEvent(const CMMFMidiEvent& aEvent);
sl@0: 
sl@0: 	// from MMMFAddDataSourceSinkAsyncObserver
sl@0: 	virtual void MadssaoAddDataSourceSinkAsyncComplete(TInt aError, const TMMFMessageDestination& aHandle);
sl@0: 	
sl@0: private:
sl@0: 	CBody(CMidiClientUtility* aParent, MMidiClientUtilityObserver& aObserver, TInt aPriority, TInt aPref);
sl@0: 	void ConstructL(TBool aUseSharedHeap);
sl@0: 	TInt DoOpen(const RMMFControllerImplInfoArray& aControllers, TUid aSinkUid, const TDesC8& aSinkData, TBool aUseSharedHeap);
sl@0:    	void ExternalizeToCBufFlatL(CBufFlat*& aCfgBuffer, const CMMFUrlParams* aUrlParams) const;
sl@0: 	void DoOpenFileL(const TMMSource& aSource);
sl@0:     void DoOpenUrlL(const TDesC& aUrl, TInt aIapId);
sl@0: private:
sl@0: 	CMidiClientUtility* iParent;
sl@0: 	MMidiClientUtilityObserver& iObserver;
sl@0: 	RMMFController iController;
sl@0: 	CMidiControllerEventMonitor* iMidiControllerEventMonitor;
sl@0: 	TMidiState iState;
sl@0: 	TMMFPrioritySettings iPrioritySettings;
sl@0: 	CRepeatTrailingSilenceTimer* iRepeatTrailingSilenceTimer;
sl@0: 
sl@0: 	// Source and sink handle info
sl@0: 	TMMFMessageDestination iSourceHandle;
sl@0: 	TMMFMessageDestination iSinkHandle;
sl@0: 
sl@0: 	// Custom command handlers
sl@0: 	RMidiControllerCustomCommands iMidiControllerCommands;
sl@0: 
sl@0: 	RMMFDRMCustomCommands iDRMCustomCommands;
sl@0: 
sl@0: 	//Stop position
sl@0: 	TTimeIntervalMicroSeconds iStopPosition;
sl@0: 
sl@0: 	HBufC8* iMimeType;
sl@0: 	TBool iIntervalSec;
sl@0: 	CMMFAddDataSourceSinkAsync* iAddDataSourceSinkAsync;
sl@0: 	CMMSourceSink* iSource;
sl@0: 
sl@0: 	ContentAccess::CContent* iContent;
sl@0: 	ContentAccess::CData* iData;
sl@0: 	}; 
sl@0: 
sl@0: #endif