将UInt32(音频帧)分成两个SInt16(左和右)?

时间:2010-03-08 22:28:47

标签: iphone pointers audio casting

总的菜鸟比任何低于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)

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

这很容易:

SInt16* left = (SInt16*)&myUInt32Chunk;
SInt16* right = left + 1;

除非iPhone是小端,否则您必须反转rightleft

由于int可以被视为两个连续的short,因此您只需要获取地址,然后就像确实是两个short一样第

答案 1 :(得分:0)

iPhone是小端: - )