日期:2014-05-19  浏览次数:21056 次

有没有基于音频采集卡开发的高手,一个相当诡异的问题!!!!
我现在基于一个音频采集卡进行开发,就是调用它提供的API进行音频数据的采集,我现在可以调用他的回调函数采集到数据,但是采集到的数据只有部分正确,不知道为什么,他的回调函数是
int     BOOL   CALLBACK   lpAudioCaptureCallback(   ULONG   _ulDataInfoPtr,   ULONG   _ulContextPtr   )
{
AUD5_DATA_INFO*     _pInfo   =   (AUD5_DATA_INFO*)_ulDataInfoPtr;
tCALLBACKCONTEXT*   _pContext   =   (tCALLBACKCONTEXT*)_ulContextPtr;
              /////////////////////////////////////////////////////////
                                            做相应的音频采集工作
              //////////////////////////////////////////////////////////
}
其中_ulDataInfoPtr是获得的音频数据结构的指针,_ulContextPtr   是相关的句柄(我觉得这个基本没什么用),其中AUD5_DATA_INFO结构如下
struct   _AUD5_DATA_INFO   {
ULONG uDataType;//
ULONG uStructSize;//
ULONG uErrCode;//
ULONG uBoardNum;     //   Board   ID[0..3]
ULONG uChannelNum;//   Channel   ID   of   the   Board
ULONG uHasNextData;
UCHAR *pDataBuffer;   //   存放音频数据地址
ULONG uLen;
long TimeTag; //   KeQuerySystemTime()
ULONG uDataAttr;

}   AUD5_DATA_INFO;
我现在在C#中把这个结构转化成如下形式:
                public   struct   AUD5_DATA_INFO  
                {
                        public   uint   uDataType;
                        public   uint   uStructSize;
                        public   uint   uErrCode;
                        public   uint   uBoardNum; //   Board   ID[0..3]
                        public   uint   uChannelNum; //   Channel   ID   of   the   Board
                        public   uint   uHasNextData;
                        public   IntPtr   pDataBuffer;
                        public   uint   uLen;
                        public   long   QuadPart
                        public   uint   uDataAttr;

                }
问题是,每次我把回调函数得到的指针转化成AUD5_DATA_INFO结构以后,结构中其他成员的值都对,就是pDataBuffer地址中所采集到的音频值不正确,特地来请教一下高手到底是什么地方可能出了问题呢!!!!!!!


------解决方案--------------------
我没有做过语音采集的,只是提供一个建议吧
public IntPtr pDataBuffer;
UCHAR *pDataBuffer; // 存放音频数据地址

将你的改为:
public UCHAR *pDataBuffer;
再试试看,估计是由大小端引起的问题,或者是字节对齐所引起的问题
------解决方案--------------------
C#没学过,只能猜了……

"public IntPtr pDataBuffer; "中的IntPtr是个什么东西?是否是指向int的指针?如果是的话,试试用指向char的指针来替代吧……