[Openal-devel] NEWBIE: Playing OggVorbis files without queued buffers

vexator vexator at gmx.net
Sat Mar 7 06:42:32 PST 2009


Hello!
I'm new to OpenAL, I'm usually working with graphics :) I want to playback
OggVorbis files, but not using queued buffers like in the sample. I got it
working, but only if I manually adjust the buffer size. Seems that I'm
missing something.. I've included my code (which is basically copy and
pasted from the sample). The adjusted line is ulBufferSize *= 12. If I don't
do this, only the first split second is being played.

Thank you!

Constructor:

FILE *pOggVorbisFile = fopen( m_strFilename.c_str(), "rb" );

fn_ov_open_callbacks( pOggVorbisFile, &sOggVorbisFile, NULL, 0, sCallbacks
);

psVorbisInfo = fn_ov_info( &sOggVorbisFile, -1 );


ulFrequency = psVorbisInfo->rate;
ulChannels = psVorbisInfo->channels;

switch( ulChannels )
{
	case 1:

		ulBufferSize = ulFrequency >> 1;
		ulBufferSize -= (ulBufferSize % 2);
		
		ulFormat = AL_FORMAT_MONO16;

		break;

	case 2:

		ulBufferSize = ulFrequency;
		ulBufferSize -= (ulBufferSize % 4);
		
		ulFormat = AL_FORMAT_STEREO16;

		break;

	case 4:

		ulBufferSize = ulFrequency * 2;
		ulBufferSize -= (ulBufferSize % 8);
		
		ulFormat = alGetEnumValue( "AL_FORMAT_QUAD16" );

		break;

	case 6:

		ulBufferSize = ulFrequency * 3;
		ulBufferSize -= (ulBufferSize % 12);
		
		ulFormat = alGetEnumValue( "AL_FORMAT_51CHN16" );

		break;

	default:

		CLog::Get().Write( LOG_SERVER, "OpenAL: Unsupported format!" );

		return;
}


ulBufferSize *= 12; // <- why do I have to do this?!


pDecodeBuffer = (char*)malloc( ulBufferSize );
unsigned long ulBytesWritten = DecodeOggVorbis( &sOggVorbisFile,
pDecodeBuffer, ulBufferSize, ulChannels );

alGenBuffers( 1, &m_uiBuffer );
alBufferData( m_uiBuffer, ulFormat, pDecodeBuffer, ulBytesWritten,
ulFrequency );

alGenSources( 1, &m_uiSource );
alSourcei( m_uiSource, AL_BUFFER, m_uiBuffer );

Play() function:

int iState;
alGetSourcei( m_uiSource, AL_SOURCE_STATE, &iState );

if( iState == AL_PLAYING )
	return;

alSourcePlay( m_uiSource );
-- 
View this message in context: http://www.nabble.com/NEWBIE%3A-Playing-OggVorbis-files-without-queued-buffers-tp22379527p22379527.html
Sent from the OpenAL - Dev mailing list archive at Nabble.com.



More information about the Openal-devel mailing list