|
Queueing fails for buffers with streamed sources: msg#00014lib.openal.devel
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> |
|---|---|---|
| Previous by Date: | MSVC8 (VS2005) Compile: 00014, Geoff Air |
|---|---|
| Next by Date: | OpenAL subversion repositories are down again: 00014, Sven Panne |
| Previous by Thread: | MSVC8 (VS2005) Compilei: 00014, Geoff Air |
| Next by Thread: | OpenAL subversion repositories are down again: 00014, Sven Panne |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |