亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cmixerthread.cpp

?? symbian適合于正苦于聲音流開發者.用到了聲音流的處理技巧和SYMBIAN中最生要的活動對象和聲通合成技術.
?? CPP
字號:
   /*
    *
============================================================================
    *  Name     : CMixerThread.cpp
    *  Part of  : SoundMixer
    *  Created  : 03/01/2003 by Forum Nokia
    *  Description:
    *     This is the project specification file for SoundMixer.
    *
    *  Version  : 1.0.0
    *  Copyright: Forum Nokia
    *
============================================================================
    */

// INCLUDES
#include "CMixerThread.h"
#include <e32svr.h>
#include "TSample.h"
#include "TAudioShared.h"

// CONSTANTS
const TInt KSampleRate = 16000;	                // sample rate used
const TInt KBufferSize = KSampleRate / 20;	// 20 buffers per second


TInt CMixerThread::ThreadFunction( TAny* aData )
	{
	TAudioShared& shared = *((TAudioShared*)aData);

	// tell client we're alive
	// signaled off when destroying this thread
	shared.iAliveMutex.Wait();

	CMixerThread* mixerThread = CMixerThread::Create( aData );
	if( mixerThread == NULL )
		{
		return KErrGeneral;
		}

	// if we're still here, activescheduler has been constructed
	// start wait loop which runs until it's time to end the thread
	CActiveScheduler::Start();
	delete mixerThread;

	// tell owning thread it's safe to exit
	shared.iAliveMutex.Signal();

    return KErrNone;
	}


CMixerThread* CMixerThread::Create( TAny* aData )
	{
	CMixerThread* self = new CMixerThread( aData );
	if( self == NULL ) return self;
	if( self->Construct() != KErrNone )
		{
		delete self;
		return NULL;
		}

	return self;
	}

TInt CMixerThread::Construct()
	{
	// create cleanup stack
	iCleanupStack = CTrapCleanup::New();
	if( iCleanupStack == NULL )
		{
		return KErrNoMemory;
		}

	TInt err = KErrNone;
	TRAP( err, ConstructL() );

	return err;
	}

void CMixerThread::ConstructL()
	{
	// create active scheduler
	iActiveScheduler = new( ELeave )CActiveScheduler;
	CActiveScheduler::Install( iActiveScheduler );

	// sound inits
	iSet.iChannels = TMdaAudioDataSettings::EChannelsMono;
	iSet.iSampleRate = TMdaAudioDataSettings::ESampleRate16000Hz;
	iSet.iVolume = 1;

	iMixBuffer = new( ELeave )TInt[ KBufferSize ];
	iBuffer = new( ELeave )TInt16[ KBufferSize ];

	iBufferPtr.Set( TPtrC8( (TUint8*)iBuffer, KBufferSize*2 ) );

	// store pointer of this class to thread local store
	// for use in ExcHandler ( static function )
	Dll::SetTls( this );
	RThread().SetExceptionHandler( ExcHandler, 0xffffffff );

	}

CMixerThread::CMixerThread( TAny* aData )
	: iShared( *((TAudioShared*)aData) )
	{
	}

CMixerThread::~CMixerThread()
	{
	delete iStream;
	delete iBuffer;
	delete iMixBuffer;

	delete iActiveScheduler;
	delete iCleanupStack;
	}

void CMixerThread::ExcHandler( TExcType aExc )
	{
	// exception handler entry function
	CMixerThread* mixerPointer = (CMixerThread*)Dll::Tls();
	mixerPointer->HandleException( aExc );
	}

void CMixerThread::HandleException( TExcType aExc )
	{
	// handle exceptions
	// exception type EExcUserInterrupt is reserved for inter-thread communication
	switch( aExc )
		{
		case EExcUserInterrupt:				// Command from client
			{
			switch( iShared.iCmd )
				{
				case ECmdStartMixer:
					{
					StartMixer();
					break;
					}
				case ECmdStopMixer:
					{
					StopMixer();
					break;
					}
				case ECmdDestroyMixer:
					{
					CActiveScheduler::Stop();		// Exit
					break;
					}

				}
			break;
			}
		default:
			{
			// if unknown exception, just exit this thread
			CActiveScheduler::Stop();				// Exit
			break;
			}
		}

	}


void CMixerThread::StartMixer()
	{
	iStream = CMdaAudioOutputStream::NewL( *this );
	iStream->Open( &iSet );
	}


void CMixerThread::StopMixer()
	{
	iStream->Stop();
	delete iStream;
	iStream = NULL;
	}

