Pull request for sound-2023-01-rc4

* Avoid endless loop and amend unit test
 * Add man-page for the sound command
 * Fix sandbox sound driver
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEbcT5xx8ppvoGt20zxIHbvCwFGsQFAmOOWpMACgkQxIHbvCwF
 GsRG5RAAiv0if+7vgU4oqzL1LI7gSRJg4ORHqOhtCSK+7qNanGDKRuPcAjN++Tt2
 Cw5uOYFkaU9oGd2HgnfkxkDNr2S85ANQyPSE22GHa0jwoQSQtI7SBtFvawN6unsz
 h5w01oGxh4IIwtN6lpYnDp3mR8T/tsNsX2zh9WMpa0DURvnJIvRC34fhhoHRht3m
 CUtC23BA04NVWRxg26PD8XFeAVQlmD4s/yeYDTAe1BZG04r4tJGTq1tld/fV3rr6
 1toT4RqzVBxamZBh7Q1hklPwa3i9P4HWDZ/6Qe3uccpQdeTpvYxKjmN+w6a4nNnd
 7C50Qvu+iWJtxu0DVxjeVg1DFTjnp9sMk5zJBg9ZZNgGRvdA+92C/JfXA+XCmPbZ
 hpMjjtLqqVmsgLEuMzb9awUfqrpJVSPBnhqsuWSZGBfjlbkV+QHDfkVuuMjHhaSC
 zzNd8ZUazgywrbsQdc+zOpvXD5QPpn1qUadoXjehxepWA60Ba0lKPMzPNtG1nvmY
 lCXPXzOuu2KBSzytTLGfdStYjwqpA6LbbzYRkW/dIX+WO5GbxJCVt8ej7J7n34zM
 +mIeFyx/vh8wavFwIR4ZO59DoKRbeHJOZ8f0tkT6iOOkWEf7DQdWREFYniTflDVD
 h0QmPnJqsgpsjscx8HLJCMYY+HuzM5mcXzn4Hz/+s7taCdC7cl4=
 =eOd2
 -----END PGP SIGNATURE-----

Merge tag 'sound-2023-01-rc4' of https://source.denx.de/u-boot/custodians/u-boot-efi

Pull request for sound-2023-01-rc4

* Avoid endless loop and amend unit test
* Add man-page for the sound command
* Fix sandbox sound driver
This commit is contained in:
Tom Rini 2022-12-06 10:07:01 -05:00
commit 14f2d087a3
8 changed files with 82 additions and 8 deletions

View File

@ -441,7 +441,6 @@ void sandbox_sdl_fill_audio(void *udata, Uint8 *stream, int len)
{ {
struct buf_info *buf; struct buf_info *buf;
int avail; int avail;
bool have_data = false;
int i; int i;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
@ -453,10 +452,9 @@ void sandbox_sdl_fill_audio(void *udata, Uint8 *stream, int len)
} }
if (avail > len) if (avail > len)
avail = len; avail = len;
have_data = true;
SDL_MixAudio(stream, buf->data + buf->pos, avail, memcpy(stream, buf->data + buf->pos, avail);
SDL_MIX_MAXVOLUME); stream += avail;
buf->pos += avail; buf->pos += avail;
len -= avail; len -= avail;
@ -466,7 +464,8 @@ void sandbox_sdl_fill_audio(void *udata, Uint8 *stream, int len)
else else
break; break;
} }
sdl.stopping = !have_data; memset(stream, 0, len);
sdl.stopping = !!len;
} }
int sandbox_sdl_sound_init(int rate, int channels) int sandbox_sdl_sound_init(int rate, int channels)
@ -484,7 +483,7 @@ int sandbox_sdl_sound_init(int rate, int channels)
wanted.freq = rate; wanted.freq = rate;
wanted.format = AUDIO_S16; wanted.format = AUDIO_S16;
wanted.channels = channels; wanted.channels = channels;
wanted.samples = 1024; /* Good low-latency value for callback */ wanted.samples = 960; /* Good low-latency value for callback */
wanted.callback = sandbox_sdl_fill_audio; wanted.callback = sandbox_sdl_fill_audio;
wanted.userdata = NULL; wanted.userdata = NULL;

View File

