我对 iOS 及其 C 基础很陌生,但对一般编程并不熟悉。我的困境是这样的。我正在基于复杂 AudioUnits 的应用程序中实现回声效果。该应用程序需要混响、回声和压缩等。但是,只有当我使用特定的时,回声才能正常工作音频流基本描述我的应用程序中生成的音频样本的格式。然而,这种格式不适用于其他音频单元。
虽然还有其他方法可以解决此问题,但修复回声算法中的位旋转可能是最直接的方法。
The*音频流基本描述* 与 echo 一起使用有一个mFormatFlag of: kAudioFormatFlagsAudioUnitCanonical;其具体情况是:
AudioUnit Stream Format (ECHO works, NO AUDIO UNITS)
Sample Rate: 44100
Format ID: lpcm
Format Flags: 3116 = kAudioFormatFlagsAudioUnitCanonical
Bytes per Packet: 4
Frames per Packet: 1
Bytes per Frame: 4
Channels per Frame: 2
Bits per Channel: 32
Set ASBD on input
Set ASBD on output
au SampleRate rate: 0.000000, 2 channels, 12 formatflags, 1819304813 mFormatID, 16 bits per channel
与 AudioUnits 一起使用的流格式是相同的,除了mFormatFlag: kAudioFormatFlagIsFloat | kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsPacked | kAudioFormatFlagIsPacked kAudioFormatFlagIsNonInterleaved——其具体内容是:
AudioUnit Stream Format (NO ECHO, AUDIO UNITS WORK)
Sample Rate: 44100
Format ID: lpcm
Format Flags: 41
Bytes per Packet: 4
Frames per Packet: 1
Bytes per Frame: 4
Channels per Frame: 2
Bits per Channel: 32
Set ASBD on input
Set ASBD on output
au SampleRate rate: 44100.000000, 2 channels, 41 formatflags, 1819304813 mFormatID, 32 bits per channel
为了创建回声效果,我使用两个函数将样本数据移位到SInt16空间,然后返回。正如我所说,这适用于kAudioFormatFlagsAudioUnitCanonical,格式但不是其他格式。当它失败时,声音会被削波和扭曲,但它们仍然存在。我认为这表明这两种格式之间的区别在于数据的排列方式Float32.
// convert sample vector from fixed point 8.24 to SInt16
void fixedPointToSInt16( SInt32 * source, SInt16 * target, int length ) {
int i;
for(i = 0;i < length; i++ ) {
target[i] = (SInt16) (source[i] >> 9);
//target[i] *= 0.003;
}
}
*如您所见,我尝试修改样本的幅度以消除削波 - 显然这不起作用。
// convert sample vector from SInt16 to fixed point 8.24
void SInt16ToFixedPoint( SInt16 * source, SInt32 * target, int length ) {
int i;
for(i = 0;i < length; i++ ) {
target[i] = (SInt32) (source[i] << 9);
if(source[i] < 0) {
target[i] |= 0xFF000000;
}
else {
target[i] &= 0x00FFFFFF;
}
}
}
如果我能确定之间的差异kAudioFormatFlagIsFloat | kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsPacked | kAudioFormatFlagIsPacked kAudioFormatFlagIsNonInterleaved,那么我可以相应地修改上面的方法。但我不知道如何解决这个问题。 CoreAudio 中的文档很神秘,但从我在那里读到的内容以及从CoreAudioTypes.h文件,两者mFormatFlag(s) 指的是相同的定点 8.24 格式。显然有什么不同,但我不知道是什么。
感谢您阅读这个长问题,并提前感谢您提供的任何见解。