亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tapieventprocess.cpp

?? 用VC編寫的電話自動應答系統
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
                                           VARIANT_TRUE,
                                           VARIANT_TRUE,
                                           lMediaTypes,
                                           0,
                                           &lRegister
                                          );

    return hr;
}


/////////////////////////////////////////////////////////////////
// MakeTheCall
//
// 功能:設置并呼叫號碼
/////////////////////////////////////////////////////////////////
HRESULT
CTapi::MakeTheCall(
            IN DWORD dwAddressType,
            IN PWCHAR szAddressToCall
           )
{
    HRESULT                 hr = S_OK;
    BSTR                    bstrAddressToCall;
	//
	// 檢測當前地址是否有效
	//
	if( m_pAddress == NULL)
		return E_FAIL;

    //
	// 這里我們只要求支持聲音即可
	//
	long lMediaTypes = TAPIMEDIATYPE_AUDIO;
    //
    // 因為我們在對線路偵聽時,已經確定 m_Address 至少支持聲音,
	// 已經滿足我們要求,不用另做檢測
    //

	//
    // 建立呼叫
    //
    bstrAddressToCall = SysAllocString( szAddressToCall );

    hr = m_pAddress->CreateCall( bstrAddressToCall,
                                dwAddressType,
                                lMediaTypes,
                                &m_pCall);

    SysFreeString ( bstrAddressToCall );

    if ( FAILED(hr) )
    {
        AfxMessageBox("建立呼叫失敗!");

        return hr;
    }

    //
    // 為當前呼叫選擇終端
    //
    hr = SelectTerminalsOnCall(m_pAddress, m_pCall );

	//
	// 正式發出呼叫
	//
    hr = m_pCall->Connect( VARIANT_TRUE );

    if ( FAILED(hr) )
    {
        m_pCall->Release();
        m_pCall = NULL;

        AfxMessageBox("無法連接!");

        return hr;
    }
    return S_OK;
}

/////////////////////////////////////////////////////////
// GetTerminal
//
// 為輸入 stream 創建默認的 terminal,并通過 ppTerminal 返回
//
/////////////////////////////////////////////////////////
HRESULT CTapi::GetTerminal(
            ITAddress   * pAddress,
            ITStream    * pStream,
            ITTerminal ** ppTerminal
           )
{
    //
    // 確定當前傳入 stream 的 media type 和 direction
    //

    HRESULT            hr;
    long               lMediaType;
    TERMINAL_DIRECTION dir;

    hr = pStream->get_MediaType( &lMediaType );
    if ( FAILED(hr) ) return hr;

    hr = pStream->get_Direction( &dir );
    if ( FAILED(hr) ) return hr;

    //
	// 這里我們人處理 Audio 流,對于 Video 流,我們不令做處理
    // 因此只調用 GetDefaultStaticTerminal.
	// 首先,獲得 ITTerminalSupport 接口 
    //

    ITTerminalSupport * pTerminalSupport;

    hr = pAddress->QueryInterface( IID_ITTerminalSupport,
                                   (void **)&pTerminalSupport);

    if ( SUCCEEDED(hr) )
    {
        //
		// 為這種 MediaType 和 Direction 獲得默認的 Terminal
        //

        hr = pTerminalSupport->GetDefaultStaticTerminal(lMediaType,
                                                        dir,
                                                        ppTerminal);

        pTerminalSupport->Release();
    }

    return hr;
}

/////////////////////////////////////////////////////////////////
// SelectTerminalOnCall
//
// 在給定的 call 上中的 stream 中選擇一個適當的 terminal
/////////////////////////////////////////////////////////////////

