I was just stumbling around EE Stack and found this post: What protocol does a headphone jack use. And it sparked some curiosity in me, and I figure, if the iPhone can do it
I've written a C library which can send and receive data through an audio cable at 64kbps. https://github.com/quiet/quiet
As far as modulation techniques, it supports a wide range, as it uses an SDR library to perform its modulation.
If you'd like to try it out, here's a live demo https://quiet.github.io/quiet-js/lab.html