diff options
Diffstat (limited to 'arch/sandbox')
-rw-r--r-- | arch/sandbox/cpu/sdl.c | 37 | ||||
-rw-r--r-- | arch/sandbox/dts/sandbox.dts | 21 | ||||
-rw-r--r-- | arch/sandbox/include/asm/sdl.h | 8 |
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 |