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

📄 pasoundio.cpp

📁 使用stl技术,(还没看,是听说的)
💻 CPP
字号:
// Conditional Build Step
#ifdef PA_AUDIO_BUILD
#include "PASoundIO.h"

namespace Ogre
{
	//----------------------------------------------------------------------- 
	SoundManager::SoundManager()
	{
	}
	
	//----------------------------------------------------------------------- 
	SoundManager::~SoundManager()
	{
	}

	//----------------------------------------------------------------------- 
	AudioClip::AudioClip()
	{
	}

	//----------------------------------------------------------------------- 
	AudioClip::~AudioClip()
	{
	}

	//---------------------------------------------------------------//
	int audioIOCallback( void *inputBuffer, void *outputBuffer,
						 unsigned long framesPerBuffer,
						 PaTimestamp outTime, void *userData )
	{
		Ogre::TheoraAudioStream *data = (Ogre::TheoraAudioStream*)userData;
		long numBytes = data->bytesPerFrame * framesPerBuffer;
		(void) outTime;
		(void) inputBuffer;

		if( outputBuffer != NULL )
		{
			long numRead = data->outFIFO.read( outputBuffer, numBytes );
			// Zero out remainder of buffer if we run out of data
			for( long i = numRead; i < numBytes; i++ )
			{
				((char *)outputBuffer)[i] = 0;
			}
		}

		return 0;
	}

	//----------------------------------------------------------------------- 
	bool AudioClip::openAudioStream( unsigned int sampleRate, 
						  eAudioSampleFormat sf,
						  unsigned int bufferSize,
						  unsigned int flags )
	{ 		
		PaSampleFormat format;
		mSampleRate = sampleRate;

		//Initialize PortAudio 
		if( Pa_Initialize() != paNoError ) 
			return false;

		if( (flags & THEORA_AUDIOSTREAM_STEREO) && (sf == SF_16Bit) )
			format = paInt16; 
		else if( (flags & THEORA_AUDIOSTREAM_STEREO) && (sf == SF_8Bit) )
			format = paInt16;
		else if ( sf == SF_16Bit )
			format = paInt16;
		else
			format = paInt16;

		PaError err = Pa_OpenStream( &aOutStream->stream, paNoDevice,
							 0, format, NULL, Pa_GetDefaultOutputDeviceID(),
							 aOutStream->samplesPerFrame, format, NULL,
							 sampleRate, FRAMES_PER_BUFFER, m_minNumBuffers,
							 paClipOff, audioIOCallback, aOutStream );
		
		if( err != paNoError )
		{
			closeAudioStream( );
			return false;
		}

		return true;
	} 
	
	//----------------------------------------------------------------------- 
	float AudioClip::getAudioStreamTime()
	{
		//This returns number of samples... so, devide by rate (ie 44100)
		float paTime;
		paTime = Pa_StreamTime( aOutStream->stream ) / mSampleRate;
		paTime -= getLatencySec() * 1.5f;
		paTime *= 1000.0f;		
	//	if( (paTime - 8000.0) > 0 )
	//		return (paTime - 8000.0);
	//	if( paTime > 0.0 )
	//	{
	//		return paTime / 100.0;
	//	}
		if( paTime < 0.0f )
			return 0;
		else
			return paTime;

		return paTime;
	}

	//----------------------------------------------------------------------- 
	bool AudioClip::closeAudioStream()
	{
		Pa_StopStream( aOutStream->stream );
		Pa_CloseStream( aOutStream->stream );
		return true;
	}
	
	//----------------------------------------------------------------------- 
	bool AudioClip::startAudioStream()
	{
		PaError err = Pa_StartStream( aOutStream->stream );
		if( err != paNoError ) 
		{
			closeAudioStream( );
			return false;
		}
		return true;
	}
} //End Namespace Ogre
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -