По-моему тут оптимизировать уже нечего, в рамках принятой концепции все на месте. Чтобы избавиться от задержек совсем, надо менять концепцию.
Чтобы было максимально просто и не заморачиваться на специфическое железо, я бы сделал так:
* Создаются 2 пинг-понг буфера. Один на запись, второй на чтение. В идеале конечно надо библиотеке SD объяснить, что читать надо прямо в них, а не копировать по байту. Иначе очень жирно будет буферов, что для AVR особенно критично.
* Прерывание от таймера настраивается на полупериод кассетного бита. Оно выводит один полубит и сдвигает указатель на следующий полубит. Когда кончается бит, на следующий бит, когда кончается байт, на следующий байт. Когда закончится буфер А, переключается на чтение буфера Б и ставит флажок "нужен буфер".
* Основной цикл слушает флажок "нужен буфер" и запускает чтение буфера А, пока выводится Б и наоборот.




Ответить с цитированием
