[U-Boot] [PATCH v2 16/22] dm: sandbox: sound: Convert to use driver model

Simon Glass sjg at chromium.org
Mon Dec 10 17:37:45 UTC 2018


Update sandbox's device tree and config to use driver model for sound. Use
the double buffer for sound output so that we don't need to wait for the
sound to complete before returning.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

Changes in v2:
- Add new patch to convert sandbox to use driver model

 arch/sandbox/cpu/sdl.c         | 36 ++++++++++++++++++++++------------
 arch/sandbox/dts/sandbox.dts   | 21 ++++++++++++++++++++
 arch/sandbox/include/asm/sdl.h |  8 ++++++++
 3 files changed, 53 insertions(+), 12 deletions(-)

diff --git a/arch/sandbox/cpu/sdl.c b/arch/sandbox/cpu/sdl.c
index 4dacdbf993f..8fc7c172e3a 100644
--- a/arch/sandbox/cpu/sdl.c
+++ b/arch/sandbox/cpu/sdl.c
@@ -4,6 +4,7 @@
  */
 
 #include <errno.h>
+#include <unistd.h>
 #include <linux/input.h>
 #include <SDL/SDL.h>
 #include <sound.h>
@@ -40,6 +41,7 @@ static struct sdl_info {
 	bool inited;
 	int cur_buf;
 	struct buf_info buf[2];
+	bool running;
 } sdl;
 
 static void sandbox_sdl_poll_events(void)
@@ -331,6 +333,7 @@ int sandbox_sdl_sound_init(void)
 	sdl.audio_active = true;
 	sdl.sample_rate = wanted.freq;
 	sdl.cur_buf = 0;
+	sdl.running = 0;
 
 	return 0;
 
@@ -340,27 +343,36 @@ err:
 	return -1;
 }
 
-int sandbox_sdl_sound_start(uint frequency)
+int sandbox_sdl_sound_play(const void *data, uint size)
 {
-	struct buf_info *buf = &sdl.buf[0];
+	struct buf_info *buf;
 
-	if (!sdl.audio_active)
-		return -1;
-	sdl.frequency = frequency;
-	sound_create_square_wave(sdl.sample_rate, (unsigned short *)buf->data,
-				 buf->alloced, frequency);
+	buf = &sdl.buf[0];
+	if (buf->size)
+		buf = &sdl.buf[1];
+	while (buf->size)
+		usleep(1000);
+
+	if (size > buf->alloced)
+		return -E2BIG;
+
+	memcpy(buf->data, data, size);
+	buf->size = size;
 	buf->pos = 0;
-	buf->size = buf->alloced;
-	SDL_PauseAudio(0);
+	if (!sdl.running) {
+		SDL_PauseAudio(0);
+		sdl.running = 1;
+	}
 
 	return 0;
 }
 
 int sandbox_sdl_sound_stop(void)
 {
-	if (!sdl.audio_active)
-		return -1;
-	SDL_PauseAudio(1);
+	if (sdl.running) {
+		SDL_PauseAudio(1);
+		sdl.running = 0;
+	}
 
 	return 0;
 }
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index ce3c88c221d..ae3189ec8cf 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -18,6 +18,11 @@
 		stdout-path = "/serial";
 	};
 
+	audio: audio-codec {
+		compatible = "sandbox,audio-codec";
+		#sound-dai-cells = <1>;
+	};
+
 	cros_ec: cros-ec {
 		reg = <0 0>;
 		u-boot,dm-pre-reloc;
@@ -127,6 +132,11 @@
 		};
 	};
 
+	i2s: i2s {
+		compatible = "sandbox,i2s";
+		#sound-dai-cells = <1>;
+	};
+
 	lcd {
 		u-boot,dm-pre-reloc;
 		compatible = "sandbox,lcd-sdl";
@@ -190,6 +200,17 @@
 		compatible = "sandbox,reset";
 	};
 
+	sound {
+		compatible = "sandbox,sound";
+		cpu {
+			sound-dai = <&i2s 0>;
+		};
+
+		codec {
+			sound-dai = <&audio 0>;
+		};
+	};
+
 	spi at 0 {
 		u-boot,dm-pre-reloc;
 		#address-cells = <1>;
diff --git a/arch/sandbox/include/asm/sdl.h b/arch/sandbox/include/asm/sdl.h
index 1c4380c592a..0143ed9e621 100644
--- a/arch/sandbox/include/asm/sdl.h
+++ b/arch/sandbox/include/asm/sdl.h
@@ -68,6 +68,14 @@ int sandbox_sdl_sound_start(uint frequency);
  */
 int sandbox_sdl_sound_stop(void);
 
+/**
+ * sandbox_sdl_sound_play() - Play a sound
+ *
+ * @data:	Data to play (typically 16-bit)
+ * @count:	Number of bytes in data
+ */
+int sandbox_sdl_sound_play(const void *data, uint count);
+
 /**
  * sandbox_sdl_sound_init() - set up the sound system
  *
-- 
2.20.0.rc2.403.gdbc3b29805-goog



More information about the U-Boot mailing list