// // amrFileCodec.h // amrDemoForiOS // // Created by Tang Xiaoping on 9/27/11. // Copyright 2011 test. All rights reserved. // #ifndef amrFileCodec_h #define amrFileCodec_h #include #include #include #include "interf_dec.h" #include "interf_enc.h" #define AMR_MAGIC_NUMBER "#!AMR\n" #define PCM_FRAME_SIZE 160 // 8khz 8000*0.02=160 #define MAX_AMR_FRAME_SIZE 32 #define AMR_FRAME_COUNT_PER_SECOND 50 typedef struct { char chChunkID[4]; int nChunkSize; }XCHUNKHEADER; typedef struct { short nFormatTag; short nChannels; int nSamplesPerSec; int nAvgBytesPerSec; short nBlockAlign; short nBitsPerSample; }WAVEFORMAT; typedef struct { short nFormatTag; short nChannels; int nSamplesPerSec; int nAvgBytesPerSec; short nBlockAlign; short nBitsPerSample; short nExSize; }WAVEFORMATX; typedef struct { char chRiffID[4]; int nRiffSize; char chRiffFormat[4]; }RIFFHEADER; typedef struct { char chFmtID[4]; int nFmtSize; WAVEFORMAT wf; }FMTBLOCK; // extern "C" 在 ObjC++ (.mm) 编译时禁用 C++ name mangling, // 保证 .o 里函数符号是 _EncodeWAVEFileToAMRFile / _DecodeAMRFileToWAVEFile(C 链接), // 与 Swift bridging-header 从 amrFileCodec.h 推导出的 C 函数签名匹配。 // // daoqi msext 原版无 extern "C" 包裹,因为调用方 VoiceConverter.mm 也是 ObjC++, // 双方都按 C++ name mangling 链接能匹配上。新外壳从 Swift 通过 bridging-header // 调用,Swift 按 C 函数解析,必须显式标 C linkage。 #ifdef __cplusplus extern "C" { #endif // WAVE音频采样频率是8khz // 音频样本单元数 = 8000*0.02 = 160 (由采样频率决定) // 声道数 1 : 160 // 2 : 160*2 = 320 // bps决定样本(sample)大小 // bps = 8 --> 8位 unsigned char // 16 --> 16位 unsigned short int EncodeWAVEFileToAMRFile(const char* pchWAVEFilename, const char* pchAMRFileName, int nChannels, int nBitsPerSample); // 将AMR文件解码成WAVE文件 int DecodeAMRFileToWAVEFile(const char* pchAMRFileName, const char* pchWAVEFilename); #ifdef __cplusplus } #endif #endif