HRESULT CTapi::SelectTerminalsOnCall(
                     ITAddress * pAddress,
                     ITBasicCallControl * pCall
                     )
{
    HRESULT hr;

    //
    // 為當前 call 獲得 ITStreamControl 接口
    //

    ITStreamControl * pStreamControl;

    hr = pCall->QueryInterface(IID_ITStreamControl,
                               (void **) &pStreamControl);

    if ( SUCCEEDED(hr) )
    {
        //
        // 列舉所有的 stream
        //

        IEnumStream * pEnumStreams;

        hr = pStreamControl->EnumerateStreams(&pEnumStreams);

        pStreamControl->Release();

        if ( SUCCEEDED(hr) )
        {
            //
            // 遍歷所有的 stream
            //

            ITStream * pStream;

            while ( S_OK == pEnumStreams->Next(1, &pStream, NULL) )
            {
                ITTerminal * pTerminal;

                //
				// 找出當前 stream 的 media type 和 direction,
				// 并且為這種 media type 和 direction 創建默認的 terminal 
                //

                hr = GetTerminal(pAddress,
                                 pStream,
                                 &pTerminal);

                if ( SUCCEEDED(hr) )
                {
                    //
					// 對當前的 Stream 選擇上面獲得的 Terminal
                    //

                    hr = pStream->SelectTerminal(pTerminal);

                    pTerminal->Release();
                }

                pStream->Release();
            }

            pEnumStreams->Release();
        }
    }
    return hr;
}

/////////////////////////////////////////////////////////////////
// PreparePlay
//
// 功能:播放給定的聲音文件
/////////////////////////////////////////////////////////////////
HRESULT 
CTapi::PreparePlay(CString strFileName)
{
	//
	// 檢測當前的 call object 是否有效
	//
    if (NULL == m_pCall)
    {
        AfxMessageBox("AnswerTheCall: Call object 無效");
        return E_UNEXPECTED;
    }

	//
	// 如果 m_pPlayFileTerm 不是NULL,先釋放之
	//
    if(NULL != m_pPlayFileTerm)
	{
		m_pPlayFileTerm->Release();
		m_pPlayFileTerm = NULL;
	}

    //
	// 為請求終端作準備 - 需要 ITBasicCallControl2 接口,只有在 TAPI3.1 中才支持
	//
    ITBasicCallControl2*    pITBCC2 = NULL;
    HRESULT hr = m_pCall->QueryInterface( IID_ITBasicCallControl2, (void**)&pITBCC2 );
	if(FAILED(hr))
	{
        AfxMessageBox("AnswerTheCall: QI ITBasicCallControl2 failed");
        m_pCall->Disconnect(DC_NORMAL);
		return hr;
	}

    //
	// 為請求終端作準備 - need CLSID BSTR 
	//
	BSTR bstrCLSID = NULL;
	hr = StringFromCLSID(CLSID_FilePlaybackTerminal, &bstrCLSID);
	if(FAILED(hr))
	{
		pITBCC2->Release();
        AfxMessageBox("AnswerTheCall: StringFromCLSID failed");
        m_pCall->Disconnect(DC_NORMAL);
		return hr;
	}

	//
	//正式請求終端,需要媒體流類型和媒體流方向
	//
	hr = pITBCC2->RequestTerminal(bstrCLSID, 
									TAPIMEDIATYPE_AUDIO, 
									TD_CAPTURE, 
									&m_pPlayFileTerm);
	//
	//釋放內存
	//
	::CoTaskMemFree(bstrCLSID);

	if(FAILED(hr))
	{
		pITBCC2->Release();
        AfxMessageBox("AnswerTheCall: RequestTerminal failed");
        m_pCall->Disconnect(DC_NORMAL);
		return hr;
	}

	//
	// 為設置文件名作準備
	//
	BSTR bstrFileName = strFileName.AllocSysString();

	if(NULL == bstrFileName)
	{
		m_pPlayFileTerm->Release();
		m_pPlayFileTerm = NULL;
		pITBCC2->Release();
        AfxMessageBox("AnswerTheCall: SysAllocString for play list failed");
        m_pCall->Disconnect(DC_NORMAL);
		return E_OUTOFMEMORY;
	}

	//
	// 為 m_pPlayFileTerm 設置文件名
	//
	hr = PutPlayList(m_pPlayFileTerm, bstrFileName);

	//
	// 釋放內存
	//
	::SysFreeString(bstrFileName);

	if(FAILED(hr))
	{
		m_pPlayFileTerm->Release();
		m_pPlayFileTerm = NULL;
		pITBCC2->Release();
		AfxMessageBox("AnswerTheCall: PutPlayList failed");
		m_pCall->Disconnect(DC_NORMAL);
		return hr;
	}

	//
	// 用 ITBasicCallControl2 選擇終端
	//
	hr = pITBCC2->SelectTerminalOnCall(m_pPlayFileTerm);
	if(FAILED(hr))
	{
		m_pPlayFileTerm->Release();
		m_pPlayFileTerm = NULL;
		pITBCC2->Release();
        AfxMessageBox("AnswerTheCall: SelectTerminalOnCall failed");
        m_pCall->Disconnect(DC_NORMAL);
		return hr;
	}

	pITBCC2->Release();
	return S_OK;
}


