Стандартная практика - использовать массив стилей переменного тока для манипулирования массивом аудио.Это связано с тем, что если вам нужно использовать контейнерный объект Objective-c с сообщениями obj-c для доступа к каждому элементу, производительность будет плохой, и, как вы заметили, количество сэмплов со звуком может быть довольно большим.
Это особенно актуально для обработки в реальном времени, такой как обработка аудиосэмплов, находящихся в системном аудио-обратном вызове io, которые должны выполнить работу в течение определенного количества миллисекунд, иначе звук отключится.
Что вы можете сделать, это определить структуру (или даже объектный класс c), который имеет массив аудиобуфера, а также такие информационные элементы, как размер, количество каналов и т. Д., Чтобы объединить его для вас в одном месте.Таким образом, когда вы получаете доступ к буферу, вам не нужно сталкиваться с проблемами эффективности obj-c, и у вас все еще есть информация о спецификации буфера.
Вот пример:
typedef struct filter_buffer {
uint16_t* buffer;
int channels;
int num_frames;
} filter_buffer;
Тогда вам просто нужен вызов, который его инициализирует.
Вы можете сделать что-то с target-c, например:
@interface FilterBuffer : NSObject
{
uint16_t* buffer;
int channels;
int num_frames;
}
-initWithBuffer:(unit16_t*)buf channels:(int)c numFrames:(int)n;
...//accessors etc
@end
@implementation FilterBuffer
-initWithBuffer:(unit16_t*)buf channels:(int)c numFrames:(int)n
{
if ((self = [super init)) {
buffer = buf;
channels = c;
num_frames = n;
}
return self;
}
...
@end
}