私は現在、オーディオDSPアプリケーションの開発に取り組んでいます。プロジェクトでは、オーディオデータの直接アクセスと変更が必要です。今は、AudioQueueを使用して生のオーディオデータにアクセスして修正することができますが、再生中にエラーが発生します。変更後の出力オーディオはノイズとなっています。要するにAudioQueueは修正後の出力をねじ返します
は、コードはこのようなものである:
(。。Speakhereサンプルコードから変更残りの部分は変わらない)予想通り
デバッグ中void AQPlayer::AQBufferCallback(void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inCompleteAQBuffer)
{
AQPlayer *THIS = (AQPlayer *)inUserData;
if (THIS->mIsDone) return;
UInt32 numBytes;
UInt32 nPackets = THIS->GetNumPacketsToRead();
OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(),
false,
&numBytes,
inCompleteAQBuffer->mPacketDescriptions,
THIS->GetCurrentPacket(),
&nPackets,
inCompleteAQBuffer->mAudioData);
if (result)
printf("AudioFileReadPackets failed: %d", (int)result);
if (nPackets > 0) {
inCompleteAQBuffer->mAudioDataByteSize = numBytes;
inCompleteAQBuffer->mPacketDescriptionCount = nPackets;
//My modification starts from here
//Modifying audio data
SInt16 *testBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;
for (int i = 0; i < (inCompleteAQBuffer->mAudioDataByteSize)/sizeof(SInt16); i++)
{
//printf("before modification %d", (int)*testBuffer);
*testBuffer = (SInt16) *testBuffer/2; //Say some simple modification
//printf("after modification %d", (int)*testBuffer);
testBuffer++;
}
AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL);
}
、バッファ内のデータが表示され、実際の出力はノイズだけです。ここで
は狂ったチーム全体の両方を行うコードのいくつかの他の奇妙な行動です:データ(1によって乗算、0で/サブを追加)、または全体に変更がない場合バッファが定数に割り当てられていると(0としてから音声がミュートされます)、再生は正常に動作します(もちろん!)しかし、それ以上のものを実行すると、それでもノイズになります。
テストオーディオとしてシングルトーンをハードコードする場合、出力ノイズも別のチャネルにも広がります。
このコードのバグはどこですか?または、私が間違ったトラックにいる場合、オーディオデータを修正して再生を正しく行うにはどうすればよいでしょうか?どんな洞察も誠実に評価されます。
は
乾杯、
MANCA