void CMixerThread::FillBuffer()
	{
	// wait for access to shared data
	iShared.iMutex.Wait();

	TInt volume = iShared.iMainVolume;
	//
	// Gather new sample information
	//
	TInt i;
	for( i=0; i<KMaxChannels; i++ )
		{
		if( iShared.iPlayStarted[ i ] )
			{
			iShared.iPlayStarted[ i ] = EFalse;
			TSample& s = iShared.iSample[ i ];

			iAudioData[ i ] = s.iData;
			iAudioPos[ i ] = 0;
			iAudioEnd[ i ] = s.iLength << KAudioShift;
			iRepStart[ i ] = s.iRepStart << KAudioShift;
			iRepEnd[ i ] = s.iRepEnd << KAudioShift;
			}
		}
	// give access to shared data
	iShared.iMutex.Signal();

	//
	// Clear buffer
	// has to be done because channels are mixed by adding their values
	// to each other
	//
	Mem::FillZ( iMixBuffer, KBufferSize*4 );

	//
	// Mix active channels
	//
	for( i=0; i<KMaxChannels; i++ )
		{
		if( iAudioData[ i ] != NULL )
			{
			TInt* buf = iMixBuffer;
			TInt* bufEnd = buf + KBufferSize;

			TInt16* src = iAudioData[ i ];

			TInt pos = iAudioPos[ i ];
			TInt posEnd = iAudioEnd[ i ];
			TInt repStart = iRepStart[ i ];
			TInt repEnd = iRepEnd[ i ];
			TInt posAdd = ( iShared.iFrequency[ i ] << KAudioShift ) / KSampleRate;
			TInt volume = iShared.iVolume[ i ];

			while( buf < bufEnd )
				{
				TInt sample = ( src[ pos >> KAudioShift ] * volume );
				pos += posAdd;
				if( pos >= posEnd )
					{
					if( repEnd == 0 )
						{
						iAudioData[ i ] = NULL;
						break;
						}
					else
						{
						pos = repStart;
						posEnd = repEnd;
						}
					}
				*buf++ += sample;
				}
			iAudioPos[ i ] = pos;
			iAudioEnd[ i ] = posEnd;

			}
		}


	// convert 32-bit mixing buffer to 16-bit output buffer
	TInt* buf = iMixBuffer;
	TInt* bufEnd = buf + KBufferSize;
	TInt16* buf2 = iBuffer;
	while( buf < bufEnd )
		{
		// 32-bit mixer buffer contents are multiplied by main volume
		// shifts are in two phases to prevent overflow and maintain quality
		TInt value = ( ( *buf++ >> 8 ) * volume ) >> 8;

		// Prevent sound from trashing on overboost volume:
		if( value < -0x7fff ) value = -0x7fff;
		if( value > 0x7fff ) value = 0x7fff;

		// and write to buffer
		*buf2++ = (TInt16)value;
		}

	// write 16-bit buffer to CMdaAudioOutputStream
	iStream->WriteL( iBufferPtr );
	}

void CMixerThread::MaoscBufferCopied( TInt aError, const TDesC8& /*aBuffer*/ )
	{
	if( aError )
		{
		iError = aError;
		}
	else
		{
		FillBuffer();
		}
	}

void CMixerThread::MaoscOpenComplete( TInt aError )
	{
	if( aError )
		{
		iError = aError;
		}
	else
		{
		iStream->SetVolume( iStream->MaxVolume() );
		FillBuffer();
		}
	}

