Well I basically used the example from the SDK and only tweaked it a little.
Furthermore I was running the application for a long time and the crash didn't happen now. So it's a very strange behaviour...
Here is my class for recording:
Code:
/*
* ============================================================================
* Name : Recorderadapter.cpp
* Part of : RecorderExample
* Created : 20.03.2005 by Forum Nokia
* Version : 1.0.0
* Copyright: Nokia Corporation
* ============================================================================
*/
//INCLUDES
#include "PhoneMuse.hrh"
#include <e32base.h>
#include <eikmenup.h>
#include <eikapp.h>
#include <eikappui.h>
#include <eikenv.h>
#include <aknutils.h>
#include "PhoneMuseAppView.h"
#include "recorderadapter.h"
#include <aknnotewrappers.h> //warning note
#include <e32std.h> //tint64
// The sound file's name produced in recording mode
_LIT(KRecorderFile, "record");
_LIT(KRecorderFileEnd, ".wav");
_LIT(KAudioRecorder, "Recorder");
_LIT(KPath, "C:\\");
_LIT(KFileName, "C:\\record%d.wav");
// ----------------------------------------------------
// CRecorderAdapter::CRecorderAdapter()
// C++ default constructor
// ----------------------------------------------------
CRecorderAdapter::CRecorderAdapter()
{
iStatus = EStop;
}
// ----------------------------------------------------
// CRecorderAdapter::NewL()
// ----------------------------------------------------
CRecorderAdapter* CRecorderAdapter::NewL(CPhoneMuseAppView* Container)
{
CRecorderAdapter* self = NewLC(Container);
CleanupStack::Pop(self);
return self;
}
// ----------------------------------------------------
// CRecorderAdapter::NewLC()
// ----------------------------------------------------
CRecorderAdapter* CRecorderAdapter::NewLC(CPhoneMuseAppView* Container)
{
CRecorderAdapter* self = new (ELeave) CRecorderAdapter();
CleanupStack::PushL(self);
self->ConstructL(Container);
return self;
}
// ----------------------------------------------------
// CRecorderAdapter::ConstructL()
// Recorder is initialized
// ----------------------------------------------------
void CRecorderAdapter::ConstructL(CPhoneMuseAppView* Container)
{
iContainer = Container;
iBuf = HBufC8::NewMaxL(bufsize);
iMdaAudioRecorderUtility = CMdaAudioRecorderUtility::NewL(*this, 0, 80, EMdaPriorityPreferenceQuality);
iTrack = 1;
//Open last recent audio file
OpenFileL(EFalse);
}
// ----------------------------------------------------
// CRecorderAdapter::~CRecorderAdapter()
// ----------------------------------------------------
CRecorderAdapter::~CRecorderAdapter()
{
delete iMdaAudioRecorderUtility;
iMdaAudioRecorderUtility = NULL;
}
void CRecorderAdapter::UpdateMenuL(CEikMenuPane* /*aMenuPane*/)
{
}
// ----------------------------------------------------
// CRecorderAdapter::PlayL()
// Set position and start playing audio file
void CRecorderAdapter::PlayL()
{
// Set playback position to the start of the file
iPosition = TTimeIntervalMicroSeconds(0);
iContainer->UpdateRecStatus(ETrue);
PlayCurrentPositionL();
}
// ----------------------------------------------------
// CRecorderAdapter::PlayCurrentPositionL()
// Start playing after setting up player
// ----------------------------------------------------
void CRecorderAdapter::PlayCurrentPositionL()
{
// Play through the device speaker
iMdaAudioRecorderUtility->SetAudioDeviceMode(CMdaAudioRecorderUtility::ELocal);
// Set maximum volume for playback
iMdaAudioRecorderUtility->SetVolume(iMdaAudioRecorderUtility->MaxVolume() - (iMdaAudioRecorderUtility->MaxVolume() / 4));
//Set position to last played position
iMdaAudioRecorderUtility->SetPosition(iPosition);
iMdaAudioRecorderUtility->PlayL();
iStatus = EPlaying;
}
// ----------------------------------------------------
// CRecorderAdapter::GetRecorderStatus()
// Return recorder status
// ----------------------------------------------------
TRecorderAdapterStatus CRecorderAdapter::GetRecorderStatus()
{
return iStatus;
}
// ----------------------------------------------------
// CRecorderAdapter::StopL()
// Stop both playing and recording
// ----------------------------------------------------
void CRecorderAdapter::StopL(TRecorderAdapterStatus aStatus)
{
iPosition = iMdaAudioRecorderUtility -> Position();
iMdaAudioRecorderUtility->Stop();
iStatus = aStatus;
iContainer->UpdateRecStatus(EFalse);
}
// ----------------------------------------------------
// CRecorderAdapter::RecordL()
// Starts recording after setting up
// ----------------------------------------------------
void CRecorderAdapter::RecordL()
{
iStatus = ERecording;
// New audio file can be opened in
// Series 60 Platform 2nd Edition, including FP1 and FP2
OpenFileL(ETrue);
}
// ----------------------------------------------------
// CRecorderAdapter::OpenFileL()
// Open last recent file or new file with bigger running number
// ----------------------------------------------------
void CRecorderAdapter::OpenFileL(TBool newFile)
{
aFileName.Format(KFileName, iTrack);
// Open an existing sample file for playback or recording,
// causes MMdaObjectStateChangeObserver::MoscoStateChangeEvent to be called
iMdaAudioRecorderUtility->Close();
iMdaAudioRecorderUtility->OpenFileL(aFileName);
}
// ----------------------------------------------------
// CRecorderAdapter::Identify()
// Returns identify string
// ----------------------------------------------------
const TDesC& CRecorderAdapter::Identify()
{
return KAudioRecorder;
}
// ----------------------------------------------------
// CRecorderAdapter::MoscoStateChangeEvent()
// Is called, if recorder's state change.
// ----------------------------------------------------
void CRecorderAdapter::MoscoStateChangeEvent(CBase* /*Object*/, TInt aPreviousState, TInt CurrentState, TInt aErrorCode)
{
if (aErrorCode != KErrNone)
{
//If user wants record, but errors occurs, warning note is shown
if (iStatus == ERecording)
{
_LIT(text, "Recording failed!");
CAknWarningNote* note = new (ELeave) CAknWarningNote();
note -> ExecuteLD(text);
}
iStatus = EStop;
}
//When recorder is ready and state is ERecording, recording may start
else if (iStatus == ERecording && CurrentState == 1 && aPreviousState == 0)
{
// Set maximum gain for recording
iMdaAudioRecorderUtility->SetGain(iMdaAudioRecorderUtility->MaxGain());
iMdaAudioRecorderUtility->SetPosition(TTimeIntervalMicroSeconds(0));
iMdaAudioRecorderUtility->RecordL();
iContainer->UpdateRecStatus(ETrue);
//iContainer ->ResetAllValues(GetDuration(), GetMaxDuration());
}
//If playing stops to end of the file, status changes to EStop
else if (iStatus == EPlaying && CurrentState == 1)
{
iStatus = EStop;
}
}
// ----------------------------------------------------
// CRecorderAdapter::GetDuration()
// Returns current duration in seconds.
// ----------------------------------------------------
TInt CRecorderAdapter::GetDuration()
{
TTimeIntervalMicroSeconds returnValue;
if (iStatus == ERecording)
returnValue = iMdaAudioRecorderUtility -> Duration();
else if (iStatus == EPlaying)
returnValue = iMdaAudioRecorderUtility -> Position();
else
return 0;
TInt64 time = returnValue.Int64();
time = time / 1000000;
//return time.GetTInt();
return TInt(time);
}
// ----------------------------------------------------
// CRecorderAdapter::GetMaxDuration()
// Returns audiofile's maximun duration in seconds.
// ----------------------------------------------------
TInt CRecorderAdapter::GetMaxDuration()
{
TTimeIntervalMicroSeconds returnValue;
if (iStatus == ERecording)
returnValue = iMdaAudioRecorderUtility -> RecordTimeAvailable();
else if (iStatus == EPlaying || iStatus == EPause)
returnValue = iMdaAudioRecorderUtility -> Duration();
else
return 0;
TInt64 time = returnValue.Int64();
time = time / 1000000;
//return time.GetTInt();
return TInt(time);
}
HBufC8* CRecorderAdapter::getData()
{
return iBuf;
}
void CRecorderAdapter::setTrack(int track)
{
iTrack=track;
OpenFileL(ETrue);
}
TFileName CRecorderAdapter::getFileName()
{
return aFileName;
}
// End of File