在C中扩展结构中的数组

时间:2016-04-14 17:09:41

标签: objective-c c

我有一个关于我认为归结为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,所以我确定我在这里缺少一些基础知识。对此的任何指示都会很棒。谢谢你的阅读。

1 个答案:

答案 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