summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2018-12-10 10:37:45 -0700
committerSimon Glass <sjg@chromium.org>2018-12-13 16:36:30 -0700
commit282e29eb4728c43fa42fcba816188cd5523bb6ee (patch)
treef0bb16730fd4c1e39cc0ca70ab9c6f4cd7301268 /arch
parent93a98a6ff3b1ce86a1a1fef6a6e2dc9d5515c9ba (diff)
dm: sandbox: sound: Convert to use driver model
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@chromium.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/sandbox/cpu/sdl.c37
-rw-r--r--arch/sandbox/dts/sandbox.dts21
-rw-r--r--arch/sandbox/include/asm/sdl.h8
3 files changed, 55 insertions, 11 deletions
diff --git a/arch/sandbox/cpu/sdl.c b/arch/sandbox/cpu/sdl.c
index 4dacdbf993..32fa1fffc9 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,39 @@ 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);
+ return 0;
+
+ 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 ce3c88c221..ae3189ec8c 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@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 1c4380c592..0143ed9e62 100644
--- a/arch/sandbox/include/asm/sdl.h
+++ b/arch/sandbox/include/asm/sdl.h
@@ -69,6 +69,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
*
* @return 0 if OK, -ENODEV if no sound is available