diff -r 000000000000 -r 58be5850fb6c omxilcomp/omxilaudioemulator/pcmcapturer/src/omxilmicsource.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxilcomp/omxilaudioemulator/pcmcapturer/src/omxilmicsource.cpp Thu Sep 02 20:13:57 2010 +0300 @@ -0,0 +1,225 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include +#include +#include +#include + +#include "omxilmicsource.h" +#include "omxilmicsource.hrh" +#include "omxilmicsourceconst.h" +#include "omxilmicsourceapb0port.h" +#include "omxilmicsourceprocessingfunction.h" + +OMXIL_COMPONENT_ECOM_ENTRYPOINT(KUidSymbianOmxILMicSource); + +// Component Entry Point +OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE aComponent) + { + // This method should be called as a result of a OMX_GetHandle call. Let's + // return something that is consistent with the return codes allowed for + // that API call. + return COmxILComponent::SymbianErrorToGetHandleError(COmxILMicSource::CreateComponent(aComponent)); + } + + +TInt +COmxILMicSource::CreateComponent(OMX_HANDLETYPE aComponent) + { + DEBUG_PRINTF(_L8("COmxILMicSource::CreateComponent")); + + COmxILMicSource* self = new COmxILMicSource(); + + if (!self) + { + return KErrNoMemory; + } + + TRAPD(err, self->ConstructL(aComponent)); + if (err != KErrNone) + { + delete self; + } + return err; + + } + +void +COmxILMicSource::ConstructL(OMX_HANDLETYPE aComponent) + { + DEBUG_PRINTF(_L8("COmxILMicSource::ConstructL")); + + // STEP 1: Initialize the data received from the IL Core + COmxILComponent::ConstructL(aComponent); + + // STEP 2: Create the call backs manager... + MOmxILCallbackNotificationIf* callbackNotificationIf=CreateCallbackManagerL(COmxILComponent::EOutofContext); + + // STEP 3: Create the audio capturer-specific Processing Function... + // Create the clock port first + COmxILClientClockPort*opb0Port = ConstructOPB0PortL(); + CleanupStack::PushL(opb0Port); + + COmxILProcessingFunction* pProcessingFunction = + COmxILMicSourceProcessingFunction::NewL(*callbackNotificationIf, *opb0Port); + RegisterProcessingFunction(pProcessingFunction); + + // STEP 4: Create Port manager... + CreatePortManagerL(COmxILComponent::ENonBufferSharingPortManager, + iOmxILVersion, // Component's OMX Version + 1, // The number of audio ports in this component + 0, // The starting audio port index + 0, // The number of image ports in this component + 0, // The starting image port index + 0, // The number of video ports in this component + 0, // The starting video port index + 1, // The number of other ports in this component + 1 // The starting other port index + ); + + // STEP 5: Create audio capturer component port + COmxILMicSourceAPB0Port* apb0Port = ConstructAPB0PortL(); + CleanupStack::PushL(apb0Port); + + // .. and add them to the port manager... + User::LeaveIfError(AddPort(apb0Port, OMX_DirOutput)); + CleanupStack::Pop(); + User::LeaveIfError(AddPort(opb0Port, OMX_DirInput)); + CleanupStack::Pop(); + + // STEP 6: Create the non-port related configuration manager... + RPointerArray componentRoles; + CleanupClosePushL(componentRoles); + componentRoles.AppendL(&KSymbianOmxILMicSourceRole()); + + COmxILConfigManager* pConfigManager = COmxILConfigManager::NewL( + KSymbianOmxILMicSourceName, + TOmxILVersion(KMicSourceComponentVersionMajor, + KMicSourceComponentVersionMinor, + KMicSourceComponentVersionRevision, + KMicSourceComponentVersionStep), + componentRoles); + RegisterConfigurationManager(pConfigManager); + + CleanupStack::PopAndDestroy(); // componentRoles + + // And finally, let's get everything started + InitComponentL(); + + } + +COmxILMicSource::COmxILMicSource() + : + iOmxILVersion(TOmxILSpecVersion()) + { + DEBUG_PRINTF(_L8("COmxILMicSource::COmxILMicSource")); + } + +COmxILMicSource::~COmxILMicSource() + { + DEBUG_PRINTF(_L8("COmxILMicSource::~COmxILMicSource")); + } + +COmxILMicSourceAPB0Port* +COmxILMicSource::ConstructAPB0PortL() const + { + DEBUG_PRINTF(_L8("COmxILMicSource::ConstructAPB0PortL")); + + RArray supportedAudioFormats; + CleanupClosePushL(supportedAudioFormats); + supportedAudioFormats.AppendL(OMX_AUDIO_CodingPCM); + + OMX_AUDIO_PARAM_PCMMODETYPE paramPcmModeType; + paramPcmModeType.nSize = sizeof(OMX_AUDIO_PARAM_PCMMODETYPE); + paramPcmModeType.nVersion = iOmxILVersion; + paramPcmModeType.nPortIndex = KMICSOURCE_APB0PORT_INDEX; + + static_cast(GetProcessingFunction())->FillParamPCMModeType(paramPcmModeType); + + OMX_AUDIO_CONFIG_VOLUMETYPE configAudioVolume; + configAudioVolume.nSize = sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE); + configAudioVolume.nVersion = iOmxILVersion; + configAudioVolume.nPortIndex = KMICSOURCE_APB0PORT_INDEX; + configAudioVolume.bLinear = OMX_TRUE; + configAudioVolume.sVolume.nValue = static_cast(GetProcessingFunction())->GetVolume(); + configAudioVolume.sVolume.nMin = KMICSOURCE_VOLUME_MIN; + configAudioVolume.sVolume.nMax = KMICSOURCE_VOLUME_MAX; + + OMX_AUDIO_CONFIG_MUTETYPE configAudioMute; + configAudioMute.nSize = sizeof(OMX_AUDIO_CONFIG_MUTETYPE); + configAudioMute.nVersion = iOmxILVersion; + configAudioMute.nPortIndex = KMICSOURCE_APB0PORT_INDEX; + configAudioMute.bMute = OMX_FALSE; + + COmxILMicSourceAPB0Port* apb0Port = COmxILMicSourceAPB0Port::NewL( + TOmxILCommonPortData( + iOmxILVersion, // OMX specification version information + KMICSOURCE_APB0PORT_INDEX, // Port number the structure applies to + OMX_DirOutput, // Direction of this port + KMICSOURCE_PCMPORT_BUFFERCOUNT_MIN, // The minimum number of buffers this port requires + KMICSOURCE_PCMPORT_BUFFERSIZE_MIN, // Minimum size, in bytes, for buffers to be used for this port + OMX_PortDomainAudio, // Domain of the port + OMX_FALSE, // Buffers contiguous requirement (true or false) + 0, // Buffer aligment requirements + OMX_BufferSupplyOutput, // supplier preference when tunneling between two ports + 0), + supportedAudioFormats, + paramPcmModeType, + configAudioVolume, + configAudioMute, + static_cast(*(GetProcessingFunction())) + ); + + CleanupStack::PopAndDestroy(&supportedAudioFormats); + return apb0Port; + } + +COmxILClientClockPort* +COmxILMicSource::ConstructOPB0PortL() const + { + DEBUG_PRINTF(_L8("COmxILMicSource::ConstructOPB0PortL")); + + TOmxILCommonPortData portData( + iOmxILVersion, + KMICSOURCE_OPB0PORT_INDEX, // port index + OMX_DirInput, + KMICSOURCE_CLOCKPORT_BUFFERCOUNT_MIN,// minimum number of buffers + sizeof(OMX_TIME_MEDIATIMETYPE), // minimum buffer size, in bytes + OMX_PortDomainOther, + OMX_FALSE, // do not need contigious buffers + 0, // byte alignment + OMX_BufferSupplyUnspecified, + COmxILPort::KBufferMarkPropagationPortNotNeeded + ); + + // TODO: Clean up the code below. The supportedOtherFormats variable has been added in order to make + // this component compilable during integration from the MM projectintegration branch . + RArray supportedOtherFormats; + CleanupClosePushL(supportedOtherFormats); + supportedOtherFormats.AppendL(OMX_OTHER_FormatTime); + COmxILClientClockPort* aClientClockPort = COmxILClientClockPort::NewL(portData, supportedOtherFormats); + CleanupStack::PopAndDestroy(&supportedOtherFormats); + + return aClientClockPort; + }