- Timestamp:
- Mar 8, 2021 1:06:36 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 143120
- Location:
- trunk/src/VBox/Devices/Audio
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DrvAudioCommon.cpp
r87996 r87997 130 130 void DrvAudioHlpClearBuf(PCPDMAUDIOPCMPROPS pPCMProps, void *pvBuf, size_t cbBuf, uint32_t cFrames) 131 131 { 132 /* 133 * Validate input 134 */ 132 135 AssertPtrReturnVoid(pPCMProps); 133 AssertPtrReturnVoid(pvBuf); 134 136 Assert(pPCMProps->cbSample); 135 137 if (!cbBuf || !cFrames) 136 138 return; 137 138 Assert(pPCMProps->cbSample); 139 AssertPtrReturnVoid(pvBuf); 140 141 Assert(pPCMProps->fSwapEndian == false); /** @todo Swapping Endianness is not supported yet. */ 142 143 /* 144 * Decide how much needs clearing. 145 */ 139 146 size_t cbToClear = DrvAudioHlpFramesToBytes(pPCMProps, cFrames); 140 Assert(cbBuf >= cbToClear); 141 142 if (cbBuf < cbToClear) 143 cbToClear = cbBuf; 147 AssertStmt(cbToClear <= cbBuf, cbToClear = cbBuf); 144 148 145 149 Log2Func(("pPCMProps=%p, pvBuf=%p, cFrames=%RU32, fSigned=%RTbool, cBytes=%RU8\n", 146 150 pPCMProps, pvBuf, cFrames, pPCMProps->fSigned, pPCMProps->cbSample)); 147 151 148 Assert(pPCMProps->fSwapEndian == false); /** @todo Swapping Endianness is not supported yet. */ 149 152 /* 153 * Do the job. 154 */ 150 155 if (pPCMProps->fSigned) 151 {152 156 RT_BZERO(pvBuf, cbToClear); 153 }154 157 else /* Unsigned formats. */ 155 158 { … … 157 160 { 158 161 case 1: /* 8 bit */ 159 {160 162 memset(pvBuf, 0x80, cbToClear); 161 163 break; 162 }163 164 164 165 case 2: /* 16 bit */ 165 166 { 166 uint16_t *p = (uint16_t *)pvBuf; 167 uint16_t s = 0x0080; 168 169 for (uint32_t i = 0; i < DrvAudioHlpBytesToFrames((uint32_t)cbToClear, pPCMProps); i++) 170 p[i] = s; 171 167 uint16_t *pu16Dst = (uint16_t *)pvBuf; 168 size_t cLeft = cbToClear / sizeof(uint16_t); 169 while (cLeft-- > 0) 170 *pu16Dst++ = 0x80; 172 171 break; 173 172 } … … 176 175 177 176 case 4: /* 32 bit */ 178 { 179 uint32_t *p = (uint32_t *)pvBuf; 180 uint32_t s = 0x00000080; 181 182 for (uint32_t i = 0; i < DrvAudioHlpBytesToFrames((uint32_t)cbToClear, pPCMProps); i++) 183 p[i] = s; 184 177 ASMMemFill32(pvBuf, cbToClear & ~(size_t)3, 0x80); 185 178 break; 186 }187 179 188 180 default: 189 {190 181 AssertMsgFailed(("Invalid bytes per sample: %RU8\n", pPCMProps->cbSample)); 191 break;192 }193 182 } 194 183 } -
trunk/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp
r87996 r87997 35 35 static void tstBasics(RTTEST hTest) 36 36 { 37 RTTestSub F(hTest, "Single buffer");37 RTTestSub(hTest, "Single buffer"); 38 38 39 39 static const PDMAUDIOPCMPROPS s_Cfg441StereoS16 = PDMAUDIOPCMPROPS_INITIALIZOR( … … 45 45 /* a_fSwapEndian: */ false 46 46 ); 47 static const PDMAUDIOPCMPROPS s_Cfg441StereoU16 = PDMAUDIOPCMPROPS_INITIALIZOR( 48 /* a_cb: */ 2, 49 /* a_fSigned: */ false, 50 /* a_cChannels: */ 2, 51 /* a_uHz: */ 44100, 52 /* a_cShift: */ PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(2 /* cb */, 2 /* cChannels */), 53 /* a_fSwapEndian: */ false 54 ); 55 static const PDMAUDIOPCMPROPS s_Cfg441StereoU32 = PDMAUDIOPCMPROPS_INITIALIZOR( 56 /* a_cb: */ 4, 57 /* a_fSigned: */ false, 58 /* a_cChannels: */ 2, 59 /* a_uHz: */ 44100, 60 /* a_cShift: */ PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(4 /* cb */, 2 /* cChannels */), 61 /* a_fSwapEndian: */ false 62 ); 47 63 48 64 RTTESTI_CHECK_MSG(PDMAUDIOPCMPROPS_F2B(&s_Cfg441StereoS16, 1) == 4, 49 65 ("got %x, expected 4\n", PDMAUDIOPCMPROPS_F2B(&s_Cfg441StereoS16, 1))); 66 RTTESTI_CHECK_MSG(PDMAUDIOPCMPROPS_F2B(&s_Cfg441StereoU16, 1) == 4, 67 ("got %x, expected 4\n", PDMAUDIOPCMPROPS_F2B(&s_Cfg441StereoU16, 1))); 68 RTTESTI_CHECK_MSG(PDMAUDIOPCMPROPS_F2B(&s_Cfg441StereoU32, 1) == 8, 69 ("got %x, expected 4\n", PDMAUDIOPCMPROPS_F2B(&s_Cfg441StereoU32, 1))); 50 70 51 71 uint32_t u32; … … 53 73 ("cb=%RU32\n", u32)); 54 74 RTTESTI_CHECK_MSG((u32 = DrvAudioHlpFramesToBytes(&s_Cfg441StereoS16, 2)) == 2 * 2 * 2, 75 ("cb=%RU32\n", u32)); 76 RTTESTI_CHECK_MSG((u32 = DrvAudioHlpFramesToBytes(&s_Cfg441StereoS16, 1)) == 4, 77 ("cb=%RU32\n", u32)); 78 RTTESTI_CHECK_MSG((u32 = DrvAudioHlpFramesToBytes(&s_Cfg441StereoU16, 1)) == 4, 79 ("cb=%RU32\n", u32)); 80 RTTESTI_CHECK_MSG((u32 = DrvAudioHlpFramesToBytes(&s_Cfg441StereoU32, 1)) == 8, 81 ("cb=%RU32\n", u32)); 82 83 RTTESTI_CHECK_MSG((u32 = DrvAudioHlpBytesToFrames(4, &s_Cfg441StereoS16)) == 1, 84 ("cb=%RU32\n", u32)); 85 RTTESTI_CHECK_MSG((u32 = DrvAudioHlpBytesToFrames(4, &s_Cfg441StereoU16)) == 1, 86 ("cb=%RU32\n", u32)); 87 RTTESTI_CHECK_MSG((u32 = DrvAudioHlpBytesToFrames(8, &s_Cfg441StereoU32)) == 1, 55 88 ("cb=%RU32\n", u32)); 56 89 … … 62 95 RTTESTI_CHECK_MSG((u64 = DrvAudioHlpBytesToMilli(&s_Cfg441StereoS16, 44100 * 2 * 2)) == RT_MS_1SEC, 63 96 ("ms=%RU64\n", u64)); 64 65 97 66 98 RTTESTI_CHECK_MSG((u64 = DrvAudioHlpFramesToNano(&s_Cfg441StereoS16, 44100)) == RT_NS_1SEC, ("ns=%RU64\n", u64)); … … 73 105 RTTESTI_CHECK_MSG((u64 = DrvAudioHlpFramesToMilli(&s_Cfg441StereoS16, 255)) == 5, ("ms=%RU64\n", u64)); 74 106 107 /* DrvAudioHlpClearBuf: */ 108 uint8_t *pbPage; 109 int rc = RTTestGuardedAlloc(hTest, PAGE_SIZE, 0, false /*fHead*/, (void **)&pbPage); 110 RTTESTI_CHECK_RC_OK_RETV(rc); 111 112 memset(pbPage, 0x42, PAGE_SIZE); 113 DrvAudioHlpClearBuf(&s_Cfg441StereoS16, pbPage, PAGE_SIZE, PAGE_SIZE / 4); 114 RTTESTI_CHECK(ASMMemIsZero(pbPage, PAGE_SIZE)); 115 116 memset(pbPage, 0x42, PAGE_SIZE); 117 DrvAudioHlpClearBuf(&s_Cfg441StereoU16, pbPage, PAGE_SIZE, PAGE_SIZE / 4); 118 for (uint32_t off = 0; off < PAGE_SIZE; off += 2) 119 RTTESTI_CHECK_MSG(pbPage[off] == 0x80 && pbPage[off + 1] == 0, ("off=%#x: %#x %x\n", off, pbPage[off], pbPage[off + 1])); 120 121 memset(pbPage, 0x42, PAGE_SIZE); 122 DrvAudioHlpClearBuf(&s_Cfg441StereoU32, pbPage, PAGE_SIZE, PAGE_SIZE / 8); 123 for (uint32_t off = 0; off < PAGE_SIZE; off += 4) 124 RTTESTI_CHECK(pbPage[off] == 0x80 && pbPage[off + 1] == 0 && pbPage[off + 2] == 0 && pbPage[off + 3] == 0); 125 126 127 RTTestDisableAssertions(hTest); 128 memset(pbPage, 0x42, PAGE_SIZE); 129 DrvAudioHlpClearBuf(&s_Cfg441StereoS16, pbPage, PAGE_SIZE, PAGE_SIZE); /* should adjust down the frame count. */ 130 RTTESTI_CHECK(ASMMemIsZero(pbPage, PAGE_SIZE)); 131 132 memset(pbPage, 0x42, PAGE_SIZE); 133 DrvAudioHlpClearBuf(&s_Cfg441StereoU16, pbPage, PAGE_SIZE, PAGE_SIZE); /* should adjust down the frame count. */ 134 for (uint32_t off = 0; off < PAGE_SIZE; off += 2) 135 RTTESTI_CHECK_MSG(pbPage[off] == 0x80 && pbPage[off + 1] == 0, ("off=%#x: %#x %x\n", off, pbPage[off], pbPage[off + 1])); 136 137 memset(pbPage, 0x42, PAGE_SIZE); 138 DrvAudioHlpClearBuf(&s_Cfg441StereoU32, pbPage, PAGE_SIZE, PAGE_SIZE); /* should adjust down the frame count. */ 139 for (uint32_t off = 0; off < PAGE_SIZE; off += 4) 140 RTTESTI_CHECK(pbPage[off] == 0x80 && pbPage[off + 1] == 0 && pbPage[off + 2] == 0 && pbPage[off + 3] == 0); 141 RTTestRestoreAssertions(hTest); 142 143 RTTestGuardedFree(hTest, pbPage); 75 144 } 76 145
Note:
See TracChangeset
for help on using the changeset viewer.