📄 pasoundio.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 + -