blob: 4fde2989e04f5983106eb12b5121844639f865df [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +00002/*
3 * Copyright (C) 2012 Samsung Electronics
4 * R. Chandrasekar <rcsekar@samsung.com>
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +00005 */
6
Simon Glass0f2af882020-05-10 11:40:05 -06007#include <log.h>
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +00008#include <sound.h>
Tom Rinia35904d2024-05-01 19:31:21 -06009#include <linux/string.h>
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +000010
Simon Glassddad0322018-11-15 19:56:13 -070011void sound_create_square_wave(uint sample_rate, unsigned short *data, int size,
Simon Glass51aa8602018-12-10 10:37:51 -070012 uint freq, uint channels)
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +000013{
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +000014 const unsigned short amplitude = 16000; /* between 1 and 32767 */
Simon Glassddad0322018-11-15 19:56:13 -070015 const int period = freq ? sample_rate / freq : 0;
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +000016 const int half = period / 2;
17
Heinrich Schuchardta5c75ce2022-12-04 14:00:05 +010018 if (!half) {
19 memset(data, 0, size);
20 return;
21 }
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +000022
23 /* Make sure we don't overflow our buffer */
24 if (size % 2)
25 size--;
26
27 while (size) {
Simon Glass51aa8602018-12-10 10:37:51 -070028 int i, j;
29
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +000030 for (i = 0; size && i < half; i++) {
Andrew Scullc40b01b2022-04-03 10:39:13 +000031 for (j = 0; size && j < channels; j++, size -= 2)
Simon Glass51aa8602018-12-10 10:37:51 -070032 *data++ = amplitude;
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +000033 }
34 for (i = 0; size && i < period - half; i++) {
Andrew Scullc40b01b2022-04-03 10:39:13 +000035 for (j = 0; size && j < channels; j++, size -= 2)
Simon Glass51aa8602018-12-10 10:37:51 -070036 *data++ = -amplitude;
Rajeshwari Shinde836a66c2012-10-25 19:49:22 +000037 }
38 }
39}