blob: b0eab233916b14e6b771ca34a9f7ad0df2883bcd [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +00002/*
3 * Copyright (C) 2012 Samsung Electronics
4 * R. Chandrasekar <rcsekar@samsung.com>
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +00005 */
6
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +00007#include <common.h>
Simon Glassf7ae49f2020-05-10 11:40:05 -06008#include <log.h>
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +00009#include <sound.h>
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +000010
Simon Glass7d92b062018-11-15 19:56:13 -070011void sound_create_square_wave(uint sample_rate, unsigned short *data, int size,
Simon Glassf9871772018-12-10 10:37:51 -070012 uint freq, uint channels)
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +000013{
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +000014 const unsigned short amplitude = 16000; /* between 1 and 32767 */
Simon Glass7d92b062018-11-15 19:56:13 -070015 const int period = freq ? sample_rate / freq : 0;
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +000016 const int half = period / 2;
17
18 assert(freq);
19
20 /* Make sure we don't overflow our buffer */
21 if (size % 2)
22 size--;
23
24 while (size) {
Simon Glassf9871772018-12-10 10:37:51 -070025 int i, j;
26
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +000027 for (i = 0; size && i < half; i++) {
28 size -= 2;
Simon Glassf9871772018-12-10 10:37:51 -070029 for (j = 0; j < channels; j++)
30 *data++ = amplitude;
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +000031 }
32 for (i = 0; size && i < period - half; i++) {
33 size -= 2;
Simon Glassf9871772018-12-10 10:37:51 -070034 for (j = 0; j < channels; j++)
35 *data++ = -amplitude;
Rajeshwari Shinde511ed5f2012-10-25 19:49:22 +000036 }
37 }
38}