«Придется ли мне полностью перераспределять канал, содержащий аудиоисточник, каждый раз, когда я хочу внести изменения в один аудиообъект?»
Нет. Например, вы можете заменить левый выход i
-го аудиоисточника следующим образом:
free(channel->audioSource[i].leftoutput);
channel->audioSource[i].leftoutput = malloc(newSize * sizeof(AudioUnitSampleType));
Или даже:
AudioUnitSampleType *tmp = realloc(channel->audioSource[i].leftoutput,
newSize * sizeof(*tmp));
if (tmp == 0) { /* handle the error */ }
channel->audioSource[i].leftoutput = tmp;
Кстати, если вы не публикуете реальный код, возможно, что ответы будут содержать ошибки из-за ошибок в ваших примерах.
Кажется, в вашем коде есть некоторая путаница между указателями и объектами, например, параметр channel
имеет тип ChannelOBJ
, тогда вы используете его как указатель. Это ошибка или ChannelOBJ
typedef для struct channelobj*
? Как правило, , а не , лучше скрывать, что что-то является указателем с помощью typedef.
Если AudioUnitSampleType также является типом указателя, то мой первый приведенный выше фрагмент кода будет неполным, поскольку тогда также потребуется освободить старые объекты, на которые указывают элементы массива, и выделить новые. Второй должен освободить старых или выделить новых в зависимости от того, увеличивается или уменьшается размер.