mmdevicefw/mdfunittest/codecapi/omx/pcmcodec/src/OmxPCMCodec.cpp
author hgs
Wed, 13 Oct 2010 12:08:48 +0100
changeset 3 28bdc4aca325
parent 0 79dd3e2336a0
permissions -rw-r--r--
2010wk42_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2005-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 <e32debug.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    17
#include <stdio.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    18
#include <string.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    19
#include <stdlib.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    20
#include <openmax/il/khronos/v1_x/OMX_Core.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    21
#include <openmax/il/khronos/v1_x/OMX_Audio.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    22
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    23
#include "OmxImpl.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    24
#include "OmxPCMCodec.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    25
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    26
const TInt KPCMBufferSize = 4096;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    27
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    28
const TInt KThreadStackSize = 16384; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    29
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    30
const TInt KShutDownTime = 5000000; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    31
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    32
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    33
TInt ProcessingThread(TAny* aComponent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    34
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    35
	// get our class
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    36
	CCodecProcessor* codecprocessor = static_cast<CCodecProcessor*>(aComponent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    37
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    38
	// run the thread
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    39
	TRAPD(err, codecprocessor->RunThreadL());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    40
	// thread has exited or failed to start so return error to the client. 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    41
	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    42
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    43
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    44
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    45
TInt COmxPCMCodec::CreateComponent(OMX_HANDLETYPE hComponent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    46
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    47
	COmxPCMCodec* self = new COmxPCMCodec(hComponent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    48
	if (self==NULL)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    49
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    50
		return KErrNoMemory;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    51
		}		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    52
	TRAPD(err, self->ConstructL());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    53
	// self is stored in the handle, so we won't return it
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    54
	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    55
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    56
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    57
OMX_ERRORTYPE COmxPCMCodec::GetComponentVersion(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    58
       OMX_STRING /*pComponentName*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    59
       OMX_VERSIONTYPE* /*pComponentVersion*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    60
       OMX_VERSIONTYPE* /*pSpecVersion*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    61
       OMX_UUIDTYPE* /*pComponentUUID*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    62
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    63
// to be implemented
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    64
	return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    65
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    66
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    67
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    68
void COmxPCMCodec::ConstructL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    69
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    70
	iCodecProcessor = CCodecProcessor::NewL(*this);	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    71
	iState = OMX_StateLoaded;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    72
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    73
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    74
COmxPCMCodec::COmxPCMCodec(OMX_HANDLETYPE hComponent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    75
	:COmxComponentImpl(hComponent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    76
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    77
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    78
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    79
COmxPCMCodec::~COmxPCMCodec()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    80
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    81
	if (iState == OMX_StateExecuting)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    82
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    83
		iCodecProcessor->Stop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    84
		iState = OMX_StateIdle;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    85
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    86
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    87
	if (iCreatedThread &&(iProcessingThread.Handle() != KNullHandle) && (iProcessingThread.ExitType() == EExitPending))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    88
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    89
		TRequestStatus logonStatus;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    90
		TBool logonFailed = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    91
		iProcessingThread.Logon(logonStatus);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    92
		if(logonStatus != KRequestPending)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    93
			{//logon failed. Mostly due to no memory
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    94
			logonFailed = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    95
			}		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    96
		iCodecProcessor->Exit();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    97
		RTimer timer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    98
		TInt err = timer.CreateLocal();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    99
		if(err==KErrNone && !logonFailed) //both timer and logon successful
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   100
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   101
			TRequestStatus timeout;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   102
			timer.After(timeout, KShutDownTime);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   103
			User::WaitForRequest(logonStatus, timeout);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   104
			if(logonStatus==KRequestPending)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   105
				{//Thread has not exited after the timeout. Kill it!
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   106
				iProcessingThread.LogonCancel(logonStatus);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   107
				User::WaitForRequest(logonStatus);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   108
				iProcessingThread.Kill(KErrDied);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   109
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   110
			else 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   111
				{//Thread exited. Cancel the timer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   112
				timer.Cancel();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   113
				User::WaitForRequest(timeout);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   114
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   115
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   116
		else 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   117
			{//either timer or Logon method has failed.Poll the thread status a maximum
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   118
			 // of 10 times and kill the thread if it hasn't exited after the polling
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   119
			for (TInt i=0; i<10 && iProcessingThread.ExitType() == EExitPending; ++i)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   120
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   121
				User::After(KShutDownTime/10);	// wait for a while
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   122
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   123
			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   124
			if (iProcessingThread.ExitType() == EExitPending)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   125
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   126
				// The polling hasn't been succesful so we kill the thread
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   127
				iProcessingThread.Kill(KErrDied);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   128
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   129
			if(!logonFailed)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   130
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   131
				User::WaitForRequest(logonStatus);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   132
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   133
			}	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   134
		iProcessingThread.Close();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   135
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   136
	delete iCodecProcessor;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   137
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   138
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   139
OMX_ERRORTYPE COmxPCMCodec::SendCommand(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   140
       OMX_COMMANDTYPE Cmd,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   141
       TUint32 nParam1,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   142
       TAny* /*pCmdData*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   143
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   144
	OMX_ERRORTYPE error = OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   145
	switch (Cmd)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   146
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   147
	case OMX_CommandStateSet:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   148
		OMX_STATETYPE state = (OMX_STATETYPE)nParam1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   149
		if (state == iState)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   150
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   151
			error = OMX_ErrorSameState;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   152
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   153
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   154
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   155
			// notify client of the state change
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   156
			switch (state)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   157
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   158
			case OMX_StateIdle:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   159
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   160
				if (iState == OMX_StateExecuting)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   161
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   162
					iCodecProcessor->Stop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   163
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   164
				break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   165
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   166
			case OMX_StateExecuting:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   167
				StartExecution();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   168
				break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   169
				};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   170
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   171
			iState = state;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   172
			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   173
			EventHandlerCallback(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   174
				OMX_EventCmdComplete,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   175
				OMX_CommandStateSet,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   176
				iState,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   177
				NULL);	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   178
			break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   179
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   180
		};	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   181
	return error;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   182
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   183
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   184
OMX_ERRORTYPE COmxPCMCodec::GetParameter(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   185
       OMX_INDEXTYPE nParamIndex,  
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   186
       TAny* ComponentParameterStructure)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   187
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   188
	switch (nParamIndex)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   189
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   190
	case OMX_IndexParamAudioInit :
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   191
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   192
		OMX_PORT_PARAM_TYPE* param = static_cast<OMX_PORT_PARAM_TYPE*>(ComponentParameterStructure);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   193
		param->nPorts = 2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   194
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   195
		break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   196
	case OMX_IndexParamPortDefinition:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   197
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   198
		OMX_PARAM_PORTDEFINITIONTYPE* portDef = static_cast<OMX_PARAM_PORTDEFINITIONTYPE*>(ComponentParameterStructure);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   199
		if (portDef->nPortIndex==0)	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   200
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   201
			portDef->eDir = OMX_DirInput;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   202
			portDef->nBufferSize = KPCMBufferSize;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   203
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   204
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   205
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   206
			portDef->eDir = OMX_DirOutput;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   207
			portDef->nBufferSize = KPCMBufferSize;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   208
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   209
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   210
		break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   211
	default:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   212
		return OMX_ErrorUnsupportedIndex;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   213
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   214
	return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   215
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   216
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   217
OMX_ERRORTYPE COmxPCMCodec::SetParameter(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   218
       OMX_INDEXTYPE nIndex,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   219
       TAny* ComponentParameterStructure)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   220
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   221
	ASSERT(iState == OMX_StateLoaded);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   222
	switch (nIndex)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   223
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   224
		case OMX_IndexParamAudioPcm:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   225
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   226
			OMX_AUDIO_PARAM_PCMMODETYPE* param = static_cast<OMX_AUDIO_PARAM_PCMMODETYPE*>(ComponentParameterStructure);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   227
			switch(param->nPortIndex)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   228
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   229
				case 0: // Input port
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   230
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   231
					iCodecProcessor->SetInputBitsPerSample(param->nBitPerSample);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   232
					iCodecProcessor->SetInputDataType(param->eNumData);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   233
					//break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   234
					return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   235
					}			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   236
				case 1: // Output port
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   237
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   238
					iCodecProcessor->SetOutputBitsPerSample(param->nBitPerSample);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   239
					iCodecProcessor->SetOutputDataType(param->eNumData);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   240
					//break;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   241
					return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   242
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   243
				default:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   244
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   245
					return OMX_ErrorUnsupportedIndex;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   246
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   247
				};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   248
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   249
		default:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   250
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   251
			return OMX_ErrorUnsupportedIndex;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   252
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   253
		};		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   254
	//return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   255
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   256
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   257
OMX_ERRORTYPE COmxPCMCodec::GetConfig(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   258
       OMX_INDEXTYPE /*nIndex*/, 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   259
       TAny* /*value*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   260
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   261
	return OMX_ErrorUnsupportedIndex;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   262
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   263
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   264
OMX_ERRORTYPE COmxPCMCodec::SetConfig(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   265
       OMX_INDEXTYPE /*nIndex*/, 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   266
       TAny* /*value*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   267
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   268
	return OMX_ErrorUnsupportedIndex;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   269
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   270
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   271
OMX_ERRORTYPE COmxPCMCodec::GetExtensionIndex(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   272
       OMX_STRING /*ParameterName*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   273
       OMX_INDEXTYPE* /*pIndexType*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   274
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   275
	return OMX_ErrorNotImplemented;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   276
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   277
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   278
OMX_ERRORTYPE COmxPCMCodec::GetState(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   279
       OMX_STATETYPE* pState)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   280
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   281
	*pState = iState;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   282
	return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   283
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   284
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   285
OMX_ERRORTYPE COmxPCMCodec::ComponentTunnelRequest(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   286
		OMX_HANDLETYPE /*hInput*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   287
		TUint32 /*nInputPort*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   288
		OMX_HANDLETYPE /*hOutput*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   289
		TUint32 /*nOutputPort*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   290
		OMX_TUNNELSETUPTYPE* /*pTunnelSetup*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   291
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   292
	return OMX_ErrorNotImplemented;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   293
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   294
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   295
OMX_ERRORTYPE COmxPCMCodec::UseBuffer(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   296
       OMX_BUFFERHEADERTYPE** ppBufferHeader,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   297
       TUint32 /*nPortIndex*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   298
       TAny* pAppPrivate,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   299
       TUint32 nSizeBytes,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   300
       TUint8* pBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   301
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   302
	ASSERT(iState == OMX_StateLoaded);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   303
	*ppBufferHeader = new OMX_BUFFERHEADERTYPE;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   304
	if (*ppBufferHeader != NULL)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   305
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   306
		(*ppBufferHeader)->pBuffer = pBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   307
		(*ppBufferHeader)->pAppPrivate = pAppPrivate;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   308
		(*ppBufferHeader)->nAllocLen = nSizeBytes;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   309
		(*ppBufferHeader)->nFilledLen = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   310
		(*ppBufferHeader)->nFlags = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   311
		(*ppBufferHeader)->pInputPortPrivate = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   312
		(*ppBufferHeader)->pOutputPortPrivate = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   313
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   314
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   315
	if (*ppBufferHeader)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   316
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   317
		return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   318
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   319
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   320
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   321
		return OMX_ErrorInsufficientResources;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   322
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   323
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   324
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   325
OMX_ERRORTYPE COmxPCMCodec::AllocateBuffer(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   326
		OMX_BUFFERHEADERTYPE** pBuffer,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   327
		TUint32 nPortIndex,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   328
		TAny* pAppData,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   329
		TUint32 nSizeBytes)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   330
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   331
	ASSERT(iState == OMX_StateLoaded);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   332
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   333
	*pBuffer = new OMX_BUFFERHEADERTYPE;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   334
	if (*pBuffer != NULL)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   335
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   336
		(*pBuffer)->pBuffer = new unsigned char[nSizeBytes];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   337
		// store our allocated memory in component's private store
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   338
		switch (nPortIndex)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   339
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   340
		case 0:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   341
			(*pBuffer)->pInputPortPrivate = (*pBuffer)->pBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   342
			(*pBuffer)->pOutputPortPrivate = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   343
			break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   344
		case 1:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   345
			(*pBuffer)->pOutputPortPrivate = (*pBuffer)->pBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   346
			(*pBuffer)->pInputPortPrivate = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   347
			break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   348
			};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   349
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   350
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   351
		(*pBuffer)->nAllocLen = nSizeBytes;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   352
		(*pBuffer)->nFilledLen = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   353
		(*pBuffer)->pAppPrivate = pAppData;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   354
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   355
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   356
	if (*pBuffer && (*pBuffer)->pBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   357
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   358
		return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   359
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   360
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   361
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   362
		return OMX_ErrorInsufficientResources;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   363
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   364
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   365
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   366
OMX_ERRORTYPE COmxPCMCodec::FreeBuffer(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   367
		TUint32 /*nPortIndex*/,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   368
       OMX_BUFFERHEADERTYPE* pBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   369
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   370
	if (pBuffer->pInputPortPrivate || 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   371
		pBuffer->pOutputPortPrivate)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   372
		delete[] pBuffer->pBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   373
	delete pBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   374
	return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   375
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   376
OMX_ERRORTYPE COmxPCMCodec::EmptyThisBuffer(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   377
       OMX_BUFFERHEADERTYPE* pBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   378
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   379
	ASSERT(iState == OMX_StateExecuting ||
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   380
			iState == OMX_StateIdle ||
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   381
			iState == OMX_StatePause);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   382
	return iCodecProcessor->EmptyThisBuffer(pBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   383
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   384
OMX_ERRORTYPE COmxPCMCodec::FillThisBuffer(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   385
           OMX_BUFFERHEADERTYPE* pBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   386
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   387
	ASSERT(iState == OMX_StateExecuting ||
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   388
			iState == OMX_StateIdle ||
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   389
			iState == OMX_StatePause);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   390
	return iCodecProcessor->FillThisBuffer(pBuffer);	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   391
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   392
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   393
OMX_ERRORTYPE COmxPCMCodec::SetCallbacks(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   394
           OMX_CALLBACKTYPE* pCallbacks, 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   395
           TAny* pAppData)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   396
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   397
	iCallback = pCallbacks;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   398
	iAppData = pAppData;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   399
	return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   400
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   401
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   402
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   403
CCodecProcessor::CCodecProcessor(COmxPCMCodec& aParent) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   404
	: iParent(&aParent)
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
void CCodecProcessor::RunThreadL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   409
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   410
	iQueueStatus = KRequestPending;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   411
	iMessageQueue.NotifyDataAvailable(iQueueStatus);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   412
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   413
	for (;;)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   414
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   415
		User::WaitForRequest(iQueueStatus);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   416
		TCodecMessage msg;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   417
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   418
		TBool exit = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   419
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   420
		while (iMessageQueue.Receive(msg)==KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   421
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   422
			switch (msg.iType)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   423
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   424
				case EStopProcessing:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   425
					iStarted = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   426
					break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   427
				case EExit:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   428
					exit = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   429
					break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   430
				case EInputBuffer:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   431
					iBuffersToEmpty.Append(msg.iBuffer); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   432
					break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   433
				case EOutputBuffer:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   434
					iBuffersToFill.Append(msg.iBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   435
					break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   436
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   437
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   438
			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   439
		if (exit)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   440
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   441
			break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   442
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   443
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   444
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   445
			// process all available buffers
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   446
			ProcessAvailableBuffers();	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   447
			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   448
			// request notification of further queue events
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   449
			iQueueStatus = KRequestPending;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   450
			iMessageQueue.NotifyDataAvailable(iQueueStatus);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   451
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   452
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   453
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   454
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   455
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   456
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   457
CCodecProcessor* CCodecProcessor::NewL(COmxPCMCodec& aParent) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   458
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   459
	CCodecProcessor* self = new (ELeave) CCodecProcessor(aParent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   460
	CleanupStack::PushL(self);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   461
	self->ConstructL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   462
	CleanupStack::Pop(self);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   463
	return self;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   464
	}	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   465
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   466
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   467
void CCodecProcessor::ConstructL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   468
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   469
	User::LeaveIfError(iMessageQueue.CreateLocal(10));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   470
	// set the default case	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   471
	iInputBitsPerSample = 8;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   472
	iInputDataType = OMX_NumericalDataUnsigned;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   473
	iOutputBitsPerSample = 16;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   474
	iOutputDataType = OMX_NumericalDataSigned;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   475
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   476
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   477
OMX_ERRORTYPE CCodecProcessor::EmptyThisBuffer( 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   478
		OMX_BUFFERHEADERTYPE* pBuffer) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   479
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   480
	TCodecMessage message;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   481
	message.iType = EInputBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   482
	message.iBuffer = pBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   483
	if (iMessageQueue.Send(message) == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   484
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   485
		return OMX_ErrorNone;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   486
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   487
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   488
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   489
		return OMX_ErrorUndefined;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   490
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   491
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   492
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   493
void CCodecProcessor::Stop()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   494
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   495
	TCodecMessage message;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   496
	message.iType = EStopProcessing;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   497
	message.iBuffer = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   498
	iMessageQueue.Send(message);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   499
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   500
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   501
void CCodecProcessor::Exit()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   502
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   503
	TCodecMessage message;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   504
	message.iType = EExit;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   505
	message.iBuffer = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   506
	iMessageQueue.SendBlocking(message);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   507
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   508
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   509
OMX_ERRORTYPE CCodecProcessor::FillThisBuffer(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   510
									OMX_BUFFERHEADERTYPE* pBuffer) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   511
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   512
	TCodecMessage message;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   513
	message.iType = EOutputBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   514
	message.iBuffer = pBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   515
	if (iMessageQueue.Send(message)== KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   516
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   517
		return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   518
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   519
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   520
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   521
		return OMX_ErrorUndefined;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   522
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   523
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   524
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   525
void CCodecProcessor::SetInputBitsPerSample(TInt aInputBitsPerSample)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   526
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   527
	iInputBitsPerSample = aInputBitsPerSample;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   528
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   529
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   530
void CCodecProcessor::SetInputDataType(OMX_NUMERICALDATATYPE aType)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   531
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   532
	iInputDataType = aType;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   533
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   534
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   535
void CCodecProcessor::SetOutputBitsPerSample(TInt aInputBitsPerSample)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   536
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   537
	iOutputBitsPerSample = aInputBitsPerSample;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   538
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   539
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   540
void CCodecProcessor::SetOutputDataType(OMX_NUMERICALDATATYPE aType)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   541
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   542
	iOutputDataType = aType;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   543
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   544
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   545
void CCodecProcessor::ChooseCodec()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   546
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   547
	// choose correct conversion codec
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   548
	if (iInputBitsPerSample == 8 && iOutputBitsPerSample == 16)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   549
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   550
		iOutputSamplesPerInputSample = 2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   551
		if (iInputDataType == OMX_NumericalDataSigned &&
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   552
		iOutputDataType == OMX_NumericalDataSigned)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   553
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   554
			iCurrentCodec = &iAudioS8ToS16PcmCodec;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   555
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   556
		else if (iInputDataType == OMX_NumericalDataUnsigned &&
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   557
			iOutputDataType == OMX_NumericalDataSigned)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   558
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   559
			iCurrentCodec = &iAudioU8ToS16PcmCodec;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   560
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   561
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   562
	else if (iInputBitsPerSample == 16 && iOutputBitsPerSample == 8)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   563
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   564
		iOutputSamplesPerInputSample = .5;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   565
		if (iInputDataType == OMX_NumericalDataSigned &&
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   566
		iOutputDataType == OMX_NumericalDataSigned)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   567
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   568
			iCurrentCodec = &iAudioS16ToS8PcmCodec;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   569
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   570
		else if (iInputDataType == OMX_NumericalDataSigned &&
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   571
			iOutputDataType == OMX_NumericalDataUnsigned)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   572
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   573
			iCurrentCodec = &iAudioS16ToU8PcmCodec;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   574
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   575
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   576
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   577
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   578
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   579
void CCodecProcessor::ProcessAvailableBuffers()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   580
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   581
	// Setup wait for data in queue
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   582
	while (iBuffersToFill.Count()>0 && iBuffersToEmpty.Count() > 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   583
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   584
		TBool lastBuffer = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   585
		if (!iStarted)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   586
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   587
			ChooseCodec();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   588
			iStarted = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   589
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   590
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   591
		OMX_BUFFERHEADERTYPE* srcBuffer = iBuffersToEmpty[0];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   592
		OMX_BUFFERHEADERTYPE* destBuffer = iBuffersToFill[0];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   593
		if (srcBuffer->nFlags & OMX_BUFFERFLAG_EOS)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   594
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   595
			lastBuffer = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   596
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   597
		TInt destBufferPos = destBuffer->nFilledLen;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   598
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   599
		TInt destBufferSize = destBuffer->nAllocLen - destBufferPos;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   600
		TInt inputSamplesRequired = (TInt)((TReal)destBufferSize / iOutputSamplesPerInputSample);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   601
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   602
		TInt availableSamples = srcBuffer->nFilledLen - iInputBufferPos;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   603
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   604
		if (availableSamples <= inputSamplesRequired)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   605
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   606
			TInt samplesToConvert = availableSamples;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   607
			if (iOutputSamplesPerInputSample == .5)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   608
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   609
				samplesToConvert >>= 1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   610
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   611
			iCurrentCodec->Convert(&srcBuffer->pBuffer[iInputBufferPos], &destBuffer->pBuffer[destBufferPos], samplesToConvert);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   612
			iInputBufferPos = 0; // finished buffer - so reset
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   613
			inputSamplesRequired -= availableSamples;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   614
			destBuffer->nFilledLen = (TInt)((TReal)availableSamples * iOutputSamplesPerInputSample);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   615
			srcBuffer->nFilledLen = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   616
			iBuffersToEmpty.Remove(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   617
			iParent->EmptyBufferDoneCallback(srcBuffer);			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   618
			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   619
			if (inputSamplesRequired == 0 || lastBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   620
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   621
				iBuffersToFill.Remove(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   622
				if (lastBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   623
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   624
					destBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   625
					// propagate the EOS flag
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   626
					iParent->EventHandlerCallback(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   627
						OMX_EventBufferFlag,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   628
						0,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   629
						destBuffer->nFlags,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   630
						NULL);	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   631
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   632
				iParent->FillBufferDoneCallback(destBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   633
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   634
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   635
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   636
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   637
			TInt samplesToConvert = inputSamplesRequired;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   638
			if (iOutputSamplesPerInputSample == .5)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   639
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   640
				samplesToConvert >>= 2;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   641
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   642
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   643
			iCurrentCodec->Convert(&srcBuffer->pBuffer[iInputBufferPos], &destBuffer->pBuffer[destBufferPos], samplesToConvert);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   644
			iInputBufferPos += inputSamplesRequired;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   645
			destBuffer->nFilledLen = destBuffer->nAllocLen;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   646
			iBuffersToFill.Remove(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   647
			iParent->FillBufferDoneCallback(destBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   648
			}		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   649
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   650
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   651
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   652
CCodecProcessor::~CCodecProcessor()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   653
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   654
	iBuffersToEmpty.Close();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   655
	iBuffersToFill.Close();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   656
	iMessageQueue.Close();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   657
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   658
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   659
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   660
TInt COmxPCMCodec::StartExecution()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   661
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   662
	// create thread with current thread's heap
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   663
	// we can thus allocate and free memory across threads
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   664
	if (!iCreatedThread)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   665
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   666
		TInt err = iProcessingThread.Create(_L("PCMCodec"), 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   667
							&ProcessingThread, 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   668
							KThreadStackSize, 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   669
							&User::Heap(),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   670
							iCodecProcessor);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   671
							
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   672
		if (err!=KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   673
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   674
			return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   675
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   676
		iCreatedThread = ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   677
		iThreadDeath = KRequestPending;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   678
		iProcessingThread.Resume();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   679
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   680
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   681
	return KErrNone;						
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   682
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   683
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   684
// Callbacks for the PCM codec
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   685
void COmxPCMCodec::EventHandlerCallback( 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   686
        			OMX_OUT OMX_EVENTTYPE eEvent, 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   687
        			OMX_OUT TUint32 nData1,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   688
        			OMX_OUT TUint32 nData2,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   689
        			OMX_OUT OMX_STRING cExtraInfo)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   690
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   691
	iCallback->EventHandler(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   692
			this,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   693
			iAppData,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   694
			eEvent,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   695
			nData1,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   696
			nData2,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   697
			cExtraInfo);	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   698
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   699
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   700
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   701
void COmxPCMCodec::FillBufferDoneCallback(OMX_BUFFERHEADERTYPE* aBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   702
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   703
	iCallback->FillBufferDone(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   704
		*this,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   705
		iAppData,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   706
		aBuffer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   707
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   708
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   709
void COmxPCMCodec::EmptyBufferDoneCallback(OMX_BUFFERHEADERTYPE* aBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   710
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   711
	iCallback->EmptyBufferDone(
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   712
		*this,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   713
		iAppData,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   714
		aBuffer);		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   715
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   716
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   717
// Component Entry Point
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   718
OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComponent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   719
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   720
	TInt err = COmxPCMCodec::CreateComponent(hComponent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   721
	if (err == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   722
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   723
		return OMX_ErrorNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   724
		}		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   725
	else 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   726
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   727
		// return problem
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   728
		return OMX_ErrorInsufficientResources;		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   729
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   730
	}