Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 10:04, 12 December 2007.

Record audio files

From Forum Nokia Wiki

CAudioRecorder illustrates how to use CMdaAudioRecorderUtility for recording wav files, CAudioPlayer <Add link> shows the audio playing part using this same class.

CAudioRecorder requires MMdaObjectStateChangeObserver callback interface to be implemented by the calling class. The only function defined in this interface is used to update different states of the file playing. The recording to the file can start only after this interface function is called with EOpen. Note that EOpen is also given when the audio recording finishes, thus you should also check the previous state variable before calling any functions.

This example also requires calling class to implement own callback interface function that is used for updating the playing status. This status is updated according to the players status as well the playing process is updated using timer implementation.

AudioRecorder.cpp

#include <Mda\Common\Resource.h>
#include <BAUTILS.H>
 
#include "AudioRecorder.h"
 
const TInt	KReFreshTimeOut = 1000000; // re-fresh every second
 
CAudioRecorder* CAudioRecorder::NewL(MExmaplePlayRecStateObserver& aObserver)
    {
    CAudioRecorder* self = CAudioRecorder::NewLC(aObserver);
    CleanupStack::Pop(self);
    return self;
    }
 
CAudioRecorder* CAudioRecorder::NewLC(MExmaplePlayRecStateObserver& aObserver)
    {
    CAudioRecorder* self = new (ELeave) CAudioRecorder(aObserver);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }
 
CAudioRecorder::CAudioRecorder(MExmaplePlayRecStateObserver& aObserver)
:iObserver(aObserver),iVolume(5)
    {
 
    }
 
CAudioRecorder::~CAudioRecorder()
{
	delete iExampleTimer;
 
    if(iRecUtility)
    {
    	iRecUtility->Stop();
    	iRecUtility->Close();
    }
    
    delete iRecUtility;
    delete iFormat;
	delete iCodec;
	delete iSettings;
}
 
 
void CAudioRecorder::ConstructL()
{
	iExampleTimer = CExampleTimer::NewL(CActive::EPriorityStandard,*this);
 
	ReportStateAndTime();
}
 
void CAudioRecorder::TimerExpired(TAny* /*aTimer*/,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(iRecUtility)
    {
    	iRecUtility->Stop(); // stop any play/rec
    	iRecUtility->Close();// close previously opened file.
    }	
    
	delete iRecUtility;
	iRecUtility = NULL;
	iRecUtility = CMdaAudioRecorderUtility::NewL(*this);
	
	// and free ther reserved resources.
	delete iFormat;
	iFormat = NULL;
	delete iCodec;
	iCodec = NULL;
	delete iSettings;
	iSettings = NULL;
	
	// if the file exists, we append sound data to it.
	if(BaflUtils::FileExists(CCoeEnv::Static()->FsSession(),aFileName))
	{
		iRecUtility->OpenFileL(iCurrentFile.iName);
	}
	else
	{		
		BaflUtils::EnsurePathExistsL(CCoeEnv::Static()->FsSession(),iCurrentFile.iName);
		
		// record new Wav sound file.
		iFormat = new (ELeave) TMdaWavClipFormat;
		iCodec = new (ELeave) TMdaWavCodec(); 
 
		iSettings = new (ELeave) TMdaAudioDataSettings;
		iSettings->iSampleRate = 8000;
		iSettings->iChannels = 1;// mono
		iRecUtility->OpenL(&iCurrentFile,&iMdaWavClipFormat,NULL,NULL);
	}
	
	if(iExampleTimer)	
	{
		iExampleTimer->After(KReFreshTimeOut);
	}
}
 
