2

SpeakHere サンプル アプリを出発点として、iPhone サウンド処理アプリを実装しようとしています。このアプリでは、再生中にバッファリングされたオーディオ サンプルを操作します。サンプルに分数 (たとえば 0.9) を掛けると、結果としてノイズが発生します。最も奇妙な点は、サンプルを整数 (1.0、2.0 など) で乗算したり、サンプルに加算または減算したりすると、再生音が期待どおりに聞こえることです。

次のコード スニペットを使用して、AudioPlayer.m の PlaybackCallback 関数で実行しています。

  //------------------
  //If buffer samples are multiplied by 0.9 we get noise. If we multiply it by 1.0 or add to it everything's fine.
  short *buffer = (short *)calloc(1, numPackets * 2);
  memmove(buffer, bufferReference->mAudioData, numPackets * 2);
  for (int i = 0; i < numPackets; i++)
  {
   buffer[i] *= 0.9;
   //buffer[i] *= 1.0;
   //buffer[i] += 10.0;
  }
  memmove(bufferReference->mAudioData, buffer, numPackets * 2);
  free(buffer);
  buffer = NULL;
  //-------------------

完全なプロジェクトはここからダウンロードできます: http://depositfiles.com/files/lmnkq68n8

誰かが私が間違っていることを教えてもらえますか? 私はすでに数日間苦労しており、完全に迷っています。

ありがとうございました!

4

2 に答える 2

0

あなたのプロジェクトをダウンロードできませんでした (ファイル ホスティング業者は常にすべてのスロットがいっぱいであると言っています)、あなたが投稿したスニペットを読むと、符号付き 16 ビット整数 (短) 値に 0.9 (浮動小数点値) を掛けているようです。 )。これにより、short への暗黙のキャストが行われます。そのため、小数点の後ろのすべてが失われ、信号にエイリアシング効果が発生します。

更新:
コードを確認しましたが、そのノイズがどこから来ているのかわかりませんでした。
memmove を使用してバッファを操作するのはなぜですか?
次の方法でバッファに直接アクセスできます。

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;

異音の原因も知りたいです。もしそれが分かった場合は、ここにあなたの解決策を投稿してください

ゲインを変更する必要がある場合は、単純にAudioQueueSetParameterを使用できます。
もう 1 つのオプションは、AudioQueueServices の代わりにRemoteIO オーディオ ユニットを使用することです。

于 2010-01-17T15:04:53.970 に答える