gpt4 book ai didi

objective-c - 在 C 中的结构中扩展数组

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:35 25 4
gpt4 key购买 nike

我有一个问题,我认为归结为 C 语法和内存注意事项。我在处理一些音频的 Objective-C 类中有一个回调,其中一个参数是 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;
}

一些注意事项:

  • 在这段代码中,新 channel 只是原始 channel 的一个副本,但实际上它会经过一些处理。
  • 命名有点奇怪,但是 mNumberBuffers 确实应该是 2 而 mNumberChannels 应该是 1。

这会导致渲染线程崩溃并出现 EXC_BAD_ACCESS 错误。所以,我的问题是向这个结构添加新缓冲区的正确方法是什么?我不经常深入研究 C,所以我确定我在这里缺少一些基础知识。对此的任何指示都会很棒。感谢阅读。

最佳答案

你不能做你正在尝试的事情,至少在你尝试做它的方式上是这样。 AudioBufferList 类型声明为:

struct AudioBufferList { UInt32 mNumberBuffers; AudioBuffer mBuffers[1]; };

这是 可变大小 结构的经典 C 模式。要为 N 缓冲区创建一个结构,分配一个 单个 内存块,其大小为:

sizeof(UInt32) + N * sizeof(AudioBuffer)

该 block 的地址分配给 AudioBufferList * 变量,字段 mNumberBuffers 设置为 N。您不能简单地增加mNumberBuffers来增加数组的大小,您必须分配一个新的完整结构,或者重新分配现有结构- 如果可能,realloc 会增加内存块的大小,否则分配一个新内存块并将现有数据复制到其中。

鉴于您的 tap_ProcessCallback() 函数被传递了一个 AudioBuuferList * 值并且不返回一个值,它无法更改结构的大小(即缓冲区的数量)它被传递。

正如评论中所指出的,当您打算复制内存时,您也在进行指针分配 - 请参阅 memcpy 和 friend 。

因此您需要重新设计 - 您的目标是可能的,而不是您尝试的方式和地点。

HTH

关于objective-c - 在 C 中的结构中扩展数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36629662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com