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