📄 d161a.cs
字号:
/// <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);
#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
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -