Странный шум при воспроизведении разных звуков с различной громкостью, установленной через OpenAL на iPhone - PullRequest
11 голосов
/ 29 июля 2010

Я использую звуковую среду OpenAL на iPhone, и я устанавливаю разные громкости для отдельных звуков.Я сталкиваюсь с проблемой, когда при переключении с одного звука на другой слышен первоначальный щелкающий / щелкающий звук.

Это действительно заметно, когда у меня есть один звук с высокой громкостью (1,0) ивторой звук, который имеет низкий (0,2).Когда я нажимаю громкий звук, а затем нажимаю тихий звук, я слышу щелчок.Но когда я иду от тихого звука к громкому, я ничего не замечаю.Таким образом, щелчок / щелчок действительно происходит при переключении с громких на тихие звуки.

Вот метод инициализации звука:

 - (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;
    }

и вот функция воспроизведения:

- (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);
    }

а вот функция, в которой я устанавливаю громкость для каждого звука сразу после воспроизведения (я пытался установить его еще и до воспроизведения):

- (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);
 }
   } 

Любая помощь очень ценится, поскольку я перепробовал все, что мог придумать,Я был бы очень благодарен.

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Все, что мне нужно было сделать, это использовать calloc вместо malloc для выделения памяти для буфера OpenAL.Или вы также можете установить ноль в память с помощью memset.

Странный шум исчез.Это было из-за нежелательной памяти в моем случае.Вот почему это тоже было случайно.Надеюсь, это поможет.

1 голос
/ 20 сентября 2012

Эта проблема вызвана тем, что не вызывается alSourceStop.

Документация на самом деле не заявляет об этом, но alSourceStop должен быть вызван на источнике звука, прежде чем его можно будет повторно использовать, даже если звук уже закончен, а параметр источника AL_SOURCE_STATE не AL_PLAYING.

0 голосов
/ 31 мая 2011

Я случайно добрался до этого неотвеченного вопроса и, обнаружив, что проблема не была решена, я попытаюсь дать свой ответ, даже если прошло много времени.OpenAL, но, похоже, это чисто аудио проблема.Обычно вы слышите короткие щелчки, когда вы внезапно меняете уровень звука, особенно с высокого значения на низкое.Например, если вы напрямую сопоставляете громкость звука с ползунком, значение которого обновляется каждые несколько мс, вы можете легко услышать щелчки и щелчки при быстром перемещении элемента управления.Разработчики аудио программного обеспечения сглаживают изменения параметров с помощью фильтра нижних частот.В вашем случае я бы посоветовал вам остановить клип после его исчезновения и начать новый клип, добавив его. Время перехода может составлять всего 2 мс: оно не слышно, и звук будет воспроизводиться очень хорошо.

Интересно, может ли (некоторые версии) OpenAL автоматически решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...