summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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