11

iPhone で OpenAL サウンド フレームワークを使用しており、個々のサウンドに異なる音量を設定しています。あるサウンドから次のサウンドに切り替えるときに、最初のポップ/クリック ノイズが聞こえるという問題が発生しています。

1 つのサウンドのボリュームが大きい (1.0) と、2 つ目のサウンドのボリュームが小さい (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);
 }
   } 

私が考えることができるすべてを試したので、どんな助けも大歓迎です。私はとても感謝しています。

4

3 に答える 3

3

私がしなければならなかったのは、malloc の代わりに calloc を使用して、OpenAL バッファにメモリを割り当てることだけでした。または、memset を使用してメモリをゼロ セットすることもできます。

奇妙なポップノイズが消えました。私の場合はジャンクメモリが原因でした。それもランダムだった理由です。お役に立てれば。

于 2011-05-24T17:54:37.143 に答える
2

この問題は、alSourceStop を呼び出さないために発生します。

ドキュメントには実際には記載されていませんが、サウンドが既に終了していて、ソースの AL_SOURCE_STATE パラメータが AL_PLAYING でない場合でも、サウンド ソースを再利用する前に、alSourceStop を呼び出す必要があります。

于 2012-09-20T05:17:22.547 に答える
0

私は無作為にこの未回答の質問にたどり着きました。問題が解決されていないことがわかったので、たとえ長い時間が経過したとしても、回答を試みます。

OpenAL についてはわかりませんが、これは純粋にオーディオの問題のようです。特に高い値から低い値にオーディオのレベルを突然変更すると、短いクリック音が聞こえるのは正常です。たとえば、数ミリ秒ごとに値が更新されるスライダーにオーディオのボリュームを直接マッピングすると、コントロールをすばやくスライドさせると、クリックやポップ音が簡単に聞こえます。オーディオ ソフトウェア開発者が行うことは、ローパス フィルターを使用してパラメーターの変化を滑らかにすることです。あなたの場合、クリップをフェードアウトした後に停止し、フェードインして新しいクリップを開始することをお勧めします。フェード時間は 2 ミリ秒と短くてもかまいません。音は聞こえず、音は細かく再生されます。

(一部のバージョンの) OpenAL は、この問題を自動的に処理できるのでしょうか。

于 2011-05-31T10:42:25.247 に答える