devsound/devsoundrefplugin/src/platsec/server/AudioServer/MmfDevSoundSessionBody.cpp
author hgs
Fri, 08 Oct 2010 19:40:43 +0100
changeset 0 79dd3e2336a0
permissions -rw-r--r--
2010wk36_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     2
// All rights reserved.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     7
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    10
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    11
// Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    12
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    13
// Description:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    14
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    15
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    16
#include <e32base.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    17
#ifdef SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    18
#include <OMX_Core.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    19
#endif // SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    20
#include "MmfDevSoundSessionBody.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    21
#include "MmfDevSoundSessionXtnd.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    22
#include "MmfDevSoundServer.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    23
#include <mdaaudiotoneplayer.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    24
#include <mmf/server/mmfdatabuffer.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    25
#include <mmffourcc.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    26
#include <mmfhwdeviceimplementationuids.hrh>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    27
#include <mmf/server/mmfswcodecwrappercustominterfacesuids.hrh> // KUidRefDevSoundTaskConfig & KMmfUidEmptyBuffersCustomInterface
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    28
#include <mmf/server/mmfdevsoundcustominterfacesupport.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    29
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    30
const TUid KEmptyBuffersCustomInterfaceTypeUid	= {KMmfUidEmptyBuffersCustomInterface};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    31
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    32
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    33
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    34
 *	Default Constructor.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    35
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    36
 *	No default implementation. CMMFDevSoundProxy implements 2-phase construction.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    37
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    38
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    39
CMMFDevSoundSvrImp::CMMFDevSoundSvrImp(CMMFDevSoundSessionXtnd* aParent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    40
: iParent(*aParent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    41
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    42
	iMode= EMMFDevSoundStateIdle;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    43
	//Set reasonable default values for DTMF 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    44
	iDTMFGen.SetToneDurations(250000,50000,250000);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    45
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    46
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    47
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    48
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    49
 *	Destructor.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    50
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    51
 *	Deletes all objects and releases all resource owned by this
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    52
 *	instance.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    53
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    54
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    55
CMMFDevSoundSvrImp::~CMMFDevSoundSvrImp()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    56
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    57
	delete iToneBuffer1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    58
	delete iToneBuffer2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    59
	delete iDevSoundEventHandler; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    60
	if( iAudioPolicyProxy != NULL)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    61
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    62
		iAudioPolicyProxy->Close(); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    63
		delete iAudioPolicyProxy;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    64
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    65
	delete iDevSoundUtil;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    66
	delete iFixedSequences;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    67
	delete iCMMFHwDevice;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    68
#ifdef SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    69
	OMX_Deinit();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    70
#endif // SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    71
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    72
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    73
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    74
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    75
 *	Constructs, and returns a pointer to, a new CMMFDevSoundSvrImp object.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    76
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    77
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    78
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    79
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    80
CMMFDevSoundSvrImp* CMMFDevSoundSvrImp::NewL(CMMFDevSoundSessionXtnd* aParent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    81
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    82
	CMMFDevSoundSvrImp* self = new (ELeave) CMMFDevSoundSvrImp(aParent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    83
	return self;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    84
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    85
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    86
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    87
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    88
 *	3rd phase constructor - assumes that iParent has already been set up properly
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    89
 *                          (During ConstructL() it has yet to be
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    90
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    91
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    92
void CMMFDevSoundSvrImp::Construct3L(RServer2& aPolicyServerHandle)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    93
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    94
	// all these data properties should be NULL, but add ASSERTs to verity
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    95
	ASSERT(iAudioPolicyProxy==NULL);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    96
	iAudioPolicyProxy = new (ELeave) RMMFAudioPolicyProxy();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    97
	ASSERT(iDevSoundEventHandler==NULL);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    98
	iDevSoundEventHandler = CMMFDevSoundEventHandler::NewL(iAudioPolicyProxy);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    99
	User::LeaveIfError(iAudioPolicyProxy->Open(aPolicyServerHandle));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   100
	iDevSoundEventHandler->SetDevSoundInfo(&iParent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   101
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   102
	iDevSoundUtil = CMMFDevSoundUtility::NewL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   103
	// Initialize Fixed sequence related
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   104
	iDevSoundUtil->InitializeFixedSequenceL(&iFixedSequences);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   105
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   106
#ifdef SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   107
	OMX_Init();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   108
#endif // SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   109
	PreInitializeL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   110
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   111
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   112
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   113
 * internal procedure to perform all initialization prior to setting the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   114
 * data type 4CC code
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   115
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   116
void CMMFDevSoundSvrImp::PreInitializeL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   117
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   118
	// Set default values for priority settings: Note: Client must 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   119
	// over ride default settings by calling SetPrioirtySettings
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   120
	iAudioPolicyPrioritySettings.iState = EMMFStateStopped;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   121
	iAudioPolicyPrioritySettings.iPref = EMdaPriorityPreferenceNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   122
	iAudioPolicyPrioritySettings.iPriority = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   123
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   124
	// Get device capabilities and current settings from Audio Policy:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   125
	User::LeaveIfError(iAudioPolicyProxy->GetPlayFormatsSupported(iPlayFormatsSupported));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   126
	User::LeaveIfError(iAudioPolicyProxy->GetPlayFormat(iPlayFormat));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   127
	User::LeaveIfError(iAudioPolicyProxy->GetRecordFormatsSupported(iRecordFormatsSupported));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   128
	User::LeaveIfError(iAudioPolicyProxy->GetRecordFormat(iRecordFormat));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   129
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   130
	//default to play until we know we are recording
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   131
	User::LeaveIfError(InitializeFormat(iPlayFormatsSupported, iPlayFormat));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   132
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   133
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   134
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   135
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   136
 *	Initializes CMMFDevSoundProxy object to play and record PCM16 raw audio data
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   137
 *	with sampling rate of 8 KHz.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   138
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   139
 *	On completion of Initialization, calls InitializeComplete() on
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   140
 *	aDevSoundObserver.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   141
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   142
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   143
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   144
 *	@param	"MDevSoundObserver& aDevSoundObserver"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   145
 *			A reference to DevSound Observer instance.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   146
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   147
 *	@param	"TMMFState aMode"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   148
 *			Mode for which this object will be used.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   149
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   150
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   151
void CMMFDevSoundSvrImp::InitializeL(MDevSoundObserver& aDevSoundObserver, TMMFState aMode)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   152
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   153
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   154
	// if no HwDevice id specified, load default null implementation
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   155
	TUid rawUid = {KMmfUidHwDevicePCM16ToPCM16};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   156
	InitializeL(aDevSoundObserver, rawUid, aMode);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   157
	__ASSERT_DEBUG(!(iHasPolicy&&(iMode == EMMFDevSoundStatePlaying)), Panic(TMMFDevSoundSessionPolicyNotInvalidated));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   158
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   159
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   160
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   161
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   162
 *	Configure CMMFDevSoundProxy object for the settings in aConfig.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   163
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   164
 *	Use this to set sampling rate, Encoding and Mono/Stereo.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   165
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   166
 *	@param	"TMMFCapabilities& aConfig"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   167
 *			Attribute values to which CMMFDevSoundProxy object will be configured to.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   168
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   169
 *  As part of defect 20796, the iRecordFormat has been set under the iPlayFormat, 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   170
 *  before it was not set at all.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   171
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   172
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   173
void CMMFDevSoundSvrImp::SetConfigL(const TMMFCapabilities& aConfig)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   174
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   175
	TUint attributeValue = aConfig.iRate;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   176
	// WINS supports from 8000 Hz to 96000 Hz
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   177
	// The ToneGenerator currently supports sample rate of 8000Hz only. 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   178
	if(iMode == EMMFDevSoundStateTonePlaying && (attributeValue != EMMFSampleRate8000Hz ))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   179
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   180
		User::Leave(KErrNotSupported);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   181
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   182
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   183
	if (attributeValue & EMMFSampleRate96000Hz) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   184
		{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   185
		iPlayFormat().iRate = 96000; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   186
		iRecordFormat().iRate = 96000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   187
		iDeviceConfig.iRate = EMMFSampleRate96000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   188
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   189
	else if (attributeValue & EMMFSampleRate88200Hz) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   190
		{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   191
		iPlayFormat().iRate = 88200; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   192
		iRecordFormat().iRate = 88200;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   193
		iDeviceConfig.iRate = EMMFSampleRate88200Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   194
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   195
	else if (attributeValue & EMMFSampleRate64000Hz) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   196
		{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   197
		iPlayFormat().iRate = 64000; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   198
		iRecordFormat().iRate = 64000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   199
		iDeviceConfig.iRate = EMMFSampleRate64000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   200
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   201
	else if (attributeValue & EMMFSampleRate48000Hz) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   202
		{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   203
		iPlayFormat().iRate = 48000; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   204
		iRecordFormat().iRate = 48000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   205
		iDeviceConfig.iRate = EMMFSampleRate48000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   206
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   207
	else if (attributeValue & EMMFSampleRate44100Hz) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   208
		{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   209
		iPlayFormat().iRate = 44100; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   210
		iRecordFormat().iRate = 44100;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   211
		iDeviceConfig.iRate = EMMFSampleRate44100Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   212
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   213
	else if (attributeValue & EMMFSampleRate32000Hz) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   214
		{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   215
		iPlayFormat().iRate = 32000; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   216
		iRecordFormat().iRate = 32000; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   217
		iDeviceConfig.iRate = EMMFSampleRate32000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   218
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   219
	else if (attributeValue & EMMFSampleRate24000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   220
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   221
		iPlayFormat().iRate = 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   222
		iRecordFormat().iRate = 24000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   223
		iDeviceConfig.iRate = EMMFSampleRate24000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   224
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   225
	else if (attributeValue & EMMFSampleRate22050Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   226
		{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   227
		iPlayFormat().iRate = 22050; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   228
		iRecordFormat().iRate = 22050; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   229
		iDeviceConfig.iRate = EMMFSampleRate22050Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   230
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   231
	else if (attributeValue & EMMFSampleRate16000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   232
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   233
		iPlayFormat().iRate = 16000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   234
		iRecordFormat().iRate = 16000; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   235
		iDeviceConfig.iRate = EMMFSampleRate16000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   236
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   237
	else if (attributeValue & EMMFSampleRate12000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   238
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   239
		iPlayFormat().iRate = 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   240
		iRecordFormat().iRate = 12000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   241
		iDeviceConfig.iRate = EMMFSampleRate12000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   242
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   243
	else if (attributeValue & EMMFSampleRate11025Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   244
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   245
		iPlayFormat().iRate = 11025;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   246
		iRecordFormat().iRate = 11025;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   247
		iDeviceConfig.iRate = EMMFSampleRate11025Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   248
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   249
	else if (attributeValue & EMMFSampleRate8000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   250
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   251
		iPlayFormat().iRate = 8000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   252
		iRecordFormat().iRate = 8000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   253
		iDeviceConfig.iRate = EMMFSampleRate8000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   254
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   255
	else if (attributeValue) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   256
		{ //if no attribute value assume its not set
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   257
		User::Leave(KErrNotSupported);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   258
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   259
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   260
	attributeValue = aConfig.iEncoding;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   261
	// Map from MMF Encoding enums to RMdaDevSound enum
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   262
	if(attributeValue & EMMFSoundEncoding8BitPCM) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   263
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   264
		iPlayFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   265
		iRecordFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   266
		iDeviceConfig.iEncoding = EMMFSoundEncoding8BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   267
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   268
	else if(attributeValue & EMMFSoundEncoding8BitALaw)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   269
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   270
		iPlayFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitALaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   271
		iRecordFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitALaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   272
		iDeviceConfig.iEncoding = EMMFSoundEncoding8BitALaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   273
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   274
	else if(attributeValue & EMMFSoundEncoding8BitMuLaw) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   275
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   276
		iPlayFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitMuLaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   277
		iRecordFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitMuLaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   278
		iDeviceConfig.iEncoding = EMMFSoundEncoding8BitMuLaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   279
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   280
	else if(attributeValue & EMMFSoundEncoding16BitPCM)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   281
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   282
		iPlayFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding16BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   283
		iRecordFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding16BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   284
		iDeviceConfig.iEncoding = EMMFSoundEncoding16BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   285
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   286
	else if (attributeValue) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   287
		{ //if no attribute value assume its not set
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   288
		User::Leave(KErrNotSupported);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   289
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   290
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   291
	// Mono/Stereo settings
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   292
	attributeValue = aConfig.iChannels;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   293
	if(iMode == EMMFDevSoundStateTonePlaying && (attributeValue != EMMFMono ))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   294
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   295
		User::Leave(KErrNotSupported);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   296
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   297
	if(attributeValue & EMMFStereo) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   298
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   299
		iPlayFormat().iChannels = 2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   300
		iRecordFormat().iChannels = 2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   301
		iDeviceConfig.iChannels = EMMFStereo;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   302
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   303
	else if(attributeValue & EMMFMono)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   304
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   305
		iPlayFormat().iChannels = 1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   306
		iRecordFormat().iChannels = 1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   307
		iDeviceConfig.iChannels = EMMFMono;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   308
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   309
	else if (attributeValue) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   310
		{ //if no attribute value assume its not set
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   311
		User::Leave(KErrNotSupported);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   312
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   313
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   314
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   315
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   316
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   317
 *	Changes the current playback volume to a specified value.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   318
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   319
 *	The volume can be changed before or during playback and is effective
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   320
 *	immediately.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   321
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   322
 *	@param	"TInt aVolume"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   323
 *			The volume setting. This can be any value from zero to the value
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   324
 *			returned by a call to CMdaAudioPlayerUtility::MaxVolume(). If the
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   325
 *			volume is not within this range, the volume is automatically set to
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   326
 *			minimum or maximum value based on the value that is being passed.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   327
 *			Setting a zero value mutes the sound. Setting the maximum value
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   328
 *			results in the loudest possible sound.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   329
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   330
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   331
void CMMFDevSoundSvrImp::SetVolume(TInt aVolume)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   332
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   333
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   334
	// Check and make sure that the volume is in valid range
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   335
	if (aVolume < 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   336
		aVolume = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   337
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   338
	if (aVolume > MaxVolume())
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   339
		aVolume = MaxVolume();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   340
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   341
	iVolume = aVolume;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   342
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   343
	SetDeviceVolume(iVolume);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   344
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   345
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   346
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   347
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   348
 *	Changes the current recording gain to a specified value.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   349
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   350
 *	The gain can be changed before or during recording and is effective
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   351
 *	immediately.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   352
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   353
 *	@param	"TInt aGain"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   354
 *			The volume setting. This can be any value from zero to the value
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   355
 *			returned by a call to CMdaAudioPlayerUtility::MaxVolume(). If the
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   356
 *			volume is not within this range, the gain is automatically set to
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   357
 *			minimum or maximum value based on the value that is being passed.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   358
 *			Setting a zero value mutes the sound. Setting the maximum value
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   359
 *			results in the loudest possible sound.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   360
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   361
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   362
void CMMFDevSoundSvrImp::SetGain(TInt aGain)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   363
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   364
	// make sure it falls with the correct range
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   365
	TInt maxGain = iRecordFormatsSupported().iMaxVolume;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   366
	if (aGain > maxGain)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   367
		aGain = maxGain;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   368
	else if (aGain < 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   369
		aGain = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   370
	iGain = aGain;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   371
	SetDeviceRecordLevel(iGain);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   372
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   373
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   374
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   375
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   376
 *	Sets the speaker balance for playing.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   377
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   378
 *	The speaker balance can be changed before or during playback and is
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   379
 *	effective immediately.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   380
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   381
 *	@param	"TInt& aLeftPercentage"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   382
 *			On return contains left speaker volume perecentage. This can be any
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   383
 *			value from zero to 100. Setting a zero value mutes the sound on left
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   384
 *			speaker.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   385
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   386
 *	@param	"TInt& aRightPercentage"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   387
 *			On return contains right speaker volume perecentage. This can be any
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   388
 *			value from zero to 100. Setting a zero value mutes the sound on
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   389
 *			right speaker.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   390
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   391
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   392
void CMMFDevSoundSvrImp::SetPlayBalanceL(TInt aLeftPercentage, TInt aRightPercentage)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   393
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   394
	if (aLeftPercentage < 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   395
		aLeftPercentage = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   396
	else if (aLeftPercentage > 100)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   397
		aLeftPercentage = 100;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   398
	if (aRightPercentage < 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   399
		aRightPercentage = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   400
	else if (aRightPercentage > 100)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   401
		aRightPercentage = 100;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   402
	iLeftPlayBalance = aLeftPercentage;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   403
	iRightPlayBalance = aRightPercentage;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   404
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   405
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   406
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   407
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   408
 *	Sets the microphone gain balance for recording.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   409
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   410
 *	The microphone gain balance can be changed before or during recording and
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   411
 *	is effective immediately.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   412
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   413
 *	@param	"TInt aLeftPercentage"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   414
 *			Left microphone gain precentage. This can be any value from zero to
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   415
 *			100. Setting a zero value mutes the gain on left microphone.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   416
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   417
 *	@param	"TInt aRightPercentage"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   418
 *			Right microphone gain precentage. This can be any value from zero to
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   419
 *			100. Setting a zero value mutes the gain on right microphone.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   420
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   421
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   422
void CMMFDevSoundSvrImp::SetRecordBalanceL(TInt aLeftPercentage, TInt aRightPercentage)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   423
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   424
	if (aLeftPercentage < 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   425
		aLeftPercentage = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   426
	else if (aLeftPercentage > 100)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   427
		aLeftPercentage = 100;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   428
	if (aRightPercentage < 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   429
		aRightPercentage = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   430
	else if (aRightPercentage > 100)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   431
		aRightPercentage = 100;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   432
	iLeftRecordBalance = aLeftPercentage;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   433
	iRightRecordBalance = aRightPercentage;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   434
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   435
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   436
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   437
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   438
 *	Initializes audio device and start play process. This method queries and
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   439
 *	acquires the audio policy before initializing audio device. If there was an
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   440
 *	error during policy initialization, PlayError() method will be called on
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   441
 *	the observer with error code KErrAccessDenied, otherwise BufferToBeFilled()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   442
 *	method will be called with a buffer reference. After reading data into the
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   443
 *	buffer reference passed, the client should call PlayData() to play data.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   444
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   445
 *	The amount of data that can be played is specified in
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   446
 *	CMMFBuffer::RequestSize(). Any data that is read into buffer beyond this
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   447
 *	size will be ignored.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   448
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   449
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   450
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   451
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   452
void CMMFDevSoundSvrImp::PlayInitL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   453
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   454
	if (!iDevSoundObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   455
		User::Leave(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   456
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   457
	if (iAudioPolicyPrioritySettings.iState == EMMFStatePlayData)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   458
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   459
		// If policy has not been obtaing then ignore the request.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   460
		// If it has then do a stop and start action on HW device
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   461
		// without informing policy.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   462
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   463
		if (iHasPolicy)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   464
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   465
			if (iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   466
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   467
				TInt err = iCMMFHwDevice->Stop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   468
				if (err == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   469
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   470
					err = iCMMFHwDevice->Start(EDevDecode, EDevOutFlow);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   471
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   472
				
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   473
				if (err != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   474
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   475
					Error(err);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   476
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   477
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   478
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   479
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   480
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   481
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   482
	// Get audio policy
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   483
	iAudioPolicyPrioritySettings.iState = EMMFStatePlayData;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   484
	RequestPolicy();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   485
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   486
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   487
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   488
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   489
 *	Initializes audio device and start record process. 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   490
 *  This method:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   491
 *  1. Queries and acquires the audio policy before initializing audio device. 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   492
 *     If there was an error during policy initialization, RecordError() method will 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   493
 *     be called on the observer with error code KErrAccessDenied, otherwise BufferToBeEmptied()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   494
 *	   method will be called with a buffer reference. This buffer contains recorded
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   495
 *	   or encoded data. After processing data in the buffer reference passed, the
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   496
 *	   client should call RecordData() to continue recording process.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   497
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   498
 *  2. Checks if the requesting client process has a UserEnvironment capability.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   499
 *     If it does not, the audio device will not be initialized and an error 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   500
 *     code KErrAccessDenied will be sent to the client.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   501
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   502
 *	The amount of data that is available is specified in
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   503
 *	CMMFBuffer::RequestSize().
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   504
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   505
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   506
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   507
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   508
void CMMFDevSoundSvrImp::RecordInitL(const RMmfIpcMessage& aMessage)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   509
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   510
	if (!iDevSoundObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   511
		User::Leave(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   512
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   513
	// Checkes if the client has the UserEnvironment capability
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   514
	if (!aMessage.HasCapability(ECapabilityUserEnvironment))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   515
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   516
		User::Leave(KErrPermissionDenied);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   517
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   518
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   519
	if (iAudioPolicyPrioritySettings.iState == EMMFStateRecordData)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   520
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   521
		if (iHasPolicy)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   522
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   523
			if (iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   524
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   525
				TInt err = iCMMFHwDevice->Stop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   526
				if (err == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   527
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   528
					err = iCMMFHwDevice->Start(EDevDecode, EDevOutFlow);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   529
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   530
				
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   531
				if (err != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   532
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   533
					Error(err);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   534
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   535
				
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   536
				if (iHwDeviceBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   537
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   538
					iHwDeviceBuffer->SetLastBuffer(EFalse);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   539
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   540
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   541
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   542
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   543
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   544
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   545
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   546
	// Get audio policy
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   547
	iAudioPolicyPrioritySettings.iState = EMMFStateRecordData;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   548
	RequestPolicy();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   549
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   550
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   551
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   552
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   553
 *	Plays data in the buffer at the current volume. The client should fill
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   554
 *	the buffer with audio data before calling this method. The Observer gets
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   555
 *	reference to buffer along with callback BufferToBeFilled(). When playing of
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   556
 *	the audio sample is complete, successfully or otherwise, the method
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   557
 *	PlayError() on observer is called.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   558
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   559
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   560
TBool CMMFDevSoundSvrImp::PlayData(const RMmfIpcMessage& aMessage)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   561
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   562
	ASSERT(iDevSoundObserver);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   563
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   564
	if (iAudioPolicyPrioritySettings.iState == EMMFStateStopped)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   565
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   566
		// Initialisation has been successful but an error (possibly underflow) has occurred
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   567
		// which the controller has yet to respond to and that has changed the state to stopped.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   568
		// Allow the call to complete and processing to continue...  
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   569
		return ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   570
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   571
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   572
	if((iAudioPolicyPrioritySettings.iState != EMMFStatePlayData) && (iAudioPolicyPrioritySettings.iState != EMMFStatePaused))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   573
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   574
		PanicClient(aMessage, EMMFDevSoundPlayDataWithoutInitialize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   575
		return EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   576
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   577
	if (iMode== EMMFDevSoundStateIdle)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   578
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   579
		return ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   580
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   581
	TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   582
    if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   583
	    {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   584
		if (iPaused)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   585
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   586
			iPaused = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   587
			//note PlayData does not leave or return an error code so the Start() fails we cannot
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   588
			//report the error back at this point
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   589
			error = iCMMFHwDevice->Start(EDevDecode, EDevOutFlow);//restart hw device after pause
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   590
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   591
	   else if ((iMode == EMMFDevSoundStatePlaying) && iHasPolicy)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   592
		    {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   593
		    TInt len = iHwDeviceBuffer->Data().Length();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   594
		    if (iHwDeviceBuffer->LastBuffer())
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   595
		    	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   596
		    	iLastBufferReceived = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   597
		    	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   598
			// Pass the data buffer to HwDevice
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   599
			error = iCMMFHwDevice->ThisHwBufferFilled(*iHwDeviceBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   600
            }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   601
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   602
	if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   603
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   604
		Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   605
		if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   606
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   607
			iCMMFHwDevice->Stop();	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   608
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   609
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   610
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   611
	return ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   612
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   613
 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   614
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   615
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   616
 *	Stops the ongoing operation (Play, Record, TonePlay, Convert)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   617
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   618
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   619
void CMMFDevSoundSvrImp::Stop()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   620
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   621
	iPaused = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   622
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   623
	if (!iHasPolicy)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   624
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   625
		UpdatePolicyState(EMMFStateStopped);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   626
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   627
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   628
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   629
	 // Stop the hw device first - this unloads sound drivers
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   630
    if (iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   631
    	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   632
		iCMMFHwDevice->Stop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   633
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   634
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   635
	iDevSoundEventHandler->CancelReceiveEvents();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   636
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   637
	UpdatePolicyState(EMMFStateStopped);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   638
	__ASSERT_DEBUG(!(iHasPolicy&&(iMode == EMMFDevSoundStatePlaying)), Panic(TMMFDevSoundSessionPolicyNotInvalidated)); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   639
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   640
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   641
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   642
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   643
 *	Temporarily Stops the ongoing operation (Play, Record, TonePlay, Convert)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   644
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   645
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   646
void CMMFDevSoundSvrImp::Pause()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   647
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   648
	iPaused = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   649
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   650
	if (!iHasPolicy)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   651
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   652
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   653
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   654
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   655
	// Pause the HW device first
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   656
	if (iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   657
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   658
		iCMMFHwDevice->Pause();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   659
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   660
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   661
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   662
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   663
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   664
 *	Returns the sample recorded so far.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   665
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   666
 *	@return "TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   667
 *			Returns the samples recorded.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   668
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   669
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   670
TInt CMMFDevSoundSvrImp::SamplesRecorded()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   671
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   672
	TInt samples = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   673
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   674
	if(iRecordCustomInterface)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   675
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   676
		samples = iRecordCustomInterface->BytesRecorded();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   677
		if(NumberOfChannels() > 1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   678
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   679
			samples /= NumberOfChannels();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   680
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   681
		if(BytesPerAudioSample() > 1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   682
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   683
			samples /= BytesPerAudioSample();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   684
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   685
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   686
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   687
	return samples;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   688
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   689
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   690
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   691
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   692
 *	Returns the sample played so far.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   693
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   694
 *	@return "TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   695
 *			Returns the samples recorded.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   696
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   697
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   698
TInt CMMFDevSoundSvrImp::SamplesPlayed()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   699
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   700
	TInt samples = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   701
	if(iPlayCustomInterface)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   702
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   703
		TUint bytesPlayed = iPlayCustomInterface->BytesPlayed();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   704
		if (bytesPlayed)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   705
			iPlayedBytesCount = bytesPlayed;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   706
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   707
		samples = iPlayedBytesCount;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   708
		if(NumberOfChannels() > 1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   709
			samples /= NumberOfChannels();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   710
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   711
		if(BytesPerAudioSample() > 1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   712
			samples /= BytesPerAudioSample();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   713
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   714
	//note always pcm16 becuase the iPlayedBytesCount originates from 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   715
	//RMdaDevSound which is always pcm16
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   716
	return samples; //each sample is 2 bytes
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   717
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   718
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   719
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   720
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   721
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   722
 *	Initializes audio device and start playing tone. Tone is played with
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   723
 *	frequency and for duration specified.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   724
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   725
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   726
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   727
 *	@param	"TInt aFrequency"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   728
 *			Frequency at with the tone will be played.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   729
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   730
 *	@param	"TTimeIntervalMicroSeconds& aDuration"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   731
 *			The period over which the tone will be played. A zero value causes
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   732
 *			the no tone to be played (Verify this with test app).
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   733
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   734
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   735
void CMMFDevSoundSvrImp::PlayToneL(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   736
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   737
	if (iMode != EMMFDevSoundStateTonePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   738
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   739
		User::Leave(KErrNotSupported); //tone playing only supported in tone play state
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   740
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   741
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   742
	// Check whether frequency and duration is valid or not
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   743
	TInt64 zeroInt64(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   744
	if ((aFrequency<0) || (aDuration.Int64() < zeroInt64))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   745
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   746
		User::Leave(KErrArgument);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   747
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   748
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   749
	if (!iDevSoundObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   750
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   751
		User::Leave(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   752
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   753
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   754
	iToneGen.SetFrequencyAndDuration(aFrequency,aDuration);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   755
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   756
	// Get audio policy
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   757
	iAudioPolicyPrioritySettings.iState = EMMFStatePlayTone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   758
	RequestPolicy();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   759
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   760
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   761
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   762
 *	Initializes audio device and start playing a dual tone. 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   763
 *  The tone consists of two sine waves of different frequencies summed together
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   764
 *  Dual Tone is played with specified frequencies and for specified duration.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   765
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   766
 *	@param	"aFrequencyOne"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   767
 *			First frequency of dual tone
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   768
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   769
 *	@param	"aFrequencyTwo"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   770
 *			Second frequency of dual tone
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   771
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   772
 *	@param	"aDuration"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   773
 *			The period over which the tone will be played. A zero value causes
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   774
 *			the no tone to be played (Verify this with test app).
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   775
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   776
void CMMFDevSoundSvrImp::PlayDualToneL(TInt aFrequencyOne, TInt aFrequencyTwo, const TTimeIntervalMicroSeconds& aDuration)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   777
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   778
	if (!iDevSoundObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   779
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   780
		User::Leave(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   781
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   782
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   783
	// Check whether frequencies and duration are valid or not
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   784
	TInt64 zeroInt64(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   785
	if ((aFrequencyOne<0) || (aFrequencyTwo<0) || (aDuration.Int64() < zeroInt64))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   786
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   787
		iDevSoundObserver->ToneFinished(KErrArgument);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   788
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   789
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   790
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   791
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   792
	iDualToneGen.SetFrequencyAndDuration(aFrequencyOne, aFrequencyTwo, aDuration);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   793
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   794
	// Get audio policy
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   795
	iAudioPolicyPrioritySettings.iState = EMMFStatePlayDualTone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   796
	RequestPolicy();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   797
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   798
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   799
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   800
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   801
 *	Initializes audio device and start playing DTMF string aDTMFString.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   802
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   803
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   804
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   805
 *	@param	"TDesC& aDTMFString"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   806
 *			DTMF sequence in a descriptor.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   807
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   808
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   809
void CMMFDevSoundSvrImp::PlayDTMFStringL(const TDesC& aDTMFString)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   810
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   811
	if (!iDevSoundObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   812
		User::Leave(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   813
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   814
	if (iMode!= EMMFDevSoundStateTonePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   815
		User::Leave(KErrNotSupported); //tone playing only supported in tone play state
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   816
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   817
	iDTMFGen.SetString(aDTMFString);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   818
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   819
	// Get audio policy
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   820
	iAudioPolicyPrioritySettings.iState = EMMFStatePlayDTMFString;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   821
	RequestPolicy();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   822
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   823
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   824
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   825
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   826
 *	Initializes audio device and start playing tone sequence.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   827
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   828
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   829
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   830
 *	@param	"TDesC8& aData"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   831
 *			Tone sequence in a descriptor.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   832
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   833
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   834
void CMMFDevSoundSvrImp::PlayToneSequenceL(const TDesC8& aData)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   835
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   836
	if (!iDevSoundObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   837
		User::Leave(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   838
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   839
	if (iMode!= EMMFDevSoundStateTonePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   840
		User::Leave(KErrNotSupported); //tone playing only supported in tone play state
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   841
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   842
	// Check whether the sequence is valid or not
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   843
	if (!iDevSoundUtil->RecognizeSequence(aData))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   844
		User::Leave(KErrCorrupt);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   845
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   846
	iSequenceGen.SetSequenceData(aData);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   847
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   848
	// Get audio policy
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   849
	iAudioPolicyPrioritySettings.iState = EMMFStatePlayToneSequence;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   850
	RequestPolicy();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   851
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   852
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   853
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   854
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   855
 *	Initializes audio device and start playing the specified pre-defined tone
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   856
 *	sequence.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   857
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   858
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   859
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   860
 *	@param	"TInt aSequenceNumber"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   861
 *			The index identifying the specific pre-defined tone sequence. Index
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   862
 *			values are relative to zero.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   863
 *			This can be any value from zero to the value returned by a call to
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   864
 *			FixedSequenceCount() - 1.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   865
 *			The function raises a panic if sequence number is not within this
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   866
 *			range.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   867
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   868
 *	@see	FixesSequenceCount()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   869
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   870
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   871
void CMMFDevSoundSvrImp::PlayFixedSequenceL(TInt aSequenceNumber)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   872
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   873
	if (!iDevSoundObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   874
		User::Leave(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   875
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   876
	if (iMode!= EMMFDevSoundStateTonePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   877
		User::Leave(KErrNotSupported); //tone playing only supported in tone play state
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   878
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   879
	ASSERT((aSequenceNumber >= 0)&&(aSequenceNumber < iFixedSequences->Count()));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   880
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   881
	iFixedSequence.Set(iFixedSequences->MdcaPoint(aSequenceNumber));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   882
	iSequenceGen.SetSequenceData(iFixedSequence);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   883
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   884
	// Get audio policy
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   885
	iAudioPolicyPrioritySettings.iState = EMMFStatePlayToneSequence;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   886
	RequestPolicy();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   887
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   888
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   889
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   890
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   891
 *	Defines the duration of tone on, tone off and tone pause to be used during the
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   892
 *	DTMF tone playback operation.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   893
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   894
 *	Supported only during tone playing.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   895
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   896
 *	@param	"TTimeIntervalMicroSeconds32& aToneOnLength"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   897
 *			The period over which the tone will be played. If this is set to
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   898
 *			zero, then the tone is not played.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   899
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   900
 *	@param	"TTimeIntervalMicroSeconds32& aToneOffLength"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   901
 *			The period over which the no tone will be played.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   902
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   903
 *	@param	"TTimeIntervalMicroSeconds32& aPauseLength"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   904
 *			The period over which the tone playing will be paused.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   905
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   906
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   907
void CMMFDevSoundSvrImp::SetDTMFLengths(TTimeIntervalMicroSeconds32& aToneOnLength,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   908
								TTimeIntervalMicroSeconds32& aToneOffLength,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   909
								TTimeIntervalMicroSeconds32& aPauseLength) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   910
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   911
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   912
	if(aToneOnLength.Int() < KMdaInfiniteDurationDTMFToneOnLength)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   913
		aToneOnLength = TTimeIntervalMicroSeconds32(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   914
	if(aToneOffLength.Int() < 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   915
		aToneOffLength = TTimeIntervalMicroSeconds32(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   916
	if(aPauseLength.Int() < 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   917
		aPauseLength = TTimeIntervalMicroSeconds32(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   918
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   919
	iDTMFGen.SetToneDurations(aToneOnLength,aToneOffLength,aPauseLength);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   920
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   921
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   922
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   923
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   924
 *	Defines the period over which the volume level is to rise smoothly from
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   925
 *	nothing to the normal volume level.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   926
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   927
 *	@param	"TTimeIntervalMicroSeconds& aRampDuration"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   928
 *			The period over which the volume is to rise. A zero value causes 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   929
 *			the tone sample to be played at the normal level for the full
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   930
 *			duration of the playback. A value, which is longer than the duration
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   931
 *			of the tone sample, that the sample never reaches its normal
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   932
 *			volume level.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   933
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   934
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   935
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   936
void CMMFDevSoundSvrImp::SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   937
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   938
	// save ramp duration for tone generator
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   939
	iRampDuration = aRampDuration;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   940
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   941
	SetDeviceVolumeRamp(iRampDuration);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   942
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   943
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   944
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   945
 *	Sets volume ramp on HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   946
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   947
TInt CMMFDevSoundSvrImp::SetDeviceVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   948
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   949
	TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   950
	if (iPlayCustomInterface) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   951
		iPlayCustomInterface->SetVolumeRamp(aRampDuration);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   952
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   953
		error = KErrNotReady;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   954
	return error;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   955
    }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   956
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   957
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   958
 *	@see sounddevice.h
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   959
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   960
void CMMFDevSoundSvrImp::GetSupportedInputDataTypesL(RArray<TFourCC>& aSupportedDataTypes, const TMMFPrioritySettings& /*aPrioritySettings*/) const
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   961
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   962
	//aPrioritySettings not used on ref DevSound
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   963
	//search for playing datatypes
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   964
	iDevSoundUtil->SeekHwDevicePluginsL(aSupportedDataTypes, EMMFStatePlaying);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   965
#ifdef SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   966
	// append list of codec plugins
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   967
	iDevSoundUtil->SeekCodecPluginsL(aSupportedDataTypes, EMMFStatePlaying, ETrue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   968
#endif // SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   969
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   970
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   971
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   972
 *	@see sounddevice.h
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   973
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   974
void CMMFDevSoundSvrImp::GetSupportedOutputDataTypesL(RArray<TFourCC>& aSupportedDataTypes, const TMMFPrioritySettings& /*aPrioritySettings*/) const
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   975
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   976
	//aPrioritySettings not used on ref DevSound
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   977
	// search for recording datatypes
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   978
	iDevSoundUtil->SeekHwDevicePluginsL(aSupportedDataTypes, EMMFStateRecording);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   979
#ifdef SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   980
	// append list of codec plugins
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   981
	iDevSoundUtil->SeekCodecPluginsL(aSupportedDataTypes, EMMFStateRecording, ETrue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   982
#endif // SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   983
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   984
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   985
TInt CMMFDevSoundSvrImp::RegisterAsClient(TUid aEventType, const TDesC8& aNotificationRegistrationData)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   986
	{	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   987
	return iAudioPolicyProxy->RequestResourceNotification(aEventType,aNotificationRegistrationData);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   988
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   989
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   990
TInt CMMFDevSoundSvrImp::CancelRegisterAsClient(TUid aEventType)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   991
	{	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   992
	return iAudioPolicyProxy->CancelRequestResourceNotification(aEventType);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   993
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   994
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   995
TInt CMMFDevSoundSvrImp::GetResourceNotificationData(TUid aEventType, TDes8& aNotificationData)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   996
	{	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   997
	TInt err = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   998
	err = iAudioPolicyProxy->IsRegisteredResourceNotification(aEventType);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   999
	if(err == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1000
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1001
		TMMFTimeIntervalMicroSecondsPckg pckg = TTimeIntervalMicroSeconds(SamplesPlayed());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1002
		aNotificationData.Copy(pckg);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1003
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1004
	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1005
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1006
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1007
TInt CMMFDevSoundSvrImp::WillResumePlay()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1008
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1009
	return iAudioPolicyProxy->StopNotification();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1010
	}	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1011
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1012
TInt CMMFDevSoundSvrImp::EmptyBuffers()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1013
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1014
	TInt err = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1015
	if (iMode != EMMFStatePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1016
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1017
		return KErrNotSupported;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1018
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1019
	if (!iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1020
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1021
		return KErrNotReady;			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1022
		}	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1023
	MEmptyBuffersCustomInterface* emptybuffers = reinterpret_cast<MEmptyBuffersCustomInterface*>(iCMMFHwDevice->CustomInterface(KEmptyBuffersCustomInterfaceTypeUid));	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1024
	if (emptybuffers)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1025
    	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1026
       	err = emptybuffers->EmptyBuffers();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1027
     	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1028
    else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1029
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1030
     	err = KErrNotSupported;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1031
     	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1032
    return err;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1033
	}	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1034
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1035
TInt CMMFDevSoundSvrImp::GetTimePlayed(TTimeIntervalMicroSeconds& aTime)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1036
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1037
	TInt err = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1038
	TTimeIntervalMicroSeconds time(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1039
	if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1040
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1041
		if(!iTimePlayedCustomInterface)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1042
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1043
			iTimePlayedCustomInterface = reinterpret_cast<MTimePlayedCustomInterface*>(iCMMFHwDevice->CustomInterface(KTimePlayedCustomInterfaceTypeUid));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1044
			if(iTimePlayedCustomInterface == NULL)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1045
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1046
				return KErrNotSupported;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1047
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1048
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1049
		err = iTimePlayedCustomInterface->GetTimePlayed(time);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1050
	    if(err == KErrNone && time.Int64() > 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1051
	    	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1052
	    	iTimePlayed = time.Int64();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1053
	    	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1054
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1055
	aTime = iTimePlayed.Int64();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1056
	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1057
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1058
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1059
/********************************************************************************
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1060
 *				Implementations of Non Exported public functions begins here	*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1061
 ********************************************************************************/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1062
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1063
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1064
//				Audio Policy specific implementation begins here				//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1065
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1066
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1067
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1068
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1069
 *	Called by Audio Policy Server when a request to play is approved by the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1070
 *	Audio Policy Server.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1071
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1072
 *	Leaves on failure??.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1073
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1074
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1075
void CMMFDevSoundSvrImp::StartPlayDataL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1076
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1077
	ASSERT(iMode== EMMFDevSoundStatePlaying);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1078
	if(iAudioPolicyPrioritySettings.iState == EMMFStateStopped)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1079
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1080
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1081
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1082
	iHasPolicy = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1083
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1084
	TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1085
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1086
	if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1087
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1088
		UpdatePolicyState(EMMFStatePlayData);		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1089
        // Set volume and play format values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1090
        error = SetPlayFormat(iPlayFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1091
        if (error == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1092
			error = SetDeviceVolume(iVolume);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1093
        if (error == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1094
			error = SetDeviceVolumeRamp(iRampDuration);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1095
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1096
		// Initialize attribute values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1097
		iPlayedBytesCount = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1098
		iTimePlayed = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1099
		iLastBufferReceived = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1100
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1101
        // Start HwDevice
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1102
        if (error == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1103
	        error = iCMMFHwDevice->Start(EDevDecode, EDevOutFlow);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1104
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1105
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1106
		error = KErrNotReady;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1107
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1108
	if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1109
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1110
		Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1111
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1112
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1113
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1114
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1115
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1116
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1117
 *	Called by Audio Policy Server when a request to record is approved by the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1118
 *	Audio Policy Server.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1119
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1120
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1121
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1122
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1123
void CMMFDevSoundSvrImp::StartRecordDataL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1124
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1125
	ASSERT(iMode== EMMFDevSoundStateRecording);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1126
	if(iAudioPolicyPrioritySettings.iState == EMMFStateStopped)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1127
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1128
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1129
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1130
	iHasPolicy = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1131
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1132
	 if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1133
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1134
		UpdatePolicyState(EMMFStateRecordData);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1135
        TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1136
        error = SetRecordFormat(iRecordFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1137
		if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1138
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1139
			Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1140
			return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1141
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1142
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1143
        error = SetDeviceRecordLevel(iGain);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1144
		if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1145
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1146
			Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1147
			return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1148
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1149
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1150
        error = iCMMFHwDevice->Start(EDevEncode, EDevInFlow);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1151
		if (iHwDeviceBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1152
			iHwDeviceBuffer->SetLastBuffer(EFalse);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1153
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1154
		if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1155
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1156
			Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1157
			return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1158
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1159
        }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1160
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1161
		iDevSoundObserver->RecordError(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1162
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1163
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1164
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1165
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1166
 *	Called by Audio Policy Server when a request to play tone is approved by
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1167
 *	the Audio Policy Server.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1168
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1169
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1170
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1171
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1172
void CMMFDevSoundSvrImp::StartPlayToneL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1173
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1174
	ASSERT(iMode == EMMFDevSoundStateTonePlaying);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1175
	if(iAudioPolicyPrioritySettings.iState == EMMFStateStopped)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1176
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1177
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1178
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1179
	iHasPolicy = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1180
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1181
	if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1182
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1183
		UpdatePolicyState(EMMFStatePlayTone);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1184
        TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1185
        // Set volume and play format values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1186
        error = SetPlayFormat(iPlayFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1187
		if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1188
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1189
			Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1190
			return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1191
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1192
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1193
        if (iHwDeviceID.iUid == KMmfUidHwDevicePCM16ToPCM16)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1194
            error = SetDeviceVolume(iVolume);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1195
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1196
			error = KErrGeneral;//hw device should always be pcm16 for tone
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1197
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1198
		// turn off volume ramping - this is done in software below
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1199
        if (error == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1200
			error = SetDeviceVolumeRamp(TTimeIntervalMicroSeconds(0));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1201
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1202
        if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1203
            {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1204
            Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1205
            return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1206
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1207
            }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1208
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1209
        // Initialize attribute values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1210
		iPlayedBytesCount = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1211
		iTimePlayed = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1212
        // Configure tone generator
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1213
        iToneGen.Configure(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1214
			iPlayFormat().iRate,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1215
			iPlayFormat().iChannels,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1216
		    iRepeatCount,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1217
			I64LOW((iRepeatTrailingSilence.Int64()*iPlayFormat().iRate)/1000000),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1218
			I64LOW((iRampDuration.Int64()*iPlayFormat().iRate)/1000000)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1219
			);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1220
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1221
		iCurrentGenerator = &iToneGen;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1222
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1223
        // Start playback
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1224
        DoPlayL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1225
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1226
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1227
		iDevSoundObserver->ToneFinished(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1228
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1229
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1230
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1231
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1232
 *	Called by Audio Policy Server when a request to play a dual tone is approved by
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1233
 *	the Audio Policy Server.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1234
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1235
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1236
void CMMFDevSoundSvrImp::StartPlayDualToneL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1237
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1238
	ASSERT(iMode == EMMFDevSoundStateTonePlaying);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1239
	if(iAudioPolicyPrioritySettings.iState == EMMFStateStopped)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1240
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1241
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1242
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1243
	iHasPolicy = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1244
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1245
	 if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1246
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1247
		UpdatePolicyState(EMMFStatePlayDualTone);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1248
        TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1249
        // Set volume and play format values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1250
        error = SetPlayFormat(iPlayFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1251
		if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1252
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1253
			Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1254
			return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1255
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1256
        if (iHwDeviceID.iUid == KMmfUidHwDevicePCM16ToPCM16)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1257
            error = SetDeviceVolume(iVolume);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1258
		else 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1259
			error = KErrGeneral;//hw device should always be pcm16 for tone
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1260
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1261
		// turn off volume ramping - this is done in software below
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1262
        if (error == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1263
			error = SetDeviceVolumeRamp(TTimeIntervalMicroSeconds(0));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1264
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1265
        if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1266
            {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1267
            Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1268
            return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1269
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1270
            }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1271
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1272
        // Initialize attribute values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1273
		iPlayedBytesCount = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1274
		iTimePlayed = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1275
        // Configure dual tone generator
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1276
		iDualToneGen.Configure(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1277
			iPlayFormat().iRate,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1278
			iPlayFormat().iChannels,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1279
			iRepeatCount,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1280
			I64LOW((iRepeatTrailingSilence.Int64()*iPlayFormat().iRate)/KOneMillionMicroSeconds),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1281
			I64LOW((iRampDuration.Int64()*iPlayFormat().iRate)/KOneMillionMicroSeconds)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1282
			);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1283
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1284
		iCurrentGenerator = &iDualToneGen;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1285
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1286
        // Start playback
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1287
        DoPlayL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1288
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1289
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1290
		iDevSoundObserver->ToneFinished(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1291
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1292
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1293
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1294
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1295
 *	Called by Audio Policy Server when a request to play DTMF String is approved
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1296
 *	by the Audio Policy Server.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1297
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1298
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1299
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1300
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1301
void CMMFDevSoundSvrImp::StartPlayDTMFStringL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1302
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1303
	ASSERT(iMode == EMMFDevSoundStateTonePlaying);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1304
	if(iAudioPolicyPrioritySettings.iState == EMMFStateStopped)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1305
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1306
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1307
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1308
	iHasPolicy = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1309
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1310
	if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1311
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1312
		UpdatePolicyState(EMMFStatePlayDTMFString);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1313
        TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1314
        // Set volume and play format values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1315
        error = SetPlayFormat(iPlayFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1316
		if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1317
            {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1318
            Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1319
            return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1320
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1321
            }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1322
        error = SetDeviceVolume(iVolume);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1323
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1324
		// turn off volume ramping - this is done in software below
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1325
        if (error == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1326
			error = SetDeviceVolumeRamp(TTimeIntervalMicroSeconds(0));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1327
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1328
        if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1329
            {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1330
            Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1331
            return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1332
            }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1333
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1334
        // Initialize attribute values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1335
		iPlayedBytesCount = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1336
		iTimePlayed = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1337
	    iDTMFGen.Configure(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1338
			iPlayFormat().iRate,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1339
			iPlayFormat().iChannels,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1340
		    iRepeatCount,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1341
			I64LOW((iRepeatTrailingSilence.Int64()*iPlayFormat().iRate)/1000000),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1342
		    I64LOW((iRampDuration.Int64()*iPlayFormat().iRate)/1000000)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1343
			);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1344
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1345
		iCurrentGenerator = &iDTMFGen;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1346
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1347
        // Start playback
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1348
		//need to trap this as we can leave with KErrUnderflow
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1349
		//if there was no data to play - the error has already
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1350
		//been sent to the observer and we don't want to call RunError
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1351
        TRAP(error,DoPlayL());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1352
		if ((error != KErrUnderflow)&&(error != KErrNone))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1353
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1354
			User::Leave(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1355
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1356
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1357
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1358
		iDevSoundObserver->ToneFinished(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1359
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1360
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1361
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1362
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1363
 *	Called by Audio Policy Server when a request to play tone sequence is
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1364
 *	approved by the Audio Policy Server.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1365
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1366
 *	Leaves on failure.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1367
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1368
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1369
void CMMFDevSoundSvrImp::StartPlayToneSequenceL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1370
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1371
	ASSERT(iMode == EMMFDevSoundStateTonePlaying);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1372
	if(iAudioPolicyPrioritySettings.iState == EMMFStateStopped)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1373
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1374
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1375
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1376
	iHasPolicy = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1377
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1378
	if(iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1379
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1380
		UpdatePolicyState(EMMFStatePlayToneSequence);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1381
        TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1382
        // Set volume and play format values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1383
        if (iHwDeviceID.iUid == KMmfUidHwDevicePCM16ToPCM16)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1384
            error = SetPlayFormat(iPlayFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1385
			else error = KErrGeneral;//hw device should always be pcm16 for tone
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1386
		if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1387
            {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1388
            Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1389
            return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1390
            }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1391
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1392
        if (iHwDeviceID.iUid == KMmfUidHwDevicePCM16ToPCM16)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1393
            error = SetDeviceVolume(iVolume);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1394
		else 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1395
			error = KErrGeneral;//hw device should always be pcm16 for tone
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1396
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1397
		// turn off volume ramping - this is done in software below
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1398
        if (error == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1399
			error = SetDeviceVolumeRamp(TTimeIntervalMicroSeconds(0));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1400
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1401
        if (error != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1402
            {
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1403
            Error(error);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1404
            return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1405
            }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1406
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1407
        // Initialize attribute values
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1408
		iPlayedBytesCount = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1409
		iTimePlayed = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1410
		iSequenceGen.Configure(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1411
			iPlayFormat().iRate,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1412
			iPlayFormat().iChannels,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1413
			iRepeatCount,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1414
			I64LOW((iRepeatTrailingSilence.Int64()*iPlayFormat().iRate)/1000000),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1415
			I64LOW((iRampDuration.Int64()*iPlayFormat().iRate)/1000000)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1416
			);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1417
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1418
		iCurrentGenerator = &iSequenceGen;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1419
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1420
        // Start playback
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1421
        DoPlayL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1422
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1423
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1424
		iDevSoundObserver->ToneFinished(KErrNotReady);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1425
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1426
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1427
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1428
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1429
 *	Called by Audio Policy Server when the current DevSound instance looses the
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1430
 *	policy because of another instance with a higher priority wants the device.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1431
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1432
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1433
void CMMFDevSoundSvrImp::SendEventToClient(const TMMFEvent& aEvent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1434
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1435
	if (aEvent.iErrorCode != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1436
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1437
		iHasPolicy = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1438
		if (iMode == EMMFDevSoundStatePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1439
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1440
			UpdateBytesPlayed();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1441
			iDevSoundObserver->PlayError(aEvent.iErrorCode);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1442
			UpdatePolicyState(EMMFStateStopped);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1443
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1444
		else if (iMode == EMMFDevSoundStateRecording)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1445
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1446
			iDevSoundObserver->RecordError(aEvent.iErrorCode);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1447
			UpdatePolicyState(EMMFStateStopped);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1448
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1449
		else if (iMode == EMMFDevSoundStateTonePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1450
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1451
			iDevSoundObserver->ToneFinished(aEvent.iErrorCode);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1452
			}			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1453
		iCMMFHwDevice->Stop();//unloads sound device
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1454
		// Have audio Policy launch higher priority request
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1455
		iAudioPolicyProxy->LaunchRequests();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1456
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1457
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1458
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1459
		iHasPolicy = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1460
		iDevSoundObserver->SendEventToClient(aEvent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1461
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1462
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1463
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1464
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1465
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1466
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1467
 *	Sets volume on HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1468
 *	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1469
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1470
 *			Error value returned by HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1471
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1472
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1473
TInt CMMFDevSoundSvrImp::SetDeviceVolume(TInt aVolume)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1474
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1475
	TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1476
	if (iPlayCustomInterface) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1477
		iPlayCustomInterface->SetVolume(aVolume);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1478
	else error = KErrNotReady;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1479
	return error;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1480
    }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1481
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1482
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1483
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1484
 *	Sets PlayFormat on HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1485
 *	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1486
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1487
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1488
 *			Error value returned by HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1489
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1490
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1491
TInt CMMFDevSoundSvrImp::SetPlayFormat(RMdaDevSound::TCurrentSoundFormatBuf& aPlayFormat)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1492
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1493
	TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1494
	if (iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1495
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1496
		TTaskConfig taskConfig;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1497
		taskConfig.iUid = KUidRefDevSoundTaskConfig;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1498
		taskConfig.iRate = aPlayFormat().iRate;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1499
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1500
		if (aPlayFormat().iChannels == 1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1501
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1502
			taskConfig.iStereoMode = ETaskMono;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1503
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1504
		else if (aPlayFormat().iChannels == 2)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1505
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1506
			taskConfig.iStereoMode = ETaskInterleaved;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1507
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1508
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1509
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1510
			return KErrArgument;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1511
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1512
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1513
		error = iCMMFHwDevice->SetConfig(taskConfig);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1514
		//note the iEncoding and iBufferSize are already determined by the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1515
		//CMMFHwDevice plugin and so are not set.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1516
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1517
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1518
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1519
		error = KErrNotReady;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1520
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1521
	return error;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1522
    }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1523
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1524
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1525
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1526
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1527
 *	Sets RecordFormat on HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1528
 *	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1529
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1530
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1531
 *			Error value returned by HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1532
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1533
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1534
TInt CMMFDevSoundSvrImp::SetRecordFormat(RMdaDevSound::TCurrentSoundFormatBuf& aRecordFormat)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1535
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1536
	TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1537
	if (iCMMFHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1538
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1539
		TTaskConfig taskConfig;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1540
		taskConfig.iUid = KUidRefDevSoundTaskConfig;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1541
		taskConfig.iRate = aRecordFormat().iRate;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1542
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1543
		if (aRecordFormat().iChannels == 1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1544
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1545
			taskConfig.iStereoMode = ETaskMono;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1546
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1547
		else if (aRecordFormat().iChannels == 2)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1548
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1549
			taskConfig.iStereoMode = ETaskInterleaved;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1550
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1551
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1552
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1553
			return KErrArgument;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1554
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1555
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1556
		error = iCMMFHwDevice->SetConfig(taskConfig);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1557
		//note the iEncoding and iBufferSize are already determined by the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1558
		//CMMFHwDevice plugin and so are not set.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1559
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1560
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1561
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1562
		error = KErrNotReady;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1563
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1564
	return error;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1565
    }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1566
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1567
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1568
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1569
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1570
 *	Sets record level on HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1571
 *	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1572
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1573
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1574
 *			Error value returned by HwDevice.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1575
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1576
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1577
TInt CMMFDevSoundSvrImp::SetDeviceRecordLevel(TInt aGain)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1578
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1579
	TInt error = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1580
	if (iRecordCustomInterface) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1581
		iRecordCustomInterface->SetGain(aGain);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1582
	else error = KErrNotReady;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1583
	return error;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1584
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1585
    }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1586
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1587
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1588
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1589
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1590
 *	MMMFHwDeviceObserver mixin implementation.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1591
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1592
 *	The CMMFHwDevice implementation object calls this method during decoding
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1593
 *	(playing), when it needs the encoded data in the buffer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1594
 *	aHwDataBuffer.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1595
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1596
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1597
 *			Error code. KErrNone if success.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1598
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1599
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1600
TInt CMMFDevSoundSvrImp::FillThisHwBuffer(CMMFBuffer& aHwDataBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1601
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1602
	TInt err = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1603
    // Keep a reference to this Hw data Buffer. We need to send the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1604
	// reference back to HwDevice implementation
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1605
	iHwDeviceBuffer = static_cast<CMMFDataBuffer*> (&aHwDataBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1606
	// Set the request length, From HwDevice this comes with buffer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1607
	// length.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1608
	TInt len = iHwDeviceBuffer->Data().MaxLength();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1609
	// Ignore error. since buffer size = Buffer Length 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1610
	TRAP(err, iHwDeviceBuffer->SetRequestSizeL(len));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1611
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1612
	if (iMode== EMMFDevSoundStatePlaying) // Get Data from Observer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1613
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1614
		if (iLastBufferReceived)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1615
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1616
			iHwDeviceBuffer->Data().SetLength(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1617
			// Pass the buffer to the he device
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1618
            err = iCMMFHwDevice->ThisHwBufferFilled(*iHwDeviceBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1619
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1620
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1621
			// Pass the buffer to the observer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1622
			iDevSoundObserver->BufferToBeFilled(&aHwDataBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1623
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1624
	else if (iMode == EMMFDevSoundStateTonePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1625
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1626
        // Hw device will call this method right after its Start was called.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1627
        // When it calls this for the first time it hasn't played one single
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1628
        // buffer yet so check that.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1629
        // In this case there's no need to set the active buffer as it's already
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1630
        // waiting to be played.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1631
        if (!iFirstCallFromHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1632
            SetActiveToneBuffer();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1633
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1634
		// If there is no data in the active buffer, tone play is finished.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1635
		// DevSound just have to wait for completion event from audio device.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1636
		if (iActiveToneBuffer->Data().Length() > 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1637
            { 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1638
			TInt tonelen = iActiveToneBuffer->Data().Length();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1639
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1640
			// don't enter more data than can be handled by the receiving buffer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1641
			if (len >= tonelen) len = tonelen;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1642
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1643
            // Copy data from tone buffer to hw device buffer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1644
            Mem::Copy((TAny*)(iHwDeviceBuffer->Data().Ptr()), (TAny*)(iActiveToneBuffer->Data().Ptr()), len);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1645
            
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1646
            iHwDeviceBuffer->Data().SetLength(len);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1647
            // Play data and try to generate next data block
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1648
			err = iCMMFHwDevice->ThisHwBufferFilled(*iHwDeviceBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1649
            if (err != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1650
            	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1651
            // Check again whether this is the first call from Hw device.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1652
            // FillFreeToneBuffer assumes the iActiveToneBuffer has already
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1653
            // been played.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1654
            if (!iFirstCallFromHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1655
                err = FillFreeToneBuffer();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1656
            else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1657
                iFirstCallFromHwDevice = EFalse;  // Reset flag
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1658
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1659
 			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1660
		else if (iFirstCallFromHwDevice)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1661
			{//we have no data in the tone buffer and thus have no 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1662
			//outstanding requests to play
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1663
			err = KErrUnderflow; //simulate underrun
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1664
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1665
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1666
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1667
			iHwDeviceBuffer->Data().SetLength(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1668
			iHwDeviceBuffer->SetLastBuffer(ETrue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1669
            // Send an empty last buffer to HwDevice to get a play completion event with KErrUnderflow
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1670
			err = iCMMFHwDevice->ThisHwBufferFilled(*iHwDeviceBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1671
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1672
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1673
		// If there was an error filling the buffer could be corrupt data
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1674
		// notify the client and stop playing.Set err to KErrNone. 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1675
		if (err != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1676
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1677
			Error(err);//Updates Bytes played informs client
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1678
			err = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1679
			iCMMFHwDevice->Stop();//unloads sound device
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1680
            }
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1681
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1682
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1683
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1684
		err = KErrGeneral;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1685
		Error(err);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1686
		iCMMFHwDevice->Stop();//unloads sound device
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1687
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1688
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1689
	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1690
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1691
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1692
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1693
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1694
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1695
 *	MMMFHwDeviceObserver mixin implementation.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1696
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1697
 *	The CMMFHwDevice implementation object calls this method during encoding
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1698
 *	(recording), when it fills the buffer aHwDataBuffer with
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1699
 *	encoded data.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1700
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1701
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1702
 *			Error code. KErrNone if success.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1703
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1704
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1705
TInt CMMFDevSoundSvrImp::EmptyThisHwBuffer(CMMFBuffer& aHwDataBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1706
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1707
	TInt err = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1708
	if(iMode== EMMFDevSoundStateRecording)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1709
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1710
		// Keep a reference to this Hw data Buffer. We need to send the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1711
		// reference back to HwDevice implementation
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1712
		iHwDeviceBuffer = static_cast<CMMFDataBuffer*>(&aHwDataBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1713
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1714
		// Set the request length, From HwDevice this comes with buffer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1715
		// length. MMF will use RequestSize attribute of the buffer.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1716
		// We can avoid this by setting in HwDevice implemenation
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1717
		TInt len = iHwDeviceBuffer->Data().Length();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1718
		TRAP(err, iHwDeviceBuffer->SetRequestSizeL(len));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1719
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1720
		// if we're pausing (i.e. flushing) set the last buffer flag
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1721
		// when we get an empty buffer from the logical driver
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1722
		if(iPaused  && iHwDeviceBuffer->Data().Length() == 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1723
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1724
		iPaused = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1725
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1726
		iHwDeviceBuffer->SetLastBuffer(ETrue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1727
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1728
		iDevSoundEventHandler->CancelReceiveEvents();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1729
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1730
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1731
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1732
		// Send Data from Observer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1733
		iDevSoundObserver->BufferToBeEmptied(iHwDeviceBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1734
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1735
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1736
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1737
		err = KErrGeneral;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1738
		Error(err);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1739
		iCMMFHwDevice->Stop();//unloads sound device
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1740
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1741
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1742
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1743
	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1744
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1745
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1746
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1747
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1748
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1749
 *	MMMFHwDeviceObserver mixin implementation.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1750
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1751
 *	The CMMFHwDevice implementation object calls this method when a message from
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1752
 *	the hardware device implementation is received.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1753
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1754
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1755
 *			Error code. KErrNone if success.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1756
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1757
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1758
TInt CMMFDevSoundSvrImp::MsgFromHwDevice(TUid aMessageType, const TDesC8& /*aMsg*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1759
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1760
	TInt result = KErrNotSupported;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1761
	if (aMessageType.iUid == KMmfHwDeviceObserverUpdateBytesPlayed)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1762
		{//this is used by sw codec wrapper to request a bytes played update
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1763
		//bytes played won't be updated in Stopped() or Error() on sw cdoec wrapper
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1764
		//as the sound device is closed. Non swCodec wrapper Hw device plugins
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1765
		//can get there bytes updated on Stopped() and/or Error()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1766
		UpdateBytesPlayed();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1767
		result = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1768
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1769
	return result;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1770
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1771
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1772
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1773
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1774
 *	MMMFHwDeviceObserver mixin implementation.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1775
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1776
 *	The CMMFHwDevice implementation object calls this method when the current
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1777
 *	encode or decode task is finished or stopped.  The policy state is updated
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1778
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1779
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1780
void CMMFDevSoundSvrImp::Stopped()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1781
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1782
	//for swcodec wrap hw devices bytes played updated in MsgFromHwDevice
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1783
	//but non Swcodec wrappers hw devices may do it differently
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1784
	//also don't know if non Swcodec wrap hw device will call Stopped or Error first
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1785
	UpdateBytesPlayed();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1786
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1787
	iLastBufferReceived = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1788
	UpdatePolicyState(EMMFStateCompleted);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1789
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1790
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1791
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1792
 *  MMMFHwDeviceObserver mixin implementation
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1793
 *  Processes error from hw device
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1794
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1795
void CMMFDevSoundSvrImp::Error(TInt aError)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1796
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1797
	if (iMode== EMMFDevSoundStatePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1798
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1799
		//for swcodec wrap hw devices bytes played updated in MsgFromHwDevice
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1800
		//but non Swcodec wrappers hw devices may do it differently
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1801
		//also don't know if non Swcodec wrap hw device will call Stopped or Error first
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1802
		UpdateBytesPlayed();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1803
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1804
        iDevSoundObserver->PlayError(aError);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1805
        UpdatePolicyState(EMMFStateStopped);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1806
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1807
	else if (iMode== EMMFDevSoundStateRecording)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1808
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1809
        iDevSoundObserver->RecordError(aError);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1810
        UpdatePolicyState(EMMFStateStopped);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1811
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1812
	else if (iMode== EMMFDevSoundStateTonePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1813
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1814
        iDevSoundObserver->ToneFinished(aError);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1815
        UpdatePolicyState(EMMFStateStopped);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1816
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1817
	//else can't handle error
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1818
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1819
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1820
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1821
/********************************************************************************
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1822
 *				Non Exported public functions ends here							*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1823
 ********************************************************************************/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1824
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1825
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1826
/********************************************************************************
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1827
 *				Private functions begins here									*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1828
 ********************************************************************************/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1829
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1830
TInt CMMFDevSoundSvrImp::InitializeFormat(RMdaDevSound::TSoundFormatsSupportedBuf& aSupportedFormat,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1831
		RMdaDevSound::TCurrentSoundFormatBuf& aFormat)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1832
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1833
	// Choose an encoding
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1834
	TUint32 enc = aSupportedFormat().iEncodings;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1835
	// Always defaults to this
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1836
	if (enc & RMdaDevSound::EMdaSoundEncoding16BitPCM)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1837
		aFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding16BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1838
	else if (enc & RMdaDevSound::EMdaSoundEncoding8BitALaw)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1839
		aFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitALaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1840
	else if (enc & RMdaDevSound::EMdaSoundEncoding8BitMuLaw)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1841
		aFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitMuLaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1842
	else if (enc & RMdaDevSound::EMdaSoundEncoding8BitPCM)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1843
		aFormat().iEncoding = RMdaDevSound::EMdaSoundEncoding8BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1844
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1845
	// default to Monophonic playback:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1846
	aFormat().iChannels=1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1847
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1848
	// Store the device capabilities (WINS supports from 8000 Hz to 44100 Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1849
	if ((aSupportedFormat().iMinRate <= 8000) && (8000 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1850
		iDeviceCapabilities.iRate = EMMFSampleRate8000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1851
	if ((aSupportedFormat().iMinRate <= 11025) && (11025 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1852
		iDeviceCapabilities.iRate |= EMMFSampleRate11025Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1853
	if ((aSupportedFormat().iMinRate <= 12000) && (12000 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1854
		iDeviceCapabilities.iRate |= EMMFSampleRate12000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1855
	if ((aSupportedFormat().iMinRate <= 16000) && (16000 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1856
		iDeviceCapabilities.iRate |= EMMFSampleRate16000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1857
	if ((aSupportedFormat().iMinRate <= 22050) && (22050 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1858
		iDeviceCapabilities.iRate |= EMMFSampleRate22050Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1859
	if ((aSupportedFormat().iMinRate <= 24000) && (24000 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1860
		iDeviceCapabilities.iRate |= EMMFSampleRate24000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1861
	if ((aSupportedFormat().iMinRate <= 32000) && (32000 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1862
		iDeviceCapabilities.iRate |= EMMFSampleRate32000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1863
	if ((aSupportedFormat().iMinRate <= 44100) && (44100 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1864
		iDeviceCapabilities.iRate |= EMMFSampleRate44100Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1865
	if ((aSupportedFormat().iMinRate <= 48000) && (48000 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1866
		iDeviceCapabilities.iRate |= EMMFSampleRate48000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1867
	if ((aSupportedFormat().iMinRate <= 64000) && (64000 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1868
		iDeviceCapabilities.iRate |= EMMFSampleRate64000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1869
	if ((aSupportedFormat().iMinRate <= 88200) && (88200 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1870
		iDeviceCapabilities.iRate |= EMMFSampleRate88200Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1871
	if ((aSupportedFormat().iMinRate <= 96000) && (96000 <= aSupportedFormat().iMaxRate))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1872
		iDeviceCapabilities.iRate |= EMMFSampleRate96000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1873
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1874
	// Store the encodings supported
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1875
	iDeviceCapabilities.iEncoding = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1876
	if (enc & RMdaDevSound::EMdaSoundEncoding16BitPCM)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1877
		iDeviceCapabilities.iEncoding |= EMMFSoundEncoding16BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1878
	if (enc & RMdaDevSound::EMdaSoundEncoding8BitALaw)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1879
		iDeviceCapabilities.iEncoding |= EMMFSoundEncoding8BitALaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1880
	if (enc & RMdaDevSound::EMdaSoundEncoding8BitMuLaw)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1881
		iDeviceCapabilities.iEncoding |= EMMFSoundEncoding8BitMuLaw;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1882
	if (enc & RMdaDevSound::EMdaSoundEncoding8BitPCM)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1883
		iDeviceCapabilities.iEncoding |= EMMFSoundEncoding8BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1884
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1885
	// Mono and Stereo support
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1886
	if (aSupportedFormat().iChannels == 2)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1887
		iDeviceCapabilities.iChannels = EMMFStereo;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1888
	iDeviceCapabilities.iChannels |= EMMFMono;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1889
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1890
	iDeviceCapabilities.iBufferSize = aSupportedFormat().iMaxBufferSize;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1891
	// Default
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1892
	iDeviceConfig.iRate = EMMFSampleRate8000Hz;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1893
	iDeviceConfig.iEncoding = EMMFSoundEncoding16BitPCM;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1894
	iDeviceConfig.iChannels = EMMFMono;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1895
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1896
	return KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1897
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1898
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1899
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1900
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1901
 *	Makes request to Policy Server (asynchronous call)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1902
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1903
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1904
void CMMFDevSoundSvrImp::RequestPolicy()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1905
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1906
	iDevSoundEventHandler->CancelReceiveEvents();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1907
	iDevSoundEventHandler->ReceiveEvents();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1908
	iAudioPolicyPrioritySettings.iCapabilities = iParent.CheckClientCapabilities();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1909
	iAudioPolicyProxy->MakeRequest(iAudioPolicyPrioritySettings);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1910
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1911
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1912
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1913
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1914
 *	Creates buffer and begin playback using the specified tone generator.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1915
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1916
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1917
void CMMFDevSoundSvrImp::DoPlayL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1918
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1919
	// Delete any buffer from previous call and try to create maximum buffer 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1920
	// size. Double Buffer the Tone data.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1921
	if (iToneBuffer1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1922
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1923
		delete iToneBuffer1; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1924
		iToneBuffer1 = NULL; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1925
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1926
	//note the tone buffer needs to be the same as the pcm16->pcm16 'null'
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1927
	//hw device plugin
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1928
	// Buffer size = (SampleRate * BytesPerSample * Channels) / 4
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1929
	TInt useBufferOfSize = ((SamplingFrequency() * 2 * NumberOfChannels())/KDevSoundFramesPerSecond + (KDevSoundDeltaFrameSize-1)) &~ (KDevSoundDeltaFrameSize-1);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1930
	//clamp buffer to desired limits
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1931
	if(useBufferOfSize < KDevSoundMinFrameSize) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1932
		useBufferOfSize = KDevSoundMinFrameSize;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1933
	else if(useBufferOfSize > KDevSoundMaxFrameSize) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1934
		useBufferOfSize = KDevSoundMaxFrameSize;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1935
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1936
	//clamp buffer to limits of hardware
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1937
	if(useBufferOfSize < Max(iPlayFormatsSupported().iMinBufferSize, iRecordFormatsSupported().iMinBufferSize))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1938
		useBufferOfSize = Max(iPlayFormatsSupported().iMinBufferSize, iRecordFormatsSupported().iMinBufferSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1939
	else if(useBufferOfSize > Min(iPlayFormatsSupported().iMaxBufferSize, iRecordFormatsSupported().iMaxBufferSize))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1940
		useBufferOfSize = Min(iPlayFormatsSupported().iMaxBufferSize, iRecordFormatsSupported().iMaxBufferSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1941
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1942
	iToneBuffer1 = CMMFDataBuffer::NewL(useBufferOfSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1943
	User::LeaveIfError(iCurrentGenerator->FillBuffer(iToneBuffer1->Data()));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1944
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1945
	if (iToneBuffer2)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1946
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1947
		delete iToneBuffer2; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1948
		iToneBuffer2 = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1949
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1950
	iToneBuffer2 = CMMFDataBuffer::NewL(useBufferOfSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1951
	User::LeaveIfError(iCurrentGenerator->FillBuffer(iToneBuffer2->Data()));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1952
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1953
	// Assign active buffer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1954
	iActiveToneBuffer = iToneBuffer1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1955
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1956
	// Hw device hasn't played anything yet so don't change
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1957
    // active buffer. This is checked in FillThisHwBuffer.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1958
    iFirstCallFromHwDevice = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1959
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1960
    // Start HwDevice to play data
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1961
    User::LeaveIfError(iCMMFHwDevice->Start(EDevDecode, EDevOutFlow));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1962
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1963
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1964
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1965
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1966
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1967
 *	This method assigns the other buffer as active buffer. The tone audio 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1968
 *	generator should fill data in the other buffer by now.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1969
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1970
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1971
void CMMFDevSoundSvrImp::SetActiveToneBuffer()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1972
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1973
	if (iActiveToneBuffer == iToneBuffer1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1974
		iActiveToneBuffer = iToneBuffer2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1975
	else if (iActiveToneBuffer == iToneBuffer2)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1976
		iActiveToneBuffer = iToneBuffer1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1977
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1978
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1979
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1980
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1981
 *	This method fills data into the free buffer.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1982
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1983
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1984
 *			Error code. KErrNone if success.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1985
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1986
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1987
TInt CMMFDevSoundSvrImp::FillFreeToneBuffer()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1988
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1989
	TInt err(KErrNone);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1990
	if (iActiveToneBuffer == iToneBuffer1)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1991
		err = iCurrentGenerator->FillBuffer(iToneBuffer2->Data());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1992
	else if (iActiveToneBuffer == iToneBuffer2)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1993
		err = iCurrentGenerator->FillBuffer(iToneBuffer1->Data());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1994
	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1995
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1996
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1997
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1998
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  1999
 *	Updates the policy state based on Audio policy settings of this devsound instance
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2000
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2001
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2002
TInt CMMFDevSoundSvrImp::UpdatePolicyState(TMMFAudioPolicyState aNewState)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2003
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2004
	iAudioPolicyPrioritySettings.iState = aNewState;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2005
	TInt error = iAudioPolicyProxy->UpdateState(iAudioPolicyPrioritySettings);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2006
	if ((error == KErrNone) && (aNewState == EMMFStateStopped))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2007
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2008
		iHasPolicy = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2009
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2010
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2011
	return error;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2012
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2013
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2014
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2015
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2016
 *	Initializes audio device node by setting volume, and sampling rate.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2017
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2018
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2019
 *			Error Code. KErrNone if success.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2020
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2021
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2022
TInt CMMFDevSoundSvrImp::InitTask()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2023
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2024
	// No Implementation
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2025
	return KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2026
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2027
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2028
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2029
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2030
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2031
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2032
 *	Returns an integer representing Sampling Frequency the device is currently
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2033
 *	configured to.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2034
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2035
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2036
 *			Sampling Frequency.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2037
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2038
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2039
TInt CMMFDevSoundSvrImp::SamplingFrequency()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2040
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2041
	if(iDeviceConfig.iRate == EMMFSampleRate8000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2042
		return 8000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2043
	else if(iDeviceConfig.iRate == EMMFSampleRate11025Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2044
		return 11025;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2045
	else if(iDeviceConfig.iRate == EMMFSampleRate12000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2046
		return 12000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2047
	else if(iDeviceConfig.iRate == EMMFSampleRate16000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2048
		return 16000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2049
	else if(iDeviceConfig.iRate == EMMFSampleRate22050Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2050
		return 22050;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2051
	else if(iDeviceConfig.iRate == EMMFSampleRate24000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2052
		return 24000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2053
	else if(iDeviceConfig.iRate == EMMFSampleRate32000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2054
		return 32000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2055
	else if(iDeviceConfig.iRate == EMMFSampleRate44100Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2056
		return 44100;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2057
	else if(iDeviceConfig.iRate == EMMFSampleRate48000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2058
		return 48000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2059
	else if(iDeviceConfig.iRate == EMMFSampleRate88200Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2060
		return 88200;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2061
	else if(iDeviceConfig.iRate == EMMFSampleRate96000Hz)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2062
		return 96000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2063
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2064
		return 8000; //default
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2065
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2066
 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2067
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2068
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2069
 *	Returns an integer representing number of channels the device is currently
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2070
 *	configured to.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2071
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2072
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2073
 *			Number of audio channels 1 if mono, 2 if stereo.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2074
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2075
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2076
TInt CMMFDevSoundSvrImp::NumberOfChannels()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2077
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2078
	if(iDeviceConfig.iChannels == EMMFMono)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2079
		return 1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2080
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2081
		return 2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2082
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2083
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2084
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2085
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2086
 *	Returns an integer representing number of bytes in each audio sample
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2087
 *	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2088
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2089
 *	@return	"TInt"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2090
 *			Number of of bytes in each audio sample.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2091
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2092
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2093
TInt CMMFDevSoundSvrImp::BytesPerAudioSample()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2094
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2095
	TInt bytes=1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2096
	switch (iDeviceConfig.iEncoding)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2097
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2098
		case EMMFSoundEncoding8BitPCM:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2099
		case EMMFSoundEncoding8BitALaw:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2100
		case EMMFSoundEncoding8BitMuLaw:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2101
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2102
			bytes=1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2103
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2104
		break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2105
		case EMMFSoundEncoding16BitPCM:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2106
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2107
			bytes=2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2108
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2109
		break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2110
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2111
	return bytes;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2112
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2113
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2114
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2115
/********************************************************************************
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2116
 *				Private functions ends here										*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2117
 ********************************************************************************/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2118
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2119
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2120
// CustomCommand* implementation:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2121
// The following come through from the parent object intact - currently it seems
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2122
// easier to pass this through with an RMessage, as the result parameter (at least)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2123
// is easier to deal with that way. This might change in the future. 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2124
// [TODO - if we extended this to CMMFHwDevice, it might be easier to use some sort
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2125
// of TMMFCustomCommandParamBlock throughout, which as well as the uid, in params etc
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2126
// by value, also provided a virtual(?) function to set output param. Could then
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2127
// use in both plat sec and original code
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2128
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2129
void CMMFDevSoundSvrImp::DoSyncCustomCommandL(const RMmfIpcMessage& aMessage)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2130
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2131
	TInt command = aMessage.Int0();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2132
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2133
	// we don't support any commands at the momment
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2134
	User::Leave(KErrNotSupported);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2135
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2136
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2137
void CMMFDevSoundSvrImp::DoSyncCustomCommandResultL(const RMmfIpcMessage& aMessage)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2138
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2139
	TInt command = aMessage.Int0();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2140
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2141
	// we don't support any commands at the momment
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2142
	User::Leave(KErrNotSupported);	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2143
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2144
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2145
void CMMFDevSoundSvrImp::DoAsyncCustomCommandL(const RMmfIpcMessage& aMessage)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2146
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2147
	TInt command = aMessage.Int0();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2148
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2149
	// we don't support any commands at the momment
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2150
	User::Leave(KErrNotSupported); // this will still complete for an async message	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2151
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2152
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2153
void CMMFDevSoundSvrImp::DoAsyncCustomCommandResultL(const RMmfIpcMessage& aMessage)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2154
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2155
	TInt command = aMessage.Int0();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2156
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2157
	// we don't support any commands at the moment
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2158
	User::Leave(KErrNotSupported); // this will still complete for an async message	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2159
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
  2160