/////////////////////////////////////////////////////////////////////
// Answers the call
//
// 功能:應答電話,創建并選擇播放的終端
/////////////////////////////////////////////////////////////////////
HRESULT
CTapi::AnswerTheCall()
{

	HRESULT hr;
	hr = PreparePlay(m_WelcomeFileName);

	if( FAILED(hr) )
	{
		AfxMessageBox("無法找到" + m_WelcomeFileName + "文件或該文件不是合法的語音文件!");
		return E_FAIL;
	}
	//
	// 現在可以正式應答電話了
	//
    hr = m_pCall->Answer();
	if(FAILED(hr))
	{
		m_pPlayFileTerm->Release();
		m_pPlayFileTerm = NULL;
        AfxMessageBox("AnswerTheCall: Answer failed");
        m_pCall->Disconnect(DC_NORMAL);
		return hr;
	}

	//
	// 到此正常結束
	//
//	pITBCC2->Release();
    return S_OK;
}


//////////////////////////////////////////////////////////////////////
// DisconnectTheCall
//
// 功能:掛斷電話
//////////////////////////////////////////////////////////////////////
HRESULT CTapi::DisconnectTheCall()
{
    HRESULT         hr = S_OK;

    if (NULL != m_pCall)
    {
        hr = m_pCall->Disconnect( DC_NORMAL );
		
		//
        // 暫時不要釋放 m_pCall,因為這樣做的話我們無法得到 Disconnected 消息
		//

		return hr;
    }

    return S_FALSE;
}


//////////////////////////////////////////////////////////////////////
// ReleaseTheCall
//
// 釋放通話過程中所用到的 object
//
//////////////////////////////////////////////////////////////////////

void
CTapi::ReleaseTheCall()
{

//	KillTimer(m_hWnd, TIMER_ID);

	//
	// 釋放終端
	//
	if(NULL != m_pPlayFileTerm)
	{
		m_pPlayFileTerm->Release();
		m_pPlayFileTerm = NULL;
	}
	if(NULL != m_pRecordFileTerm)
	{
		m_pRecordFileTerm->Release();
		m_pRecordFileTerm = NULL;
	}
	//
	// 釋放 call object - 這樣會同時釋放所有的被選擇過得終端
	//
    if (NULL != m_pCall)
    {
        m_pCall->Release();
        m_pCall = NULL;
    }
}

