📄 tinputstream.cpp
字号:
// TInputStream.cpp
//
// Copyright (c) 2003 Symbian Ltd. All rights reserved.
//
#include <barsread.h>
#include <eikbtpan.h>
#include <eikcmbut.h>
#include <eiklabel.h>
#include <eikmover.h>
#include <eikbtgpc.h>
#include <eikon.hrh>
#include <eikon.rsg>
#include "TInputStream.h"
const TInt KBufferSize = 16000;
//
// CTInputStreamAppView
//
CTInputStreamAppView::CTInputStreamAppView():
CCoeControl()
{}
CTInputStreamAppView::~CTInputStreamAppView()
{
delete iBitmapGc;
delete iBitmapDev;
delete iBitmap;
}
void CTInputStreamAppView::ConstructL(const TRect& aRect)
{
CreateWindowL();
SetRect(aRect);
ActivateL();
const CFont* font = ControlEnv()->NormalFont();
iFontHeight = font->HeightInPixels();
iFontAscent = font->AscentInPixels();
iBitmap = new(ELeave) CFbsBitmap;
User::LeaveIfError(iBitmap->Create(aRect.Size(),Window().DisplayMode()));
iBitmapDev = CFbsBitmapDevice::NewL(iBitmap);
iBitmapDev->CreateContext(iBitmapGc);
iBitmapGc->UseFont(font);
iBitmapGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
iBitmapGc->SetBrushColor(KRgbWhite);
iBitmapGc->Clear();
}
void CTInputStreamAppView::AddMessage(const TDesC& aMessage)
{
iBitmapGc->CopyRect(TPoint(0,-iFontHeight),Rect());
const TRect messageRect(0,Rect().iBr.iY - iFontHeight,Rect().iBr.iX,Rect().iBr.iY);
iBitmapGc->DrawText(aMessage,messageRect,iFontAscent);
Window().Invalidate();
}
void CTInputStreamAppView::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.BitBlt(aRect.iTl,iBitmap,aRect);
}
//
// CTInputStreamAppUi
//
CTInputStreamAppUi::~CTInputStreamAppUi()
{
delete iInput;
delete iOutput;
iBuffer.ResetAndDestroy();
if (iAppView)
{
RemoveFromStack(iAppView);
delete iAppView;
}
}
void CTInputStreamAppUi::ConstructL()
{
BaseConstructL();
iAppView = new(ELeave) CTInputStreamAppView;
iAppView->ConstructL(ClientRect());
AddToStackL(iAppView);
iSettings.iChannels = TMdaAudioDataSettings::EChannelsMono;
iSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate8000Hz;
iInput = CMdaAudioInputStream::NewL(*this);
iInput->Open(&iSettings);
iOutput = CMdaAudioOutputStream::NewL(*this);
iOutput->Open(&iSettings);
TDes8* buffer = new(ELeave) TBuf8<KBufferSize>;
buffer->SetMax();
CleanupStack::PushL(buffer);
User::LeaveIfError(iBuffer.Append(buffer));
CleanupStack::Pop(buffer);
buffer = new(ELeave) TBuf8<KBufferSize>;
buffer->SetMax();
CleanupStack::PushL(buffer);
User::LeaveIfError(iBuffer.Append(buffer));
CleanupStack::Pop(buffer);
buffer = new(ELeave) TBuf8<KBufferSize>;
buffer->SetMax();
CleanupStack::PushL(buffer);
User::LeaveIfError(iBuffer.Append(buffer));
CleanupStack::Pop(buffer);
}
void CTInputStreamAppUi::HandleCommandL(TInt aCommand)
{
switch (aCommand)
{
case ETInputStreamCmdRecord:
RecordL();
break;
case ETInputStreamCmdPlay:
PlayL();
break;
case EAknSoftkeyBack:
CEikAppUi::Exit();
break;
}
}
void CTInputStreamAppUi::MaiscOpenComplete(TInt aError)
{
if (aError != KErrNone)
{
TBuf<32> buf(_L("Input err "));
buf.AppendNum(aError);
iAppView->AddMessage(buf);
}
OpenCompleteL(aError);
}
void CTInputStreamAppUi::MaiscBufferCopied(TInt aError, const TDesC8& aBuffer)
{
TBuf<32> buf(_L("Buf "));
if (&aBuffer == iBuffer[0])
buf.AppendNum(1);
else if (&aBuffer == iBuffer[1])
buf.AppendNum(2);
else if (&aBuffer == iBuffer[2])
{
buf.AppendNum(3);
iState = EOpen;
}
buf.Append(_L(" full, err "));
buf.AppendNum(aError);
iAppView->AddMessage(buf);
User::LeaveIfError(aError);
}
void CTInputStreamAppUi::MaiscRecordComplete(TInt aError)
{
iState = EOpen;
TBuf<32> buf(_L("Record complete, err "));
buf.AppendNum(aError);
iAppView->AddMessage(buf);
User::LeaveIfError(aError);
}
void CTInputStreamAppUi::MaoscOpenComplete(TInt aError)
{
if (aError != KErrNone)
{
TBuf<32> buf(_L("Output err "));
buf.AppendNum(aError);
iAppView->AddMessage(buf);
}
OpenCompleteL(aError);
}
void CTInputStreamAppUi::MaoscBufferCopied(TInt aError, const TDesC8& aBuffer)
{
TBuf<32> buf(_L("Buf "));
if (&aBuffer == iBuffer[0])
buf.AppendNum(1);
else if (&aBuffer == iBuffer[1])
buf.AppendNum(2);
else if (&aBuffer == iBuffer[2])
buf.AppendNum(3);
buf.Append(_L(" played, err "));
buf.AppendNum(aError);
iAppView->AddMessage(buf);
User::LeaveIfError(aError);
}
void CTInputStreamAppUi::MaoscPlayComplete(TInt aError)
{
iState = EOpen;
if (aError == KErrUnderflow)
aError = KErrNone;
TBuf<32> buf(_L("Play complete, err "));
buf.AppendNum(aError);
iAppView->AddMessage(buf);
User::LeaveIfError(aError);
}
void CTInputStreamAppUi::OpenCompleteL(TInt aError)
{
User::LeaveIfError(aError);
if (iState == EClosed)
{
iState = EFirstOpenSuccessful;
}
else
{
iState = EOpen;
iAppView->AddMessage(_L("Ready"));
iInput->SetGain(iInput->MaxGain());
iOutput->SetVolume(iOutput->MaxVolume() / 2);
}
}
void CTInputStreamAppUi::RecordL()
{
if (iState != EOpen)
User::Leave(KErrNotReady);
iState = ERecording;
for (TInt index = 0; index < iBuffer.Count(); index++)
{
iInput->ReadL(*iBuffer[index]);
}
}
void CTInputStreamAppUi::PlayL()
{
if (iState != EOpen)
User::Leave(KErrNotReady);
iState = EPlaying;
for (TInt index = 0; index < iBuffer.Count(); index++)
{
iOutput->WriteL(*iBuffer[index]);
}
}
//
// CTInputStreamApp
//
TUid CTInputStreamApp::AppDllUid() const
{
return KUidMdaAudioInputStreamingTestApp;
}
CApaDocument* CTInputStreamApp::CreateDocumentL()
{
return new(ELeave) CTInputStreamDocument(*this);
}
//
// CTInputStreamDocument
//
CTInputStreamDocument::CTInputStreamDocument(CEikApplication& aApp)
: CAknDocument(aApp)
{}
CEikAppUi* CTInputStreamDocument::CreateAppUiL()
{
return new(ELeave) CTInputStreamAppUi;
}
EXPORT_C CApaApplication* NewApplication()
{
return new CTInputStreamApp;
}
GLDEF_C TInt E32Dll(TDllReason)
{
return KErrNone;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -