sl@0: // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include "audiodevice.hrh" sl@0: #include "audiodevice.h" sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: // we need 16k to hold a pcm packet sl@0: const TInt KBufferSize = 16384; sl@0: sl@0: const TInt KDefaultSampleRate = 8000; sl@0: const TInt KDefaultNumberChannels = 1; sl@0: _LIT(KAudioDevicePanic, "CAudioDevice Panic"); sl@0: sl@0: enum TAudioDevicePanics sl@0: { sl@0: EObserverNotSet, sl@0: EInvalidUsage sl@0: }; sl@0: sl@0: const TInt KInputPortIndex = 0; sl@0: const TInt KOutputPortIndex = 1; sl@0: sl@0: // ------------------------------------------------------------------------------------------ sl@0: // CAudioDevice::CInput port class implementation sl@0: sl@0: sl@0: CAudioDevice::CInputPort::CInputPort(CAudioDevice& aParent) sl@0: : CActive(EPriorityNormal), sl@0: iParent(aParent), sl@0: iSampleRate(KDefaultSampleRate), sl@0: iChannels(KDefaultNumberChannels), sl@0: iBufferSize(KBufferSize) sl@0: { sl@0: } sl@0: sl@0: CAudioDevice::CInputPort::~CInputPort() sl@0: { sl@0: Cancel(); sl@0: iBuffers.Close(); sl@0: } sl@0: sl@0: CAudioDevice::CInputPort* CAudioDevice::CInputPort::NewL(CAudioDevice& aParent) sl@0: { sl@0: CInputPort* self = new (ELeave) CInputPort(aParent); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::ConstructL() sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::MipConfigure(const TPuConfig& aConfig) sl@0: { sl@0: if (aConfig.Uid() == TUid::Uid(KUidTTaskConfig)) sl@0: { sl@0: const TTaskConfig* config = TPuTaskConfig::GetStructure(aConfig); sl@0: sl@0: iSampleRate = config->iRate; sl@0: iChannels = (config->iStereoMode & ETaskMono)? 1 : 2; sl@0: iInterleaved = (config->iStereoMode & ETaskInterleaved)?ETrue : EFalse; sl@0: return KErrNone; sl@0: } sl@0: sl@0: if (aConfig.Uid() == TUid::Uid(KUidTTaskConfig2)) sl@0: { sl@0: const TTaskConfig2* config = TPuTaskConfig2::GetStructure(aConfig); sl@0: sl@0: iSampleRate = config->iRate; sl@0: iChannels = config->iNumberOfChannels; sl@0: iInterleaved = (config->iStereoMode & ETaskInterleaved)?ETrue : EFalse; sl@0: return KErrNone; sl@0: } sl@0: sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::MipGetConfig(TPuConfig& /*aConfig*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::MipTunnelRequest(const MMdfOutputPort& aOutputPortToBeConnectedTo, sl@0: TTunnelFlags& /*aTunnelFlags*/, TSupplierType& /*aSupplierType*/) sl@0: { sl@0: if ((iParent.State()!=EProcessingUnitLoaded) && (!iStopped)) sl@0: { sl@0: // invalid state sl@0: return EInvalidState; sl@0: } sl@0: sl@0: if (iPortConnectedTo) sl@0: { sl@0: // the port is already connected, return an error sl@0: return EPortAlreadyTunnelled; sl@0: } sl@0: iPortConnectedTo = const_cast(&aOutputPortToBeConnectedTo); sl@0: return KErrNone; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::MipWriteData(CMMFBuffer& aInputBuffer) sl@0: { sl@0: TInt err = iBuffers.Append(&aInputBuffer); sl@0: if (err == KErrNone) sl@0: { sl@0: if (iParent.State() == EProcessingUnitExecuting && !IsActive()) sl@0: { sl@0: SetActive(); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (iObserver) sl@0: { sl@0: iObserver->MipoWriteDataComplete(this, &aInputBuffer, err); sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::Execute() sl@0: { sl@0: if (!IsActive() && iBuffers.Count()>0) sl@0: { sl@0: SetActive(); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: } sl@0: sl@0: TBool CAudioDevice::CInputPort::MipIsTunnelled() const sl@0: { sl@0: if (iPortConnectedTo) sl@0: { sl@0: return ETrue; sl@0: } sl@0: else sl@0: { sl@0: return EFalse; sl@0: } sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::MipIndex() const sl@0: { sl@0: return KInputPortIndex; sl@0: } sl@0: sl@0: CMMFBuffer* CAudioDevice::CInputPort::MipCreateBuffer(TInt /*aBufferSize*/) sl@0: { sl@0: __ASSERT_ALWAYS(EFalse, User::Panic(KAudioDevicePanic, EInvalidUsage)); sl@0: return NULL; sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::MipUseBuffer(CMMFBuffer& /*aBuffer*/) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::MipFreeBuffer(CMMFBuffer* /*aBuffer*/) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::MipDisconnectTunnel() sl@0: { sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::MipRestartTunnel() sl@0: { sl@0: } sl@0: sl@0: TUint32 CAudioDevice::CInputPort::MipBufferSize() const sl@0: { sl@0: return iBufferSize; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::Pause() sl@0: { sl@0: if (iParent.SoundDevice().Handle()) sl@0: { sl@0: iParent.SoundDevice().PausePlayBuffer(); sl@0: } sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::Stop() sl@0: { sl@0: Cancel(); sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::MipCreateCustomInterface(TUid aUid) sl@0: { sl@0: if (aUid.iUid == KMmfPlaySettingsCustomInterface) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TAny* CAudioDevice::CInputPort::MipCustomInterface(TUid aUid) sl@0: { sl@0: if (aUid.iUid == KMmfPlaySettingsCustomInterface) sl@0: { sl@0: return static_cast(this); sl@0: } sl@0: return NULL; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::SetVolume(TUint aVolume) sl@0: { sl@0: iVolume = aVolume; sl@0: } sl@0: sl@0: TUint CAudioDevice::CInputPort::Volume() sl@0: { sl@0: return iVolume; sl@0: } sl@0: sl@0: TUint CAudioDevice::CInputPort::BytesPlayed() sl@0: { sl@0: return iBytesPlayed; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration) sl@0: { sl@0: iRampDuration = aRampDuration; sl@0: } sl@0: sl@0: TTimeIntervalMicroSeconds& CAudioDevice::CInputPort::VolumeRamp() sl@0: { sl@0: return iRampDuration; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::RunL() sl@0: { sl@0: if (iCurrentBuffer != NULL) sl@0: { sl@0: // If we've been signalled with a buffer, callback that we've completed the writing of the sl@0: // buffer sl@0: if (iObserver) sl@0: { sl@0: iObserver->MipoWriteDataComplete(this, iCurrentBuffer, iStatus.Int()); sl@0: if (iCurrentBuffer->LastBuffer()) sl@0: { sl@0: iParent.Observer()->ExecuteComplete(&iParent, KErrUnderflow); sl@0: iParent.SoundDevice().Close(); sl@0: } sl@0: } sl@0: iCurrentBuffer = NULL; sl@0: } sl@0: // only process the next buffer if there is no error sl@0: // error callbacks were handled in the previous block sl@0: if (iStatus == KErrNone) sl@0: { sl@0: if (iBuffers.Count()>0) sl@0: { sl@0: iCurrentBuffer = iBuffers[0]; sl@0: iBuffers.Remove(0); sl@0: sl@0: if (CMMFBuffer::IsSupportedDataBuffer(iCurrentBuffer->Type())) sl@0: { sl@0: TDes8& aBufferDes = (static_cast(iCurrentBuffer))->Data(); sl@0: iStatus = KRequestPending; sl@0: iParent.SoundDevice().PlayData(iStatus, aBufferDes); sl@0: SetActive(); sl@0: } sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::DoCancel() sl@0: { sl@0: if (iParent.SoundDevice().Handle()) sl@0: { sl@0: iParent.SoundDevice().CancelPlayData(); sl@0: iParent.SoundDevice().FlushPlayBuffer(); sl@0: } sl@0: } sl@0: sl@0: // CAudioDevice::CInput port class implementation sl@0: CAudioDevice::COutputPort::COutputPort(CAudioDevice& aParent) sl@0: : CActive(EPriorityNormal), sl@0: iParent(aParent), sl@0: iSampleRate(KDefaultSampleRate), sl@0: iChannels(KDefaultNumberChannels), sl@0: iBufferSize(KBufferSize) sl@0: { sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::SampleRate() sl@0: { sl@0: return iSampleRate; sl@0: } sl@0: sl@0: TInt CAudioDevice::CInputPort::Channels() sl@0: { sl@0: return iChannels; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::MipInitialize() sl@0: { sl@0: // Nothing to do sl@0: } sl@0: sl@0: CAudioDevice::COutputPort* CAudioDevice::COutputPort::NewL(CAudioDevice& aParent) sl@0: { sl@0: COutputPort* self = new (ELeave) COutputPort(aParent); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::ConstructL() sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::MopConfigure(const TPuConfig& aConfig) sl@0: { sl@0: if (aConfig.Uid() == TUid::Uid(KUidTTaskConfig)) sl@0: { sl@0: const TTaskConfig* config = TPuTaskConfig::GetStructure(aConfig); sl@0: sl@0: iSampleRate = config->iRate; sl@0: iChannels = (config->iStereoMode & ETaskMono)? 1 : 2; sl@0: iInterleaved = (config->iStereoMode & ETaskInterleaved)?ETrue : EFalse; sl@0: return KErrNone; sl@0: } sl@0: sl@0: if (aConfig.Uid() == TUid::Uid(KUidTTaskConfig2)) sl@0: { sl@0: const TTaskConfig2* config = TPuTaskConfig2::GetStructure(aConfig); sl@0: sl@0: iSampleRate = config->iRate; sl@0: iChannels = config->iNumberOfChannels; sl@0: iInterleaved = (config->iStereoMode & ETaskInterleaved)?ETrue : EFalse; sl@0: return KErrNone; sl@0: } sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::MopGetConfig(TPuConfig& /*aConfig*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::MopInitialize() sl@0: { sl@0: // Nothing to do sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::MopTunnelRequest(const MMdfInputPort& /*aInputPortToBeConnectedTo*/, sl@0: TTunnelFlags& /*aTunnelFlags*/, TSupplierType& /*aSupplierType*/) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::MopReadData(CMMFBuffer& aOutputBuffer) sl@0: { sl@0: TInt err = iBuffers.Append(&aOutputBuffer); sl@0: if (err == KErrNone) sl@0: { sl@0: if ((iParent.State() == EProcessingUnitExecuting || iParent.State() == EProcessingUnitPaused) && !IsActive()) sl@0: { sl@0: SetActive(); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (iObserver) sl@0: { sl@0: iObserver->MopoReadDataComplete(this, &aOutputBuffer, err); sl@0: } sl@0: } sl@0: } sl@0: sl@0: TBool CAudioDevice::COutputPort::MopIsTunnelled() const sl@0: { sl@0: return EFalse; sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::MopIndex() const sl@0: { sl@0: return KOutputPortIndex; sl@0: } sl@0: sl@0: CMMFBuffer* CAudioDevice::COutputPort::MopCreateBuffer(TInt /*aBufferSize*/) sl@0: { sl@0: return NULL; sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::MopUseBuffer(CMMFBuffer& /*aBuffer*/) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::MopFreeBuffer(CMMFBuffer* /*aBuffer*/) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::Execute() sl@0: { sl@0: if (!IsActive() && iBuffers.Count()>0) sl@0: { sl@0: SetActive(); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::Pause() sl@0: { sl@0: if(iParent.SoundDevice().Handle()) sl@0: { sl@0: iParent.SoundDevice().FlushRecordBuffer(); sl@0: } sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::Stop() sl@0: { sl@0: Cancel(); sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::MopDisconnectTunnel() sl@0: { sl@0: // Find the last buffer in the array and set it as the 'LastBuffer' sl@0: if(iBuffers.Count() > 0) sl@0: { sl@0: (iBuffers[iBuffers.Count() - 1])->SetLastBuffer(ETrue); sl@0: } sl@0: // Still have to send callback and cancel driver sl@0: iObserver->MopoDisconnectTunnelComplete(this, KErrNone); sl@0: iParent.SoundDevice().CancelRecordData(); sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::MopRestartTunnel() sl@0: { sl@0: } sl@0: sl@0: TUint32 CAudioDevice::COutputPort::MopBufferSize() const sl@0: { sl@0: return iBufferSize; sl@0: } sl@0: sl@0: void CAudioDevice::CInputPort::MipSetObserver(const MMdfInputPortObserver& aObserver) sl@0: { sl@0: iObserver = const_cast(&aObserver); sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::MopSetObserver(const MMdfOutputPortObserver& aObserver) sl@0: { sl@0: iObserver = const_cast(&aObserver); sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::MopCreateCustomInterface(TUid aUid) sl@0: { sl@0: if (aUid.iUid == KMmfRecordSettingsCustomInterface) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TAny* CAudioDevice::COutputPort::MopCustomInterface(TUid aUid) sl@0: { sl@0: if (aUid.iUid == KMmfRecordSettingsCustomInterface) sl@0: { sl@0: return dynamic_cast(this); sl@0: } sl@0: sl@0: return NULL; sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::RunL() sl@0: { sl@0: if (iCurrentBuffer != NULL) sl@0: { sl@0: // If we've been signalled with a buffer, callback that we've completed the writing of the sl@0: // buffer sl@0: if (iObserver) sl@0: { sl@0: TInt length = iCurrentBuffer->BufferSize(); sl@0: iBytesRecorded += length; sl@0: if (lengthSetLastBuffer(ETrue); sl@0: iParent.SoundDevice().CancelRecordData(); // Required so that a resume of an encode functions correctly sl@0: } sl@0: sl@0: iObserver->MopoReadDataComplete(this, iCurrentBuffer, iStatus.Int()); sl@0: sl@0: } sl@0: iCurrentBuffer = NULL; sl@0: } sl@0: sl@0: if (iStatus == KErrNone) sl@0: { sl@0: if (iBuffers.Count()>0) sl@0: { sl@0: iCurrentBuffer = iBuffers[0]; sl@0: iBuffers.Remove(0); sl@0: sl@0: if (CMMFBuffer::IsSupportedDataBuffer(iCurrentBuffer->Type())) sl@0: { sl@0: TDes8& aBufferDes = (static_cast(iCurrentBuffer))->Data(); sl@0: iStatus = KRequestPending; sl@0: iParent.SoundDevice().RecordData(iStatus, aBufferDes); sl@0: SetActive(); sl@0: } sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CAudioDevice::COutputPort::DoCancel() sl@0: { sl@0: if (iParent.SoundDevice().Handle()) sl@0: { sl@0: iParent.SoundDevice().CancelRecordData(); sl@0: iParent.SoundDevice().FlushRecordBuffer(); sl@0: } sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::SampleRate() sl@0: { sl@0: return iSampleRate; sl@0: } sl@0: sl@0: TInt CAudioDevice::COutputPort::Channels() sl@0: { sl@0: return iChannels; sl@0: } sl@0: sl@0: CAudioDevice::COutputPort::~COutputPort() sl@0: { sl@0: Cancel(); sl@0: iBuffers.Close(); sl@0: } sl@0: sl@0: // from MRecordCustomInterface sl@0: void CAudioDevice::COutputPort::SetGain(TUint aGain) sl@0: { sl@0: iGain = aGain; sl@0: } sl@0: TUint CAudioDevice::COutputPort::Gain() sl@0: { sl@0: return iGain; sl@0: } sl@0: sl@0: TUint CAudioDevice::COutputPort::BytesRecorded() sl@0: { sl@0: return iBytesRecorded; sl@0: } sl@0: sl@0: // ------------------------------------------------------------------------------------------ sl@0: // CAudioDevice Implementation sl@0: sl@0: sl@0: CAudioDevice::CAudioDevice() sl@0: { sl@0: } sl@0: sl@0: CAudioDevice::~CAudioDevice() sl@0: { sl@0: delete iInputPort; sl@0: delete iOutputPort; sl@0: iSoundDevice.Close(); sl@0: } sl@0: sl@0: void CAudioDevice::Execute() sl@0: { sl@0: __ASSERT_ALWAYS(iObserver, User::Panic(KAudioDevicePanic, EObserverNotSet)); sl@0: TInt err = KErrNone; sl@0: if(!iSoundDevice.Handle()) sl@0: { sl@0: err = iSoundDevice.Open(); sl@0: } sl@0: sl@0: RMdaDevSound::TCurrentSoundFormatBuf buf; sl@0: if (err == KErrNone) sl@0: { sl@0: if(iState == EProcessingUnitPaused) sl@0: { sl@0: iSoundDevice.ResumePlaying(); sl@0: } sl@0: else sl@0: { sl@0: // Set play format (for input port) sl@0: iSoundDevice.GetPlayFormat(buf); sl@0: buf().iRate = iInputPort->SampleRate(); sl@0: buf().iChannels = iInputPort->Channels(); sl@0: buf().iBufferSize = KBufferSize; sl@0: buf().iEncoding = RMdaDevSound::EMdaSoundEncoding16BitPCM; sl@0: err = iSoundDevice.SetPlayFormat(buf); sl@0: } sl@0: } sl@0: iState = EProcessingUnitExecuting; sl@0: if (err == KErrNone) sl@0: { sl@0: // Set record format (for output format) sl@0: iSoundDevice.GetRecordFormat(buf); sl@0: buf().iRate = iOutputPort->SampleRate(); sl@0: buf().iChannels = iOutputPort->Channels(); sl@0: buf().iBufferSize = KBufferSize; sl@0: buf().iEncoding = RMdaDevSound::EMdaSoundEncoding16BitPCM; sl@0: iSoundDevice.SetRecordFormat(buf); sl@0: iInputPort->Execute(); sl@0: iOutputPort->Execute(); sl@0: } sl@0: else sl@0: { sl@0: iObserver->ExecuteComplete(this, err); sl@0: } sl@0: } sl@0: sl@0: TInt CAudioDevice::Pause() sl@0: { sl@0: iState = EProcessingUnitPaused; sl@0: iInputPort->Pause(); sl@0: iOutputPort->Pause(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: void CAudioDevice::Stop() sl@0: { sl@0: if(iState == EProcessingUnitExecuting || iState == EProcessingUnitPaused) sl@0: { sl@0: // Cancel and flush the device driver sl@0: iInputPort->Stop(); sl@0: iOutputPort->Stop(); sl@0: iState = EProcessingUnitIdle; sl@0: sl@0: // Close the sound device sl@0: iSoundDevice.Close(); sl@0: } sl@0: } sl@0: sl@0: CAudioDevice* CAudioDevice::NewL() sl@0: { sl@0: CAudioDevice* self = new (ELeave) CAudioDevice; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: TInt CAudioDevice::Create(const MMdfProcessingUnitObserver& aObserver) sl@0: { sl@0: iObserver = const_cast(&aObserver); sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt CAudioDevice::Configure(const TPuConfig& /*aConfigurationSetup*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TInt CAudioDevice::GetConfig(TPuConfig& /*aConfigurationSetup*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TInt CAudioDevice::GetInputPorts(RPointerArray& aComponentInputPorts ) sl@0: { sl@0: return aComponentInputPorts.Append(iInputPort); sl@0: } sl@0: sl@0: TInt CAudioDevice::GetOutputPorts(RPointerArray& aComponentOutputPorts ) sl@0: { sl@0: return aComponentOutputPorts.Append(iOutputPort); sl@0: } sl@0: sl@0: void CAudioDevice::ConstructL() sl@0: { sl@0: iInputPort = CInputPort::NewL(*this); sl@0: iOutputPort = COutputPort::NewL(*this); sl@0: iState = EProcessingUnitLoaded; sl@0: } sl@0: sl@0: void CAudioDevice::Initialize() sl@0: { sl@0: __ASSERT_ALWAYS(iObserver, User::Panic(KAudioDevicePanic, EObserverNotSet)); sl@0: sl@0: iObserver->InitializeComplete(this, KErrNone); sl@0: iState = EProcessingUnitIdle; sl@0: } sl@0: sl@0: MMdfProcessingUnitObserver* CAudioDevice::Observer() sl@0: { sl@0: return iObserver; sl@0: } sl@0: sl@0: TProcessingUnitState CAudioDevice::State() sl@0: { sl@0: return iState; sl@0: } sl@0: sl@0: RMdaDevSound& CAudioDevice::SoundDevice() sl@0: { sl@0: return iSoundDevice; sl@0: } sl@0: sl@0: TAny* CAudioDevice::CustomInterface(TUid /*aUid*/) sl@0: { sl@0: return NULL; sl@0: } sl@0: sl@0: TInt CAudioDevice::CreateCustomInterface(TUid /*aUid*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: // ------------------------------------------------------------------------------------------ sl@0: // ECOM Implementation table entry sl@0: sl@0: const TImplementationProxy ImplementationTable[] = sl@0: { sl@0: IMPLEMENTATION_PROXY_ENTRY(KUidPUAudioDevice, CAudioDevice::NewL), sl@0: }; sl@0: sl@0: EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) sl@0: { sl@0: aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); sl@0: return ImplementationTable; sl@0: } sl@0: