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>
This commit is contained in:
Simon Glass 2018-12-10 10:37:45 -07:00
parent 93a98a6ff3
commit 282e29eb47
3 changed files with 55 additions and 11 deletions

View File

@ -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;
}

View File

@ -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>;

View File

@ -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
*