我有一个关于我认为归结为C语法和内存注意事项的问题。我在一个处理一些音频的Objective-C类中有一个回调,其中一个参数是NSDictionary
。它代表我想要转换为立体声的单声道音频信号。这是我的代码:
bufferListInOut
一些注意事项:
static void tap_ProcessCallback(MTAudioProcessingTapRef tap,
CMItemCount numberFrames,
MTAudioProcessingTapFlags flags,
AudioBufferList *bufferListInOut,
CMItemCount *numberFramesOut,
MTAudioProcessingTapFlags *flagsOut){
// Retrieve mono audio data into bufferListInOut
MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, NULL, NULL, NULL);
// Copy the mono channel's data
float *channelLeft = malloc(numberFrames * sizeof(float));
channelLeft = bufferListInOut->mBuffers[0].mData;
// Attempt to create a second channel which is (currently) a copy of the first
bufferListInOut->mNumberBuffers = 2; // 2 for stereo, 1 for mono
bufferListInOut->mBuffers[1].mNumberChannels = 1;
bufferListInOut->mBuffers[1].mDataByteSize = numberFrames * sizeof(Float32);
bufferListInOut->mBuffers[1].mData = channelLeft;
// Set number of frames out
*numberFramesOut = numberFrames;
}
的确意味着为2而mNumberBuffers
的意思是1。这会在渲染线程中出现mNumberChannels
错误。所以,我的问题是为这个结构添加新缓冲区的正确方法是什么?我不经常深入研究C,所以我确定我在这里缺少一些基础知识。对此的任何指示都会很棒。谢谢你的阅读。
答案 0 :(得分:3)
你不能做你正在尝试的事情,至少在尝试这样做的方式。类型 SET DEFINE OFF;
CREATE OR REPLACE TRIGGER ProductMaint
AFTER INSERT ON Orders
FOR EACH ROW
WHEN(NEW.Qty >0)
BEGIN
UPDATE Products
SET Qtyonhand = Qtyonhand - :NEW.Qty
WHERE Products.Mfr =Orders.Mfr
AND Products.Product =Orders.Product;
DBMS_OUTPUT.PUT_LINE(:New.Qtyonhand);
END;
/
声明为:
AudioBufferList
这是可变大小结构的经典C模式。要为struct AudioBufferList { UInt32 mNumberBuffers; AudioBuffer mBuffers[1]; };
缓冲区创建结构,将为单个内存块分配大小:
N
该块的地址分配给sizeof(UInt32) + N * sizeof(AudioBuffer)
变量,字段AudioBufferList *
设置为mNumberBuffers
。你不能只是增加N
来增加数组的大小,而是必须分配一个新的完整结构,或者mNumberBuffers
现有结构 - realloc
如果可能,增加内存块的大小,或者分配一个新内存块,如果没有,则将现有数据复制到内存中。
如果realloc
函数传递了tap_ProcessCallback()
值并且没有返回值,则无法更改传递结构的大小(即缓冲区数)。< / p>
正如评论中所指出的那样,当您打算复制内存时,您也在进行指针分配 - 请参阅AudioBuuferList *
和朋友。
所以你需要重新设计 - 你的目标是可能的,而不是你尝试过的方式和地点。
HTH