test: add unit test for the PCM library
This commit is contained in:
		
							
								
								
									
										12
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -937,6 +937,7 @@ sparse-check: | ||||
| if ENABLE_TEST | ||||
|  | ||||
| C_TESTS = \ | ||||
| 	test/test_pcm \ | ||||
| 	test/test_queue_priority | ||||
|  | ||||
| TESTS = $(C_TESTS) | ||||
| @@ -1193,6 +1194,17 @@ test_run_inotify_SOURCES = test/run_inotify.c \ | ||||
| test_run_inotify_LDADD = $(GLIB_LIBS) | ||||
| endif | ||||
|  | ||||
| test_test_pcm_SOURCES = \ | ||||
| 	test/test_pcm_dither.c \ | ||||
| 	test/test_pcm_pack.c \ | ||||
| 	test/test_pcm_channels.c \ | ||||
| 	test/test_pcm_byteswap.c \ | ||||
| 	test/test_pcm_all.h \ | ||||
| 	test/test_pcm_main.c | ||||
| test_test_pcm_LDADD = \ | ||||
| 	$(PCM_LIBS) \ | ||||
| 	$(GLIB_LIBS) | ||||
|  | ||||
| test_test_queue_priority_SOURCES = \ | ||||
| 	src/queue.c \ | ||||
| 	test/test_queue_priority.c | ||||
|   | ||||
							
								
								
									
										47
									
								
								test/test_pcm_all.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								test/test_pcm_all.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2011 The Music Player Daemon Project | ||||
|  * http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  */ | ||||
|  | ||||
| #ifndef MPD_TEST_PCM_ALL_H | ||||
| #define MPD_TEST_PCM_ALL_H | ||||
|  | ||||
| void | ||||
| test_pcm_dither_24(void); | ||||
|  | ||||
| void | ||||
| test_pcm_dither_32(void); | ||||
|  | ||||
| void | ||||
| test_pcm_pack_24(void); | ||||
|  | ||||
| void | ||||
| test_pcm_unpack_24(void); | ||||
|  | ||||
| void | ||||
| test_pcm_channels_16(void); | ||||
|  | ||||
| void | ||||
| test_pcm_channels_32(void); | ||||
|  | ||||
| void | ||||
| test_pcm_byteswap_16(void); | ||||
|  | ||||
| void | ||||
| test_pcm_byteswap_32(void); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										62
									
								
								test/test_pcm_byteswap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								test/test_pcm_byteswap.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2011 The Music Player Daemon Project | ||||
|  * http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  */ | ||||
|  | ||||
| #include "test_pcm_all.h" | ||||
| #include "pcm_byteswap.h" | ||||
| #include "pcm_buffer.h" | ||||
|  | ||||
| #include <glib.h> | ||||
|  | ||||
| void | ||||
| test_pcm_byteswap_16(void) | ||||
| { | ||||
| 	enum { N = 256 }; | ||||
| 	int16_t src[N]; | ||||
|  | ||||
| 	for (unsigned i = 0; i < G_N_ELEMENTS(src); ++i) | ||||
| 		src[i] = g_random_int(); | ||||
|  | ||||
| 	struct pcm_buffer buffer; | ||||
| 	pcm_buffer_init(&buffer); | ||||
|  | ||||
| 	const int16_t *dest = pcm_byteswap_16(&buffer, src, sizeof(src)); | ||||
| 	g_assert(dest != NULL); | ||||
| 	for (unsigned i = 0; i < N; ++i) | ||||
| 		g_assert_cmpint(dest[i], ==, | ||||
| 				(int16_t)GUINT16_SWAP_LE_BE(src[i])); | ||||
| } | ||||
|  | ||||
| void | ||||
| test_pcm_byteswap_32(void) | ||||
| { | ||||
| 	enum { N = 256 }; | ||||
| 	int32_t src[N]; | ||||
|  | ||||
| 	for (unsigned i = 0; i < G_N_ELEMENTS(src); ++i) | ||||
| 		src[i] = g_random_int(); | ||||
|  | ||||
| 	struct pcm_buffer buffer; | ||||
| 	pcm_buffer_init(&buffer); | ||||
|  | ||||
| 	const int32_t *dest = pcm_byteswap_32(&buffer, src, sizeof(src)); | ||||
| 	g_assert(dest != NULL); | ||||
| 	for (unsigned i = 0; i < N; ++i) | ||||
| 		g_assert_cmpint(dest[i], ==, | ||||
| 				(int32_t)GUINT32_SWAP_LE_BE(src[i])); | ||||
| } | ||||
							
								
								
									
										100
									
								
								test/test_pcm_channels.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								test/test_pcm_channels.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2011 The Music Player Daemon Project | ||||
