да, конечно, вы можете, вы можете делать все что угодно внутри вашего обратного вызова рендеринга. когда вы устанавливаете этот вызов обратно, вы можете передать указатель на объект.
этот объект может содержать состояния включения / выключения для каждого тона. фактически объект может содержать метод, отвечающий за заполнение буфера. (просто убедитесь, что объект неатомный, если это свойство - в противном случае вы получите артефакты из-за проблем с блокировкой)
Чего именно вы пытаетесь достичь? Вам действительно нужно генерировать на лету?
в этом случае вы рискуете перегрузить функцию обратного вызова рендеринга аудиоустройства remoteIO, что приведет к сбоям и артефактам
вы можете избежать неприятностей с симулятором, а затем перенести его на устройство и обнаружить, что он таинственным образом больше не работает, потому что вы работаете на процессоре, в 50 раз меньшем, и один обратный вызов не может завершиться до следующего приходит
сказав, что вы можете сойти с рук много
Я сделал 12-тональный проигрыватель, который может одновременно воспроизводить любое количество отдельных тонов
все, что я делаю, - это наличие кольцевого буфера для каждого тона (я использую довольно сложный сигнал, так что это занимает много времени, фактически я вычисляю его при первом запуске приложения и затем загружаю его из файла) и поддерживать заголовок чтения и включенный флаг для каждого кольца.
Затем я добавляю все в обратный вызов рендеринга, и это прекрасно работает на устройстве, даже если все 12 играют вместе. Я знаю, что документация говорит вам не делать этого, она рекомендует использовать этот обратный вызов только для того, чтобы заполнить один буфер из другого, но вы можете многого избежать, и это PITA для кодирования какой-то системы буферизации, которая вычисляет в другой теме.