[PATCH v2 6/7] sound: add CONFIG_SOUND_SINE symbol

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Sun Dec 4 22:16:06 CET 2022


Provide a configuration symbol to allow the sound command play a sine wave
instead of a square wave.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
---
v2:
	update documentation
---
 doc/usage/cmd/sound.rst      |  3 +++
 drivers/sound/Kconfig        |  6 ++++++
 drivers/sound/sound-uclass.c | 10 ++++++++--
 test/dm/sound.c              | 20 ++++++++++++--------
 4 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/doc/usage/cmd/sound.rst b/doc/usage/cmd/sound.rst
index d3fac243b1..aa988fa261 100644
--- a/doc/usage/cmd/sound.rst
+++ b/doc/usage/cmd/sound.rst
@@ -35,6 +35,9 @@ Configuration
 
 The sound command is enabled by CONFIG_CMD_SOUND=y.
 
+By default a square wave is generated. With CONFIG_SOUND_SINE=y a sine wave is
+used instead.
+
 Return value
 ------------
 
diff --git a/drivers/sound/Kconfig b/drivers/sound/Kconfig
index 0948d8caab..1005192fd4 100644
--- a/drivers/sound/Kconfig
+++ b/drivers/sound/Kconfig
@@ -12,6 +12,12 @@ config SOUND
 	  audio codecs are called from the sound-i2s code. This could be
 	  converted to driver model.
 
+config SOUND_SINE
+	bool "Generate sine wave"
+	help
+	  When this setting is enabled playing a sound produces a sine
+	  wave. If the settings is not enabled, a square wave is produced.
+
 config I2S
 	bool "Enable I2S support"
 	depends on SOUND
diff --git a/drivers/sound/sound-uclass.c b/drivers/sound/sound-uclass.c
index 2ffc4fc7c1..637f6b11ab 100644
--- a/drivers/sound/sound-uclass.c
+++ b/drivers/sound/sound-uclass.c
@@ -99,8 +99,14 @@ int sound_beep(struct udevice *dev, int msecs, int frequency_hz)
 		return -ENOMEM;
 	}
 
-	sound_create_square_wave(i2s_uc_priv->samplingrate, data, data_size,
-				 frequency_hz, i2s_uc_priv->channels);
+	if (CONFIG_IS_ENABLED(SOUND_SINE))
+		sound_create_sine_wave(i2s_uc_priv->samplingrate, data,
+				       data_size, frequency_hz,
+				       i2s_uc_priv->channels);
+	else
+		sound_create_square_wave(i2s_uc_priv->samplingrate, data,
+					 data_size, frequency_hz,
+					 i2s_uc_priv->channels);
 
 	ret = 0;
 	while (msecs >= 1000) {
diff --git a/test/dm/sound.c b/test/dm/sound.c
index 15d545ab5a..f16ea80157 100644
--- a/test/dm/sound.c
+++ b/test/dm/sound.c
@@ -17,6 +17,12 @@ static int dm_test_sound(struct unit_test_state *uts)
 {
 	struct sound_uc_priv *uc_priv;
 	struct udevice *dev;
+	int expected;
+
+	if (CONFIG_IS_ENABLED(SOUND_SINE))
+		expected = 3494;
+	else
+		expected = 4560;
 
 	/* check probe success */
 	ut_assertok(uclass_first_device_err(UCLASS_SOUND, &dev));
@@ -24,24 +30,22 @@ static int dm_test_sound(struct unit_test_state *uts)
 	ut_asserteq_str("audio-codec", uc_priv->codec->name);
 	ut_asserteq_str("i2s", uc_priv->i2s->name);
 	ut_asserteq(0, sandbox_get_setup_called(dev));
-
 	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(expected, sandbox_get_sound_sum(dev));
 	ut_assertok(sound_beep(dev, 1, 100));
 	ut_asserteq(96, sandbox_get_sound_count(dev));
-	ut_asserteq(9120, sandbox_get_sound_sum(dev));
+	expected *= 2;
+	ut_asserteq(expected, 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_asserteq(expected, 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_asserteq(expected, 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(false, sandbox_get_sound_active(dev));
-
+	ut_asserteq(expected, sandbox_get_sound_sum(dev));
 	return 0;
 }
 DM_TEST(dm_test_sound, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
-- 
2.37.2



More information about the U-Boot mailing list