[PATCH 1/1] cmd: allow sound command to play multiple sounds
Simon Glass
sjg at chromium.org
Sat Dec 17 22:40:51 CET 2022
On Thu, 15 Dec 2022 at 17:56, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> Currently the sound command accepts only one value each for duration and
> frequency. Allowing more duration and frequency arguments enables playing a
> tune.
>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
> cmd/sound.c | 41 ++++++++++++++++++++++++++++-------------
> doc/usage/cmd/sound.rst | 23 +++++++++++++++++++++--
> 2 files changed, 49 insertions(+), 15 deletions(-)
>
> diff --git a/cmd/sound.c b/cmd/sound.c
> index 20ac3f758e..cef71be5e3 100644
> --- a/cmd/sound.c
> +++ b/cmd/sound.c
> @@ -39,26 +39,39 @@ static int do_play(struct cmd_tbl *cmdtp, int flag, int argc,
> int ret = 0;
> int msec = 1000;
> int freq = 400;
> -
> - if (argc > 1)
> - msec = dectoul(argv[1], NULL);
> - if (argc > 2)
> - freq = dectoul(argv[2], NULL);
> + bool first = true;
>
> ret = uclass_first_device_err(UCLASS_SOUND, &dev);
> - if (!ret)
> + if (ret)
> + goto err;
> + --argc;
> + ++argv;
> + while (argc || first) {
> + first = false;
> + if (argc && *argv[0] != '-') {
> + msec = dectoul(argv[0], NULL);
> + --argc;
> + ++argv;
> + }
> + if (argc && *argv[0] != '-') {
> + freq = dectoul(argv[0], NULL);
> + --argc;
> + ++argv;
> + }
> ret = sound_beep(dev, msec, freq);
> - if (ret) {
> - printf("Sound device failed to play (err=%d)\n", ret);
> - return CMD_RET_FAILURE;
> + if (ret)
> + goto err;
> }
> -
> return 0;
> +
> +err:
> + printf("Sound device failed to play (err=%d)\n", ret);
> + return CMD_RET_FAILURE;
> }
>
> static struct cmd_tbl cmd_sound_sub[] = {
> U_BOOT_CMD_MKENT(init, 0, 1, do_init, "", ""),
> - U_BOOT_CMD_MKENT(play, 2, 1, do_play, "", ""),
> + U_BOOT_CMD_MKENT(play, INT_MAX, 1, do_play, "", ""),
> };
>
> /* process sound command */
> @@ -83,8 +96,10 @@ static int do_sound(struct cmd_tbl *cmdtp, int flag, int argc,
> }
>
> U_BOOT_CMD(
> - sound, 4, 1, do_sound,
> + sound, INT_MAX, 1, do_sound,
> "sound sub-system",
> "init - initialise the sound driver\n"
> - "sound play [len [freq]] - play a sound for len ms at freq Hz\n"
> + "sound play [[[-q|-s] len [freq]] ...] - play sounds\n"
Is the -q / -s stuff actually implemented? Assuming that is in another patch:
Reviewed-by: Simon Glass <sjg at chromium.org>
> + " len - duration in ms\n"
> + " freq - frequency in Hz\n"
> );
> diff --git a/doc/usage/cmd/sound.rst b/doc/usage/cmd/sound.rst
> index d3fac243b1..174975f2c6 100644
> --- a/doc/usage/cmd/sound.rst
> +++ b/doc/usage/cmd/sound.rst
> @@ -10,12 +10,12 @@ Synopsis
> ::
>
> sound init
> - sound play [len [freq]]
> + sound play [[len freq] ...] [len [freq]]
>
> Description
> -----------
>
> -The *sound* command is used to play a beep sound.
> +The *sound* command is used to play one or multiple beep sounds.
>
> sound init
> initializes the sound driver.
> @@ -30,6 +30,25 @@ len
> freq
> frequency of the sound in Hz, defaults to 400 Hz
>
> +Examples
> +--------
> +
> +Beep at 400 Hz for 1000 ms::
> +
> + sound play
> +
> +Beep at 400 Hz for 600 ms::
> +
> + sound play 600
> +
> +Beep at 500 Hz for 600 ms::
> +
> + sound play 600 500
> +
> +Play melody::
> +
> + sound play 500 1047 500 880 500 0 500 1047 500 880 500 0 500 784 500 698 500 784 1000 698
> +
> Configuration
> -------------
>
> --
> 2.37.2
>
Regards,
Simon
More information about the U-Boot
mailing list