From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Mon, 10 Dec 2018 10:37:51 -0700 Subject: [U-Boot] [PATCH v2 22/22] dm: sound: Use the correct number of channels for sound In-Reply-To: <20181210173751.177266-1-sjg@chromium.org> References: <20181210173751.177266-1-sjg@chromium.org> Message-ID: <20181210173751.177266-23-sjg@chromium.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 --- Changes in v2: - Add new patch to use the correct number of channels for sound drivers/sound/sound-uclass.c | 2 +- drivers/sound/sound.c | 11 +++++++---- include/sound.h | 11 ++++++----- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/sound/sound-uclass.c b/drivers/sound/sound-uclass.c index 71e753cb993..2b836268896 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 4f0ad0d8f0d..dd3f9db4f75 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; } } } diff --git a/include/sound.h b/include/sound.h index 02acefd34f0..b7959cc2607 100644 --- a/include/sound.h +++ b/include/sound.h @@ -37,13 +37,14 @@ struct sound_uc_priv { /** * Generates square wave sound data for 1 second * - * @param sample_rate Sample rate in Hz - * @param data data buffer pointer - * @param size size of the buffer in bytes - * @param freq frequency of the wave + * @sample_rate: Sample rate in Hz + * @data: data buffer pointer + * @size: size of the buffer in bytes + * @freq: frequency of the wave + * @channels: Number of channels to use */ void sound_create_square_wave(uint sample_rate, unsigned short *data, int size, - uint freq); + uint freq, uint channels); /* * The sound uclass brings together a data transport (currently only I2C) and a -- 2.20.0.rc2.403.gdbc3b29805-goog