logo       

Queueing fails for buffers with streamed sources: msg#00014

lib.openal.devel

Subject: Queueing fails for buffers with streamed sources

Using svn revision 1426 under linux when running something like:

alGenBuffers( 2, vorbbuf );
alGenSources( 1, &vorbsource );
alSourceQueueBuffers(vorbsource,2,vorbbuf);
alutLoadVorbisp( vorbbuf[i], data, size );
alSourcePlay( vorbsource );

openal plays the first buffer in an endless loop.

Testcase and a patch to fix it is attached. There is probably a better
way to do this but this seems to work.

regards DevH

#include <AL/al.h>
#include <AL/alc.h>
//#include <AL/alut.h>
#include <AL/alext.h>

#include <errno.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>

#define DATABUFSIZE 4096
#define VORBIS_FILE "boom.ogg"
#define VORBIS_FUNC "alutLoadVorbis_LOKI"
#define MP3_FUNC "alutLoadMP3_LOKI"
#define NUMSOURCES 1

ALboolean sourceIsPlaying( ALuint sid )
{
ALint state;
if( alIsSource( sid ) == AL_FALSE ) {
return AL_FALSE;
}
alGetSourceiv( sid, AL_SOURCE_STATE, &state );
return ( ( state == AL_PLAYING )
|| ( state == AL_PAUSED ) ) ? AL_TRUE : AL_FALSE;
}

static void init( void );

static ALuint vorbbuf[2]; /* our buffers */
static ALuint vorbsource = ( ALuint ) -1;

static time_t start;

static ALCcontext *context;

/* our vorbis extension */
typedef ALboolean ( dataLoader ) ( ALuint, ALvoid *, ALint );
dataLoader *alutLoadVorbisp = NULL;
dataLoader *alutLoadMP3p = NULL;

static void init( void )
{
start = time( NULL );

alGenBuffers( 2, vorbbuf );
alGenSources( 1, &vorbsource );

alSourceQueueBuffers(vorbsource,2,vorbbuf);
alSourcei( vorbsource, AL_ROLLOFF_FACTOR, 1 );
alSourcei( vorbsource, AL_SOURCE_RELATIVE, AL_TRUE );
}

int main( int argc, char *argv[] )
{
ALCdevice *device;
FILE *fh;
struct stat sbuf;
void *data;
char *fname;
int size;
int i;

device = alcOpenDevice( NULL );
if( device == NULL ) {
return EXIT_FAILURE;
}

/* Initialize ALUT. */
context = alcCreateContext( device, NULL );
if( context == NULL ) {
alcCloseDevice( device );

return EXIT_FAILURE;
}

alcMakeContextCurrent( context );

init( );

alutLoadVorbisp =
( dataLoader * ) alGetProcAddress( ( ALchar * ) VORBIS_FUNC );
if( alutLoadVorbisp == NULL ) {


fprintf( stderr, "Could not GetProc %s\n",
( ALubyte * ) VORBIS_FUNC );
exit( EXIT_FAILURE );
}

alutLoadMP3p =
( dataLoader * ) alGetProcAddress( ( ALchar * ) MP3_FUNC );
if( alutLoadMP3p == NULL ) {


fprintf( stderr, "Could not GetProc %s\n",
( ALubyte * ) MP3_FUNC );
exit( EXIT_FAILURE );
}

for(i = 0; i < 2; i++)
{
fname = ( argc == (1+i) ) ? VORBIS_FILE : argv[1+i];

if( stat( fname, &sbuf ) == -1 ) {
perror( fname );
return errno;
}

size = sbuf.st_size;
data = malloc( size );
if( data == NULL ) {
exit( EXIT_FAILURE );
}

fh = fopen( fname, "rb" );
if( fh == NULL ) {
fprintf( stderr, "Could not open %s\n", fname );

free( data );

exit( EXIT_FAILURE );
}

fread( data, size, 1, fh );
if(1)
{
if( alutLoadVorbisp( vorbbuf[i], data, size ) != AL_TRUE ) {
fprintf( stderr, "alutLoadVorbis failed\n" );
exit( EXIT_FAILURE );
}
}
else
{
if( alutLoadMP3p( vorbbuf[i], data, size ) != AL_TRUE ) {
fprintf( stderr, "alutLoadMP3 failed\n" );
exit( EXIT_FAILURE );
}
}
free( data );
}

ALuint queued = 0;
alGetSourcei(vorbsource,AL_BUFFERS_QUEUED,&queued);
printf("%ld files queued\n", queued);
alSourcePlay( vorbsource );

while( sourceIsPlaying( vorbsource ) == AL_TRUE ) {
ALuint queued1 = 0;
alGetSourcei(vorbsource,AL_BUFFERS_QUEUED,&queued1);
if(queued != queued1)
{
queued = queued1;
printf("%ld files queued", queued);
}
alSourcePause( vorbsource );
alSourcePlay( vorbsource );
sleep( 1 );
}

alcDestroyContext( context );
alcCloseDevice( device );

return EXIT_SUCCESS;
}

Index: src/al_mixer.c
===================================================================
--- src/al_mixer.c (revision 1426)
+++ src/al_mixer.c (working copy)
@@ -309,7 +309,6 @@
AL_buffer *samp = _alGetBuffer(bid);

assert(samp);
- assert(src->srcParams.soundpos < samp->size);
}
#endif

Index: src/al_source.c
===================================================================
--- src/al_source.c (revision 1426)
+++ src/al_source.c (working copy)
@@ -1405,6 +1405,17 @@
* What a cheat.
*/

+ /* Fix queueing */
+ src->srcParams.new_readindex = src->bid_queue.read_index+1;
+ src->srcParams.new_soundpos = 0;
+ if(src->bid_queue.read_index >= src->bid_queue.size)
+ {
+ if(_alSourceIsLooping(src))
+ {
+ src->srcParams.new_readindex = 0;
+ }
+ }
+
src->srcParams.soundpos = samp->size + nc * resultsamps *
sizeof **buffers;
}

_______________________________________________
Openal-devel mailing list
Openal-devel@xxxxxxxxxxxxxxxxxxxxxxx
http://opensource.creative.com/mailman/listinfo/openal-devel
<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise