实例介绍
【实例简介】
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Ex13_12 { public struct TC_INI_TYPE { public short wCardNo; //卡的总数 public short wCardType; //卡的类型 public short wConnect; //卡之间是否连通 public short wIRQ; //中断号 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public char[] cbDir; //安装目录 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public short[] wAddress;//每块卡的地址 public short wMajorVer; //软件主版本号 public short wMinorVer; //软件辅版本号 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public short[] wChType; //每个通道的类型 } public struct TC_INI_TYPE_MORE { } [StructLayout(LayoutKind.Sequential)] unsafe class DJ160API { private DJ160API() { } public const short MAX_CHANNEL_NO = 128; public const short LEN_FILEPATH = 128; public const short MAX_CARD_NO = 32; #region 初始化函数; /// <summary> /// 初始化函数,初始化设备驱动程序 /// 返回值: /// 0表示成功; /// -1表示打开设备驱动程序错误; /// -2表示读取TC08A-V.INI文件时,发生错误; /// -3表示INI文件的设置与实际硬件不一致时,发生错误 /// </summary> /// <returns>long</returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long LoadDRV(); /// <summary> /// 关闭驱动程序 /// </summary> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void FreeDRV(); /// <summary> /// 初始化语音卡硬件,并为每个通道分配语音缓冲区。 /// wusedCh可以用函数CheckValidCh来获得; /// 在调用本函数的时候,将为每路分配wFileBufLen大小的语音缓冲区,共计wusedCh*wFileBufLen,若申请不到,则返回-2。 /// buffer必须为1024的整数倍。 /// 返回值: /// 0表示成功; /// -1表示LoadDRV没有成功,造成本函数调用失败; /// -2表示分别分配缓冲区失败; /// 列:EnableCard(8,1024*16)将会申请1024K的内存 /// </summary> /// <param name="wusedCh">工作的通道总数</param> /// <param name="wFileBufLen">驱动种为每通道分配的语音内存大小</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long EnableCard(short wusedCh, short wFileBufLen); /// <summary> /// 关闭语音卡的硬件,释放缓冲区,程序结束(包括正常和不正常退出)时需要调用此函数 /// </summary> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void DisableCard(); [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void GetSysInfo(ref TC_INI_TYPE TmpIni); [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void GetSysInfoMore(ref TC_INI_TYPE_MORE TmpMore); /// <summary> /// 检测在当前机器内可用的通道总数。 /// 返回值: /// 棕的可用通道数 /// </summary> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short CheckValidCh(); /// <summary> /// 检测某个通道的类型 /// 返回值: /// CHTYPE_USER(0)表示内线; /// CHTYPE_TRUNK(1)表示外线; /// CHTYPE_EMPTY(2)表示悬空; /// </summary> /// <param name="wChnlNo">通道号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short CheckChType(short wChnlNo); /// <summary> /// 检测某个通道的类型 /// 返回值: /// CHTYPE_USER(0)表示内线; /// CHTYPE_TRUNK(1)表示外线; /// CHTYPE_EMPTY(2)表示悬空; /// CHTYPE_EMPTY(3)表示录音模块; /// </summary> /// <param name="wChnlNo">通道号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short CheckChTypeNew(short wChnlNo); [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool IsSupportCallerID(); [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void SetPackrate(short wPackRate); /// <summary> /// 维持文件录放音的持续进行,需要在处理函数的大循环中调用。 /// </summary> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void PUSH_PLAY(); /// <summary> /// 设定要检测的挂机忙音的参数。 /// </summary> /// <param name="BusyLen">忙音的时间长度,单位为秒</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void SetBusyPara(short BusyLen); /// <summary> /// 设定拨号以后要检测的信号音的参数。 /// 比如国际中规定拨号后的回铃音为响1秒,停止为4秒,忙音为0.35秒,写为SetDialPara(100,4000,350,7) /// </summary> /// <param name="RingBack">回铃音中响声的时间长度,单位为毫秒</param> /// <param name="RingBack0">回铃音中两声之间间隔的时间长度,单位为毫秒</param> /// <param name="BusyLen">对方占线时返回的忙音信号的时间长度</param> /// <param name="RingTimes">一共响多少次认为是无人接听</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void SetDialPara(short RingBack, short RingBack0, short BusyLen, short RingTimes); /// <summary> /// 读取D161A卡的序列号,注意:该序列号必须在LoadDRV之后,EnableCard之前。 /// /// </summary> /// <param name="wCardNo">卡号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long NewReadPass(short wCardNo); /// <summary> /// 设定某通道的工作参数 /// </summary> /// <param name="wChnlNo">通道号</param> /// <param name="cbWorkMode">选择要设定的工作模式</param> /// <param name="cbModeVal">参数值</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void D_SetWorkMode(short wChnlNo, byte cbWorkMode, byte cbModeVal); #endregion #region 振铃及摘挂机函数; /// <summary> /// 检测(外线)是否有震铃信号或(内线)有无提机 /// 比如:当函数返回1时,对于外线此时“提机”(OffHook)可以接通该路电话,而内线无需“提机”即可处于接通状态。 /// 返回值: /// 1表示有振铃信号(外线)或话机提机(内线) /// 0表示无振铃信号(外线)或话机提机(内线) /// /// </summary> /// <param name="wChnlNo">通道号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool RingDetect(short wChnlNo); /// <summary> /// 外线提机,对于内线,此函数不起作用。 /// 注意:不要对内线通道调用本函数。 /// </summary> /// <param name="wChnlNo"></param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void OffHook(short wChnlNo); /// <summary> /// 外线挂机,对于内线,此函数不起作用。 /// 注意:不要对内线调用本函数 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void HangUp(short wChnlNo); #endregion #region 放音函数; /// <summary> /// 指定通道开始普通内存放音。当放音长度(dwPlayLen)大于系统缓冲区的长度(在函数EnableCard中定义)时, /// 需要函数PUSH_PLAY来维持录音的持续 /// </summary> /// <param name="wChnlNo">通道号</param> /// <param name="PlayBuf">语音缓冲区地址</param> /// <param name="dwStartPos">在缓冲区中的偏移</param> /// <param name="dwPlayLen">放音的长度</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void StartPlay(short wChnlNo, byte[] PlayBuf, int dwStartPos, int dwPlayLen); /// <summary> /// 指定通道停止内存放音,本函数可以停止内存普通放音、内存索引放音、内存循环放音。 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void StopPlay(short wChnlNo); /// <summary> /// 检查指定通道放音是否结束,本函数可以用于普通内存放音、索引内存放音、循环内存放音和文件放音。 /// </summary> /// <param name="wChnlNo">通道号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool CheckPlayEnd(short wChnlNo); /// <summary> /// 开始文件放音。停止该方式的放音,一定要用StopPlayFile。 /// 检查放音是否结束,用CheckPlayEnd。 /// </summary> /// <param name="wChnlNo"></param> /// <param name="FileName"></param> /// <param name="StartPos"></param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool StartPlayFile(short wChnlNo, byte[] FileName, int StartPos); /// <summary> /// 对指定通道停止文件放音。 /// 对StartPlayFile开始的放音,必须用本函数来停止,这样才能关闭语音文件。 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void StopPlayFile(short wChnlNo); /// <summary> /// 初始化多文件放音。每开始一个新的多文件放音前调用此函数。 /// </summary> /// <param name="Line">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void RsetIndexPlayFile(short Line); /// <summary> /// 增加多文件放音的放音文件。 /// 返回值: /// 0代表失败,1代表成功。 /// </summary> /// <param name="wChnlNo">通道号</param> /// <param name="FileName">增加的语音文件名称</param> /// <returns>bool</returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool AddIndexPlayFile(short wChnlNo, byte[] FileName); /// <summary> /// 开始一个内存索引放音 /// 返回值:0失败,1成功。 /// </summary> /// <param name="wChnlNo">通道号</param> /// <param name="pIndexTable">要放音的索引序号</param> /// <param name="wIndexLen">要放音的索引长度</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void StartPlayIndex(short wChnlNo, short[] pIndexTable, short wIndexLen); /// <summary> /// 检查多文件放音是否结束,并维护多文件放音的连续性。当进行多文件放音时,必须用本函数以保证多文件放音的连续性。 /// 返回值: /// 0未结束,1结束 /// </summary> /// <param name="wChnlNo">通道号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool CheckIndexPlayFile(short wChnlNo); /// <summary> /// 停止多文件放音。 该函数停止指定通道的多文件放音,对于使用StartIndexPlayFile函数开始的多文件放音,结束时一定要调用本函数。 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void StopIndexPlayFile(short wChnlNo); /// <summary> /// 开始一个多文件放音。 /// 当调用该函数成功后,必须循环调用CheckIndexPlayFile函数来检测放音是否结束没, /// 并维护多文件放音联系进行 /// </summary> /// <param name="wChnlNo">通道号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool StartIndexPlayFile(short wChnlNo); #endregion #region 录音函数 /// <summary> /// 开始文件录音。 /// 停止该方式的录音一定要用StopRecordFile。 /// 检查录音是否结束,用CheckRecordEnd函数。 /// </summary> /// <param name="wChnlNo">通道号</param> /// <param name="FileName">文件名</param> /// <param name="dwRecordLen">最长录音长度</param> /// <returns>True:成功,False:打开文件失败</returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool StartRecordFile(short wChnlNo, byte[] FileName, long dwRecordLen); /// <summary> /// 本函数是对文件录音函数StartRecordFile的补充。 /// 当dwRecordStartPos=0时,调用函数StartRecordFile,即创建新文件录音; /// 当FileName不存在时,调用StartRecordFile,即创建新文件录音; /// 当FileName已经存在时: /// 若dwRecordStartPos大于文件长度时,从文件尾部开始录音;因此,如果需要从一个文件尾部继续录音,可以令dwRecordStartPos=0xFFFFFFFFL; /// 若dwRecordStartPos小于文件长度的时,从dwRecordStartPos处开始录音;录音长度由变量dwRecordLen来确定。 /// </summary> /// <param name="wChnlNo">通道号</param> /// <param name="FileName">文件名</param> /// <param name="dwRecordLen">最长录音长度</param> /// <param name="dwRecordStartPos">录音的开始位置</param> /// <returns>True:成功,False:打开文件失败</returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool StartRecordFileNew(short wChnlNo, byte[] FileName, Int64 dwRecordLen, Int64 dwRecordStartPos); /// <summary> /// 检查指定通道录音是否结束(缓冲区已满) /// 返回值: /// 0表示未结束,1代表结束 /// </summary> /// <param name="ChannelNo">通道号</param> /// <returns>Int</returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern int CheckRecordEnd(int ChannelNo); /// <summary> /// 该函数停止指定通道的文件录音,对于StartRecordFile函数启动的录音,一定要用本函数来停止,才能保证关闭语音文件。 /// </summary> /// <param name="wChnlNo"></param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void StopRecordFile(short wChnlNo); #endregion #region 收码、拔号、信号音检测函数 /// <summary> /// 清空系统的DTMF缓冲区,如果缓冲区中有DTMF的按键值,将会丢失。 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void InitDtmfBuf(short wChnlNo); /// <summary> /// 取该通道收到的DTMF编码,如果在缓冲区中有DTMF按键,调用本函数将返回最早一个DTMF按键,同时将该按键从缓冲区中移去, /// 如果没有收到任何DTMF键,本函数返回-1. /// 返回值: /// 1~9代表1~9键, /// 10代表0键, /// 11代表*键, /// 12代表#键, /// 13代表A键, /// 14代表B键, /// 15代表C键, /// 0代表D键。 /// </summary> /// <param name="wChnlNo">通道号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short GetDtmfCode(short wChnlNo); /// <summary> /// 查看指定通道是否有DTMF按键。当收到一个有效的DTMF按键后,本函数返回TRUE.本函数并不能将按键从内部缓冲区中移动去。 /// 如想移去该按键,需要调用GetDtmfCode。 /// 返回值: /// FALSE(0)代表缓冲区内没有DTMF按键, /// TRUE(1)代表有DTMF按键。 /// </summary> /// <param name="wChnlNo">通道号</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool DtmfHit(short wChnlNo); /// <summary> /// 某路开始新的信号检测。一般在摘机或者挂机后,调用本函数来开始新的信号检测。 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void StartSigCheck(short wChnlNo); /// <summary> /// 拨打电话号码。开始某通道的呼出过程。该函数只是设置通道的呼出缓冲区,真正的呼出过程需循环调用Sig_CheckDial函数来逐步完成。 /// 返回值: 1 成功 /// 0 失败 /// </summary> /// <param name="wChNo">通道号</param> /// <param name="DialNum">呼出号码</param> /// <param name="PreDialNum">前导号码</param> /// <param name="wMode">呼出检测的模式选择</param> /// <returns></returns> [DllImport("NewSig.dll", CharSet = CharSet.Auto)] //public static extern int Sig_StartDial(short wChNo, char* DialNum, char* PreDialNum, short wMode); public static extern int Sig_StartDial(short wChNo, [MarshalAs(UnmanagedType.LPArray)] byte[] DialNum, [MarshalAs(UnmanagedType.LPArray)] byte[] PreDialNum, short wMode); /// <summary> /// 在调用函数Sig_StartDial启动拨号过程后,就可以循环调用Sig_CheckDial函数维持拨号过程,并检测呼出的结果,直至得到结果为止。 /// 拨号的一般过程为: ///1.如参数PreDialNum不为空,则延迟1秒后拨出PreDialNum,如PreDialNum为空,则直接进入步骤3。 ///2.检测PreDialNum是否已发完。如已发完转至步骤3。 ///3.检测是否有拨号音,如拨号音长度达到配置项DialToneAfterOffHook的数值,则发送DialNum码串, /// 并转至步骤4。如在此步骤已等待配置项NoDialToneAfterOffHook定义的时间长度仍未检测到拨号音,则返回S_NODIALTONE。 ///4.检测DialNum串是否发完,如已发完则延迟StartDelay配置项的时间长度后进入步骤5。 ///5.如从进入此步骤起已经过配置项RingLen定义的时间长度,拨号音仍未停止则返回S_NOSIGNAL; /// 如在此步骤已等待配置项NoRingLen定义的时间长度仍未检测到回铃音则返回S_NOSIGNAL; /// 如检测到占线忙音数达到配置项BusySigCount定义的数字,则返回S_BUSY;如检测到对方摘机,则返回S_CONNECT; /// 如进入此步骤已经过配置项Ringback_NoAnswerTime定义的时间长度,并且已检测到回铃音,则返回S_NOBODY;其它情况返回S_NORESULT。 ///需注意的是,在进行呼出结果检测之前必须调用函数StartSigCheck启动信号音采集过程, /// 并且在进行呼出结果检测时,要循环调用FeedSigFunc函数维持信号音采集过程。 /// 返回值:16(0x10) 尚未得出结果 /// 15(0x0F) 没有拨号音 /// 33(0x21) 检测到对方占线的忙音 /// 20(0x14) 对方摘机,可以进行通话 /// 19(0x13) 振铃若干次,无人接听电话 /// 21(0x15) 没有信号音 /// </summary> /// <param name="wChNo">通道号</param> /// <returns></returns> [DllImport("NewSig.dll", CharSet = CharSet.Auto)] public static extern int Sig_CheckDial(short wChNo); #endregion #region 内线振铃控制及挂机检测 /// <summary> /// 对某以路内线通道馈电,同时停止馈铃流。 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void FeedPower(short wChnlNo); /// <summary> /// 对某一路内线通道馈连续的铃流。调用本函数后,本通道所连接的电话机将会不停的振铃, /// 直到调用函数FeedPower才会停止 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void FeedRing(short wChnlNo); /// <summary> /// 维持断续振铃信号及信号音的函数;在程序大循环中调用 /// </summary> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void FeedSigFunc(); /// <summary> /// 对某一路内线通道馈断续的铃流。断续的时间长度为响铃0.75秒,停止3秒。若要停止断续的铃流需要使用 /// 函数FeedPower。在本通道正在振铃的情况下,检测摘机必须用函数OffHookDetect,而不能使用RingDetect /// 注意: /// 一定要不断的调用FeedSigFunc,才能保证产生断续的铃流 /// </summary> /// <param name="wChnlNo"></param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void FeedRealRing(short wChnlNo); /// <summary> /// 检测某一路内线通道的摘机状态,当调用FeedRealRing函数开始一个断续的铃流后 /// 请使用本函数来检测摘机状态 /// </summary> /// <param name="wChnlNo">通道好</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void OffHookDetect(short wChnlNo); /// <summary> /// 某一通道开始挂机检测;当通道摘机后,可以调用本函数。 /// 该函数对内线通道有效。 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void StartHangUpDetect(short wChnlNo); [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short HangUpDetect(short wChnlNo); #endregion #region 收主叫号码有关的函数 /// <summary> /// 初始化某路的Caller-ID缓冲区。 /// </summary> /// <param name="wChnlNo">通道号</param> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void ResetCallerIDBuffer(short wChnlNo); [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short GetCallerIDRawStr(short wChnlNo, byte[] IDRawStr); /// <summary> /// 获得Caller-Id的内容 /// 当返回3或4时,CallerIdStr内存有接收到的CallerID /// 注意:由于FSK是在第一声振铃后发送的(有些地方甚至是第二三声后发送的)因此不能以检测到振铃就摘机 /// 在检测到有振铃的时候,必须首先调用ResetCallerIDBuffer,当本函数返回3或者4的时候才能摘机(OffHook) /// </summary> /// <param name="wChnlNo">通道号</param> /// <param name="IDStr">接收到的主叫号码信息</param> /// <returns></returns> [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short GetCallerIDStr(short wChnlNo, byte[] IDStr); //public static extern short GetCallerIDStr(short wChnlNo, char[] IDStr); #endregion #region 新增信号音函数 /// <summary> /// 完成信号音检测的初始化工作。 /// 该函数将从Windows目录下的NewSig.ini文件中读取信号音检测的配置信息, /// 根据配置参数的情况对硬件进行必要的设置, /// 即调整由用户自行设置的2个信号音的频率, /// 可能只用到其中1个,也可能2个都用到。 /// 函数返回:1成功 0失败 /// </summary> /// <param name="Times"></param> [DllImport("NewSig.dll", CharSet = CharSet.Auto)] public static extern void Sig_Init(int Times); /// <summary> /// 对某通道进行挂机忙音检测。 /// 返回值:1检测到忙音,0没有检测到 /// </summary> /// <param name="wChlNo">通道号</param> /// <returns>Int</returns> [DllImport("NewSig.dll", CharSet = CharSet.Auto)] public static extern int Sig_CheckBusy(short wChlNo); /// <summary> /// 清空忙音检测的缓冲区以及内部计数。当检测对方挂机的忙音后,必须调用本函数。 /// </summary> /// <param name="wChlNo"></param> [DllImport("NewSig.DLL", CharSet = CharSet.Auto)] public static extern void Sig_ResetCheck(short wChlNo); #endregion #region 声音格式转换函数 /// <summary> /// 把 A-Law PCM 文件转换为线性PCM,8000Hz,16bit,单声道Wave文件。 /// 如果有与WaveFileName相同名称的文件,将会被替换。 /// 返回值: /// 1,成功; /// -1,打开源文件错误; /// -2,打开目标文件错误; /// </summary> /// <param name="PcmFileName">要被转换的A-Law PCM文件</param> /// <param name="WaveFileName">转换后的文件名称</param> /// <returns></returns> [DllImport("DJCVT.dll", CharSet = CharSet.Auto)] public static extern int PcmtoWave(byte[] PcmFileName, byte[] WaveFileName); /// <summary> /// 把 A-Law PCM 文件转换为 wave 文件,wave的格式为: /// WaveFormat=0,为线性PCM,8000Hz,16bit,单声道Wave /// WaveFormat=1,为A-Law PCM,8000Hz,8bit,单声道Wave /// WaveFormat=2,为线性PCM,8000Hz,8bit,单声道Wave /// 返回值: /// 1,成功; /// -1,打开源文件错误; /// -2,打开目标文件错误; /// -3,无效的WaveFormat; /// </summary> /// <param name="PcmFileName">要被转换的A-Law PCM文件</param> /// <param name="WaveFileName">转换后的文件名称</param> /// <param name="WaveFormat">Wave文件格式</param> /// <returns></returns> [DllImport("DJCVT.dll", CharSet = CharSet.Auto)] public static extern int PcmtoWaveNew(byte[] PcmFileName, byte[] WaveFileName, int WaveFormat); /// <summary> /// 把 wave 文件转换为 A-Law PCM 文件。 /// 如果有与PcmFileName相同名称的文件,将会被替换。 /// 返回值: /// 1,成功 /// -1,打开源文件失败 /// -2,打开目标文件失败 /// </summary> /// <param name="WaveFileName">要被转换的Wave文件</param> /// <param name="PcmFileName">转换后的文件名称</param> /// <returns></returns> [DllImport("DJCVT.dll", CharSet = CharSet.Auto)] public static extern int WavetoPcm(byte[] WaveFileName, byte[] PcmFileName); #endregion } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论