+typedef int (*DacWriteFunc_t) (struct DacContext *ctx, unsigned channel, uint16_t sample);
+typedef void (*SetChannelMaskFunc_t) (struct DacContext *ctx, uint32_t mask);
+typedef void (*SetSamplingRate_t) (struct DacContext *ctx, uint32_t rate);
+typedef void (*DmaConversionBufFunc_t) (struct DacContext *ctx, void *buf, size_t len);
+typedef bool (*DmaConversionIsFinished_t) (struct DacContext *ctx);
+typedef void (*DmaStartStreamingFunc_t) (struct DacContext *ctx, void *buf, size_t len, size_t slicelen);
+typedef void *(*DmaWaitConversionFunc_t) (struct DacContext *ctx);
+typedef void (*DmaStopFunc_t) (struct DacContext *ctx);
+
+typedef struct DacContext
+{
+ DacWriteFunc_t write;
+ SetChannelMaskFunc_t setCh;
+ SetSamplingRate_t setSampleRate;
+ DmaConversionBufFunc_t conversion;
+ DmaConversionIsFinished_t isFinished;
+ DmaStartStreamingFunc_t start;
+ DmaWaitConversionFunc_t wait;
+ DmaStopFunc_t stop;
+ size_t slicelen;
+
+ DB(id_t _type);
+} DacContext;
+
+INLINE int dac_write(DacContext *ctx, unsigned channel, uint16_t sample)
+{
+ ASSERT(ctx->write);
+ return ctx->write(ctx, channel, sample);
+}
+
+INLINE void dac_setChannelMask(struct DacContext *ctx, uint32_t mask)
+{
+ ASSERT(ctx->setCh);
+ ctx->setCh(ctx, mask);
+}
+
+INLINE void dac_setSamplingRate(struct DacContext *ctx, uint32_t rate)
+{
+ ASSERT(ctx->setSampleRate);
+ ctx->setSampleRate(ctx, rate);
+}
+
+/**
+ * Convert \param len samples stored into \param buf.
+ */
+INLINE void dac_dmaConversionBuffer(struct DacContext *ctx, void *buf, size_t len)