📄 audioengine.cpp
字号:
/*
============================================================================
Name : AudioEngine.cpp
Author :
Version :
Copyright : Your copyright notice
Description : CAudioEngine implementation
============================================================================
*/
#include "AudioEngine.h"
#include <eikenv.h>
#include <stringloader.h>
#include <barsread.h>
#include <aknutils.h>
const TInt KToneFrequency = 256;
const TInt KToneDuration = 4000000;
const TInt KToneVolumeDenominator = 1;
CAudioEngine::CAudioEngine( MAudioEngineObserver& aObserver )
: iObserver( aObserver )
, iState( EStoped )
{
}
CAudioEngine::~CAudioEngine()
{
StopAndDelete( );
}
CAudioEngine* CAudioEngine::NewL( MAudioEngineObserver& aObserver )
{
CAudioEngine* self=CAudioEngine::NewLC( aObserver );
CleanupStack::Pop();
return self;
}
CAudioEngine* CAudioEngine::NewLC( MAudioEngineObserver& aObserver )
{
CAudioEngine* self = new (ELeave)CAudioEngine( aObserver );
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
void CAudioEngine::ConstructL()
{
}
//========================CMdaAudioToneUtility 相关===============================
void CAudioEngine::MatoPrepareComplete( TInt aError )
{
if ( aError )
{
StopAndDelete( );
}
else
{
iPlayerTone->SetVolume( iPlayerTone->MaxVolume( ) / KToneVolumeDenominator );
iPlayerTone->Play();
}
}
void CAudioEngine::MatoPlayComplete( TInt /*aError*/ )
{
iState = EStoped;
delete iPlayerTone;
iPlayerTone = NULL;
TRAPD( err, iObserver.HandlePlayingStopedL() );
}
void CAudioEngine::PlayToneL()
{
iState = EPlaying;
iPlayerTone = CMdaAudioToneUtility::NewL( *this );
// 播放单音,可以通过PrepareToPlayXXX()函数播放从文件、描述符包含的DTMF和音频声音序列
iPlayerTone->PrepareToPlayTone( KToneFrequency, TTimeIntervalMicroSeconds( KToneDuration ) );
}
//===========================CMdaAudioPlayerUtility类相关=====================================
void CAudioEngine::MapcInitComplete( TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/ )
{
if ( KErrNone == aError )
{
iPlayerFile->SetVolume( iPlayerFile->MaxVolume() / KToneVolumeDenominator );
iPlayerFile->Play( );
}
else
{
StopAndDelete( );
}
}
void CAudioEngine::MapcPlayComplete( TInt /*aError*/ )
{
iState = EStoped;
delete iPlayerFile;
iPlayerFile = NULL;
TRAPD( err, iObserver.HandlePlayingStopedL( ) );
}
void CAudioEngine::PlayWavL( const TDesC& aWavFileName )
{
TFileName wavFile( aWavFileName );
User::LeaveIfError( CompleteWithAppPath( wavFile ) );
iState = EPlaying;
iPlayerFile = CMdaAudioPlayerUtility::NewFilePlayerL( wavFile, *this );
}
// 模拟器不支持Midi文件的回放,但它可以在大多数硬件设备上播放
void CAudioEngine::PlayMidiL( const TDesC& aMidiFileName )
{
#ifdef __WINS__
TFileName midiFile( aMidiFileName );
User::LeaveIfError( CompleteWithAppPath( midiFile ) );
iState = EPlaying;
iPlayerFile = CMdaAudioPlayerUtility::NewFilePlayerL( midiFile, *this );
#endif
}
//============================CMdaAudioOutputStream类相关================================
void CAudioEngine::MaoscOpenComplete( TInt aError )
{
if ( KErrNone == aError )
{
TRAPD( err, iPlayerStream->WriteL( *iStreamBuffer ) );
}
else
{
StopAndDelete( );
}
}
void CAudioEngine::MaoscBufferCopied( TInt aError, const TDesC8& /*aBuffer*/ )
{
if ( KErrNone == aError )
{
TRAPD( err, iPlayerStream->WriteL( *iStreamBuffer ) );
}
}
void CAudioEngine::MaoscPlayComplete( TInt /*aError*/ )
{
iState = EStoped;
delete iPlayerStream;
iPlayerStream = NULL;
delete iStreamBuffer;
iStreamBuffer = NULL;
delete[] iStreamData;
iStreamData = NULL;
TRAPD( err, iObserver.HandlePlayingStopedL( ) );
}
void CAudioEngine::PLayStreamL( const TDesC& aStreamFile )
{
// 打开文件并载入缓冲
RFs fs;
CleanupClosePushL( fs );
User::LeaveIfError( fs.Connect( ) );
RFile file;
CleanupClosePushL( file );
TFileName streamFile( aStreamFile );
User::LeaveIfError( CompleteWithAppPath( streamFile ) );
User::LeaveIfError ( file.Open( fs, streamFile, EFileRead | EFileShareReadersOnly ) );
TInt fileSize = 0;
file.Size( fileSize );
iStreamData = new ( ELeave ) TUint8[ fileSize ];
iStreamBuffer = new ( ELeave ) TPtr8( iStreamData, fileSize, fileSize );
file.Read( *iStreamBuffer );
CleanupStack::PopAndDestroy( 2 );
iState = EPlaying;
iPlayerStream = CMdaAudioOutputStream::NewL( * this );
// 设置声道,默认是单声道EChannelsMono
//iStreamSettings.iChannels = TMdaAudioDataSettings::EChannelsStereo; //EChannelsMono
// 设置音量
iStreamSettings.iVolume = iPlayerStream -> MaxVolume( ) / KToneVolumeDenominator;
// 设置播放频率
iStreamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate16000Hz;
iPlayerStream->Open( &iStreamSettings );
}
void CAudioEngine::StopAndDelete()
{
if ( iPlayerTone )
{
iPlayerTone->CancelPlay( );
}
if ( iPlayerFile )
{
iPlayerFile->Stop( );
iPlayerFile->Close( );
}
if ( iPlayerStream )
{
iPlayerStream->Stop( );
}
delete iPlayerTone;
iPlayerTone = NULL;
delete iPlayerFile;
iPlayerFile = NULL;
delete iPlayerStream;
iPlayerStream = NULL;
delete iStreamBuffer;
iStreamBuffer = NULL;
delete[] iStreamData;
iStreamData = NULL;
iState = EStoped;
}
TState CAudioEngine::State()
{
return iState;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -