⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audioengine.cpp

📁 封装了Symbian OS 3rd的音频播放器
💻 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 + -