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
--
| 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 |
