aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gaudio/pwm/gaudio_play_pwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gaudio/pwm/gaudio_play_pwm.c')
-rw-r--r--drivers/gaudio/pwm/gaudio_play_pwm.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/drivers/gaudio/pwm/gaudio_play_pwm.c b/drivers/gaudio/pwm/gaudio_play_pwm.c
new file mode 100644
index 00000000..91d7a835
--- /dev/null
+++ b/drivers/gaudio/pwm/gaudio_play_pwm.c
@@ -0,0 +1,117 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://ugfx.org/license.html
+ */
+
+#include "gfx.h"
+
+#if GFX_USE_GAUDIO && GAUDIO_NEED_PLAY
+
+/* Include the driver defines */
+#include "../../../src/gaudio/gaudio_driver_play.h"
+
+/* Forward definition */
+static void gaudio_play_pwm_timer_callbackI(void);
+
+/* Include the board interface */
+#include "gaudio_play_board.h"
+
+static GDataBuffer *pplay;
+static ArrayDataFormat playfmt;
+static size_t playlen;
+static uint8_t *pdata;
+
+static void gaudio_play_pwm_timer_callbackI(void) {
+ if (pplay) {
+
+ // Get the next value from the current data buffer
+ if (gfxSampleFormatBits(playfmt) > 8) {
+ gaudio_play_pwm_setI(*(uint16_t *)pdata);
+ pdata += 2;
+ } else {
+ gaudio_play_pwm_setI(*pdata);
+ pdata++;
+ }
+
+ // Are we done yet
+ if (--playlen)
+ return;
+ gaudioPlayReleaseDataBlockI(pplay);
+
+ // Get a new data buffer
+ if (!(pplay = gaudioPlayGetDataBlockI())) {
+ // All is done
+ gaudioPlayDoneI();
+ return;
+ }
+
+ } else {
+ // Get a new data buffer
+ if (!(pplay = gaudioPlayGetDataBlockI()))
+ return;
+ }
+
+ // Set up ready for the new buffer
+ playlen = pplay->len;
+ if (gfxSampleFormatBits(playfmt) > 8)
+ playlen >>= 1;
+ pdata = (uint8_t *)(pplay+1);
+}
+
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+bool_t gaudio_play_lld_init(uint16_t channel, uint32_t frequency, ArrayDataFormat format) {
+ (void) channel;
+
+ if (format != ARRAY_DATA_8BITUNSIGNED && format != ARRAY_DATA_10BITUNSIGNED)
+ return FALSE;
+
+ playfmt = format;
+ return gaudio_play_pwm_setup(frequency, format);
+}
+
+bool_t gaudio_play_lld_set_volume(uint8_t vol) {
+ (void) vol;
+ return FALSE;
+}
+
+void gaudio_play_lld_start(void) {
+
+ gfxSystemLock();
+ // Get a new data buffer
+ if (pplay || !(pplay = gaudioPlayGetDataBlockI())) {
+ gfxSystemUnlock(); // Nothing to do
+ return;
+ }
+
+ // Set up ready for the new buffer
+ playlen = pplay->len;
+ if (gfxSampleFormatBits(playfmt) > 8)
+ playlen >>= 1;
+ pdata = (uint8_t *)(pplay+1);
+ gfxSystemUnlock();
+
+ // Start the playing
+ gaudio_play_pwm_start();
+}
+
+void gaudio_play_lld_stop(void) {
+ // Stop everything
+ gaudio_play_pwm_stop();
+
+ // We may need to clean up the remaining buffer.
+ gfxSystemLock();
+ if (pplay) {
+ gaudioPlayReleaseDataBlockI(pplay);
+ pplay = 0;
+ gaudioPlayDoneI();
+ }
+ gfxSystemUnlock();
+}
+
+#endif /* GFX_USE_GAUDIO && GAUDIO_NEED_PLAY */