145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak/*
245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak * v4l-test: Test environment for Video For Linux Two API
345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak *
4c40b521b10941033d8b1c031bd02ab47240d5c93subrata_modak * 20 Apr 2009  0.7  Added string content validation
5c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak * 18 Apr 2009  0.6  More strict check for strings
6c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak * 29 Mar 2009  0.5  Clean up test case for NULL parameter
7c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak * 25 Mar 2009  0.4  Cleaned up dprintf() outputs and ret and errno names
8a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak *  9 Feb 2009  0.3  Typo corrected; added some debug messages
9a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak *  7 Feb 2009  0.2  Test case test_VIDIOC_G_AUDIO_ignore_index added
1045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak *  3 Feb 2009  0.1  First release
1145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak *
1245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak * Written by M�rton N�meth <nm127@freemail.hu>
1345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak * Released under GPL
1445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak *
1545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak */
1645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
1745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <stdio.h>
1845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <sys/types.h>
1945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <sys/stat.h>
2045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <fcntl.h>
2145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <unistd.h>
2245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <sys/ioctl.h>
2345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <errno.h>
2445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <string.h>
2545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
2645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <linux/videodev2.h>
2745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <linux/errno.h>
2845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
2945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include <CUnit/CUnit.h>
3045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
3145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include "v4l2_test.h"
3245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include "dev_video.h"
3345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include "video_limits.h"
34c40b521b10941033d8b1c031bd02ab47240d5c93subrata_modak#include "v4l2_validator.h"
3545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
3645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak#include "test_VIDIOC_ENUMAUDIO.h"
3745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
38354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint valid_audio_capability(__u32 capability)
39354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
4045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	int valid = 0;
4145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
42354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((capability & ~(V4L2_AUDCAP_STEREO | V4L2_AUDCAP_AVL))
43354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    == 0) {
4445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		valid = 1;
4545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	} else {
4645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		valid = 0;
4745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
4845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	return valid;
4945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak}
5045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
51354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint valid_audio_mode(__u32 mode)
52354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
5345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	int valid = 0;
5445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
55df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if ((mode & ~(V4L2_AUDMODE_AVL))
56354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    == 0) {
5745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		valid = 1;
5845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	} else {
5945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		valid = 0;
6045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
6145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	return valid;
6245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak}
6345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
64354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_G_AUDIO()
65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
66c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
6745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_audio audio;
6845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_audio audio2;
6945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
7045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	memset(&audio, 0xff, sizeof(audio));
71c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio);
72c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
7345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
74c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_get=%i, errno_get=%i\n",
75c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
7645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
77c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	if (ret_get == 0) {
78c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, 0);
7945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
8045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		//CU_ASSERT_EQUAL(audio.index, ?);
8145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		CU_ASSERT(0 < strlen((char *)audio.name));
83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		CU_ASSERT(valid_string((char *)audio.name, sizeof(audio.name)));
8445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
8545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT(valid_audio_capability(audio.capability));
8645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT(valid_audio_mode(audio.mode));
8745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
8845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(audio.reserved[0], 0);
8945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(audio.reserved[1], 0);
9045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
91c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		/* Check if the unused bytes of the name string are
92c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		 * also filled with zeros. Also check if there is any
93c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		 * padding byte between any two fields then this
94c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		 * padding byte is also filled with zeros.
95c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		 */
96c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		memset(&audio2, 0, sizeof(audio2));
97c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		audio2.index = audio.index;
98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		strncpy((char *)audio2.name, (char *)audio.name,
99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			sizeof(audio2.name));
100c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		audio2.capability = audio.capability;
101c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		audio2.mode = audio.mode;
102c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
103c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak
10445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		dprintf("\taudio = {.index=%u, .name=\"%s\", "
10545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			".capability=0x%X, .mode=0x%X, "
10645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			".reserved[]={ 0x%X, 0x%X } }\n",
10745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			audio.index,
10845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			audio.name,
10945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			audio.capability,
110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			audio.mode, audio.reserved[0], audio.reserved[1]
111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    );
11245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
11345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	} else {
114c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, -1);
115c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_get, EINVAL);
11645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
11745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* check if the audio structure is untouched */
11845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&audio2, 0xff, sizeof(audio2));
11945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
12045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
12145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
12245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
12345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak}
12445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_G_AUDIO_ignore_index()
126354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
127c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
128c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret2, errno2;
129a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio;
130a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio2;
131a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
132a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* check whether the "index" field is ignored by VIDIOC_G_AUDIO */
133a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
134a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio, 0, sizeof(audio));
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	dprintf("\t%s:%u: audio.index=%u\n", __FILE__, __LINE__, audio.index);
136c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio);
137c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
138a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
139c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_get=%i, errno_get=%i\n",
140c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
141a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
142a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio2, 0, sizeof(audio2));
143a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	audio2.index = U32_MAX;
144a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret2 = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio2);
145a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno2 = errno;
146a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
147c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret2=%i, errno2=%i\n",
148c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret2, errno2);
149a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
150c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	if (ret_get == 0) {
151a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret2, 0);
152a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
153a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	} else {
154c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, -1);
155c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_get, EINVAL);
156a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret2, -1);
157a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(errno2, EINVAL);
158a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
159a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
160a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak}
161a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_G_AUDIO_NULL()
163354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
164c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
165c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_null, errno_null;
16645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_audio audio;
16745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
16845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	memset(&audio, 0xff, sizeof(audio));
169c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio);
170c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
17145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
172c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_get=%i, errno_get=%i\n",
173c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
17445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
175c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_null = ioctl(get_video_fd(), VIDIOC_G_AUDIO, NULL);
176c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_null = errno;
17745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
178c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_null=%i, errno_null=%i\n",
179c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_null, errno_null);
18045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
181c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	/* check if VIDIOC_G_AUDIO is supported at all or not */
182c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	if (ret_get == 0) {
183c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, 0);
18445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* VIDIOC_G_AUDIO is supported, the parameter should be checked */
185c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_null, -1);
186c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_null, EFAULT);
187c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	} else {
188c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, -1);
189c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_get, EINVAL);
190c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		/* VIDIOC_G_AUDIO not supported at all, the parameter should not be evaluated */
191c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_null, -1);
192c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_null, EINVAL);
19345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
19445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
19545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak}
196a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
197354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_AUDIO()
198354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
199a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	int ret_orig, errno_orig;
200c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_set, errno_set;
201c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_enum, errno_enum;
202a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	__u32 index;
203a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	__u32 i;
204a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_orig;
205a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_enum;
206a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_set;
207a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
208a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* This testcase tries to find out the relations between the following
209a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	 * commands:
210a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	 *  - VIDIOC_ENUMAUDIO
211a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	 *  - VIDIOC_G_AUDIO
212a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	 *  - VIDIOC_S_AUDIO
213a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	 */
214a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
215a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* remember the original settings */
216a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_orig, 0, sizeof(audio_orig));
217a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
218a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_orig = errno;
219a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
220c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n",
221c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_orig, errno_orig);
222a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
223a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	if (ret_orig == 0) {
224a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_orig, 0);
225a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	} else {
226a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_orig, -1);
227a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(errno_orig, EINVAL);
228a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
229a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
230a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* try to continue even if VIDIOC_G_AUDIO seems to be not supported */
231a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
232a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	index = 0;
233a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	do {
234a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		memset(&audio_enum, 0, sizeof(audio_enum));
235a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		audio_enum.index = index;
236c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		ret_enum = ioctl(get_video_fd(), VIDIOC_ENUMAUDIO, &audio_enum);
237c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		errno_enum = errno;
238a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
239c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		if (ret_enum == 0) {
240a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak			memset(&audio_set, 0xff, sizeof(audio_set));
241a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak			audio_set.index = index;
242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret_set =
243354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
244c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak			errno_set = errno;
245a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
246a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak			/* It shall be always possible to set the audio input to the
247a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak			 * enumerated values.
248a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak			 */
249c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak			CU_ASSERT_EQUAL(ret_enum, 0);
250a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
251a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak			index++;
252a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		}
253a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
254c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	} while (ret_enum == 0);
255c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(ret_enum, -1);
256c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(errno_enum, EINVAL);
257a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
258a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* try to set audio input to beyond the enumerated values */
259354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = 0; i <= 32; i++) {
260a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		memset(&audio_set, 0xff, sizeof(audio_set));
261a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		audio_set.index = index;
262c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
263c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		errno_set = errno;
264a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
265c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
266c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
267a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
268a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		index++;
269a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
270a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
271a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* restore the original audio input settings */
272a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_set, 0, sizeof(audio_set));
273a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	audio_set.index = audio_orig.index;
274c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
275c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_set = errno;
276a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
277a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	if (ret_orig == 0) {
278a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* If it was possible at the beginning to get the audio input then
279a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * it shall be possible to set it again.
280a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
281c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_set, 0);
282a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	} else {
283a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* In case we could not fetch the audio input value at the start
284a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
285a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
286c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
287c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
288a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
289a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
290a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak}
291a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
292354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_AUDIO_S32_MAX()
293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
294a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	int ret_set, errno_set;
295c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_orig, errno_orig;
296a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio;
297a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio2;
298a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_orig;
299a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_set;
300a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
301a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* remember the original settings */
302a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_orig, 0, sizeof(audio_orig));
303a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
304a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_orig = errno;
305a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
306c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n",
307c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_orig, errno_orig);
308a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
309a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* test invalid index */
310a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio, 0xff, sizeof(audio));
311354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	audio.index = (__u32) S32_MAX;
312c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio);
313c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_set = errno;
314c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
315c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n",
316c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
317a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
318c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(ret_set, -1);
319c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(errno_set, EINVAL);
320a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
321a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* Check whether the original audio struct is untouched */
322a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio2, 0xff, sizeof(audio2));
323354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	audio2.index = (__u32) S32_MAX;
324a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
325a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
326a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* restore the original audio input settings */
327a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_set, 0, sizeof(audio_set));
328a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	audio_set.index = audio_orig.index;
329a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
330a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_set = errno;
331a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
332c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n",
333c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
334a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
335a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	if (ret_orig == 0) {
336a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* If it was possible at the beginning to get the audio input then
337a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * it shall be possible to set it again.
338a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
339a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_set, 0);
340a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	} else {
341a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* In case we could not fetch the audio input value at the start
342a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
343a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
344a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
345a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
346a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
347a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak}
348a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
349354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_AUDIO_S32_MAX_1()
350354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
351a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	int ret_set, errno_set;
352c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_orig, errno_orig;
353a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio;
354a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio2;
355a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_orig;
356a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_set;
357a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
358a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* remember the original settings */
359a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_orig, 0, sizeof(audio_orig));
360a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
361a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_orig = errno;
362a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
363c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n",
364c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_orig, errno_orig);
365a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
366a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* test invalid index */
367a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio, 0xff, sizeof(audio));
368354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	audio.index = ((__u32) S32_MAX) + 1;
369c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio);
370c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_set = errno;
371c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
372c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n",
373c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
374a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
375c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(ret_set, -1);
376c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(errno_set, EINVAL);
377a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
378a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* Check whether the original audio struct is untouched */
379a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio2, 0xff, sizeof(audio2));
380354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	audio2.index = ((__u32) S32_MAX) + 1;
381a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
382a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
383a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* restore the original audio input settings */
384a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_set, 0, sizeof(audio_set));
385a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	audio_set.index = audio_orig.index;
386a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
387a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_set = errno;
388a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
389c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n",
390c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
391a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
392a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	if (ret_orig == 0) {
393a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* If it was possible at the beginning to get the audio input then
394a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * it shall be possible to set it again.
395a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
396a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_set, 0);
397a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	} else {
398a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* In case we could not fetch the audio input value at the start
399a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
400a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
401a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
402a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
403a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
404a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak}
405a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
406354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_AUDIO_U32_MAX()
407354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
408a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	int ret_orig, errno_orig;
409a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	int ret_set, errno_set;
410a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio;
411a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio2;
412a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_orig;
413a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_set;
414a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
415a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* remember the original settings */
416a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_orig, 0, sizeof(audio_orig));
417a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
418a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_orig = errno;
419a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
420c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n",
421c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_orig, errno_orig);
422a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* test invalid index */
423a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio, 0xff, sizeof(audio));
424a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	audio.index = U32_MAX;
425c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio);
426c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_set = errno;
427c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
428c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n",
429c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
430a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
431c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(ret_set, -1);
432c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(errno_set, EINVAL);
433a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
434a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* Check whether the original audio struct is untouched */
435a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio2, 0xff, sizeof(audio2));
436a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	audio2.index = U32_MAX;
437a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
438a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
439a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* restore the original audio input settings */
440a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_set, 0, sizeof(audio_set));
441a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	audio_set.index = audio_orig.index;
442a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
443a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_set = errno;
444a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
445c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n",
446c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
447a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
448a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	if (ret_orig == 0) {
449a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* If it was possible at the beginning to get the audio input then
450a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * it shall be possible to set it again.
451a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
452a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_set, 0);
453a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	} else {
454a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* In case we could not fetch the audio input value at the start
455a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
456a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
457a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
458a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
459a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
460a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak}
461a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
462354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_AUDIO_NULL()
463354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
464a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	int ret_orig, errno_orig;
465a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	int ret_set, errno_set;
466c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_null, errno_null;
467a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_orig;
468a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	struct v4l2_audio audio_set;
469a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
470a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* remember the original settings */
471a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_orig, 0, sizeof(audio_orig));
472a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
473a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_orig = errno;
474a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
475c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n",
476c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_orig, errno_orig);
477a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
478a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_set, 0, sizeof(audio_set));
479c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
480c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_set = errno;
481a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
482c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n",
483c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
484a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
485c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_null = ioctl(get_video_fd(), VIDIOC_S_AUDIO, NULL);
486c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_null = errno;
487a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
488c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_null=%i, errno_null=%i\n",
489c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_null, errno_null);
490a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
491c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	if (ret_set == 0) {
492c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_set, 0);
493c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_null, -1);
494c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_null, EFAULT);
495a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	} else {
496c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
497c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
498c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_null, -1);
499c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_null, EINVAL);
500a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
501a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
502a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	/* restore the original audio input settings */
503a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	memset(&audio_set, 0, sizeof(audio_set));
504a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	audio_set.index = audio_orig.index;
505a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
506a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	errno_set = errno;
507a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
508c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n",
509c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
510a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak
511a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	if (ret_orig == 0) {
512a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* If it was possible at the beginning to get the audio input then
513a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * it shall be possible to set it again.
514a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
515c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_orig, 0);
516a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_set, 0);
517a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	} else {
518a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		/* In case we could not fetch the audio input value at the start
519a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
520a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		 */
521c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_orig, -1);
522c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_orig, EINVAL);
523a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
524a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
525a157bd2fcb85f064d776ec857b64f8e070b710a9subrata_modak	}
526ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
527