This is the most simple base class for audio sinks that only requires subclasses to implement a set of simple functions:
* `open()` :Open
the device.
* `prepare()` :Configure
the device with the specified format.
* `write()` :Write
samples to the device.
* `reset()` :Unblock
writes and flush the device.
* `delay()` :Get
the number of samples written but not yet played by the device.
* `unprepare()` :Undo
operations done by prepare.
* `close()` :Close
the device.
All scheduling of samples and timestamps is done in this base class together with BaseSink using a default implementation of a RingBuffer that uses threads.