@ -188,6 +188,16 @@ int sandbox_get_setup_called(struct udevice *dev);
*/ */
int sandbox_get_sound_active(struct udevice *dev); int sandbox_get_sound_active(struct udevice *dev);
/**
* sandbox_get_sound_count() - Read back the count of the sound data so far
*
* This data is provided to the sandbox driver by the sound play() method.
*
* @dev: Device to check
* Return: count of audio data
*/
int sandbox_get_sound_count(struct udevice *dev);
/** /**
* sandbox_get_sound_sum() - Read back the sum of the sound data so far * sandbox_get_sound_sum() - Read back the sum of the sound data so far
* *

View File

@ -86,5 +86,5 @@ U_BOOT_CMD(
sound, 4, 1, do_sound, sound, 4, 1, do_sound,
"sound sub-system", "sound sub-system",
"init - initialise the sound driver\n" "init - initialise the sound driver\n"
"sound play [len] [freq] - play a sound for len ms at freq hz\n" "sound play [len [freq]] - play a sound for len ms at freq Hz\n"
); );

41
doc/usage/cmd/sound.rst Normal file
View File

@ -0,0 +1,41 @@
.. SPDX-License-Identifier: GPL-2.0+
.. Copyright 2022, Heinrich Schuchardt <xypron.glpk@gmx.de>
sound command
=============
Synopsis
--------
::
sound init
sound play [len [freq]]
Description
-----------
The *sound* command is used to play a beep sound.
sound init
initializes the sound driver.
sound play
plays a square wave sound. It does not depend on previously calling
*sound init*.
len
duration of the sound in ms, defaults to 1000 ms
freq
frequency of the sound in Hz, defaults to 400 Hz
Configuration
-------------
The sound command is enabled by CONFIG_CMD_SOUND=y.
Return value
------------
The return value $? is 0 (true) if the command succeeds, 1 (false) otherwise.

View File

@ -73,6 +73,7 @@ Shell commands
cmd/scp03 cmd/scp03
cmd/setexpr cmd/setexpr
cmd/size cmd/size
cmd/sound
cmd/temperature cmd/temperature
cmd/tftpput cmd/tftpput
cmd/true cmd/true

View File

@ -29,6 +29,7 @@ struct sandbox_i2s_priv {
struct sandbox_sound_priv { struct sandbox_sound_priv {
int setup_called; /* Incremented when setup() method is called */ int setup_called; /* Incremented when setup() method is called */
bool active; /* TX data is being sent */ bool active; /* TX data is being sent */
int count; /* Use to count the provided audio data */
int sum; /* Use to sum the provided audio data */ int sum; /* Use to sum the provided audio data */
bool allow_beep; /* true to allow the start_beep() interface */ bool allow_beep; /* true to allow the start_beep() interface */
int frequency_hz; /* Beep frequency if active, else 0 */ int frequency_hz; /* Beep frequency if active, else 0 */
@ -68,6 +69,13 @@ int sandbox_get_sound_active(struct udevice *dev)
return priv->active; return priv->active;
} }
int sandbox_get_sound_count(struct udevice *dev)
{
struct sandbox_sound_priv *priv = dev_get_priv(dev);
return priv->count;
}
int sandbox_get_sound_sum(struct udevice *dev) int sandbox_get_sound_sum(struct udevice *dev)
{ {
struct sandbox_sound_priv *priv = dev_get_priv(dev); struct sandbox_sound_priv *priv = dev_get_priv(dev);
@ -168,6 +176,7 @@ static int sandbox_sound_play(struct udevice *dev, void *data, uint data_size)
for (i = 0; i < data_size; i++) for (i = 0; i < data_size; i++)
priv->sum += ((uint8_t *)data)[i]; priv->sum += ((uint8_t *)data)[i];
priv->count += data_size;
return i2s_tx_data(uc_priv->i2s, data, data_size); return i2s_tx_data(uc_priv->i2s, data, data_size);
} }

View File

@ -15,7 +15,10 @@ void sound_create_square_wave(uint sample_rate, unsigned short *data, int size,
const int period = freq ? sample_rate / freq : 0; const int period = freq ? sample_rate / freq : 0;
const int half = period / 2; const int half = period / 2;
assert(freq); if (!half) {
memset(data, 0, size);
return;
}
/* Make sure we don't overflow our buffer */ /* Make sure we don't overflow our buffer */
if (size % 2) if (size % 2)

View File

@ -26,8 +26,19 @@ static int dm_test_sound(struct unit_test_state *uts)
ut_asserteq(0, sandbox_get_setup_called(dev)); ut_asserteq(0, sandbox_get_setup_called(dev));
ut_assertok(sound_beep(dev, 1, 100)); ut_assertok(sound_beep(dev, 1, 100));
ut_asserteq(48, sandbox_get_sound_count(dev));
ut_asserteq(4560, sandbox_get_sound_sum(dev)); ut_asserteq(4560, sandbox_get_sound_sum(dev));
ut_assertok(sound_beep(dev, 1, 100)); ut_assertok(sound_beep(dev, 1, 100));
ut_asserteq(96, sandbox_get_sound_count(dev));
ut_asserteq(9120, sandbox_get_sound_sum(dev));
ut_assertok(sound_beep(dev, 1, -100));
ut_asserteq(144, sandbox_get_sound_count(dev));
ut_asserteq(9120, sandbox_get_sound_sum(dev));
ut_assertok(sound_beep(dev, 1, 0));
ut_asserteq(192, sandbox_get_sound_count(dev));
ut_asserteq(9120, sandbox_get_sound_sum(dev));
ut_assertok(sound_beep(dev, 1, INT_MAX));
ut_asserteq(240, sandbox_get_sound_count(dev));
ut_asserteq(9120, sandbox_get_sound_sum(dev)); ut_asserteq(9120, sandbox_get_sound_sum(dev));
ut_asserteq(false, sandbox_get_sound_active(dev)); ut_asserteq(false, sandbox_get_sound_active(dev));