void CMixerThread::MaoscPlayComplete( TInt aError )
	{
	if( aError )
		{
		iError = aError;
		}
	else
		{
		iStream->SetVolume( iStream->MaxVolume() );
		FillBuffer();
		}
	}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲高清不卡在线| 视频一区二区三区入口| 91精品国产综合久久精品麻豆 | 91精品国产色综合久久不卡电影| 国产成人无遮挡在线视频| 亚洲一二三四久久| 中文子幕无线码一区tr| 制服丝袜亚洲播放| 欧美艳星brazzers| 99久久精品国产精品久久| 久久成人免费网站| 日本欧美在线看| 亚洲综合一二区| 中文字幕在线观看一区| 久久久久88色偷偷免费| 欧美一区二区日韩| 欧美日韩不卡一区| 色妞www精品视频| av电影一区二区| 成人免费va视频| 国产不卡高清在线观看视频| 美美哒免费高清在线观看视频一区二区 | 亚洲视频资源在线| 日本一二三四高清不卡| 久久尤物电影视频在线观看| 日韩免费在线观看| 欧美一区二区三区啪啪| 欧美日韩第一区日日骚| 欧美亚洲国产一区二区三区va| av不卡一区二区三区| 懂色av一区二区在线播放| 韩国欧美国产1区| 韩国欧美国产1区| 精品系列免费在线观看| 久久se精品一区二区| 久草热8精品视频在线观看| 蜜臀久久久久久久| 久久99精品久久久久久国产越南 | 欧美videossexotv100| 欧美一级夜夜爽| 日韩欧美你懂的| 26uuu精品一区二区在线观看| 精品第一国产综合精品aⅴ| 精品91自产拍在线观看一区| 日韩欧美激情一区| 久久久精品综合| 国产精品青草综合久久久久99| 中文一区二区在线观看| 国产精品白丝在线| 亚洲一区二区三区中文字幕| 亚洲国产三级在线| 免费看欧美美女黄的网站| 精品在线播放免费| 国产成人av自拍| 99久久伊人久久99| 日本韩国视频一区二区| 欧美精品日韩一本| 精品播放一区二区| 国产精品久久三| 一区二区三区小说| 欧美a一区二区| 国产成人精品一区二区三区四区| 99精品视频一区| 欧美理论片在线| www国产亚洲精品久久麻豆| 中文字幕乱码亚洲精品一区| 亚洲精品国产a| 美女性感视频久久| 成年人国产精品| 欧美疯狂性受xxxxx喷水图片| 日韩欧美成人激情| 亚洲日本一区二区| 蜜桃av一区二区| gogogo免费视频观看亚洲一| 欧美日韩国产综合一区二区| 精品日产卡一卡二卡麻豆| 国产精品久久久久久久蜜臀| 日韩精品免费视频人成| 粉嫩欧美一区二区三区高清影视| 91成人在线观看喷潮| 亚洲精品一区二区三区香蕉| 亚洲欧美日韩在线不卡| 九九九久久久精品| 日本韩国一区二区三区视频| 精品99久久久久久| 亚洲成人一区在线| 成人动漫视频在线| 日韩精品最新网址| 亚洲乱码国产乱码精品精的特点 | 亚洲v精品v日韩v欧美v专区| 国产高清视频一区| 欧美日韩视频第一区| 久久精品一区二区| 日本不卡在线视频| 在线观看一区二区精品视频| 国产女主播在线一区二区| 午夜精品久久久久久久蜜桃app| 成人精品gif动图一区| 3d成人h动漫网站入口| 亚洲人123区| 国产成人免费视频| 91精品国产品国语在线不卡| 亚洲欧美日韩中文播放| 成人免费看黄yyy456| 欧美不卡一区二区| 婷婷国产v国产偷v亚洲高清| 色噜噜狠狠成人网p站| 亚洲国产激情av| 国产一区二区三区观看| 欧美一区二区精美| 亚洲国产成人va在线观看天堂| 成人精品免费网站| 久久先锋影音av鲁色资源| 美女精品自拍一二三四| 这里只有精品电影| 亚洲福利一二三区| 欧美无乱码久久久免费午夜一区| 国产精品久久三| 成人精品视频网站| 国产精品久久影院| 成人免费毛片aaaaa**| 中文字幕高清一区| 国产成人福利片| 日本一区二区三区在线不卡| 国产综合色产在线精品| 久久综合成人精品亚洲另类欧美| 久久99精品国产.久久久久久| 欧美一区二区三区视频| 日本成人在线网站| 日韩免费看的电影| 久久99久久99| 久久亚洲欧美国产精品乐播| 国产在线看一区| 久久精子c满五个校花| 国产乱对白刺激视频不卡| 亚洲精品在线观看网站| 国内成人免费视频| 国产日韩精品一区二区三区 | 亚洲国产成人av好男人在线观看| 91成人网在线| 亚洲精品ww久久久久久p站| 91国偷自产一区二区三区观看| 亚洲激情一二三区| 欧美日韩美少妇| 免费xxxx性欧美18vr| 2023国产精品自拍| 大胆亚洲人体视频| 亚洲欧美日韩小说| 欧美顶级少妇做爰| 韩国三级电影一区二区| 中文乱码免费一区二区| 色诱视频网站一区| 午夜精品一区二区三区免费视频| 欧美一激情一区二区三区| 国产精品香蕉一区二区三区| 国产精品成人免费| 欧美乱妇20p| 极品销魂美女一区二区三区| 久久精品人人爽人人爽| 97久久精品人人做人人爽 | 成人免费的视频| 亚洲一卡二卡三卡四卡无卡久久| 欧美一级黄色大片| 国产69精品一区二区亚洲孕妇 | 国产又黄又大久久| 中文字幕一区二区三区在线观看 | 国产精品久久久久久久久免费桃花 | 精品黑人一区二区三区久久| 国产传媒日韩欧美成人| 一区二区三区成人| 精品免费视频.| a亚洲天堂av| 日本午夜精品一区二区三区电影 | 国产日韩欧美一区二区三区乱码| 99精品视频一区二区三区| 日本人妖一区二区| 国产精品美女一区二区在线观看| 欧美三级在线视频| 国产很黄免费观看久久| 无码av免费一区二区三区试看| 国产三区在线成人av| 欧美性生活一区| 国产乱理伦片在线观看夜一区| 一区二区国产盗摄色噜噜| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产精品二三区| 51午夜精品国产| 91首页免费视频| 日本sm残虐另类| 亚洲激情图片小说视频| www国产精品av| 91精品欧美综合在线观看最新 | 99精品视频中文字幕| 久久不见久久见免费视频7| 亚洲欧美日韩国产中文在线| xfplay精品久久| 欧美精品第1页| 色婷婷久久久亚洲一区二区三区| 韩国欧美国产1区| 免费成人你懂的|