//////////////////////////////////////////////////////////////////
// PutPlayList 
//
// 功能:將要播放的聲音文件放入播放列表。調用了 put_PlayList 
//////////////////////////////////////////////////////////////////
HRESULT CTapi::PutPlayList(
			IN ITTerminal *pITTerminal, 
			IN BSTR bstrFileName)
{
	//
	// 檢測輸入的終端是否有效
	//
	if(NULL == pITTerminal)
	{
        AfxMessageBox("PutPlayList: playback terminal NULL");
		return E_UNEXPECTED;
	}

	//
    // 獲得 ITMediaPlayback 接口 
	//
    ITMediaPlayback*    pMediaPlayback = NULL;

    HRESULT hr = pITTerminal->QueryInterface(
										IID_ITMediaPlayback,
										(void**)&pMediaPlayback);

	if(FAILED(hr))
	{
        AfxMessageBox("PutPlayList: QI ITMediaPlayback failed");
		return hr;
	}

	//
	// put_PlayList 函數需要用到的 VARIANT 變量
	//
	VARIANT varPlaylist;
	VariantInit(&varPlaylist);

	//
	// 設置 SAFEARRAYBOUND 
	//
    SAFEARRAYBOUND DimensionBounds;
    DimensionBounds.lLbound = 1;

	//
	// 設置 playlist 中的文件數
	//
    DimensionBounds.cElements = 1;

    //
	// 把文件名置于 playlist 中的 index = 1處
	//
    long lArrayPos = 1;

	//
	// 用于存放文件名 - 用于把文件名加入到 SafeArray
	//
    VARIANT* pvarArrayEntry = new VARIANT;
    if( pvarArrayEntry == NULL)
    {
        AfxMessageBox("PutPlayList: new VARIANT failed");
        return E_OUTOFMEMORY;
    }
	VariantInit(pvarArrayEntry);

    //
	// 創建 SAFEARRAY
	//
    SAFEARRAY *pPlayListArray = NULL;
    pPlayListArray = SafeArrayCreate( VT_VARIANT, 1, &DimensionBounds);
    if( pPlayListArray == NULL)
    {
        AfxMessageBox("PutPlayList: SafeArrayCreate failed");
		delete pvarArrayEntry;
        return E_OUTOFMEMORY;
    }

	//
	// 正式把存儲在 pvarArrayEntry 中的文件名加入到 SafeArray 中
	// 當我們需要加入多個元素到 SafeArray 中時,只需讓 lArrayPos 加 1 即可
	//
    pvarArrayEntry->vt = VT_BSTR;
    pvarArrayEntry->bstrVal = ::SysAllocString(bstrFileName);
    SafeArrayPutElement( pPlayListArray, &lArrayPos, pvarArrayEntry);
	VariantClear(pvarArrayEntry);

	//
	// 準備varPlaylist, 為調用 put_PlayList 作準備

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人国产精品视频| 国产91富婆露脸刺激对白| 激情亚洲综合在线| 日韩欧美美女一区二区三区| 日本中文字幕不卡| 88在线观看91蜜桃国自产| 亚洲国产aⅴ成人精品无吗| 欧美精品一区视频| 免费国产亚洲视频| 国产人妖乱国产精品人妖| 99在线视频精品| 韩国视频一区二区| 777午夜精品免费视频| 日韩精品一区二区三区四区| 亚洲一区二区不卡免费| 色综合一个色综合亚洲| 亚洲人成影院在线观看| 国产精品狼人久久影院观看方式| 国产尤物一区二区在线| 精品剧情v国产在线观看在线| 在线免费观看日本欧美| jlzzjlzz亚洲日本少妇| 国产美女视频一区| 六月丁香婷婷色狠狠久久| 日日夜夜免费精品视频| 一区二区国产盗摄色噜噜| 国产精品视频第一区| 国产欧美视频一区二区| 久久网站热最新地址| 精品日韩一区二区三区 | 成人一级片在线观看| 日本午夜精品一区二区三区电影 | 色国产精品一区在线观看| 国产成人精品免费一区二区| 国产一区三区三区| 国产精品资源在线观看| 久久66热偷产精品| 国精产品一区一区三区mba桃花| 日韩中文字幕区一区有砖一区| 亚洲一区免费在线观看| 亚洲国产aⅴ成人精品无吗| 国产欧美精品一区二区色综合朱莉| 精品国产成人系列| 久久久久国产精品麻豆| 日本一区二区三区四区在线视频| 国产精品视频九色porn| 亚洲手机成人高清视频| 亚洲美女在线一区| 亚洲国产另类av| 日韩高清不卡一区| 七七婷婷婷婷精品国产| 激情综合色综合久久| 国产一区二区三区免费看| 懂色av一区二区三区免费观看| 成人免费av在线| 日本精品一级二级| 6080国产精品一区二区| 欧美精品一区男女天堂| 中文字幕在线免费不卡| 亚洲三级在线观看| 午夜成人免费视频| 狠狠色丁香久久婷婷综合_中 | 夜夜爽夜夜爽精品视频| 天天综合天天做天天综合| 美日韩一级片在线观看| 丰满放荡岳乱妇91ww| 91国产成人在线| 日韩视频中午一区| 久久久午夜精品| 亚洲日本中文字幕区| 日本成人中文字幕在线视频| 国产麻豆精品在线观看| 色94色欧美sute亚洲13| 精品国内片67194| 国产精品美女久久久久久| 亚洲午夜在线视频| 国产一区二区精品久久99| 色狠狠av一区二区三区| 精品国产亚洲一区二区三区在线观看| 亚洲国产高清aⅴ视频| 亚洲成人av资源| 国产不卡视频在线播放| 欧美日韩中文精品| 久久久久国产精品人| 亚洲福利视频导航| 国产成人自拍高清视频在线免费播放| 欧美色精品在线视频| 亚洲国产高清在线| 日韩精品福利网| 95精品视频在线| 欧美www视频| 一片黄亚洲嫩模| 国产精品影视在线观看| 欧美三级电影一区| 日本一区二区三区在线观看| 肉色丝袜一区二区| 91猫先生在线| 久久精品一区二区三区四区| 天堂久久久久va久久久久| 成人精品免费网站| 欧美一级生活片| 一区二区三区资源| 国产精品77777| 日韩午夜电影av| 亚洲一区二区三区在线看| 成人一级视频在线观看| 精品国内二区三区| 午夜欧美视频在线观看| 91蜜桃视频在线| 国产欧美久久久精品影院| 久久国产麻豆精品| 91精品国产综合久久久久久漫画| 亚洲男人的天堂在线aⅴ视频| 国产一区二区精品久久| 日韩视频在线永久播放| 日韩激情在线观看| 在线观看亚洲专区| 亚洲欧美国产77777| 成人激情午夜影院| 久久久久久久久久久99999| 毛片一区二区三区| 欧美一区午夜视频在线观看| 亚洲成av人影院| 欧洲激情一区二区| 亚洲一线二线三线久久久| 一本色道久久综合亚洲精品按摩| 日本一区二区成人| 不卡一区二区在线| 中文字幕一区二区在线观看| 成人免费高清在线| 国产精品美女久久久久高潮| 国产白丝网站精品污在线入口| 久久久国产午夜精品| 国产麻豆9l精品三级站| 国产午夜精品久久久久久久| 国产激情视频一区二区在线观看 | 天天免费综合色| 欧美色爱综合网| 午夜不卡av在线| 日韩午夜中文字幕| 极品少妇xxxx偷拍精品少妇| 久久综合色综合88| 国产大陆亚洲精品国产| 国产精品另类一区| 91在线视频网址| 夜夜嗨av一区二区三区中文字幕| 欧美午夜在线一二页| 日韩高清欧美激情| 精品国产91久久久久久久妲己 | 在线精品观看国产| 亚洲.国产.中文慕字在线| 91.xcao| 免费观看91视频大全| 精品不卡在线视频| 成人黄色在线看| 一区二区三区免费| 欧美精品在线观看播放| 久久se精品一区精品二区| 国产女同性恋一区二区| 91免费版在线看| 视频在线观看一区二区三区| 欧美精品一区男女天堂| 不卡一区二区中文字幕| 亚洲国产一区在线观看| 日韩欧美精品在线| 波波电影院一区二区三区| 亚洲国产你懂的| 久久一区二区三区四区| 一本大道久久a久久精品综合| 日韩精品亚洲一区二区三区免费| 久久一区二区三区四区| 91国偷自产一区二区使用方法| 美洲天堂一区二卡三卡四卡视频| 欧美激情一区二区| 欧美丝袜第三区| 国产乱码精品一区二区三区忘忧草 | 亚洲自拍欧美精品| 精品国产免费人成在线观看| 91麻豆国产精品久久| 免费观看30秒视频久久| 亚洲人快播电影网| 日韩三级.com| 97se亚洲国产综合在线| 狠狠色丁香久久婷婷综合_中| 亚洲欧美日韩中文播放| 亚洲精品一区二区三区在线观看 | 中文字幕日韩一区二区| 欧美一区二区三区日韩| 99久久免费视频.com| 麻豆国产精品777777在线| 亚洲女人的天堂| 国产欧美一区二区精品仙草咪| 欧美老女人在线| 9久草视频在线视频精品| 久久成人久久爱| 一区二区三区四区中文字幕| 久久午夜国产精品| 欧美精选午夜久久久乱码6080| 成人av在线一区二区三区| 国内精品嫩模私拍在线|