1 1.1 nia /*- 2 1.1 nia * Copyright (c) 2020 The NetBSD Foundation, Inc. 3 1.1 nia * All rights reserved. 4 1.1 nia * 5 1.1 nia * This code is derived from software contributed to The NetBSD Foundation 6 1.1 nia * by Nia Alarie. 7 1.1 nia * 8 1.1 nia * Redistribution and use in source and binary forms, with or without 9 1.1 nia * modification, are permitted provided that the following conditions 10 1.1 nia * are met: 11 1.1 nia * 1. Redistributions of source code must retain the above copyright 12 1.1 nia * notice, this list of conditions and the following disclaimer. 13 1.1 nia * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 nia * notice, this list of conditions and the following disclaimer in the 15 1.1 nia * documentation and/or other materials provided with the distribution. 16 1.1 nia * 17 1.1 nia * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18 1.1 nia * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19 1.1 nia * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 1.1 nia * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21 1.1 nia * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 1.1 nia * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 1.1 nia * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 1.1 nia * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 1.1 nia * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 1.1 nia * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 1.1 nia * POSSIBILITY OF SUCH DAMAGE. 28 1.1 nia */ 29 1.1 nia 30 1.1 nia #include <sys/audioio.h> 31 1.1 nia #include <soundcard.h> 32 1.1 nia #include <fcntl.h> 33 1.1 nia #include <stdbool.h> 34 1.1 nia #include <stdio.h> 35 1.1 nia #include <math.h> 36 1.1 nia #include <atf-c.h> 37 1.1 nia 38 1.1 nia ATF_TC(oss_dsp_init); 39 1.1 nia ATF_TC_HEAD(oss_dsp_init, tc) 40 1.1 nia { 41 1.1 nia atf_tc_set_md_var(tc, "descr", "Tests dsp init ioctls"); 42 1.1 nia } 43 1.1 nia 44 1.1 nia ATF_TC_BODY(oss_dsp_init, tc) 45 1.1 nia { 46 1.1 nia struct audio_info hwinfo; 47 1.1 nia struct audio_info info; 48 1.1 nia int fd, channels, fmt, rate; 49 1.1 nia 50 1.1 nia if ((fd = open("/dev/audio", O_WRONLY)) == -1) 51 1.1 nia atf_tc_skip("Audio device unavailable for playback"); 52 1.1 nia 53 1.1 nia if (ioctl(fd, AUDIO_GETFORMAT, &hwinfo) < 0) { 54 1.2 nia atf_tc_fail("ioctl AUDIO_GETFORMAT failed"); 55 1.1 nia close(fd); 56 1.1 nia } 57 1.1 nia 58 1.1 nia /* Verify SNDCTL_DSP_CHANNELS sets the device to mono. */ 59 1.1 nia 60 1.1 nia channels = 1; 61 1.1 nia if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) < 0) 62 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_CHANNELS (1) failed"); 63 1.1 nia ATF_REQUIRE_EQ(channels, 1); 64 1.1 nia 65 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 66 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 67 1.1 nia ATF_REQUIRE_EQ(info.play.channels, 1); 68 1.1 nia 69 1.1 nia /* Verify SNDCTL_DSP_CHANNELS sets the device to stereo. */ 70 1.1 nia 71 1.1 nia channels = 2; 72 1.1 nia if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) < 0) 73 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_CHANNELS (2) failed"); 74 1.1 nia ATF_REQUIRE_EQ(channels, 2); 75 1.1 nia 76 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 77 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 78 1.1 nia ATF_REQUIRE_EQ(info.play.channels, 2); 79 1.1 nia 80 1.1 nia /* 81 1.1 nia * Verify an invalid argument to SNDCTL_DSP_CHANNELS leaves the device 82 1.1 nia * at the hardware channel count. 83 1.1 nia */ 84 1.1 nia 85 1.1 nia channels = 0; 86 1.1 nia if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) < 0) 87 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_CHANNELS (0) failed"); 88 1.1 nia ATF_REQUIRE_EQ(channels, (int)hwinfo.play.channels); 89 1.1 nia 90 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 91 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 92 1.1 nia ATF_REQUIRE_EQ(info.play.channels, hwinfo.play.channels); 93 1.1 nia 94 1.1 nia /* 95 1.1 nia * SNDCTL_DSP_STEREO is an older alternative to SNDCTL_DSP_CHANNELS 96 1.1 nia * that simply takes a boolean argument. 97 1.1 nia */ 98 1.1 nia 99 1.1 nia /* Set the device to mono with SNDCTL_DSP_STEREO = 0 */ 100 1.1 nia 101 1.1 nia channels = 0; 102 1.1 nia if (ioctl(fd, SNDCTL_DSP_STEREO, &channels) < 0) 103 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_STEREO (0) failed"); 104 1.1 nia ATF_REQUIRE_EQ(channels, 0); 105 1.1 nia 106 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 107 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 108 1.1 nia 109 1.1 nia ATF_REQUIRE_EQ(info.play.channels, 1); 110 1.1 nia 111 1.1 nia /* Set the device to stereo with SNDCTL_DSP_STEREO = 1 */ 112 1.1 nia 113 1.1 nia channels = 1; 114 1.1 nia if (ioctl(fd, SNDCTL_DSP_STEREO, &channels) < 0) 115 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_STEREO (1) failed"); 116 1.1 nia ATF_REQUIRE_EQ(channels, 1); 117 1.1 nia 118 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 119 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 120 1.1 nia ATF_REQUIRE_EQ(info.play.channels, 2); 121 1.1 nia 122 1.1 nia /* Verify SNDCTL_DSP_SETFMT works with common audio formats */ 123 1.1 nia 124 1.1 nia fmt = AFMT_MU_LAW; 125 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0) 126 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETFMT (AFMT_MU_LAW) failed"); 127 1.1 nia ATF_REQUIRE_EQ(fmt, AFMT_MU_LAW); 128 1.1 nia 129 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 130 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 131 1.1 nia ATF_REQUIRE_EQ(info.play.encoding, AUDIO_ENCODING_ULAW); 132 1.1 nia ATF_REQUIRE_EQ(info.play.precision, 8); 133 1.1 nia 134 1.1 nia fmt = AFMT_A_LAW; 135 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0) 136 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETFMT (AFMT_A_LAW) failed"); 137 1.1 nia ATF_REQUIRE_EQ(fmt, AFMT_A_LAW); 138 1.1 nia 139 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 140 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 141 1.1 nia ATF_REQUIRE_EQ(info.play.encoding, AUDIO_ENCODING_ALAW); 142 1.1 nia ATF_REQUIRE_EQ(info.play.precision, 8); 143 1.1 nia 144 1.1 nia fmt = AFMT_S16_LE; 145 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0) 146 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETFMT (AFMT_S16_LE) failed"); 147 1.1 nia ATF_REQUIRE_EQ(fmt, AFMT_S16_LE); 148 1.1 nia 149 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 150 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 151 1.1 nia ATF_REQUIRE_EQ(info.play.encoding, AUDIO_ENCODING_SLINEAR_LE); 152 1.1 nia ATF_REQUIRE_EQ(info.play.precision, 16); 153 1.1 nia 154 1.1 nia fmt = AFMT_S16_BE; 155 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0) 156 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETFMT (AFMT_S16_BE) failed"); 157 1.1 nia ATF_REQUIRE_EQ(fmt, AFMT_S16_BE); 158 1.1 nia 159 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 160 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 161 1.1 nia ATF_REQUIRE_EQ(info.play.encoding, AUDIO_ENCODING_SLINEAR_BE); 162 1.1 nia ATF_REQUIRE_EQ(info.play.precision, 16); 163 1.1 nia 164 1.1 nia fmt = AFMT_U16_LE; 165 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0) 166 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETFMT (AFMT_U16_LE) failed"); 167 1.1 nia ATF_REQUIRE_EQ(fmt, AFMT_U16_LE); 168 1.1 nia 169 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 170 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 171 1.1 nia ATF_REQUIRE_EQ(info.play.encoding, AUDIO_ENCODING_ULINEAR_LE); 172 1.1 nia ATF_REQUIRE_EQ(info.play.precision, 16); 173 1.1 nia 174 1.1 nia fmt = AFMT_U16_BE; 175 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0) 176 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETFMT (AFMT_U16_BE) failed"); 177 1.1 nia ATF_REQUIRE_EQ(fmt, AFMT_U16_BE); 178 1.1 nia 179 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 180 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 181 1.1 nia ATF_REQUIRE_EQ(info.play.encoding, AUDIO_ENCODING_ULINEAR_BE); 182 1.1 nia ATF_REQUIRE_EQ(info.play.precision, 16); 183 1.1 nia 184 1.1 nia fmt = AFMT_S32_LE; 185 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0) 186 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETFMT (AFMT_S32_LE) failed"); 187 1.1 nia ATF_REQUIRE_EQ(fmt, AFMT_S32_LE); 188 1.1 nia 189 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 190 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 191 1.1 nia ATF_REQUIRE_EQ(info.play.encoding, AUDIO_ENCODING_SLINEAR_LE); 192 1.1 nia ATF_REQUIRE_EQ(info.play.precision, 32); 193 1.1 nia 194 1.1 nia /* Verify some supported sample rates. */ 195 1.1 nia 196 1.1 nia rate = 8000; 197 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 198 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (8000) failed"); 199 1.1 nia 200 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 201 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 202 1.1 nia ATF_REQUIRE_EQ(rate, (int)info.play.sample_rate); 203 1.1 nia 204 1.1 nia rate = 32000; 205 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 206 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (32000) failed"); 207 1.1 nia 208 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 209 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 210 1.1 nia ATF_REQUIRE_EQ(info.play.sample_rate, 32000); 211 1.1 nia ATF_REQUIRE_EQ(rate, (int)info.play.sample_rate); 212 1.1 nia 213 1.1 nia rate = 44100; 214 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 215 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (44100) failed"); 216 1.1 nia 217 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 218 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 219 1.1 nia ATF_REQUIRE_EQ(info.play.sample_rate, 44100); 220 1.1 nia ATF_REQUIRE_EQ(rate, (int)info.play.sample_rate); 221 1.1 nia 222 1.1 nia rate = 48000; 223 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 224 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (48000) failed"); 225 1.1 nia 226 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 227 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 228 1.1 nia ATF_REQUIRE_EQ(info.play.sample_rate, 48000); 229 1.1 nia ATF_REQUIRE_EQ(rate, (int)info.play.sample_rate); 230 1.1 nia 231 1.1 nia rate = 96000; 232 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 233 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (96000) failed"); 234 1.1 nia 235 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 236 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 237 1.1 nia ATF_REQUIRE_EQ(info.play.sample_rate, 96000); 238 1.1 nia ATF_REQUIRE_EQ(rate, (int)info.play.sample_rate); 239 1.1 nia 240 1.1 nia rate = 192000; 241 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 242 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (192000) failed"); 243 1.1 nia 244 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 245 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 246 1.1 nia ATF_REQUIRE_EQ(info.play.sample_rate, 192000); 247 1.1 nia ATF_REQUIRE_EQ(rate, (int)info.play.sample_rate); 248 1.1 nia 249 1.1 nia /* 250 1.1 nia * and some unsupported sample rates... "best effort" 251 1.1 nia */ 252 1.1 nia 253 1.4 andvar /* closest supported rate is 1000 */ 254 1.1 nia rate = 900; 255 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 256 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (900) failed"); 257 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 258 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 259 1.1 nia ATF_REQUIRE((fabs(900.0 - info.play.sample_rate) / 900.0) < 0.2); 260 1.1 nia ATF_REQUIRE_EQ(rate, (int)info.play.sample_rate); 261 1.1 nia 262 1.4 andvar /* closest supported rate is 192000 */ 263 1.1 nia rate = 197000; 264 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 265 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (197000) failed"); 266 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 267 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 268 1.1 nia ATF_REQUIRE((fabs(197000.0 - info.play.sample_rate) / 197000.0) < 0.2); 269 1.1 nia ATF_REQUIRE_EQ(rate, (int)info.play.sample_rate); 270 1.1 nia 271 1.1 nia /* 0 should return the hardware rate. */ 272 1.1 nia 273 1.1 nia rate = 0; 274 1.1 nia if (ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) 275 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SPEED (0) failed"); 276 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 277 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 278 1.1 nia ATF_REQUIRE_EQ(hwinfo.play.sample_rate, info.play.sample_rate); 279 1.1 nia 280 1.1 nia close(fd); 281 1.1 nia } 282 1.1 nia 283 1.1 nia ATF_TC(oss_dsp_trigger_read); 284 1.1 nia ATF_TC_HEAD(oss_dsp_trigger_read, tc) 285 1.1 nia { 286 1.1 nia atf_tc_set_md_var(tc, "descr", "Tests SNDCTL_DSP_SETTRIGGER correctly " 287 1.1 nia "changes the recording pause state"); 288 1.1 nia } 289 1.1 nia 290 1.1 nia ATF_TC_BODY(oss_dsp_trigger_read, tc) 291 1.1 nia { 292 1.1 nia struct audio_info info; 293 1.1 nia int fd, bits; 294 1.1 nia 295 1.3 gson #if defined(__sparc__) 296 1.3 gson atf_tc_skip("PR port-sparc/55876"); 297 1.3 gson #endif 298 1.3 gson 299 1.1 nia if ((fd = open("/dev/audio", O_RDONLY)) == -1) 300 1.1 nia atf_tc_skip("Audio device unavailable for recording"); 301 1.1 nia 302 1.1 nia /* pause everything ... */ 303 1.1 nia 304 1.1 nia bits = 0; 305 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETTRIGGER, &bits) < 0) 306 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETTRIGGER (0) failed"); 307 1.1 nia 308 1.1 nia if (ioctl(fd, SNDCTL_DSP_GETTRIGGER, &bits) < 0) 309 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_GETTRIGGER failed"); 310 1.1 nia ATF_REQUIRE_EQ(bits, 0); 311 1.1 nia 312 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 313 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 314 1.1 nia 315 1.1 nia ATF_REQUIRE_EQ(info.record.pause, 1); 316 1.1 nia 317 1.1 nia /* unpause everything ... */ 318 1.1 nia 319 1.1 nia bits = PCM_ENABLE_INPUT; 320 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETTRIGGER, &bits) < 0) 321 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETTRIGGER " 322 1.2 nia "(PCM_ENABLE_INPUT) failed"); 323 1.1 nia 324 1.1 nia if (ioctl(fd, SNDCTL_DSP_GETTRIGGER, &bits) < 0) 325 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_GETTRIGGER failed"); 326 1.1 nia ATF_REQUIRE_EQ(bits, PCM_ENABLE_INPUT); 327 1.1 nia 328 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 329 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 330 1.1 nia 331 1.1 nia ATF_REQUIRE_EQ(info.record.pause, 0); 332 1.1 nia 333 1.1 nia close(fd); 334 1.1 nia } 335 1.1 nia 336 1.1 nia ATF_TC(oss_dsp_trigger_write); 337 1.1 nia ATF_TC_HEAD(oss_dsp_trigger_write, tc) 338 1.1 nia { 339 1.1 nia atf_tc_set_md_var(tc, "descr", "Tests SNDCTL_DSP_SETTRIGGER correctly " 340 1.1 nia "changes the playback pause state"); 341 1.1 nia } 342 1.1 nia 343 1.1 nia ATF_TC_BODY(oss_dsp_trigger_write, tc) 344 1.1 nia { 345 1.1 nia struct audio_info info; 346 1.1 nia int fd, bits; 347 1.1 nia 348 1.1 nia if ((fd = open("/dev/audio", O_WRONLY)) == -1) 349 1.1 nia atf_tc_skip("Audio device unavailable for playback"); 350 1.1 nia 351 1.1 nia /* pause everything ... */ 352 1.1 nia 353 1.1 nia bits = 0; 354 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETTRIGGER, &bits) < 0) 355 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETTRIGGER (0) failed"); 356 1.1 nia 357 1.1 nia if (ioctl(fd, SNDCTL_DSP_GETTRIGGER, &bits) < 0) 358 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_GETTRIGGER failed"); 359 1.1 nia ATF_REQUIRE_EQ(bits, 0); 360 1.1 nia 361 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 362 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 363 1.1 nia 364 1.1 nia ATF_REQUIRE_EQ(info.play.pause, 1); 365 1.1 nia 366 1.1 nia /* unpause everything ... */ 367 1.1 nia 368 1.1 nia bits = PCM_ENABLE_OUTPUT; 369 1.1 nia if (ioctl(fd, SNDCTL_DSP_SETTRIGGER, &bits) < 0) 370 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_SETTRIGGER " 371 1.2 nia "(PCM_ENABLE_OUTPUT) failed"); 372 1.1 nia 373 1.1 nia if (ioctl(fd, SNDCTL_DSP_GETTRIGGER, &bits) < 0) 374 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_GETTRIGGER failed"); 375 1.1 nia ATF_REQUIRE_EQ(bits, PCM_ENABLE_OUTPUT); 376 1.1 nia 377 1.1 nia if (ioctl(fd, AUDIO_GETBUFINFO, &info) < 0) 378 1.2 nia atf_tc_fail("ioctl AUDIO_GETBUFINFO failed"); 379 1.1 nia 380 1.1 nia ATF_REQUIRE_EQ(info.play.pause, 0); 381 1.1 nia 382 1.1 nia close(fd); 383 1.1 nia } 384 1.1 nia 385 1.1 nia ATF_TC(oss_dsp_caps); 386 1.1 nia ATF_TC_HEAD(oss_dsp_caps, tc) 387 1.1 nia { 388 1.2 nia atf_tc_set_md_var(tc, "descr", "Verifies that OSS device capabilities " 389 1.2 nia "are the same as native capabilities"); 390 1.1 nia } 391 1.1 nia 392 1.1 nia ATF_TC_BODY(oss_dsp_caps, tc) 393 1.1 nia { 394 1.1 nia unsigned i; 395 1.1 nia char dev[16]; 396 1.1 nia bool dev_tested = false; 397 1.1 nia int fd; 398 1.1 nia int caps, props, fmts; 399 1.1 nia 400 1.1 nia for (i = 0; i < 16; ++i) { 401 1.1 nia (void)snprintf(dev, sizeof(dev), "/dev/audio%u", i); 402 1.1 nia 403 1.1 nia if ((fd = open(dev, O_WRONLY)) == -1) { 404 1.1 nia if ((fd = open(dev, O_RDONLY)) == -1) 405 1.1 nia break; 406 1.1 nia } 407 1.1 nia 408 1.1 nia if (ioctl(fd, SNDCTL_DSP_GETCAPS, &caps) < 0) 409 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_GETCAPS failed"); 410 1.1 nia 411 1.1 nia if (ioctl(fd, AUDIO_GETPROPS, &props) < 0) 412 1.2 nia atf_tc_fail("ioctl AUDIO_GETPROPS failed"); 413 1.1 nia 414 1.1 nia ATF_REQUIRE(!(caps & DSP_CAP_DUPLEX) == 415 1.1 nia !(props & AUDIO_PROP_FULLDUPLEX)); 416 1.1 nia 417 1.1 nia ATF_REQUIRE(!(caps & DSP_CAP_MMAP) == 418 1.1 nia !(props & AUDIO_PROP_MMAP)); 419 1.1 nia 420 1.1 nia ATF_REQUIRE(!(caps & DSP_CAP_INPUT) == 421 1.1 nia !(props & AUDIO_PROP_CAPTURE)); 422 1.1 nia 423 1.1 nia ATF_REQUIRE(!(caps & DSP_CAP_OUTPUT) == 424 1.1 nia !(props & AUDIO_PROP_PLAYBACK)); 425 1.1 nia 426 1.1 nia /* Trigger is always supported in this implementation. */ 427 1.1 nia ATF_REQUIRE(caps & DSP_CAP_TRIGGER); 428 1.1 nia 429 1.1 nia if (ioctl(fd, SNDCTL_DSP_GETFMTS, &fmts) < 0) 430 1.2 nia atf_tc_fail("ioctl SNDCTL_DSP_GETFMTS failed"); 431 1.1 nia 432 1.1 nia /* All supported by the kernel mixer. */ 433 1.1 nia ATF_REQUIRE(fmts & AFMT_MU_LAW); 434 1.1 nia ATF_REQUIRE(fmts & AFMT_A_LAW); 435 1.1 nia ATF_REQUIRE(fmts & AFMT_S8); 436 1.1 nia ATF_REQUIRE(fmts & AFMT_U8); 437 1.1 nia ATF_REQUIRE(fmts & AFMT_S16_LE); 438 1.1 nia ATF_REQUIRE(fmts & AFMT_S16_BE); 439 1.1 nia ATF_REQUIRE(fmts & AFMT_U16_LE); 440 1.1 nia ATF_REQUIRE(fmts & AFMT_U16_BE); 441 1.1 nia ATF_REQUIRE(fmts & AFMT_S32_LE); 442 1.1 nia ATF_REQUIRE(fmts & AFMT_S32_BE); 443 1.1 nia 444 1.1 nia /* Sanity test... */ 445 1.1 nia ATF_REQUIRE_EQ(fmts & AFMT_MPEG, 0); 446 1.1 nia 447 1.1 nia close(fd); 448 1.1 nia 449 1.1 nia dev_tested = true; 450 1.1 nia } 451 1.1 nia 452 1.1 nia if (!dev_tested) 453 1.1 nia atf_tc_skip("No testable audio device available"); 454 1.1 nia } 455 1.1 nia 456 1.1 nia ATF_TP_ADD_TCS(tp) 457 1.1 nia { 458 1.1 nia ATF_TP_ADD_TC(tp, oss_dsp_init); 459 1.1 nia ATF_TP_ADD_TC(tp, oss_dsp_caps); 460 1.1 nia ATF_TP_ADD_TC(tp, oss_dsp_trigger_read); 461 1.1 nia ATF_TP_ADD_TC(tp, oss_dsp_trigger_write); 462 1.1 nia 463 1.1 nia return atf_no_error(); 464 1.1 nia } 465 1.1 nia 466