|  * http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  */ | ||||
|  | ||||
| #include "test_pcm_all.h" | ||||
| #include "pcm_channels.h" | ||||
| #include "pcm_buffer.h" | ||||
|  | ||||
| #include <glib.h> | ||||
|  | ||||
| void | ||||
| test_pcm_channels_16(void) | ||||
| { | ||||
| 	enum { N = 256 }; | ||||
| 	int16_t src[N * 2]; | ||||
|  | ||||
| 	for (unsigned i = 0; i < G_N_ELEMENTS(src); ++i) | ||||
| 		src[i] = g_random_int(); | ||||
|  | ||||
| 	struct pcm_buffer buffer; | ||||
| 	pcm_buffer_init(&buffer); | ||||
|  | ||||
| 	/* stereo to mono */ | ||||
|  | ||||
| 	size_t dest_size; | ||||
| 	const int16_t *dest = | ||||
| 		pcm_convert_channels_16(&buffer, 1, 2, src, sizeof(src), | ||||
| 					&dest_size); | ||||
| 	g_assert(dest != NULL); | ||||
| 	g_assert_cmpint(dest_size, ==, sizeof(src) / 2); | ||||
| 	for (unsigned i = 0; i < N; ++i) | ||||
| 		g_assert_cmpint(dest[i], ==, | ||||
| 				(src[i * 2] + src[i * 2 + 1]) / 2); | ||||
|  | ||||
| 	/* mono to stereo */ | ||||
|  | ||||
| 	dest = pcm_convert_channels_16(&buffer, 2, 1, src, sizeof(src), | ||||
| 				       &dest_size); | ||||
| 	g_assert(dest != NULL); | ||||
| 	g_assert_cmpint(dest_size, ==, sizeof(src) * 2); | ||||
| 	for (unsigned i = 0; i < N; ++i) { | ||||
| 		g_assert_cmpint(dest[i * 2], ==, src[i]); | ||||
| 		g_assert_cmpint(dest[i * 2 + 1], ==, src[i]); | ||||
| 	} | ||||
|  | ||||
| 	pcm_buffer_deinit(&buffer); | ||||
| } | ||||
|  | ||||
| void | ||||
| test_pcm_channels_32(void) | ||||
| { | ||||
| 	enum { N = 256 }; | ||||
| 	int32_t src[N * 2]; | ||||
|  | ||||
| 	for (unsigned i = 0; i < G_N_ELEMENTS(src); ++i) | ||||
| 		src[i] = g_random_int(); | ||||
|  | ||||
| 	struct pcm_buffer buffer; | ||||
| 	pcm_buffer_init(&buffer); | ||||
|  | ||||
| 	/* stereo to mono */ | ||||
|  | ||||
| 	size_t dest_size; | ||||
| 	const int32_t *dest = | ||||
| 		pcm_convert_channels_32(&buffer, 1, 2, src, sizeof(src), | ||||
| 					&dest_size); | ||||
| 	g_assert(dest != NULL); | ||||
| 	g_assert_cmpint(dest_size, ==, sizeof(src) / 2); | ||||
| 	for (unsigned i = 0; i < N; ++i) | ||||
| 		g_assert_cmpint(dest[i], ==, | ||||
| 				((int64_t)src[i * 2] + (int64_t)src[i * 2 + 1]) / 2); | ||||
|  | ||||
| 	/* mono to stereo */ | ||||
|  | ||||
| 	dest = pcm_convert_channels_32(&buffer, 2, 1, src, sizeof(src), | ||||
| 				       &dest_size); | ||||
| 	g_assert(dest != NULL); | ||||
| 	g_assert_cmpint(dest_size, ==, sizeof(src) * 2); | ||||
| 	for (unsigned i = 0; i < N; ++i) { | ||||
| 		g_assert_cmpint(dest[i * 2], ==, src[i]); | ||||
| 		g_assert_cmpint(dest[i * 2 + 1], ==, src[i]); | ||||
| 	} | ||||
|  | ||||
| 	pcm_buffer_deinit(&buffer); | ||||
| } | ||||
							
								
								
									
										79
									
								
								test/test_pcm_dither.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								test/test_pcm_dither.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2011 The Music Player Daemon Project | ||||
