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

📄 audiorecorder.cpp

📁 电话录音
💻 CPP
字号:
// This code has been corrected by Michel David. Now the H and CPP are compatible. 
// Some includes have been added.
// Don't forget to add the line 
// LIBRARY	mediaclientaudio.lib
// In the MMP
// 
// IMPORTANT!
// CMdaAudioRecorderUtility->RecordL() needs "UserEnvironment" capability to access microphone. 
// Without the capability it won't work in 3.1-> devices. MultimediaDD-capability is NOT needed.
//
// Add UserEnvironment as CAPABILITY in .mmp file. 
// Remember to use ABLD REALLYCLEAN when fidling with capabilities.
 
#include <e32base.h>
#include <aknviewappui.h>
 
#include <Mda\Common\Resource.h>
#include <BAUTILS.H>
 
#include "AudioRecorder.h"


#define KAudioPriority   80
#define KAudioPreference 0x00060001


const TInt	KReFreshTimeOut = 1000000; // re-fresh every second
 
CAudioRecorder* CAudioRecorder::NewL(MExmapleRecStateObserver& aObserver)
    {
    CAudioRecorder* self = CAudioRecorder::NewLC(aObserver);
    CleanupStack::Pop(self);
    return self;
    }
									  
CAudioRecorder* CAudioRecorder::NewLC(MExmapleRecStateObserver& aObserver)
    {
    CAudioRecorder* self = new (ELeave) CAudioRecorder(aObserver);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }
 
CAudioRecorder::CAudioRecorder(MExmapleRecStateObserver& aObserver)
:iObserver(aObserver),iVolume(5)
    {
 
    }
 
CAudioRecorder::~CAudioRecorder()
{
	delete iExampleTimer;
 
    if(iRecorderUtility)
    {
    	iRecorderUtility->Stop();
    	iRecorderUtility->Close();
    }
    
    delete iRecorderUtility;
    delete iFormat;
	delete iCodec;
	delete iAudioDataSettings;
}
 
 
void CAudioRecorder::ConstructL()
{
	iExampleTimer = CExampleTimer::NewL(*this);
 
	ReportStateAndTime();
}
 
void CAudioRecorder::TimerExpired(TInt aError)
{
	ReportStateAndTime();
	
	if(iExampleTimer && aError != KErrCancel)	
	{
		iExampleTimer->After(KReFreshTimeOut);
	}
}
 
void CAudioRecorder::RecordL(const TDesC& aFileName)
{	
    
	iCurrentFile.iName.Copy(aFileName);
	
	if(iExampleTimer)	
	{
		iExampleTimer->Cancel();
	}
	
	if(iRecorderUtility)
    {
    	iRecorderUtility->Stop(); // stop any play/rec
    	iRecorderUtility->Close();// close previously opened file.
    }	
    
	delete iRecorderUtility;
	iRecorderUtility = NULL;
	


	
	iRecorderUtility = CMdaAudioRecorderUtility::NewL(
	        *this,
	        NULL,
	        KAudioPriority,
	        (TMdaPriorityPreference)KAudioPreference);
	
	// and free ther reserved resources.
	delete iFormat;
	iFormat = NULL;
	delete iCodec;
	iCodec = NULL;
	delete iAudioDataSettings;
	iAudioDataSettings = NULL;
	
	// if the file exists, we append sound data to it.
	if(BaflUtils::FileExists(CCoeEnv::Static()->FsSession(),aFileName))
	{
		iRecorderUtility->OpenFileL(iCurrentFile.iName);
	}
	else
	{		
		BaflUtils::EnsurePathExistsL(CCoeEnv::Static()->FsSession(),iCurrentFile.iName);
		
		// record new Wav sound file.
		iFormat = new (ELeave) TMdaWavClipFormat;
		iCodec = new (ELeave) TMdaWavCodec(); 
 
		iAudioDataSettings = new (ELeave) TMdaAudioDataSettings;
		iAudioDataSettings->iSampleRate = 8000;
		iAudioDataSettings->iChannels = 1;// mono
		iRecorderUtility->OpenL(&iCurrentFile,&iMdaWavClipFormat,NULL,NULL);
	}
	
	if(iExampleTimer)	
	{
		iExampleTimer->After(KReFreshTimeOut);
	}
	
}
 
void CAudioRecorder::StopL(void)
{

	if(iExampleTimer)
	{
		iExampleTimer->Cancel();
	}
	
    if(iRecorderUtility)
    {
    	iRecorderUtility->Stop();
    }
 
    ReportStateAndTime();
    
}
 
void CAudioRecorder::SetVolume(TInt& aVolume)
{

	if(aVolume < 1)
		aVolume = 1;
	else if(aVolume > 10)
		aVolume = 10;
	
	iVolume = aVolume;// save to internal value always
	if(iRecorderUtility) // and if utility exists, set it to it as well.
	{
		TInt Vol = ((iRecorderUtility->MaxVolume() * iVolume) / 10);
		iRecorderUtility->SetVolume(Vol);
	}
}
 
void CAudioRecorder::ReportStateAndTime(void)
{
 
	TInt CurrPosition(0),FileDuration(0);
	
	CMdaAudioClipUtility::TState CurrState(CMdaAudioClipUtility::ENotReady);
	
	if(iRecorderUtility)
	{
		CurrState =  iRecorderUtility->State();
		
		TInt64 HelpPos = iRecorderUtility->Position().Int64();	
		CurrPosition = HelpPos / 1000000;
 
		HelpPos = iRecorderUtility->RecordTimeAvailable().Int64();
		FileDuration = HelpPos / 1000000;
	}
	
	iObserver.StateUpdate(CurrState,CurrPosition,FileDuration);
	 
}
 
 
void CAudioRecorder::MoscoStateChangeEvent(CBase* aObject, TInt aPreviousState, TInt aCurrentState, TInt aErrorCode)
{
 

	if(aObject == iRecorderUtility)
	{
		ReportStateAndTime();
		
		switch(aCurrentState)
		{
		case CMdaAudioClipUtility::EOpen:
			{
			
				if(aPreviousState == CMdaAudioClipUtility::ENotReady)
				{
					TInt Vol = ((iVolume * iRecorderUtility->MaxVolume()) / 10);
					iRecorderUtility->SetVolume(Vol);
					
					
					TRAPD(err,
						iRecorderUtility->SetGain(iRecorderUtility->MaxGain());
			    		iRecorderUtility->RecordL(););
					
				}
			}
			break;
		case CMdaAudioClipUtility::EPlaying:
            {
            
            }           
            break;		    
		case CMdaAudioClipUtility::ERecording:
            {
            
            }           
            break;		    
		case CMdaAudioClipUtility::ENotReady:
            {
            
            }           
            break;		    
		default: // no need to do anything on these states.
		    {
		    
		    }		    
			break;
		}
	}
}

⌨️ 快捷键说明

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