From f987177db9c988142032ed8142a093cce2378a90 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 10 Dec 2018 10:37:51 -0700 Subject: dm: sound: Use the correct number of channels for sound At present the 'beep' sound generates a waveform for only one channel even if two are being used. This means that the beep is twice the frequency it should be. Correct this by making it a parameter. The fix in a previous commit was correct for sandbox but not for other boards. Fixes: 03f11e87a8 ("sound: Correct data output in sound_create_square_wave()") Signed-off-by: Simon Glass --- drivers/sound/sound-uclass.c | 2 +- drivers/sound/sound.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'drivers/sound') diff --git a/drivers/sound/sound-uclass.c b/drivers/sound/sound-uclass.c index 71e753cb99..2b83626889 100644 --- a/drivers/sound/sound-uclass.c +++ b/drivers/sound/sound-uclass.c @@ -53,7 +53,7 @@ int sound_beep(struct udevice *dev, int msecs, int frequency_hz) } sound_create_square_wave(i2s_uc_priv->samplingrate, data, data_size, - frequency_hz); + frequency_hz, i2s_uc_priv->channels); while (msecs >= 1000) { ret = sound_play(dev, data, data_size); diff --git a/drivers/sound/sound.c b/drivers/sound/sound.c index 4f0ad0d8f0..dd3f9db4f7 100644 --- a/drivers/sound/sound.c +++ b/drivers/sound/sound.c @@ -8,7 +8,7 @@ #include void sound_create_square_wave(uint sample_rate, unsigned short *data, int size, - uint freq) + uint freq, uint channels) { const unsigned short amplitude = 16000; /* between 1 and 32767 */ const int period = freq ? sample_rate / freq : 0; @@ -21,14 +21,17 @@ void sound_create_square_wave(uint sample_rate, unsigned short *data, int size, size--; while (size) { - int i; + int i, j; + for (i = 0; size && i < half; i++) { size -= 2; - *data++ = amplitude; + for (j = 0; j < channels; j++) + *data++ = amplitude; } for (i = 0; size && i < period - half; i++) { size -= 2; - *data++ = -amplitude; + for (j = 0; j < channels; j++) + *data++ = -amplitude; } } } -- cgit v1.2.3