|  * http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  */ | ||||
|  | ||||
| #include "test_pcm_all.h" | ||||
| #include "pcm_dither.h" | ||||
|  | ||||
| #include <glib.h> | ||||
|  | ||||
| /** | ||||
|  * Generate a random 24 bit PCM sample. | ||||
|  */ | ||||
| static int32_t | ||||
| random24(void) | ||||
| { | ||||
| 	int32_t x = g_random_int() & 0xffffff; | ||||
| 	if (x & 0x800000) | ||||
| 		x |= 0xff000000; | ||||
| 	return x; | ||||
| } | ||||
|  | ||||
| void | ||||
| test_pcm_dither_24(void) | ||||
| { | ||||
| 	struct pcm_dither dither; | ||||
|  | ||||
| 	pcm_dither_24_init(&dither); | ||||
|  | ||||
| 	enum { N = 256 }; | ||||
| 	int32_t src[N]; | ||||
| 	for (unsigned i = 0; i < N; ++i) | ||||
| 		src[i] = random24(); | ||||
|  | ||||
| 	int16_t dest[N]; | ||||
|  | ||||
| 	pcm_dither_24_to_16(&dither, dest, src, N); | ||||
|  | ||||
| 	for (unsigned i = 0; i < N; ++i) { | ||||
| 		g_assert_cmpint(dest[i], >=, (src[i] >> 8) - 8); | ||||
| 		g_assert_cmpint(dest[i], <, (src[i] >> 8) + 8); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void | ||||
| test_pcm_dither_32(void) | ||||
| { | ||||
| 	struct pcm_dither dither; | ||||
|  | ||||
| 	pcm_dither_24_init(&dither); | ||||
|  | ||||
| 	enum { N = 256 }; | ||||
| 	int32_t src[N]; | ||||
| 	for (unsigned i = 0; i < N; ++i) | ||||
| 		src[i] = g_random_int(); | ||||
|  | ||||
| 	int16_t dest[N]; | ||||
|  | ||||
| 	pcm_dither_32_to_16(&dither, dest, src, N); | ||||
|  | ||||
| 	for (unsigned i = 0; i < N; ++i) { | ||||
| 		g_assert_cmpint(dest[i], >=, (src[i] >> 16) - 8); | ||||
| 		g_assert_cmpint(dest[i], <, (src[i] >> 16) + 8); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										38
									
								
								test/test_pcm_main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								test/test_pcm_main.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2011 The Music Player Daemon Project | ||||
|  * http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  */ | ||||
|  | ||||
| #include "test_pcm_all.h" | ||||
|  | ||||
| #include <glib.h> | ||||
|  | ||||
| int | ||||
| main(int argc, char **argv) | ||||
| { | ||||
| 	g_test_init (&argc, &argv, NULL); | ||||
| 	g_test_add_func("/pcm/dither/24", test_pcm_dither_24); | ||||
| 	g_test_add_func("/pcm/dither/32", test_pcm_dither_32); | ||||
| 	g_test_add_func("/pcm/pack/pack24", test_pcm_pack_24); | ||||
| 	g_test_add_func("/pcm/pack/unpack24", test_pcm_unpack_24); | ||||
| 	g_test_add_func("/pcm/channels/16", test_pcm_channels_16); | ||||
| 	g_test_add_func("/pcm/channels/32", test_pcm_channels_32); | ||||
| 	g_test_add_func("/pcm/byteswap/16", test_pcm_byteswap_16); | ||||
| 	g_test_add_func("/pcm/byteswap/32", test_pcm_byteswap_32); | ||||
|  | ||||
| 	g_test_run(); | ||||
| } | ||||
							
								
								
									
										89
									
								
								test/test_pcm_pack.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								test/test_pcm_pack.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2011 The Music Player Daemon Project | ||||
|  * http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  */ | ||||
|  | ||||
| #include "test_pcm_all.h" | ||||
| #include "pcm_pack.h" | ||||
|  | ||||
| #include <glib.h> | ||||
|  | ||||
| /** | ||||
|  * Generate a random 24 bit PCM sample. | ||||
|  */ | ||||
| static int32_t | ||||
| random24(void) | ||||
| { | ||||
| 	int32_t x = g_random_int() & 0xffffff; | ||||
| 	if (x & 0x800000) | ||||
| 		x |= 0xff000000; | ||||
| 	return x; | ||||
| } | ||||
|  | ||||
| void | ||||
| test_pcm_pack_24(void) | ||||
| { | ||||
| 	enum { N = 256 }; | ||||
| 	int32_t src[N * 3]; | ||||
| 	for (unsigned i = 0; i < N; ++i) | ||||
| 		src[i] = random24(); | ||||
|  | ||||
| 	uint8_t dest[N * 3]; | ||||
|  | ||||
| 	pcm_pack_24(dest, src, N, false); | ||||
|  | ||||
| 	for (unsigned i = 0; i < N; ++i) { | ||||
| 		int32_t d; | ||||
| 		if (G_BYTE_ORDER == G_BIG_ENDIAN) | ||||
| 			d = (dest[i * 3] << 16) | (dest[i * 3 + 1] << 8) | ||||
| 				| dest[i * 3 + 2]; | ||||
| 		else | ||||
| 			d = (dest[i * 3 + 2] << 16) | (dest[i * 3 + 1] << 8) | ||||
| 				| dest[i * 3]; | ||||
| 		if (d & 0x800000) | ||||
| 			d |= 0xff000000; | ||||
|  | ||||
| 		g_assert_cmpint(d, ==, src[i]); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void | ||||
| test_pcm_unpack_24(void) | ||||
| { | ||||
| 	enum { N = 256 }; | ||||
| 	uint8_t src[N * 3]; | ||||
| 	for (unsigned i = 0; i < G_N_ELEMENTS(src); ++i) | ||||
| 		src[i] = g_random_int_range(0, 256); | ||||
|  | ||||
| 	int32_t dest[N]; | ||||
|  | ||||
| 	pcm_unpack_24(dest, src, N, false); | ||||
|  | ||||
| 	for (unsigned i = 0; i < N; ++i) { | ||||
| 		int32_t s; | ||||
| 		if (G_BYTE_ORDER == G_BIG_ENDIAN) | ||||
| 			s = (src[i * 3] << 16) | (src[i * 3 + 1] << 8) | ||||
| 				| src[i * 3 + 2]; | ||||
| 		else | ||||
| 			s = (src[i * 3 + 2] << 16) | (src[i * 3 + 1] << 8) | ||||
| 				| src[i * 3]; | ||||
| 		if (s & 0x800000) | ||||
| 			s |= 0xff000000; | ||||
|  | ||||
| 		g_assert_cmpint(s, ==, dest[i]); | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann