xref: /rk3399_rockchip-uboot/drivers/sound/sound.c (revision 1cad23c5f471d695bed1e3907e30caee3c2a3056)
1511ed5fdSRajeshwari Shinde /*
2511ed5fdSRajeshwari Shinde  * Copyright (C) 2012 Samsung Electronics
3511ed5fdSRajeshwari Shinde  * R. Chandrasekar <rcsekar@samsung.com>
4511ed5fdSRajeshwari Shinde  *
51a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
6511ed5fdSRajeshwari Shinde  */
7511ed5fdSRajeshwari Shinde 
8511ed5fdSRajeshwari Shinde #include <common.h>
9511ed5fdSRajeshwari Shinde #include <sound.h>
10511ed5fdSRajeshwari Shinde 
sound_create_square_wave(unsigned short * data,int size,uint32_t freq)11*a77bf709SSimon Glass void sound_create_square_wave(unsigned short *data, int size, uint32_t freq)
12511ed5fdSRajeshwari Shinde {
13511ed5fdSRajeshwari Shinde 	const int sample = 48000;
14511ed5fdSRajeshwari Shinde 	const unsigned short amplitude = 16000; /* between 1 and 32767 */
15511ed5fdSRajeshwari Shinde 	const int period = freq ? sample / freq : 0;
16511ed5fdSRajeshwari Shinde 	const int half = period / 2;
17511ed5fdSRajeshwari Shinde 
18511ed5fdSRajeshwari Shinde 	assert(freq);
19511ed5fdSRajeshwari Shinde 
20511ed5fdSRajeshwari Shinde 	/* Make sure we don't overflow our buffer */
21511ed5fdSRajeshwari Shinde 	if (size % 2)
22511ed5fdSRajeshwari Shinde 		size--;
23511ed5fdSRajeshwari Shinde 
24511ed5fdSRajeshwari Shinde 	while (size) {
25511ed5fdSRajeshwari Shinde 		int i;
26511ed5fdSRajeshwari Shinde 		for (i = 0; size && i < half; i++) {
27511ed5fdSRajeshwari Shinde 			size -= 2;
28511ed5fdSRajeshwari Shinde 			*data++ = amplitude;
29511ed5fdSRajeshwari Shinde 			*data++ = amplitude;
30511ed5fdSRajeshwari Shinde 		}
31511ed5fdSRajeshwari Shinde 		for (i = 0; size && i < period - half; i++) {
32511ed5fdSRajeshwari Shinde 			size -= 2;
33511ed5fdSRajeshwari Shinde 			*data++ = -amplitude;
34511ed5fdSRajeshwari Shinde 			*data++ = -amplitude;
35511ed5fdSRajeshwari Shinde 		}
36511ed5fdSRajeshwari Shinde 	}
37511ed5fdSRajeshwari Shinde }
38