总的菜鸟比任何低于Java的水平,潜入iPhone音频,并从所有的转换/指针/原始内存访问中实现。
我正在使用some example code从光盘读取WAV文件,并将立体声样本作为单个UInt32值返回。如果我理解正确,这只是返回创建两个16位样本所需的32位内存的便捷方法。最终,这些数据被写入一个缓冲区,一个音频单元将其收集起来。即使数据是以UInt32大小的块编写的,它最终也会被解释为16位样本对。
我需要帮助的是将这些UInt32帧分成左右两个样本。我假设我想将每个UInt32转换为SInt16,因为音频样本是有符号值。在我看来,为了效率,我应该能够简单地指向内存中的相同块,并避免任何复制。
所以,在伪代码中,它会是这样的:
UInt32 myStereoFrame = getFramefromFilePlayer;
SInt16* leftChannel = getFirst16Bits(myStereoFrame);
SInt16* rightChannel = getSecond16Bits(myStereoFrame);
有人可以帮我把我的伪变成真正的代码吗?
编辑:
非常感谢zneak的回答,这很有效:
SInt16* left = (SInt16*)&myUInt32Chunk;
SInt16* right = left + 1;
现在,要将我的SInt16重组为UInt32(假设我不想只使用我的原始变量myStereoFrame),我需要反向做大致相同的事情:将我的两个SInt16连续排列在一起内存插槽然后将该内存转换为UInt32。
所以我做了一个数组:
SInt16 newFrameInMemory[2] = {*left, *right}
然后将该数组的整个长度复制到UInt32
UInt32 newFrame32 = newFrameInMemory
虽然这不起作用,但如果我这样做一点丑陋 - 将数组转换为指针,然后取消引用指针,它确实有效。
UInt32 newFrame32 = *((UInt32*)&newFrameInMemory)
有更好的方法吗?
答案 0 :(得分:1)
这很容易:
SInt16* left = (SInt16*)&myUInt32Chunk;
SInt16* right = left + 1;
除非iPhone是小端,否则您必须反转right
和left
。
由于int
可以被视为两个连续的short
,因此您只需要获取地址,然后就像确实是两个short
一样第
答案 1 :(得分:0)
iPhone是小端: - )