这个本质量化位数的转换;并不是精度转换;注意有些系统上float是8字节的;这里使用的是4字节32位
转载来自:https://github.com/pinkydodo/AudioUnitMac/blob/master/AudioUnitMac/AudioRecordAndPlay.mm
1 ////////////////////////////////////////////////////////////////////////////////////////////////////////
2 ///把float32格式的音频数据,转换为int16格式的
3 void tdav_codec_float_to_int16 (void *pInput, void* pOutput, uint8_t* pu1SampleSz, uint32_t* pu4TotalSz, bool bFloat)
4 {
5 int16_t i2SampleNumTotal = *pu4TotalSz / *pu1SampleSz; //
6 int16_t *pi2Buf = (int16_t *)pOutput;
7 if (!pInput || !pOutput) {
8 return;
9 }
10
11 if (bFloat && *pu1SampleSz == 4) {
12 float* pf4Buf = (float*)pInput;
13 for (int i = 0; i < i2SampleNumTotal; i++) {
14 pi2Buf[i] = (int16_t)(pf4Buf[i] * 32767 ); // float -> int16 只要是不超过能表示的最临界数值,就行,超了类型所表示的最大值就会破音
15 }
16 *pu4TotalSz /= 2; // transfer to int16 byte size
17 *pu1SampleSz /= 2;
18 }
19 if (!bFloat && *pu1SampleSz == 2) {
20 memcpy (pOutput, pInput, *pu4TotalSz);
21 }
22 return;
23 }
24
25 ///把int16格式的音频数据,转换为float格式的
26 void tdav_codec_int16_to_float (void *pInput, void* pOutput, uint8_t* pu1SampleSz, uint32_t* pu4TotalSz, bool bInt16)
27 {
28 int16_t i2SampleNumTotal = *pu4TotalSz / *pu1SampleSz;
29 float *pf4Buf = (float *)pOutput;
30 if (!pInput || !pOutput) {
31 return;
32 }
33
34 if ( bInt16 && *pu1SampleSz == 2) {
35 int16_t* pi2Buf = (int16_t*)pInput;
36 for (int i = 0; i < i2SampleNumTotal; i++) {
37 pf4Buf[i] = (float)pi2Buf[i] / 32768 ; // int16 -> float
38 }
39 *pu4TotalSz *= 2; // transfer to int16 byte size
40 *pu1SampleSz *= 2;
41 }
42 if (!bInt16 && *pu1SampleSz == 4) { //如果是float,直接拷贝
43 memcpy (pOutput, pInput, *pu4TotalSz);
44 }
45 return;
46 }