[Openal] Trouble with more than 2 buffers at the same time

Zarnick Maelstorm zarnick at geekvault.org
Tue Jun 30 04:17:00 PDT 2009


Well, I do have, and they work fine, the buzz you are hearing could be me
the White noise I'm hearing, since I'm repeating the same sources over and
over (like a loop), this can be "masked" as some sort of smaller white
noise. What I'm trying to achieve is something like this
http://lab.andre-michelle.com/tonematrix , it's a polyphone matrix, much
like the tenory from Yamaha, now, if I'm not mistaken, this is MIDI right?
But I should be able to mimic something like this using Wave Sines right?

Any help on this (books or whatever) would be really apreciated.

Thanks

Mateus
http://www.geekvault.org


On Mon, Jun 29, 2009 at 10:24 PM, Chris Robinson <chris.kcat at gmail.com>wrote:

> On Monday 29 June 2009 7:37:54 am you wrote:
> > Ok, so it's a little big, but you can see the error (on the audio
> output),
> > then again, this maybe the normal behaviour when you put together 3 or
> more
> > wave sines to play at the same time.
>
> Hmm, it seems to work for me. I start getting a buzz after starting 2 or 3
> sources, but it doesn't seem to turn into white noise. Tried with both
> 44.1khz
> and 48khz output. Do you have an OpenAL Soft config set somewhere?
>
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <string.h>
> > #include <errno.h>
> > #include <AL/al.h>
> > #include <AL/alc.h>
> > #include <AL/alut.h>
> >
> > #define KMAX_BUFFERS 16
> > #define KMAX_SOURCES 255
> > #define KFREQ 440
> > #define KPHASE 90
> > #define KDURATION 10
> >
> >
> > ALuint m_buffers[KMAX_BUFFERS];
> > ALuint m_sources[KMAX_SOURCES];
> >
> > void printALError(ALenum error)
> > {
> >   switch(error)
> >   {
> >     /* ALut errors */
> >     case ALUT_ERROR_INVALID_VALUE:        fprintf(stderr,"[ERROR] (ALUT)
> > Invalid error");break;
> >     case ALUT_ERROR_INVALID_OPERATION:    fprintf(stderr,"[ERROR] (ALUT)
> > Invalid operation");break;
> >     case ALUT_ERROR_OPEN_DEVICE:          fprintf(stderr,"[ERROR] (ALUT)
> > Open device");break;
> >     case ALUT_ERROR_CREATE_CONTEXT:       fprintf(stderr,"[ERROR] (ALUT)
> > Create context");break;
> >     case ALUT_ERROR_MAKE_CONTEXT_CURRENT: fprintf(stderr,"[ERROR] (ALUT)
> > Couldn't create context");break;
> >     case ALUT_ERROR_NO_CURRENT_CONTEXT:   fprintf(stderr,"[ERROR] (ALUT)
> No
> > current context");break;
> >     case ALUT_ERROR_AL_ERROR_ON_ENTRY:    fprintf(stderr,"[ERROR] (ALUT)
> AL
> > error on entry");break;
> >     case ALUT_ERROR_ALC_ERROR_ON_ENTRY:   fprintf(stderr,"[ERROR] (ALUT)
> > ALC error on entry");break;
> >     case ALUT_ERROR_CLOSE_DEVICE:         fprintf(stderr,"[ERROR] (ALUT)
> > Close device");break;
> >     case ALUT_ERROR_DESTROY_CONTEXT:      fprintf(stderr,"[ERROR] (ALUT)
> > Destroy context");break;
> >     case ALUT_ERROR_OUT_OF_MEMORY:        fprintf(stderr,"[ERROR] (ALUT)
> > Out of memory");break;
> >     case ALUT_ERROR_INVALID_ENUM:         fprintf(stderr,"[ERROR] (ALUT)
> > Invalid enumaration");break;
> >     case ALUT_ERROR_GEN_BUFFERS:          fprintf(stderr,"[ERROR] (ALUT)
> > Generating buffers");break;
> >     case ALUT_ERROR_BUFFER_DATA:          fprintf(stderr,"[ERROR] (ALUT)
> > Error passing buffer data");break;
> >     /* OpenAL Errors */
> >     case AL_INVALID_VALUE:     fprintf(stderr,"[ERROR] (OpenAL) Invalid
> > value");break;
> >     case AL_INVALID_ENUM:      fprintf(stderr,"[ERROR] (OpenAL) Invalid
> > enumeration");break;
> >     case AL_INVALID_OPERATION: fprintf(stderr,"[ERROR] (OpenAL) Invalid
> > operation");break;
> >
> >     default: fprintf(stderr,"[ERROR] Unknown error");break;
> >   }
> >   fprintf(stderr,"\n");
> > }
> >
> > ALboolean loadALData(void)
> > {
> >   ALenum error;
> >   ALfloat freq = 0.0;
> >   unsigned int i,j;
> >   i=j=0;
> >
> >   #ifdef DEBUG
> >   fprintf(stderr,"[DEBUG] Creating buffers\n");
> >   #endif
> >
> >   for(i = 0; i < KMAX_BUFFERS; i++)
> >   {
> >     freq  = KFREQ*(i+1);
> >     freq /= 2;
> >     m_buffers[i]     =
> > alutCreateBufferWaveform(ALUT_WAVEFORM_SINE,freq,KPHASE, KDURATION);
> >     if(m_buffers[i] == AL_NONE)
> >     {
> >       printALError(alGetError());
> >       return AL_FALSE;
> >     }
> >   }
> >
> >   #ifdef DEBUG
> >   fprintf(stderr,"[DEBUG] Creating sources\n");
> >   #endif
> >   //Creating sources
> >   alGenSources((ALsizei)KMAX_SOURCES,m_sources);
> >   if((error = alGetError()) != AL_NO_ERROR)
> >   {
> >     printALError(error);
> >     return AL_FALSE;
> >   }
> >   for(i = 0; i < KMAX_SOURCES; i++)
> >   {
> >     alSourcei (m_sources[i], AL_BUFFER,    m_buffers[j++]);
> >     alSourcef (m_sources[i], AL_PITCH,     1.0);
> >     alSourcef (m_sources[i], AL_GAIN,      1.0);
> >     alSourcei (m_sources[i], AL_LOOPING,   AL_TRUE);
> >     alSource3f(m_sources[i], AL_POSITION,  0, 0, 0);
> >     alSource3f(m_sources[i], AL_VELOCITY,  0, 0, 0);
> >     alSource3f(m_sources[i], AL_DIRECTION, 0, 0, 0);
> >     if(j >= KMAX_BUFFERS) j = 0;
> >   }
> >   return AL_TRUE;
> > }
> >
> > ALboolean setListener(void)
> > {
> >   ALenum error;
> >   ALfloat m_fListenerPos[] = {0.0, 0.0, 0.0}; //Position of the listener
> >   ALfloat m_fListenerVel[] = {0.0, 0.0, 0.0}; //Velocity of the listener
> >   ALfloat m_fListenerOri[] = {0.0, 0.0, -1.0, 0.0, 1.0, 0.0};
> //Orientation
> > of the listener, first 3 elements are "at", second 3 are "up"
> >   alListenerfv(AL_POSITION, m_fListenerPos);
> >   alListenerfv(AL_VELOCITY, m_fListenerVel);
> >   alListenerfv(AL_ORIENTATION, m_fListenerOri);
> >   if((error = alGetError()) != AL_NO_ERROR)
> >   {
> >     printALError(error);
> >     return AL_FALSE;
> >   }
> >   return AL_TRUE;
> > }
> >
> > void killAllData(void)
> > {
> >   alDeleteBuffers(KMAX_BUFFERS,m_buffers);
> >   alDeleteSources(KMAX_SOURCES,m_sources);
> >   alutExit();
> > }
> >
> > int main()
> > {
> >   ALenum error;
> >   char ch = '\0';
> >   #ifdef DEBUG
> >   fprintf(stderr,"[DEBUG] Starting OpenAL via ALUT\n");
> >   #endif
> >   if(alutInit(NULL,0)!=AL_TRUE)
> >   {
> >     printALError(alGetError());
> >     return 1;
> >   }
> >   alGetError(); /* Clearing error bit */
> >
> >   #ifdef DEBUG
> >   fprintf(stderr,"[DEBUG] Setting listener values\n");
> >   #endif
> >
> >   if(setListener() == AL_FALSE)
> >   {
> >     #ifdef DEBUG
> >     fprintf(stderr,"[DEBUG] Killing all data\n");
> >     #endif
> >     killAllData();
> >     return 1;
> >   }
> >
> >   #ifdef DEBUG
> >   fprintf(stderr,"[DEBUG] Setting buffers and sources\n");
> >   #endif
> >   if(loadALData()==AL_FALSE)
> >   {
> >     #ifdef DEBUG
> >     fprintf(stderr,"[DEBUG] Killing all data\n");
> >     #endif
> >     killAllData();
> >     return 1;
> >   }
> >
> >   #ifdef DEBUG
> >   fprintf(stderr,"[DEBUG] Playing sounds\n");
> >   #endif
> >
> >   while(ch!='q')
> >   {
> >     fprintf(stdout,"Command> ");
> >     fscanf(stdin,"%c",&ch);
> >     switch(ch)
> >     {
> >       case '1':
> >       {
> >         alSourcePlay(m_sources[1]);
> >         if((error = alGetError()) != AL_NO_ERROR)
> >           printALError(error);
> >         break;
> >       }
> >       case '2':
> >       {
> >         alSourcePlay(m_sources[2]);
> >         if((error = alGetError()) != AL_NO_ERROR)
> >           printALError(error);
> >         break;
> >       }
> >       case '3':
> >       {
> >         alSourcePlay(m_sources[3]);
> >         if((error = alGetError()) != AL_NO_ERROR)
> >           printALError(error);
> >         break;
> >       }
> >       case '4':
> >       {
> >         alSourcePlay(m_sources[4]);
> >         if((error = alGetError()) != AL_NO_ERROR)
> >           printALError(error);
> >         break;
> >       }
> >       case 's':
> >       {
> >         alSourceStopv(KMAX_SOURCES,m_sources);
> >         if((error = alGetError()) != AL_NO_ERROR)
> >           printALError(error);
> >         break;
> >       }
> >       case 'q':
> >       {
> >         fprintf(stdout,"Shutting down\n");break;
> >       }
> >       default: fprintf(stdout,"Unknown command\n");break;
> >     }
> >   }
> >
> >   #ifdef DEBUG
> >   fprintf(stderr,"[DEBUG] Killing all data\n");
> >   #endif
> >   killAllData();
> >
> >   return 0;
> > }
>
> _______________________________________________
> Openal mailing list
> Openal at opensource.creative.com
> http://opensource.creative.com/mailman/listinfo/openal
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://opensource.creative.com/pipermail/openal/attachments/20090630/aa0b0a00/attachment-0001.html


More information about the Openal mailing list