Changeset 68132 in vbox for trunk/src/VBox/Devices/Audio/testcase
- Timestamp:
- Jul 27, 2017 8:15:43 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 117212
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp
r67697 r68132 62 62 RTTESTI_CHECK_RC_OK(AudioMixBufInit(&mb, "Single", &config, cBufSize)); 63 63 RTTESTI_CHECK(AudioMixBufSize(&mb) == cBufSize); 64 RTTESTI_CHECK(AUDIOMIXBUF_B2 S(&mb, AudioMixBufSizeBytes(&mb)) == cBufSize);65 RTTESTI_CHECK(AUDIOMIXBUF_ S2B(&mb, AudioMixBufSize(&mb)) == AudioMixBufSizeBytes(&mb));64 RTTESTI_CHECK(AUDIOMIXBUF_B2F(&mb, AudioMixBufSizeBytes(&mb)) == cBufSize); 65 RTTESTI_CHECK(AUDIOMIXBUF_F2B(&mb, AudioMixBufSize(&mb)) == AudioMixBufSizeBytes(&mb)); 66 66 RTTESTI_CHECK(AudioMixBufFree(&mb) == cBufSize); 67 RTTESTI_CHECK(AUDIOMIXBUF_ S2B(&mb, AudioMixBufFree(&mb)) == AudioMixBufFreeBytes(&mb));67 RTTESTI_CHECK(AUDIOMIXBUF_F2B(&mb, AudioMixBufFree(&mb)) == AudioMixBufFreeBytes(&mb)); 68 68 69 69 /* 70 70 * Absolute writes. 71 71 */ 72 uint32_t cSamplesRead = 0, cSamplesWritten = 0, cSamplesWrittenAbs = 0; 73 int8_t samples8 [2] = { 0x12, 0x34 }; 74 int16_t samples16[2] = { 0xAA, 0xBB }; 75 int32_t samples32[2] = { 0xCC, 0xDD }; 76 /* int64_t samples64[2] = { 0xEE, 0xFF }; - unused */ 77 78 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, &samples8, sizeof(samples8), &cSamplesWritten)); 79 RTTESTI_CHECK(cSamplesWritten == 0 /* Samples */); 72 uint32_t cFramesRead = 0, cFramesWritten = 0, cFramesWrittenAbs = 0; 73 int8_t aFrames8 [2] = { 0x12, 0x34 }; 74 int16_t aFrames16[2] = { 0xAA, 0xBB }; 75 int32_t aFrames32[2] = { 0xCC, 0xDD }; 76 77 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, &aFrames8, sizeof(aFrames8), &cFramesWritten)); 78 RTTESTI_CHECK(cFramesWritten == 0 /* Frames */); 80 79 RTTESTI_CHECK(AudioMixBufUsed(&mb) == 0); 81 80 82 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, & samples16, sizeof(samples16), &cSamplesWritten));83 RTTESTI_CHECK(c SamplesWritten == 1 /* Samples */);81 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, &aFrames16, sizeof(aFrames16), &cFramesWritten)); 82 RTTESTI_CHECK(cFramesWritten == 1 /* Frames */); 84 83 RTTESTI_CHECK(AudioMixBufUsed(&mb) == 1); 85 84 86 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 2 /* Offset */, & samples32, sizeof(samples32), &cSamplesWritten));87 RTTESTI_CHECK(c SamplesWritten == 2 /* Samples */);85 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 2 /* Offset */, &aFrames32, sizeof(aFrames32), &cFramesWritten)); 86 RTTESTI_CHECK(cFramesWritten == 2 /* Frames */); 88 87 RTTESTI_CHECK(AudioMixBufUsed(&mb) == 2); 89 88 90 89 /* Beyond buffer. */ 91 RTTESTI_CHECK_RC(AudioMixBufWriteAt(&mb, AudioMixBufSize(&mb) + 1, & samples16, sizeof(samples16),92 &c SamplesWritten), VERR_BUFFER_OVERFLOW);93 94 /* Offset wrap-around: When writing as much (or more) samples the mixing buffer can hold. */90 RTTESTI_CHECK_RC(AudioMixBufWriteAt(&mb, AudioMixBufSize(&mb) + 1, &aFrames16, sizeof(aFrames16), 91 &cFramesWritten), VERR_BUFFER_OVERFLOW); 92 93 /* Offset wrap-around: When writing as much (or more) frames the mixing buffer can hold. */ 95 94 uint32_t cbSamples = cBufSize * sizeof(int16_t) * 2 /* Channels */; 96 95 RTTESTI_CHECK(cbSamples); 97 96 uint16_t *paSamples = (uint16_t *)RTMemAlloc(cbSamples); 98 97 RTTESTI_CHECK(paSamples); 99 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, paSamples, cbSamples, &c SamplesWritten));100 RTTESTI_CHECK(c SamplesWritten == cBufSize /* Samples */);98 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, paSamples, cbSamples, &cFramesWritten)); 99 RTTESTI_CHECK(cFramesWritten == cBufSize /* Frames */); 101 100 RTTESTI_CHECK(AudioMixBufUsed(&mb) == cBufSize); 102 101 RTTESTI_CHECK(AudioMixBufReadPos(&mb) == 0); … … 110 109 AudioMixBufReset(&mb); 111 110 112 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 2 /* Offset */, & samples32, sizeof(samples32), &cSamplesWritten));113 RTTESTI_CHECK(c SamplesWritten == 2 /* Samples */);111 RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 2 /* Offset */, &aFrames32, sizeof(aFrames32), &cFramesWritten)); 112 RTTESTI_CHECK(cFramesWritten == 2 /* Frames */); 114 113 RTTESTI_CHECK(AudioMixBufUsed(&mb) == 2); 115 114 116 c SamplesWrittenAbs = AudioMixBufUsed(&mb);117 118 uint32_t cToWrite = AudioMixBufSize(&mb) - c SamplesWrittenAbs - 1; /* -1 as padding plus -2 samples for above. */115 cFramesWrittenAbs = AudioMixBufUsed(&mb); 116 117 uint32_t cToWrite = AudioMixBufSize(&mb) - cFramesWrittenAbs - 1; /* -1 as padding plus -2 frames for above. */ 119 118 for (uint32_t i = 0; i < cToWrite; i++) 120 119 { 121 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&mb, & samples16, sizeof(samples16), &cSamplesWritten));122 RTTESTI_CHECK(c SamplesWritten == 1);120 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&mb, &aFrames16, sizeof(aFrames16), &cFramesWritten)); 121 RTTESTI_CHECK(cFramesWritten == 1); 123 122 } 124 123 RTTESTI_CHECK(!AudioMixBufIsEmpty(&mb)); 125 124 RTTESTI_CHECK(AudioMixBufFree(&mb) == 1); 126 RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_ S2B(&mb, 1U));127 RTTESTI_CHECK(AudioMixBufUsed(&mb) == cToWrite + c SamplesWrittenAbs /* + last absolute write */);128 129 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&mb, & samples16, sizeof(samples16), &cSamplesWritten));130 RTTESTI_CHECK(c SamplesWritten == 1);125 RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_F2B(&mb, 1U)); 126 RTTESTI_CHECK(AudioMixBufUsed(&mb) == cToWrite + cFramesWrittenAbs /* + last absolute write */); 127 128 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&mb, &aFrames16, sizeof(aFrames16), &cFramesWritten)); 129 RTTESTI_CHECK(cFramesWritten == 1); 131 130 RTTESTI_CHECK(AudioMixBufFree(&mb) == 0); 132 RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_ S2B(&mb, 0U));131 RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_F2B(&mb, 0U)); 133 132 RTTESTI_CHECK(AudioMixBufUsed(&mb) == cBufSize); 134 133 135 134 /* Circular reads. */ 136 uint32_t cToRead = AudioMixBufSize(&mb) - c SamplesWrittenAbs - 1;135 uint32_t cToRead = AudioMixBufSize(&mb) - cFramesWrittenAbs - 1; 137 136 for (uint32_t i = 0; i < cToRead; i++) 138 137 { 139 RTTESTI_CHECK_RC_OK(AudioMixBufReadCirc(&mb, & samples16, sizeof(samples16), &cSamplesRead));140 RTTESTI_CHECK(c SamplesRead == 1);141 AudioMixBufFinish(&mb, c SamplesRead);138 RTTESTI_CHECK_RC_OK(AudioMixBufReadCirc(&mb, &aFrames16, sizeof(aFrames16), &cFramesRead)); 139 RTTESTI_CHECK(cFramesRead == 1); 140 AudioMixBufFinish(&mb, cFramesRead); 142 141 } 143 142 RTTESTI_CHECK(!AudioMixBufIsEmpty(&mb)); 144 RTTESTI_CHECK(AudioMixBufFree(&mb) == AudioMixBufSize(&mb) - c SamplesWrittenAbs - 1);145 RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_ S2B(&mb, cBufSize - cSamplesWrittenAbs - 1));143 RTTESTI_CHECK(AudioMixBufFree(&mb) == AudioMixBufSize(&mb) - cFramesWrittenAbs - 1); 144 RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_F2B(&mb, cBufSize - cFramesWrittenAbs - 1)); 146 145 RTTESTI_CHECK(AudioMixBufUsed(&mb) == cBufSize - cToRead); 147 146 148 RTTESTI_CHECK_RC_OK(AudioMixBufReadCirc(&mb, & samples16, sizeof(samples16), &cSamplesRead));149 RTTESTI_CHECK(c SamplesRead == 1);150 AudioMixBufFinish(&mb, c SamplesRead);151 RTTESTI_CHECK(AudioMixBufFree(&mb) == cBufSize - c SamplesWrittenAbs);152 RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_ S2B(&mb, cBufSize - cSamplesWrittenAbs));153 RTTESTI_CHECK(AudioMixBufUsed(&mb) == c SamplesWrittenAbs);147 RTTESTI_CHECK_RC_OK(AudioMixBufReadCirc(&mb, &aFrames16, sizeof(aFrames16), &cFramesRead)); 148 RTTESTI_CHECK(cFramesRead == 1); 149 AudioMixBufFinish(&mb, cFramesRead); 150 RTTESTI_CHECK(AudioMixBufFree(&mb) == cBufSize - cFramesWrittenAbs); 151 RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_F2B(&mb, cBufSize - cFramesWrittenAbs)); 152 RTTESTI_CHECK(AudioMixBufUsed(&mb) == cFramesWrittenAbs); 154 153 155 154 AudioMixBufDestroy(&mb); … … 191 190 RTTESTI_CHECK(DrvAudioHlpPCMPropsAreValid(&cfg_c1)); 192 191 193 uint32_t c Samples = 16;194 uint32_t cChildBufSize = RTRandU32Ex(c Samples /* Min */, 64 /* Max */);192 uint32_t cFrames = 16; 193 uint32_t cChildBufSize = RTRandU32Ex(cFrames /* Min */, 64 /* Max */); 195 194 196 195 PDMAUDIOMIXBUF child1; … … 220 219 uint32_t cbBuf = _1K; 221 220 char pvBuf[_1K]; 222 int16_t samples[32] = { 0xAA, 0xBB };223 uint32_t c SamplesRead, cSamplesWritten, cSamplesMixed;224 225 uint32_t c SamplesChild1 = cSamples;226 uint32_t c SamplesChild2 = cSamples;221 int16_t aFrames16[32] = { 0xAA, 0xBB }; 222 uint32_t cFramesRead, cFramesWritten, cFramesMixed; 223 224 uint32_t cFramesChild1 = cFrames; 225 uint32_t cFramesChild2 = cFrames; 227 226 228 227 uint32_t t = RTRandU32() % 32; 229 228 230 229 RTTestPrintf(hTest, RTTESTLVL_DEBUG, 231 "cParentBufSize=%RU32, cChildBufSize=%RU32, %RU32 samples -> %RU32 iterations total\n",232 cParentBufSize, cChildBufSize, c Samples, t);230 "cParentBufSize=%RU32, cChildBufSize=%RU32, %RU32 frames -> %RU32 iterations total\n", 231 cParentBufSize, cChildBufSize, cFrames, t); 233 232 234 233 /* … … 248 247 { 249 248 /* Child 1. */ 250 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufWriteAt(&child1, 0, & samples, sizeof(samples), &cSamplesWritten));251 RTTESTI_CHECK_MSG_BREAK(c SamplesWritten == cSamplesChild1, ("Child1: Expected %RU32 written samples, got %RU32\n", cSamplesChild1, cSamplesWritten));252 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufMixToParent(&child1, c SamplesWritten, &cSamplesMixed));253 254 cChildrenSamplesMixedTotal += c SamplesMixed;255 256 RTTESTI_CHECK_MSG_BREAK(c SamplesWritten == cSamplesMixed, ("Child1: Expected %RU32 mixed samples, got %RU32\n", cSamplesWritten, cSamplesMixed));257 RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&child1) == 0, ("Child1: Expected %RU32 used samples, got %RU32\n", 0, AudioMixBufUsed(&child1)));249 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufWriteAt(&child1, 0, &aFrames16, sizeof(aFrames16), &cFramesWritten)); 250 RTTESTI_CHECK_MSG_BREAK(cFramesWritten == cFramesChild1, ("Child1: Expected %RU32 written frames, got %RU32\n", cFramesChild1, cFramesWritten)); 251 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufMixToParent(&child1, cFramesWritten, &cFramesMixed)); 252 253 cChildrenSamplesMixedTotal += cFramesMixed; 254 255 RTTESTI_CHECK_MSG_BREAK(cFramesWritten == cFramesMixed, ("Child1: Expected %RU32 mixed frames, got %RU32\n", cFramesWritten, cFramesMixed)); 256 RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&child1) == 0, ("Child1: Expected %RU32 used frames, got %RU32\n", 0, AudioMixBufUsed(&child1))); 258 257 } 259 258 … … 263 262 { 264 263 /* Child 2. */ 265 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufWriteAt(&child2, 0, & samples, sizeof(samples), &cSamplesWritten));266 RTTESTI_CHECK_MSG_BREAK(c SamplesWritten == cSamplesChild2, ("Child2: Expected %RU32 written samples, got %RU32\n", cSamplesChild2, cSamplesWritten));267 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufMixToParent(&child2, c SamplesWritten, &cSamplesMixed));268 269 cChildrenSamplesMixedTotal += c SamplesMixed;270 271 RTTESTI_CHECK_MSG_BREAK(c SamplesWritten == cSamplesMixed, ("Child2: Expected %RU32 mixed samples, got %RU32\n", cSamplesWritten, cSamplesMixed));272 RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&child2) == 0, ("Child2: Expected %RU32 used samples, got %RU32\n", 0, AudioMixBufUsed(&child2)));264 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufWriteAt(&child2, 0, &aFrames16, sizeof(aFrames16), &cFramesWritten)); 265 RTTESTI_CHECK_MSG_BREAK(cFramesWritten == cFramesChild2, ("Child2: Expected %RU32 written frames, got %RU32\n", cFramesChild2, cFramesWritten)); 266 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufMixToParent(&child2, cFramesWritten, &cFramesMixed)); 267 268 cChildrenSamplesMixedTotal += cFramesMixed; 269 270 RTTESTI_CHECK_MSG_BREAK(cFramesWritten == cFramesMixed, ("Child2: Expected %RU32 mixed frames, got %RU32\n", cFramesWritten, cFramesMixed)); 271 RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&child2) == 0, ("Child2: Expected %RU32 used frames, got %RU32\n", 0, AudioMixBufUsed(&child2))); 273 272 } 274 273 275 274 /* 276 * Read out all samples from the parent buffer and also mark the just-read samples as finished275 * Read out all frames from the parent buffer and also mark the just-read frames as finished 277 276 * so that both connected children buffers can keep track of their stuff. 278 277 */ … … 280 279 while (cParentSamples) 281 280 { 282 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, pvBuf, cbBuf, &c SamplesRead));283 if (!c SamplesRead)281 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, pvBuf, cbBuf, &cFramesRead)); 282 if (!cFramesRead) 284 283 break; 285 284 286 AudioMixBufFinish(&parent, c SamplesRead);287 288 RTTESTI_CHECK(cParentSamples >= c SamplesRead);289 cParentSamples -= c SamplesRead;285 AudioMixBufFinish(&parent, cFramesRead); 286 287 RTTESTI_CHECK(cParentSamples >= cFramesRead); 288 cParentSamples -= cFramesRead; 290 289 } 291 290 … … 331 330 * take shortcuts and performs conversion. Because conversion to double 332 331 * the sample rate effectively inserts one additional sample between every 333 * two source samples, N source samples will be converted to N * 2 - 1334 * samples. However, the last source sample will be saved for later332 * two source frames, N source frames will be converted to N * 2 - 1 333 * frames. However, the last source sample will be saved for later 335 334 * interpolation and not immediately output. 336 335 */ … … 353 352 RTTESTI_CHECK_RC_OK(AudioMixBufLinkTo(&child, &parent)); 354 353 355 /* 8-bit unsigned samples. Often used with SB16 device. */356 uint8_t samples[16] = { 0xAA, 0xBB, 0, 1, 43, 125, 126, 127,357 128, 129, 130, 131, 132, UINT8_MAX - 1, UINT8_MAX, 0 };354 /* 8-bit unsigned frames. Often used with SB16 device. */ 355 uint8_t aFrames8U[16] = { 0xAA, 0xBB, 0, 1, 43, 125, 126, 127, 356 128, 129, 130, 131, 132, UINT8_MAX - 1, UINT8_MAX, 0 }; 358 357 359 358 /* … … 362 361 uint32_t cbBuf = 256; 363 362 char achBuf[256]; 364 uint32_t c SamplesRead, cSamplesWritten, cSamplesMixed;365 366 uint32_t c SamplesChild = 16;367 uint32_t c SamplesParent = cSamplesChild * 2 - 2;368 uint32_t c SamplesTotalRead = 0;363 uint32_t cFramesRead, cFramesWritten, cFramesMixed; 364 365 uint32_t cFramesChild = 16; 366 uint32_t cFramesParent = cFramesChild * 2 - 2; 367 uint32_t cFramesTotalRead = 0; 369 368 370 369 /**** 8-bit unsigned samples ****/ 371 370 RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Conversion test %uHz %uch 8-bit\n", cfg_c.uHz, cfg_c.cChannels); 372 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&child, & samples, sizeof(samples), &cSamplesWritten));373 RTTESTI_CHECK_MSG(c SamplesWritten == cSamplesChild, ("Child: Expected %RU32 written samples, got %RU32\n", cSamplesChild, cSamplesWritten));374 RTTESTI_CHECK_RC_OK(AudioMixBufMixToParent(&child, c SamplesWritten, &cSamplesMixed));375 uint32_t c Samples = AudioMixBufUsed(&parent);376 RTTESTI_CHECK_MSG(AudioMixBufLive(&child) == c Samples, ("Child: Expected %RU32 mixed samples, got %RU32\n", AudioMixBufLive(&child), cSamples));371 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&child, &aFrames8U, sizeof(aFrames8U), &cFramesWritten)); 372 RTTESTI_CHECK_MSG(cFramesWritten == cFramesChild, ("Child: Expected %RU32 written frames, got %RU32\n", cFramesChild, cFramesWritten)); 373 RTTESTI_CHECK_RC_OK(AudioMixBufMixToParent(&child, cFramesWritten, &cFramesMixed)); 374 uint32_t cFrames = AudioMixBufUsed(&parent); 375 RTTESTI_CHECK_MSG(AudioMixBufLive(&child) == cFrames, ("Child: Expected %RU32 mixed frames, got %RU32\n", AudioMixBufLive(&child), cFrames)); 377 376 378 377 RTTESTI_CHECK(AudioMixBufUsed(&parent) == AudioMixBufLive(&child)); … … 380 379 for (;;) 381 380 { 382 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &c SamplesRead));383 if (!c SamplesRead)381 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &cFramesRead)); 382 if (!cFramesRead) 384 383 break; 385 c SamplesTotalRead += cSamplesRead;386 AudioMixBufFinish(&parent, c SamplesRead);387 } 388 389 RTTESTI_CHECK_MSG(c SamplesTotalRead == cSamplesParent, ("Parent: Expected %RU32 mixed samples, got %RU32\n", cSamplesParent, cSamplesTotalRead));390 391 /* Check that the samples came out unharmed. Every other sample is interpolated and we ignore it. */384 cFramesTotalRead += cFramesRead; 385 AudioMixBufFinish(&parent, cFramesRead); 386 } 387 388 RTTESTI_CHECK_MSG(cFramesTotalRead == cFramesParent, ("Parent: Expected %RU32 mixed frames, got %RU32\n", cFramesParent, cFramesTotalRead)); 389 390 /* Check that the frames came out unharmed. Every other sample is interpolated and we ignore it. */ 392 391 /* NB: This also checks that the default volume setting is 0dB attenuation. */ 393 uint8_t *pSrc8 = & samples[0];392 uint8_t *pSrc8 = &aFrames8U[0]; 394 393 uint8_t *pDst8 = (uint8_t *)achBuf; 395 394 396 for (i = 0; i < c SamplesChild - 1; ++i)395 for (i = 0; i < cFramesChild - 1; ++i) 397 396 { 398 397 RTTESTI_CHECK_MSG(*pSrc8 == *pDst8, ("index %u: Dst=%d, Src=%d\n", i, *pDst8, *pSrc8)); … … 452 451 453 452 /* 16-bit signed. More or less exclusively used as output, and usually as input, too. */ 454 int16_t samples[16] = { 0xAA, 0xBB, INT16_MIN, INT16_MIN + 1, INT16_MIN / 2, -3, -2, -1,455 0, 1, 2, 3, INT16_MAX / 2, INT16_MAX - 1, INT16_MAX, 0 };453 int16_t aFrames16S[16] = { 0xAA, 0xBB, INT16_MIN, INT16_MIN + 1, INT16_MIN / 2, -3, -2, -1, 454 0, 1, 2, 3, INT16_MAX / 2, INT16_MAX - 1, INT16_MAX, 0 }; 456 455 457 456 /* … … 460 459 uint32_t cbBuf = 256; 461 460 char achBuf[256]; 462 uint32_t c SamplesRead, cSamplesWritten, cSamplesMixed;463 464 uint32_t c SamplesChild = 16;465 uint32_t c SamplesParent = cSamplesChild * 2 - 2;466 uint32_t c SamplesTotalRead = 0;461 uint32_t cFramesRead, cFramesWritten, cFramesMixed; 462 463 uint32_t cFramesChild = 16; 464 uint32_t cFramesParent = cFramesChild * 2 - 2; 465 uint32_t cFramesTotalRead = 0; 467 466 468 467 /**** 16-bit signed samples ****/ 469 468 RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Conversion test %uHz %uch 16-bit\n", cfg_c.uHz, cfg_c.cChannels); 470 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&child, & samples, sizeof(samples), &cSamplesWritten));471 RTTESTI_CHECK_MSG(c SamplesWritten == cSamplesChild, ("Child: Expected %RU32 written samples, got %RU32\n", cSamplesChild, cSamplesWritten));472 RTTESTI_CHECK_RC_OK(AudioMixBufMixToParent(&child, c SamplesWritten, &cSamplesMixed));473 uint32_t c Samples = AudioMixBufUsed(&parent);474 RTTESTI_CHECK_MSG(AudioMixBufLive(&child) == c Samples, ("Child: Expected %RU32 mixed samples, got %RU32\n", AudioMixBufLive(&child), cSamples));469 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&child, &aFrames16S, sizeof(aFrames16S), &cFramesWritten)); 470 RTTESTI_CHECK_MSG(cFramesWritten == cFramesChild, ("Child: Expected %RU32 written frames, got %RU32\n", cFramesChild, cFramesWritten)); 471 RTTESTI_CHECK_RC_OK(AudioMixBufMixToParent(&child, cFramesWritten, &cFramesMixed)); 472 uint32_t cFrames = AudioMixBufUsed(&parent); 473 RTTESTI_CHECK_MSG(AudioMixBufLive(&child) == cFrames, ("Child: Expected %RU32 mixed frames, got %RU32\n", AudioMixBufLive(&child), cFrames)); 475 474 476 475 RTTESTI_CHECK(AudioMixBufUsed(&parent) == AudioMixBufLive(&child)); … … 478 477 for (;;) 479 478 { 480 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &c SamplesRead));481 if (!c SamplesRead)479 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &cFramesRead)); 480 if (!cFramesRead) 482 481 break; 483 c SamplesTotalRead += cSamplesRead;484 AudioMixBufFinish(&parent, c SamplesRead);485 } 486 RTTESTI_CHECK_MSG(c SamplesTotalRead == cSamplesParent, ("Parent: Expected %RU32 mixed samples, got %RU32\n", cSamplesParent, cSamplesTotalRead));487 488 /* Check that the samples came out unharmed. Every other sample is interpolated and we ignore it. */482 cFramesTotalRead += cFramesRead; 483 AudioMixBufFinish(&parent, cFramesRead); 484 } 485 RTTESTI_CHECK_MSG(cFramesTotalRead == cFramesParent, ("Parent: Expected %RU32 mixed frames, got %RU32\n", cFramesParent, cFramesTotalRead)); 486 487 /* Check that the frames came out unharmed. Every other sample is interpolated and we ignore it. */ 489 488 /* NB: This also checks that the default volume setting is 0dB attenuation. */ 490 int16_t *pSrc16 = & samples[0];489 int16_t *pSrc16 = &aFrames16S[0]; 491 490 int16_t *pDst16 = (int16_t *)achBuf; 492 491 493 for (i = 0; i < c SamplesChild - 1; ++i)492 for (i = 0; i < cFramesChild - 1; ++i) 494 493 { 495 494 RTTESTI_CHECK_MSG(*pSrc16 == *pDst16, ("index %u: Dst=%d, Src=%d\n", i, *pDst16, *pSrc16)); … … 538 537 539 538 /* A few 16-bit signed samples. */ 540 int16_t samples[16] = { INT16_MIN, INT16_MIN + 1, -128, -64, -4, -1, 0, 1,541 2, 255, 256, INT16_MAX / 2, INT16_MAX - 2, INT16_MAX - 1, INT16_MAX, 0 };539 int16_t aFrames16S[16] = { INT16_MIN, INT16_MIN + 1, -128, -64, -4, -1, 0, 1, 540 2, 255, 256, INT16_MAX / 2, INT16_MAX - 2, INT16_MAX - 1, INT16_MAX, 0 }; 542 541 543 542 /* … … 546 545 uint32_t cbBuf = 256; 547 546 char achBuf[256]; 548 uint32_t c SamplesRead, cSamplesWritten, cSamplesMixed;549 550 uint32_t c SamplesChild = 8;551 uint32_t c SamplesParent = cSamplesChild;552 uint32_t c SamplesTotalRead;547 uint32_t cFramesRead, cFramesWritten, cFramesMixed; 548 549 uint32_t cFramesChild = 8; 550 uint32_t cFramesParent = cFramesChild; 551 uint32_t cFramesTotalRead; 553 552 int16_t *pSrc16; 554 553 int16_t *pDst16; … … 561 560 AudioMixBufSetVolume(&child, &vol); 562 561 563 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&child, & samples, sizeof(samples), &cSamplesWritten));564 RTTESTI_CHECK_MSG(c SamplesWritten == cSamplesChild, ("Child: Expected %RU32 written samples, got %RU32\n", cSamplesChild, cSamplesWritten));565 RTTESTI_CHECK_RC_OK(AudioMixBufMixToParent(&child, c SamplesWritten, &cSamplesMixed));566 567 c SamplesTotalRead = 0;562 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&child, &aFrames16S, sizeof(aFrames16S), &cFramesWritten)); 563 RTTESTI_CHECK_MSG(cFramesWritten == cFramesChild, ("Child: Expected %RU32 written frames, got %RU32\n", cFramesChild, cFramesWritten)); 564 RTTESTI_CHECK_RC_OK(AudioMixBufMixToParent(&child, cFramesWritten, &cFramesMixed)); 565 566 cFramesTotalRead = 0; 568 567 for (;;) 569 568 { 570 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &c SamplesRead));571 if (!c SamplesRead)569 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &cFramesRead)); 570 if (!cFramesRead) 572 571 break; 573 c SamplesTotalRead += cSamplesRead;574 AudioMixBufFinish(&parent, c SamplesRead);575 } 576 RTTESTI_CHECK_MSG(c SamplesTotalRead == cSamplesParent, ("Parent: Expected %RU32 mixed samples, got %RU32\n", cSamplesParent, cSamplesTotalRead));577 578 /* Check that at 0dB the samples came out unharmed. */579 pSrc16 = & samples[0];572 cFramesTotalRead += cFramesRead; 573 AudioMixBufFinish(&parent, cFramesRead); 574 } 575 RTTESTI_CHECK_MSG(cFramesTotalRead == cFramesParent, ("Parent: Expected %RU32 mixed frames, got %RU32\n", cFramesParent, cFramesTotalRead)); 576 577 /* Check that at 0dB the frames came out unharmed. */ 578 pSrc16 = &aFrames16S[0]; 580 579 pDst16 = (int16_t *)achBuf; 581 580 582 for (i = 0; i < c SamplesParent * 2 /* stereo */; ++i)581 for (i = 0; i < cFramesParent * 2 /* stereo */; ++i) 583 582 { 584 583 RTTESTI_CHECK_MSG(*pSrc16 == *pDst16, ("index %u: Dst=%d, Src=%d\n", i, *pDst16, *pSrc16)); … … 592 591 AudioMixBufSetVolume(&child, &vol); 593 592 594 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&child, & samples, sizeof(samples), &cSamplesWritten));595 RTTESTI_CHECK_MSG(c SamplesWritten == cSamplesChild, ("Child: Expected %RU32 written samples, got %RU32\n", cSamplesChild, cSamplesWritten));596 RTTESTI_CHECK_RC_OK(AudioMixBufMixToParent(&child, c SamplesWritten, &cSamplesMixed));597 598 c SamplesTotalRead = 0;593 RTTESTI_CHECK_RC_OK(AudioMixBufWriteCirc(&child, &aFrames16S, sizeof(aFrames16S), &cFramesWritten)); 594 RTTESTI_CHECK_MSG(cFramesWritten == cFramesChild, ("Child: Expected %RU32 written frames, got %RU32\n", cFramesChild, cFramesWritten)); 595 RTTESTI_CHECK_RC_OK(AudioMixBufMixToParent(&child, cFramesWritten, &cFramesMixed)); 596 597 cFramesTotalRead = 0; 599 598 for (;;) 600 599 { 601 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &c SamplesRead));602 if (!c SamplesRead)600 RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &cFramesRead)); 601 if (!cFramesRead) 603 602 break; 604 c SamplesTotalRead += cSamplesRead;605 AudioMixBufFinish(&parent, c SamplesRead);606 } 607 RTTESTI_CHECK_MSG(c SamplesTotalRead == cSamplesParent, ("Parent: Expected %RU32 mixed samples, got %RU32\n", cSamplesParent, cSamplesTotalRead));603 cFramesTotalRead += cFramesRead; 604 AudioMixBufFinish(&parent, cFramesRead); 605 } 606 RTTESTI_CHECK_MSG(cFramesTotalRead == cFramesParent, ("Parent: Expected %RU32 mixed frames, got %RU32\n", cFramesParent, cFramesTotalRead)); 608 607 609 608 /* Check that at -6dB the sample values are halved. */ 610 pSrc16 = & samples[0];609 pSrc16 = &aFrames16S[0]; 611 610 pDst16 = (int16_t *)achBuf; 612 611 613 for (i = 0; i < c SamplesParent * 2 /* stereo */; ++i)612 for (i = 0; i < cFramesParent * 2 /* stereo */; ++i) 614 613 { 615 614 /* Watch out! For negative values, x >> 1 is not the same as x / 2. */
Note:
See TracChangeset
for help on using the changeset viewer.