void CAudioRecorder::StopL(void)
{
	if(iExampleTimer)
	{
		iExampleTimer->Cancel();
	}
	
    if(iRecUtility)
    {
    	iRecUtility->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(iRecUtility) // and if utility exists, set it to it as well.
	{
		TInt Vol = ((iRecUtility->MaxVolume() * iVolume) / 10);
		iRecUtility->SetVolume(Vol);
	}
}
 
void CAudioRecorder::ReportStateAndTime(void)
{
	TInt CurrPosition(0),FileDuration(0);
	
	CMdaAudioClipUtility::TState CurrState(CMdaAudioClipUtility::ENotReady);
	
	if(iRecUtility)
	{
		CurrState =  iRecUtility->State();
		
		TInt64 HelpPos = iRecUtility->Position().Int64();	
		CurrPosition = HelpPos / 1000000;
 
		HelpPos = iRecUtility->RecordTimeAvailable().Int64();
		FileDuration = HelpPos / 1000000;
	}
	
	iObserver.StateUpdate(CurrState,CurrPosition,FileDuration);
}
 
 
void CAudioRecorder::MoscoStateChangeEvent(CBase* aObject, TInt aPreviousState, TInt aCurrentState, TInt /*aErrorCode*/)
{
	if(aObject == iRecUtility)
	{
		ReportStateAndTime();
		
		switch(aCurrentState)
		{
		case CMdaAudioClipUtility::EOpen:
			{
				if(aPreviousState == CMdaAudioClipUtility::ENotReady)
				{
					TInt Vol = ((iVolume * iRecUtility->MaxVolume()) / 10);
					iRecUtility->SetVolume(Vol);
					
					TRAPD(err,
						iRecUtility->SetGain(iRecUtility->MaxGain());
			    		iRecUtility->RecordL(););
				}
			}
			break;
		case CMdaAudioClipUtility::EPlaying:
		case CMdaAudioClipUtility::ERecording:
		case CMdaAudioClipUtility::ENotReady:
		default: // no need to do anything on these states.
			break;
		}
	}
}

AudioRecorder.h

#include <MdaAudioSampleEditor.h>
#include <Mda\Client\Utility.h>
#include "CExampleTimer.h"
 
//
class MExmapleRecStateObserver
	{
	public:
		virtual void StateUpdate(CMdaAudioClipUtility::TState aState, TInt aPosition, TInt aDuration)=0;
	};
 
 
class CAudioRecorder : public CBase, public MMdaObjectStateChangeObserver
,MExampleTimerNotify
    {
public:
    static CAudioRecorder* NewL(MExmapleRecStateObserver& aObserver);
    static CAudioRecorder* NewLC(MExmapleRecStateObserver& aObserver);
     ~CAudioRecorder();
public:  // public functions 
	void RecordL(const TDesC& aFileName);
	void StopL(void);
	void SetVolume(TInt& aVolume);
private:// interna functions
	void ReportStateAndTime(void);
    void ConstructL();
    CAudioRecorder(MExmapleRecStateObserver& aObserver);
protected: // from MMdaObjectStateChangeObserver & MExampleTimerNotify
	void MoscoStateChangeEvent(CBase* aObject, TInt aPreviousState, TInt aCurrentState, TInt aErrorCode);
	void TimerExpired(TAny* aTimer,TInt aError);	
private:
	MExmapleRecStateObserver&		iObserver;
	CMdaAudioRecorderUtility* 		iToneUtility;
    TInt 							iVolume;
    TMdaWavClipFormat				iMdaWavClipFormat;
    TMdaFileClipLocation 			iCurrentFile;
    CExampleTimer*					iExampleTimer;
    TMdaClipFormat* 				iFormat;
	TMdaPackage* 					iCodec;
	TMdaAudioDataSettings* 			iSettings;
    };


Links

Audio Recording APIs

Recording audio with stream

MMF


--

Related Discussions
Thread Thread Starter Forum Replies Last Post
6230 3gp conveter FAB60 Graphics & Video & Streaming 19 2005-08-21 19:12
Accessing the voice samples.... jshunnar Symbian Media (Graphics & Sounds) 1 2007-10-04 04:20
Detecting spoken words within an AMR compressed audio file Miles08 Mobile Java Media (Graphics & Sounds) 5 2008-08-06 13:34
Audio Recording 6600 armandogarcia General Symbian C++ 1 2004-02-08 06:49
6230i playing MIDI and AMR melas21 Mobile Java Media (Graphics & Sounds) 9 2006-11-19 22:57
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtopicQUqfnTopicZaudioQ
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX