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