I would drop the ring buffer here, it's just an additional stage of copying. Why don't you block ActiveAESink thread until core audio thread comes by and picks the data directly from data?