Code:
CMdaAudioInputStream::ReadL()
_LIT(KAudioFilePCM, "sample.aud");
_LIT(KAudioFileAMR, "sample.amr");
CAudioStreamEngine* CAudioStreamEngine::NewL(CAudioStreamAppUi* aAppUi)
{
...
}
CAudioStreamEngine* CAudioStreamEngine::NewLC(CAudioStreamAppUi* aAppUi)
{
...
}
void CAudioStreamEngine::ConstructL()
{
iInputStream = CMdaAudioInputStream::NewL(*this);
iOutputStream = CMdaAudioOutputStream::NewL(*this);
iFs = CEikonEnv::Static()->FsSession();
iDefaultEncoding = iInputStream->DataType();
iCurrentEncoding = iDefaultEncoding;
iStreamBuffer = HBufC8::NewMaxL(iFrameSize * iFrameCount);
iStreamStart=0;
iStreamEnd=iFrameCount - 1;
User::LeaveIfError( iFs.CreatePrivatePath( EDriveC ) );
User::LeaveIfError( iFs.SetSessionToPrivate( EDriveC ) );
iStop = CIdle::NewL( CActive::EPriorityIdle );
iPlayUtility = CMdaAudioPlayerUtility::NewL(*this);
iPlayUtility->OpenUrlL(_L("rtsp://rmlivev8.bbc.net.uk/farm/*/ev7/live24/worldservice/livenews_v8.ra"));
iPlayUtility->Play();
}
CAudioStreamEngine::CAudioStreamEngine(CAudioStreamAppUi* aAppUi)
: iAppUi(aAppUi), iUseAMR(EFalse), iAudioFile(KAudioFilePCM), iFrameSize(KFrameSizePCM),
iFrameCount(KFrameCountPCM), iStreamBuffer(0), iFramePtr(0,0), iBufferOK(EFalse)
{
iStreamSettings.iChannels=TMdaAudioDataSettings::EChannelsMono;
iStreamSettings.iSampleRate=TMdaAudioDataSettings::ESampleRate8000Hz;
}
CAudioStreamEngine::~CAudioStreamEngine()
{
if (iInputStream)
{
if (iInputStatus!=ENotReady)
{iInputStream->Stop();}
delete iInputStream;
}
if (iOutputStream)
{
if (iOutputStatus!=ENotReady)
{iOutputStream->Stop();}
delete iOutputStream;
}
if (iStreamBuffer)
{delete iStreamBuffer;}
if (iStop)
{iStop->Cancel();}
delete iStop;
}
void CAudioStreamEngine::Play()
{
if (iInputStatus!=ENotReady || iOutputStatus!=ENotReady)
{return;}
if(!iBufferOK)
{return;}
iOutputStream->Open(&iStreamSettings);
}
void CAudioStreamEngine::Stop()
{
iPlayUtility->Stop();
if (iInputStatus!=ENotReady)
{
iInputStream->Stop();
iBufferOK = ETrue;
iInputStatus = ENotReady;
}
if (iOutputStatus!=ENotReady)
{
iOutputStream->Stop();
iOutputStatus = ENotReady;
}
}
void CAudioStreamEngine::LoadAudioFileL()
{
RFileReadStream audiofile;
TFileName fileName;
fileName.Copy(iAudioFilePath);
fileName.Append(iAudioFile);
TInt err = audiofile.Open(iFs, fileName, EFileRead|EFileStream);
iStreamBuffer->Des().FillZ(iFrameCount * iFrameSize); // Empty the stream buffer
if (err==KErrNone)
{
if (iUseAMR)
{
TBuf8<KAMRHeaderLength> temp;
audiofile.ReadL(temp, KAMRHeaderLength);
}
TUint idx=0;
while (idx < iFrameCount)
{
TRAPD(fstatus, audiofile.ReadL(GetFrame(idx), iFrameSize));
if (fstatus!=KErrNone)
break;
idx++;
}
iStreamStart=0;
iStreamEnd=idx-1;
iBufferOK = ETrue;
}
else
{
iBufferOK = EFalse;
}
audiofile.Close();
}
void CAudioStreamEngine::SaveAudioFileL()
{
if (!iBufferOK)
{
return;
}
RFileWriteStream audiofile;
TVolumeInfo volinfo;
TInt err=iFs.Volume(volinfo,EDriveC);
if ( volinfo.iFree<(iFrameCount*iFrameSize))
{return;}
TFileName fileName;
fileName.Copy(iAudioFilePath);
fileName.Append(iAudioFile);
err = audiofile.Replace(iFs, fileName, EFileWrite|EFileStream);
if (err==KErrNone)
{
if (iUseAMR)
{
for (int i = 0; i < KAMRHeaderLength; i++)
audiofile.WriteUint8L(KAMRNBHeader[i]);
}
for (TUint idx=iStreamStart; idx<=iStreamEnd; idx++)//iFrameCount; idx++)
{
audiofile.WriteL(GetFrame(idx));
}
}
audiofile.Close();
}
void CAudioStreamEngine::SetEncodingL(TBool aAmr)
{
if (iUseAMR != aAmr)
{
iUseAMR = aAmr;
if (iUseAMR)
{
TRAPD(err, iInputStream->SetDataTypeL(KMMFFourCCCodeAMR));
if (err != KErrNone)
{
iCurrentEncoding = iDefaultEncoding;
iUseAMR = EFalse;
return;
}
else
{
iCurrentEncoding = KMMFFourCCCodeAMR;
iAudioFile.Zero();
iAudioFile.Append(KAudioFileAMR);
iFrameCount = KFrameCountAMR;
iFrameSize = KFrameSizeAMR;
}
}
else
{
iCurrentEncoding = iDefaultEncoding;
iAudioFile.Zero();
iAudioFile.Append(KAudioFilePCM);
iFrameCount = KFrameCountPCM;
iFrameSize = KFrameSizePCM;
}
iBufferOK = EFalse;
if (iStreamBuffer) delete iStreamBuffer;
iStreamBuffer = NULL;
iStreamBuffer = HBufC8::NewMaxL(iFrameSize * iFrameCount);
iStreamStart=0;
iStreamEnd=iFrameCount - 1;
}
}
TPtr8& CAudioStreamEngine::GetFrame(TUint aFrameIdx)
{
__ASSERT_ALWAYS(aFrameIdx < iFrameCount,
User::Panic(_L("AudioStreamEx"), 1));
iFramePtr.Set((TUint8*)(iStreamBuffer->Ptr() + (aFrameIdx * iFrameSize)),iFrameSize,iFrameSize);
return iFramePtr;
}
TPtr8& CAudioStreamEngine::GetPlaybackFrames(TUint aLastFrame)
{
__ASSERT_ALWAYS(aLastFrame < iFrameCount,
User::Panic(_L("AudioStreamEx"), 2));
iFramePtr.Set((TUint8*)(iStreamBuffer->Ptr()),(aLastFrame + 1) * iFrameSize,(aLastFrame + 1) * iFrameSize);
return iFramePtr;
}
void CAudioStreamEngine::MaiscOpenComplete(TInt aError)
{
if (aError==KErrNone)
{
iInputStatus = EOpen;
TRAPD(error, iInputStream->SetDataTypeL(iCurrentEncoding));
PanicIfError(error);
iInputStream->SetGain(iInputStream->MaxGain());
iInputStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
iStreamBuffer->Des().FillZ(iFrameCount * iFrameSize);
iStreamIdx=0;
TRAPD(error2, iInputStream->ReadL(GetFrame(iStreamIdx)));
PanicIfError(error2);
}
else
{iInputStatus = ENotReady;}
}
void CAudioStreamEngine::MaiscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
{
if (aError!=KErrNone)
{
_LIT(KMessage,"Recording error: %d");
HBufC16* message = HBufC16::NewLC(KMessage().Length()+10);
message->Des().AppendFormat(KMessage,aError);
CleanupStack::PopAndDestroy();
message = NULL;
}
if (aError==KErrNone)
{
iStreamIdx++;
if (iStreamIdx == iFrameCount)
{
iStreamEnd = iStreamIdx - 1;
iBufferOK = ETrue;
iStop->Start( TCallBack(BackgroundStop, this) );
return;
}
TRAPD(error, iInputStream->ReadL(GetFrame(iStreamIdx)));
PanicIfError(error);
}
else if (aError==KErrAbort)
{
iStreamEnd = iStreamIdx - 1;
iBufferOK = ETrue;
iInputStatus = ENotReady;
}
else
{iInputStatus = ENotReady;}
}
TInt CAudioStreamEngine::BackgroundStop( TAny *aStream )
{
((CAudioStreamEngine*)aStream)->Stop();
return EFalse;
}
void CAudioStreamEngine::MaiscRecordComplete(TInt aError)
{iInputStatus = ENotReady;}
void CAudioStreamEngine::MaoscOpenComplete(TInt aError)
{
if (aError==KErrNone)
{
iOutputStatus = EOpen;
TRAPD(error, iOutputStream->SetDataTypeL(iCurrentEncoding));
PanicIfError(error);
iOutputStream->SetVolume(iOutputStream->MaxVolume()/2);
iOutputStream->SetPriority(EPriorityNormal,
EMdaPriorityPreferenceTime);
if (iUseAMR)
{
iStreamIdx = iStreamEnd;
TRAPD(error2, iOutputStream->WriteL(GetPlaybackFrames(iStreamEnd)));
PanicIfError(error2);
}
else
{
iStreamIdx = 0;
TRAPD(error3, iOutputStream->WriteL(GetFrame(iStreamIdx)));
PanicIfError(error3);
}
}
else
{iOutputStatus = ENotReady;}
}
void CAudioStreamEngine::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
{
if (aError==KErrNone)
{
if (iStreamIdx==iStreamEnd)
{iStop->Start( TCallBack(BackgroundStop, this) );}
else
{
iStreamIdx++;
TRAPD(error, iOutputStream->WriteL(GetFrame(iStreamIdx)));
PanicIfError(error);
}
}
else if (aError==KErrAbort)
{iOutputStatus = ENotReady;}
else
{iOutputStatus = ENotReady;}
}
void CAudioStreamEngine::MaoscPlayComplete(TInt aError)
{ iOutputStatus = ENotReady;}
void CAudioStreamEngine::MapcPlayComplete(TInt /*aError*/)
{}
void CAudioStreamEngine::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/)
{
if(aError == KErrNone)
{
iPlayUtility->SetVolume(iPlayUtility->MaxVolume());
}
}