⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio2eng.cpp

📁 Symbian OS C++手机开发源码
💻 CPP
字号:
/* Copyright (c) 2004, Symbian Software Ltd. All rights reserved */

#ifndef __Audio2ENG_H_
#define __Audio2ENG_H_

#include "Audio2eng.h"
#include "Audio2Ui.h"
#include "Audio2.hrh"

CAudio2Engine::CAudio2Engine(CAudio2Ui& aAppUi) : 
	iAppUi(aAppUi),
    iState(ENotReady)
    {
    }

void CAudio2Engine::SetArrays(RArray<TFourCC>* aDataTypes,
						 RArray<TUint>* aSampleRates,
						 RArray<TUint>* aChannels)
	{
	iDataTypes=aDataTypes;
	iSampleRates=aSampleRates;
	iChannels=aChannels;
	}

CAudio2Engine* CAudio2Engine::NewL(CAudio2Ui& aAppUi)
    {
    CAudio2Engine* self = NewLC(aAppUi);
    CleanupStack::Pop();  // self
    return self;
    }

CAudio2Engine* CAudio2Engine::NewLC(CAudio2Ui& aAppUi)
    {
    CAudio2Engine* self = new (ELeave) CAudio2Engine(aAppUi);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

_LIT(KFileName,"rec.wav");

void CAudio2Engine::ConstructL()
    {
	delete iUtility;
	iUtility=NULL;
    iUtility = CMdaAudioRecorderUtility::NewL(*this);
	iUtility->OpenFileL(KFileName);
    }

void CAudio2Engine::ConvertL(TPtrC aExt, TInt aCodecIndex, TInt aSampleRatesIndex, TInt aChannelsIndex)
	{
	iCodecIndex=aCodecIndex;
	iSampleRatesIndex=aSampleRatesIndex;
	iChannelsIndex=aChannelsIndex;
	iState=EOpeningConverter;
	OpenConverterL(aExt);
	}

void CAudio2Engine::OpenConverterL(TPtrC aExt)
	{
	if (iConverter)
		{
		delete iConverter;
		iConverter=NULL;
		};

	iConverter=CMdaAudioConvertUtility::NewL(*this);
	_LIT(KConvertName,"conv");

	TBuf<32> fileName;
	fileName=KConvertName;
	fileName.Append(aExt);

	RFs session;
	session.Connect();
	session.Delete(fileName);
	session.Close();

	iConverter->OpenL(KFileName, fileName);
	}

void CAudio2Engine::GetFormatsL(TPtrC aExt)
	{
	iState=EGettingConversionFormats;
	OpenConverterL(aExt);
	}

void CAudio2Engine::GetFormats2L()
	{
	//ask the destination which types it supports	
	TRAPD(err,iConverter -> GetSupportedDestinationDataTypesL(*iDataTypes));
	if (err != KErrNotSupported)
		User::LeaveIfError(err);
	
	TRAP(err,iConverter -> GetSupportedConversionSampleRatesL(*iSampleRates));
	if (err != KErrNotSupported)
		User::LeaveIfError(err);

	TRAP(err,iConverter -> GetSupportedConversionNumberOfChannelsL(*iChannels));
	if (err != KErrNotSupported) 
		User::LeaveIfError(err);
	iConversionTypes=ETrue;
	}

void CAudio2Engine::Convert2L()
	{
	if (iCodecIndex!=-1)//selections were made
		{
		TFourCC cc=(*iDataTypes)[iCodecIndex];
		iConverter->SetDestinationDataTypeL(cc);
		TInt s=(*iSampleRates)[iSampleRatesIndex];
		iConverter->SetDestinationSampleRateL(s);
		TInt c=(*iChannels)[iChannelsIndex];
		iConverter->SetDestinationNumberOfChannelsL(c);
		}
	iConverter->ConvertL();
	}

CAudio2Engine::~CAudio2Engine()
    {
    delete iUtility;    
    iUtility = NULL;

	delete iConverter;
	iConverter=NULL;
    }

void CAudio2Engine::PlayL()
	{
	iUtility->PlayL();
	}

void CAudio2Engine::StopL()
	{
	if (iState==ERecording)
		{
		iUtility->Stop();
		iRecorded=ETrue;
		}

	if (iState==EConverting)
		iConverter->Stop();

	iState=EReady;
	}

// Set options and start recording
void CAudio2Engine::StartRecordingL()
	{
	iUtility -> SetAudioDeviceMode(CMdaAudioRecorderUtility::EDefault);
	iUtility -> RecordL();
	}
	
void CAudio2Engine::RecordTypesL(CDesCArray& aTypeArray)
	{
	RMMFControllerImplInfoArray controllers;
	CleanupResetAndDestroyPushL(controllers);

	CMMFControllerPluginSelectionParameters* cSelect = CMMFControllerPluginSelectionParameters::NewLC();
	CMMFFormatSelectionParameters* fSelectRead = CMMFFormatSelectionParameters::NewLC();
	CMMFFormatSelectionParameters* fSelectWrite = CMMFFormatSelectionParameters::NewLC();

	RArray<TUid> mediaIds;
	mediaIds.Append(KUidMediaTypeAudio);
	CleanupClosePushL(mediaIds);
	cSelect->SetMediaIdsL(mediaIds, CMMFPluginSelectionParameters::EAllowOnlySuppliedMediaIds);
	cSelect->SetRequiredPlayFormatSupportL(*fSelectRead);
	cSelect->SetRequiredRecordFormatSupportL(*fSelectWrite); // need to specify this as otherwise the supported record formats won't be retrieved
	cSelect->ListImplementationsL(controllers);

	TBuf<10> buf;
	// Loop through each returned plug-in and get their record formats
	for (TInt i=0; i<controllers.Count(); i++)
		{
		const RMMFFormatImplInfoArray& recordInfo =  controllers[i]->RecordFormats();
		// Get array of supported file extensions.
		for (TInt j=0; j<recordInfo.Count(); j++)
			{
			const CDesC8Array& extensions = recordInfo[j]->SupportedFileExtensions();
			// and finally add each extension to the array
			for (TInt k=0; k<extensions.Count(); k++)
				{
				buf.Copy(extensions[k]);
				aTypeArray.AppendL(buf);
				} 
			} 
		}
	CleanupStack::PopAndDestroy(5);
	}

void CAudio2Engine::MoscoStateChangeEvent(CBase* aObject, TInt /*aPreviousState*/, TInt aCurrentState, TInt aErrorCode)
	{
	if (aErrorCode!=KErrNone)
		{//message
		iState=ENotReady;
		return;
		}

	if (aObject==iUtility)	
		switch (aCurrentState)
			{
			case CMdaAudioClipUtility::EOpen:
				iState=EReady;
				break;
			case CMdaAudioClipUtility::ERecording:
				iState=ERecording;
				break;
			case CMdaAudioClipUtility::EPlaying:
				iState=EPlaying;
				break;
			default:;
			}
	else //must be converter
		switch (aCurrentState)
			{
			case CMdaAudioClipUtility::EOpen:
				{
				if (iState==EGettingConversionFormats)
					{
					GetFormats2L();
					iState=EReady;
					break;
					}
				else
					{
					TState state=iState;				
					iState=EReady;
					if (state!=EConverting)
						Convert2L();
					break;
					}
				}
			case CMdaAudioClipUtility::ERecording:
				iState=EConverting;
				break;
			case CMdaAudioClipUtility::EPlaying:
				iState=EConverting;
				break;
			default:;
			}
	}

void CAudio2Engine::UpdateMenu(CEikMenuPane* aMenuPane)
    {
	switch(iState)
		{
		case ENotReady:
			aMenuPane->SetItemDimmed(ECmdRecord, EFalse);
			aMenuPane->SetItemDimmed(ECmdPlay, ETrue);
			aMenuPane->SetItemDimmed(ECmdStop, ETrue);
			aMenuPane->SetItemDimmed(ECmdConversionFormats, ETrue);
			aMenuPane->SetItemDimmed(ECmdConversionTypes, ETrue);
			aMenuPane->SetItemDimmed(ECmdConvert, ETrue);
			break;

		case EReady:
			aMenuPane->SetItemDimmed(ECmdRecord, EFalse);
			aMenuPane->SetItemDimmed(ECmdPlay, EFalse);
			aMenuPane->SetItemDimmed(ECmdStop, ETrue);
			aMenuPane->SetItemDimmed(ECmdConversionFormats, !iRecorded);
			aMenuPane->SetItemDimmed(ECmdConversionTypes, !iConversionTypes);
			aMenuPane->SetItemDimmed(ECmdConvert, !iConversionTypes);
			break;

		case EPlaying:
		case ERecording:
		case EConverting:
			aMenuPane->SetItemDimmed(ECmdRecord, ETrue);
			aMenuPane->SetItemDimmed(ECmdPlay, ETrue);
			aMenuPane->SetItemDimmed(ECmdStop, EFalse);
			aMenuPane->SetItemDimmed(ECmdConversionFormats, ETrue);
			aMenuPane->SetItemDimmed(ECmdConversionTypes, ETrue);
			aMenuPane->SetItemDimmed(ECmdConvert, ETrue);
			break;
		}
	}

#endif// __Audio2ENG_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -