Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Weird popping noise when playing different sounds with different volumes set through OpenAL on the iPhone

I'm using OpenAL sound framework on the iPhone, and I'm setting different volumes on individual sounds. I'm running into a problem where I'm hearing an initial popping/clicking noise when switching from one sound to the next.

It's really noticeable when I have one sound that's got a high volume (1.0) and a second sound that has a low one (0.2). When I hit the loud sound, and then hit the soft sound, I hear the pop/click. But when I go from the soft sound to the loud, I don't notice anything. So the pop/click really happens when switching from loud to soft sounds.

Here's the init sound method:

 - (id) initWithSoundFile:(NSString *)file doesLoop:(BOOL)loops
{
 self = [super init];
 if (self != nil) 
 {  
  if(![self loadSoundFile:file doesLoop:loops])
   {
   debug(@"Failed to load the sound file: %@...", file);
   [self release];
   return nil;
  }
  self.sourceFileName = file;

  //temporary sound queue
  self.temporarySounds = [NSMutableArray array];

  //default volume/pitch
  self.volume = 1.0;
  self.pitch = 1.0;  
  }
 return self;
    }

and here's the play function:

- (BOOL) play
{

 if([self isPlaying]) //see if the base source is busy...
 {
  //if so, create a new source
  NSUInteger tmpSourceID;
  alGenSources(1, &tmpSourceID);

  //attach the buffer to the source
  alSourcei(tmpSourceID, AL_BUFFER, bufferID);
  alSourcePlay(tmpSourceID);

  //add the sound id to the play queue so we can dispose of it later
  [temporarySounds addObject: [NSNumber numberWithUnsignedInteger:tmpSourceID]];

  //a "callback" for when the sound is done playing +0.1 secs
  [self performSelector:@selector(deleteTemporarySource)
   withObject:nil
   afterDelay:(duration * pitch) + 0.1];

  return ((error = alGetError()) != AL_NO_ERROR);
 }

 //if the base source isn't busy, just use that one...

 alSourcePlay(sourceID);
 return ((error = alGetError()) != AL_NO_ERROR);
    }

and here's the function where i set the volume for each sound immediately after playing (ive tried setting it before playing too):

- (void) setVolume:(ALfloat)newVolume
{
 volume = MAX(MIN(newVolume, 1.0f), 0.0f); //cap to 0-1
 alSourcef(sourceID, AL_GAIN, volume); 

 //now set the volume for any temporary sounds...

 for(NSNumber *tmpSourceID in temporarySounds)
 {
  //tmpSourceID is the source ID for the temporary sound
  alSourcef([tmpSourceID unsignedIntegerValue], AL_GAIN, volume);
 }
   } 

Any help is greatly appreciated as I've tried everything I can think of. I would be so grateful.

like image 512
c0dec0de Avatar asked Jul 28 '10 22:07

c0dec0de


1 Answers

All I had to do was use calloc instead of malloc to allocate memory for the OpenAL buffer. Or you could also zero set the memory with memset.

The wierd popping noise went off. It was due to junk memory in my case. That's why it was random too. Hope this helps.

like image 101
Rajavanya Subramaniyan Avatar answered Oct 19 '22 23:10

Rajavanya Subramaniyan