📄 tone.c
字号:
/*--------------------------------------------------------------------------------------------------------------------------------
|
| Project: VoiceLink TB640 sample (tone)
|
| Filename: connection.c
|
| Copyright: TelcoBridges 2002-2003, All Rights Reserved
|
| Description:
|
| Notes: Tabs = 4
|
*-------------------------------------------------------------------------------------------------------------------------------
|
| Revision: $Revision: 1.51 $
|
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Includes
*------------------------------------------------------------------------------------------------------------------------------*/
#include "structures.h"
/*--------------------------------------------------------------------------------------------------------------------------------
| Forward declarations
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Defines
*------------------------------------------------------------------------------------------------------------------------------*/
#define TONE_MAX_RESOURCES 4096 /* Max resources that will be handled by this app */
#define TONE_TIMER_GRANULARITY 100 /* ms */
#define TONE_TIMER_MAX_TIMEOUT 30000 /* 30 sec */
#define TONE_SHORT_DTMF_FLAG 0x80000000
/*--------------------------------------------------------------------------------------------------------------------------------
| Types
*------------------------------------------------------------------------------------------------------------------------------*/
TB640_RESOURCE_HANDLE g_ahTrunkRes[ 2048 ];
TB640_RESOURCE_HANDLE g_ahVpRes [ 2048 * 2 ];
TB640_RESOURCE_HANDLE g_ahStrmRes [ 2048 ];
TB640_RESOURCE_HANDLE g_ahVpGrp [ 2048 ];
TB640_CONNECTION_HANDLE g_ahConn[ 2048 * 2 ];
TBX_UINT32 g_un32RxPlayTonesCnt = 0;
TBX_UINT32 g_un32RxStopTonesCnt = 0;
TBX_TICK g_SentTick;
/*--------------------------------------------------------------------------------------------------------------------------------
| Versioning
*------------------------------------------------------------------------------------------------------------------------------*/
#ifdef WIN32
#pragma ident "$Revision: 1.51 $"
#endif
/*--------------------------------------------------------------------------------------------------------------------------------
| Global variables
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_CHAR g_abyDigitToDtmf[] =
{
TB640_VP_DIGIT_TYPE_DTMF_DIGIT0, /* Digit 0 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT1, /* Digit 1 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT2, /* Digit 2 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT3, /* Digit 3 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT4, /* Digit 4 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT5, /* Digit 5 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT6, /* Digit 6 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT7, /* Digit 7 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT8, /* Digit 8 */
TB640_VP_DIGIT_TYPE_DTMF_DIGIT9, /* Digit 9 */
TB640_VP_DIGIT_TYPE_DTMF_DIGITPND, /* Digit # */
TB640_VP_DIGIT_TYPE_DTMF_DIGITST /* Digit * */
};
TBX_CHAR* g_apszToneString[] = {
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT1", /*0*/
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT2",
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT3",
"TB640_VP_DIGIT_TYPE_DTMF_DIGITA",
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT4",
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT5",
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT6",
"TB640_VP_DIGIT_TYPE_DTMF_DIGITB",
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT7",
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT8",
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT9",
"TB640_VP_DIGIT_TYPE_DTMF_DIGITC",
"TB640_VP_DIGIT_TYPE_DTMF_DIGITST",
"TB640_VP_DIGIT_TYPE_DTMF_DIGIT0",
"TB640_VP_DIGIT_TYPE_DTMF_DIGITPND",
"TB640_VP_DIGIT_TYPE_DTMF_DIGITD", /*15*/
"UNK", "UNK", "UNK", "UNK",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT1", /*20*/
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT2",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT4",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT7",
"TB640_VP_DIGIT_TYPE_MFR1_CODE11",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT3",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT5",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT8",
"TB640_VP_DIGIT_TYPE_MFR1_CODE10",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT6",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT9",
"TB640_VP_DIGIT_TYPE_MFR1_KPTERMST",
"TB640_VP_DIGIT_TYPE_MFR1_DIGIT0",
"TB640_VP_DIGIT_TYPE_MFR1_KPTRANTR",
"TB640_VP_DIGIT_TYPE_MFR1_STENDPLS", /*34*/
"UNK", "UNK", "UNK", "UNK", "UNK",
"TB640_VP_DIGIT_TYPE_MFR2_FWD1", /*40 */
"TB640_VP_DIGIT_TYPE_MFR2_FWD2",
"TB640_VP_DIGIT_TYPE_MFR2_FWD4",
"TB640_VP_DIGIT_TYPE_MFR2_FWD7",
"TB640_VP_DIGIT_TYPE_MFR2_FWD11",
"TB640_VP_DIGIT_TYPE_MFR2_FWD3",
"TB640_VP_DIGIT_TYPE_MFR2_FWD5",
"TB640_VP_DIGIT_TYPE_MFR2_FWD8",
"TB640_VP_DIGIT_TYPE_MFR2_FWD12",
"TB640_VP_DIGIT_TYPE_MFR2_FWD6",
"TB640_VP_DIGIT_TYPE_MFR2_FWD9",
"TB640_VP_DIGIT_TYPE_MFR2_FWD13",
"TB640_VP_DIGIT_TYPE_MFR2_FWD10",
"TB640_VP_DIGIT_TYPE_MFR2_FWD14",
"TB640_VP_DIGIT_TYPE_MFR2_FWD15", /*54 */
"UNK", "UNK", "UNK", "UNK", "UNK",
"TB640_VP_DIGIT_TYPE_MFR2_BCK1", /*60 */
"TB640_VP_DIGIT_TYPE_MFR2_BCK2",
"TB640_VP_DIGIT_TYPE_MFR2_BCK4",
"TB640_VP_DIGIT_TYPE_MFR2_BCK7",
"TB640_VP_DIGIT_TYPE_MFR2_BCK11",
"TB640_VP_DIGIT_TYPE_MFR2_BCK3",
"TB640_VP_DIGIT_TYPE_MFR2_BCK5",
"TB640_VP_DIGIT_TYPE_MFR2_BCK8",
"TB640_VP_DIGIT_TYPE_MFR2_BCK12",
"TB640_VP_DIGIT_TYPE_MFR2_BCK6",
"TB640_VP_DIGIT_TYPE_MFR2_BCK9",
"TB640_VP_DIGIT_TYPE_MFR2_BCK13",
"TB640_VP_DIGIT_TYPE_MFR2_BCK10",
"TB640_VP_DIGIT_TYPE_MFR2_BCK14",
"TB640_VP_DIGIT_TYPE_MFR2_BCK15", /*74 */
"UNK", "UNK", "UNK", "UNK", "UNK",
"TB640_VP_DIGIT_TYPE_FSK_TAS", /* 80 */
"TB640_VP_DIGIT_TYPE_FAX_CNG", /* 81 */
"TB640_VP_DIGIT_TYPE_FAX_G164", /* 82 */
"TB640_VP_DIGIT_TYPE_FAX_G165", /* 83 */
};
TBX_UINT32 g_un32ToneStringCnt = 84;
/*--------------------------------------------------------------------------------------------------------------------------------
| Macros
*------------------------------------------------------------------------------------------------------------------------------*/
#define TONE_STRING( _Tone ) \
((TBX_UINT32)_Tone < g_un32ToneStringCnt) ? g_apszToneString[_Tone] : "UNK"
#define TONE_STRING_SHORT( _Tone ) \
((TBX_UINT32)_Tone < g_un32ToneStringCnt) ? g_apszToneString[_Tone] + sizeof("TB640_VP_DIGIT_TYPE_DTMF_DIGIT") - 1 : "UNK"
/*--------------------------------------------------------------------------------------------------------------------------------
| Function Prototypes
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Implementation
*------------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------------
|
| ToneMainMenu: This function displays the PM application's main menu.
|
| in_hLib : Handle to the TBX library returned by TBXOpenLib()
| in_hAdapter : Handle to an adapter that was previously selected and attached to by SelectAdapter()
| in_un32TrunkNo : Trunk number to use
|
| Note : ~
|
| Return : TBX_RESULT_OK
| TBX_RESULT_FAIL
| or others
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT ToneMainMenu (
IN TBX_LIB_HANDLE in_hLib,
IN TBX_ADAPTER_HANDLE in_hAdapter,
IN TBX_UINT32 in_un32TrunkNo )
{
TBX_RESULT Result = TBX_RESULT_OK;
TBX_BOOL fAgain;
TBX_BOOL fPrintMenu;
TBX_INT32 iInput;
TONE_EVENTS_THREAD_CONTEXT EventsThreadCtx;
TONE_TIMER_THREAD_CONTEXT TimerThreadCtx;
TONE_COLLECTOR_THREAD_CONTEXT CollectorThreadCtx;
TBX_THREAD hCollectorThread;
TBX_THREAD hEventsThread;
TBX_THREAD hTimerThread;
TBX_UINT32 un32TimeSlot;
TBX_UINT32 un32Duration;
TBX_UINT32 un32OnTime;
TBX_UINT32 un32OffTime;
TBX_UINT32 un32Count;
TBX_UINT32 un32TimeSlotPlay;
TBX_UINT32 un32SegmentCnt;
TBX_UINT32 un32Freq1;
TBX_UINT32 un32Freq2;
TBX_UINT32 un32ToneIdx;
TBX_INT32 n32Level;
TB640_VP_TONE_DETECT_TYPE ToneType;
TB640_VP_DIGIT_TYPE Digit;
TBX_UINT32 un32ToneStringIdx;
TBX_CHAR szPhoneNumber[64];
TB640_TRUNK_HANDLE hTrunk;
PTB640_REQ_VP_TONE_PLAY pMsToneReq;
TBX_FIFO msToneFifo;
TBX_UINT32 un32SegmentIdx;
TBX_UINT32 un32Tone;
PTB640_VP_DIGIT_PARAMS pToneIdx;
TBX_UINT32 un32ToneCnt;
TBX_UINT32 un32FirstDigitTimeout;
TBX_UINT32 un32InterDigitTimeout;
TBX_BOOL fUseShortDtmf;
TBX_CHAR cDigit;
TBX_CHAR szDigit[2] = "#";
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialization of local variables */
memset( &EventsThreadCtx, 0, sizeof(EventsThreadCtx) );
memset( &TimerThreadCtx, 0, sizeof(TimerThreadCtx) );
memset( &CollectorThreadCtx, 0, sizeof(CollectorThreadCtx) );
memset( &msToneFifo, 0, sizeof(msToneFifo) );
EventsThreadCtx.hEventsFilter = (TBX_FILTER_HANDLE)TBX_HANDLE_INVALID;
EventsThreadCtx.hLib = in_hLib;
EventsThreadCtx.hAdapter = in_hAdapter;
TimerThreadCtx.hAdapter = in_hAdapter;
TimerThreadCtx.hLib = in_hLib;
TimerThreadCtx.un32Timeout = TONE_TIMER_GRANULARITY;
CollectorThreadCtx.hAdapter = in_hAdapter;
CollectorThreadCtx.hLib = in_hLib;
hEventsThread = TBX_THREAD_INVALID;
fAgain = TBX_TRUE;
fPrintMenu = TBX_TRUE;
un32TimeSlot = 1;
un32TimeSlotPlay = 1;
un32OnTime = 200;
un32OffTime = 500;
un32SegmentCnt = 2;
Digit = 1;
un32Freq1 = 1000;
un32Freq2 = 2000;
n32Level = TB640_VP_TONE_LEVEL_MINUS_10_DBM;
un32Tone = 0;
un32FirstDigitTimeout = 5000;
un32InterDigitTimeout = 2000;
fUseShortDtmf = TBX_FALSE;
Result = TBX_FIFO_CREATE( &msToneFifo, 100 );
if( TBX_RESULT_FAILURE(Result) )
{
return Result;
}
/* Launch the thread that waits for these events */
CollectorThreadCtx.fContinue = TBX_TRUE;
Result = TBX_THREAD_CREATE_HPRIO (
&hCollectorThread,
CollectorThread,
&CollectorThreadCtx );
/* Launch our Timer thread, we want it High Prio for better accuracy */
TimerThreadCtx.fContinue = TBX_TRUE;
TBX_THREAD_CREATE_HPRIO(
&hTimerThread,
ToneTimerThread,
&TimerThreadCtx );
/* Launch the thread that waits for these events */
EventsThreadCtx.fContinue = TBX_TRUE;
Result = TBX_THREAD_CREATE (
&hEventsThread,
ToneEventsThread,
&EventsThreadCtx );
/* Set the trunk handles */
hTrunk = g_aTrunkInfo[ in_un32TrunkNo ].hTrunk;
/* Invalidate all connection handles */
memset( g_ahConn, ~0, sizeof( g_ahConn ) );
memset( g_ahVpRes, ~0, sizeof( g_ahVpRes ) );
memset( g_ahStrmRes, ~0, sizeof( g_ahStrmRes ) );
memset( g_ahVpGrp, ~0, sizeof( g_ahVpGrp ) );
memset( g_ahTrunkRes, ~0, sizeof( g_ahTrunkRes ) );
fprintf(stdout,"\nLegend:\n");
fprintf(stdout,"I : Internally connected (timeslot 0)\n");
fprintf(stdout,"E : Externally connected to trunk (timeslot 1-31)\n");
while (fAgain)
{
Result = TBX_RESULT_OK;
if (fPrintMenu == TBX_TRUE)
{
fprintf(stdout,"\n\nStart of Menu");
fprintf(stdout,"\n1. Display this menu again");
fprintf(stdout,"\n-----------------");
fprintf(stdout,"\n2. Allocate & Connect Tone Resource (E)");
fprintf(stdout,"\n-----------------");
fprintf(stdout,"\n3. Play Specific Tone");
fprintf(stdout,"\n4. Play All Tone");
fprintf(stdout,"\n5. Dial a number");
fprintf(stdout,"\n6. Play multi-segment Tone");
fprintf(stdout,"\n7. Stop Tone");
fprintf(stdout,"\n-----------------");
fprintf(stdout,"\n10. Define a multi-segment tone");
fprintf(stdout,"\n11. List ms-tone definitions");
fprintf(stdout,"\n12. Play a ms-Tone definition");
fprintf(stdout,"\n13. Collect multi Digits");
fprintf(stdout,"\n-----------------");
fprintf(stdout,"\n20. DaisyChain test (I)");
fprintf(stdout,"\n21. Burst test (I)");
fprintf(stdout,"\n22. ShortDtmf test (I)");
fprintf(stdout,"\n-----------------");
fprintf(stdout,"\n30. Free Allocated Resource/connections");
fprintf(stdout,"\n-----------------");
fprintf(stdout,"\n0. Quit");
fprintf(stdout,"\n-----------------");
fprintf(stdout,"\nPlay:%d Stop:%d\n", g_un32RxPlayTonesCnt, g_un32RxStopTonesCnt );
fPrintMenu = TBX_FALSE;
}
iInput = PromptUserWithDefault_TBX_INT32( "Command? ", 1 );
switch ( iInput )
{
case 2: /* Allocate Tone Resource */
{
ToneType = PromptUserWithDefault_TBX_INT32( "ToneType [1=DTMF|2=MFR1|4=MFR2FWD|8=MFR2BCK|128=FAX]? ", TB640_VP_TONE_DETECT_TYPE_DTMF );
if( ToneType & TB640_VP_TONE_DETECT_TYPE_DTMF )
fUseShortDtmf = PromptUserWithDefault_TBX_BOOL( "Use Short Dtmf Detection ? ", fUseShortDtmf );
un32TimeSlot = PromptUserWithDefault_TBX_INT32( "Tdm Timeslot to connect to? ", un32TimeSlot );
if( fUseShortDtmf )
ToneType |= TONE_SHORT_DTMF_FLAG;
/* Allocate and connect Tone Definition */
Result = ToneResAllocateAndConnect
(
in_hLib,
in_hAdapter,
ToneType,
hTrunk,
un32TimeSlot
);
un32TimeSlot++;
} break;
case 3: /* Play Specific Tone */
{
un32TimeSlotPlay = PromptUserWithDefault_TBX_INT32( "Tdm timeslot play tone to? ", un32TimeSlotPlay );
un32OnTime = PromptUserWithDefault_TBX_INT32( "tone On Time (ms)? ", un32OnTime );
if(un32OnTime != ~0 )
un32OffTime = PromptUserWithDefault_TBX_INT32( "tone Off Time (ms)? ", un32OffTime );
un32ToneStringIdx = g_un32ToneStringCnt;
while( un32ToneStringIdx-- )
if( strcmp( TONE_STRING(un32ToneStringIdx), "UNK" ) )
fprintf( stdout, "%02d: %s\n", un32ToneStringIdx, TONE_STRING(un32ToneStringIdx) );
fprintf( stdout, "99: Exit Play Tone\n" );
do
{
Digit = (TB640_VP_DIGIT_TYPE)PromptUserWithDefault_TBX_INT32( "What digit? ", 99 );
if( Digit == 99 )
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -