⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp_apdlg.cpp

📁 一个在Linux下开发的IP摄像头的驱动程序及控制软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					EnterCriticalSection(&g_CS[i]);
					nRate = (g_Channel_Info[i].nFrames * 1000) / dwDiff;
					g_Channel_Info[i].nFrames = 0;
					g_Channel_Info[i].dwLastFRTick = dwTickNow;
					LeaveCriticalSection(&g_CS[i]);
				}

			}
			sprintf(chTemp, "%d", nRate);
			GetDlgItem(IDC_STATIC_FR1 + i)->SetWindowText(chTemp);
		}
	}

	CTime t = CTime::GetCurrentTime();
	str3.Format("\n     %02ld:%02ld:%02ld", t.GetHour(), t.GetMinute(), t.GetSecond());


	str = str1+str2+str3;
	m_STATIC_STATUS.SetWindowText(str);
	return 0;
}

int CMP_APDlg::CheckUI(void)
{
	/*m_btnGetSys.EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp)));
	GetDlgItem(IDC_BUTTON_GETMD)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp)));
	GetDlgItem(IDC_BUTTON_SETMD)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp)));
	m_editUrlCmd.EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncHttpOperGet | asyncHttpOperPost)));

	GetDlgItem(IDC_CHECK_SHOW_RETURN)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncHttpOperGet | asyncHttpOperPost)));
	m_StaticUrlCmd.EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncHttpOperGet | asyncHttpOperPost)));
	m_butGet.EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncHttpOperGet | asyncHttpOperPost)));
	m_butPost.EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncHttpOperGet | asyncHttpOperPost)));
	CButton_SetDO1.EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncSetDO)));
	CEdit_DO1Val.EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncSetDO)));
	GetDlgItem(IDC_BUTTON_SETPARAM)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncSetDO)));
	GetDlgItem(IDC_BUTTON_UPD_REMOTE)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp)));
	GetDlgItem(IDC_EDIT_SETPARAM_CNT)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncSetDO)));
	GetDlgItem(IDC_READ_UART)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncUartRead)));
	GetDlgItem(IDC_EDIT_UART)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncUartRead)));
	GetDlgItem(IDC_WRITE_UART)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncUartWrite)));
	GetDlgItem(IDC_EDIT_UART2)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp | asyncUartWrite)));
	((CButton *) GetDlgItem(IDC_CHECK_NOBORDER))->SetCheck(g_Channel_Info[g_iFocus].bNoBorder?1:0);
	GetDlgItem(IDC_BUTTON_GET_SECENTRY)->EnableWindow(g_Channel_Info[g_iFocus].bConnecting &&
		!(g_Channel_Info[g_iFocus].dwAsyncOper & (asyncSetProp)));
		*/

	if (g_Channel_Info[g_iFocus].chServer_Type[2] > '3' && g_Channel_Info[g_iFocus].chServer_Type[2] != '7')
	{
		BOOL bTalkEnabled = !(g_Channel_Info[g_iFocus].eTalkState == eTalkEstablishing ||
							 g_Channel_Info[g_iFocus].eTalkState == eTalkStopping);

		bTalkEnabled &= (g_Channel_Info[g_iFocus].iAudioMode < 3);

		m_btnTx.EnableWindow(bTalkEnabled && g_Channel_Info[g_iFocus].bConnecting && g_Channel_Info[g_iFocus].nTxConn != 2);
		GetDlgItem(IDC_BUTTON_TALK)->EnableWindow(!m_bNoAudio && bTalkEnabled && g_Channel_Info[g_iFocus].bConnecting && g_Channel_Info[g_iFocus].nTxConn != 1);
		m_editTxFileName.EnableWindow(bTalkEnabled && g_Channel_Info[g_iFocus].bConnecting && g_Channel_Info[g_iFocus].nTxConn == 0);
		m_btnTxBrowse.EnableWindow(bTalkEnabled && g_Channel_Info[g_iFocus].bConnecting && g_Channel_Info[g_iFocus].nTxConn == 0);

		if (g_Channel_Info[g_iFocus].nTxConn == 1)
			m_btnTx.SetWindowText("Stop Tx");
		else
			m_btnTx.SetWindowText("Start Tx");

		if (g_Channel_Info[g_iFocus].nTxConn == 2)
			GetDlgItem(IDC_BUTTON_TALK)->SetWindowText("Stop Talk");
		else
			GetDlgItem(IDC_BUTTON_TALK)->SetWindowText("Start Talk");
	}
	else
	{
		m_btnTx.EnableWindow(FALSE);
		m_editTxFileName.EnableWindow(FALSE);
		m_btnTxBrowse.EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_TALK)->EnableWindow(FALSE);
	}

	CButton_ChDisplay.SetCheck(g_Channel_Info[g_iFocus].bNoDisplay?0:1);

	CSliderCtrl_Volume.SetPos(g_Channel_Info[g_iFocus].dwVolume);

	BOOL bEnabled = FALSE;
	if (g_Channel_Info[g_iFocus].chStatus == channelStopped ||
		g_Channel_Info[g_iFocus].chStatus == channelConnected)
		bEnabled = TRUE;

	if ( strlen(g_Channel_Info[g_iFocus].chServer_Type) == 0 )
	{
		CButton_Record.EnableWindow(FALSE);
		CButton_Connect.EnableWindow(FALSE);
		CButton_Snap.EnableWindow(FALSE);
	}
	else
	{
		CButton_Record.EnableWindow(bEnabled && g_Channel_Info[g_iFocus].bConnecting);
		CButton_Snap.EnableWindow(bEnabled && g_Channel_Info[g_iFocus].bConnecting);
		CSliderCtrl_Range.EnableWindow(g_Channel_Info[g_iFocus].dwMediaEnd && bEnabled);
		CButton_Pause.EnableWindow(bEnabled && g_Channel_Info[g_iFocus].eRtspState == eRtspStPlay);
		CButton_Play.EnableWindow(bEnabled && g_Channel_Info[g_iFocus].eRtspState != eRtspStPlay);
		CButton_Connect.EnableWindow(TRUE); //Bruce
	}

	if (g_Channel_Info[g_iFocus].chStatus != channelStopped)
		CButton_Connect.SetWindowText("Disconnect");
	else
		CButton_Connect.SetWindowText("Connect");

	if ( g_Channel_Info[g_iFocus].bRecording == TRUE )
		CButton_Record.SetWindowText("Stop");
	else
		CButton_Record.SetWindowText("Record");

	// close non-focus channel's audio
	TUPDATECHANNELOPTION tUpdateChannelOptions;
    for ( int i = 0 ; i < g_nMaxChannel ; i ++ )
	{
		tUpdateChannelOptions.dwFlags = UPCH_AUDIOOUT;
		if (i == g_iFocus)
		{
			tUpdateChannelOptions.bAudioOut = TRUE;

			// mute half duplex when upstream is enabled.
			if((g_Channel_Info[g_iFocus].iAudioMode == 2) & (g_Channel_Info[g_iFocus].nTxConn))
			{
				tUpdateChannelOptions.bAudioOut = FALSE;
			}
		}
		else
			tUpdateChannelOptions.bAudioOut = FALSE;

		tUpdateChannelOptions.dwFlags = UPCH_AUDIOOUT;
		if ( g_Channel_Info[i].hChannel != NULL )
			AvSynchronizer_UpdateChannelSettings (g_Channel_Info[i].hChannel,tUpdateChannelOptions );
	}

	g_Channel_Info[g_iFocus].nTimerDI = 0;

	m_btnEventDrivenRec.EnableWindow(g_Channel_Info[g_iFocus].bConnecting);
	m_btnEventDrivenRec.SetCheck(g_Channel_Info[g_iFocus].bEventRecord?1:0);
	
	return 0;
	
}



void CMP_APDlg::OnTimer(UINT nIDEvent)
{
	// TODO: Add your message handler code here and/or call default
	if (nIDEvent == 1)
		Change_Status();
	else if (nIDEvent == 2)
		// check for reconnection
		CheckReconnection();

	CDialog::OnTimer(nIDEvent);
}

void CMP_APDlg::CheckReconnection()
{
	EnterCriticalSection(&m_CS);
	
	for (int nCnt = 0; nCnt < g_nMaxChannel; nCnt++)
	{
		if (g_Channel_Info[nCnt].bNeedReconnect)
		{
			g_Channel_Info[nCnt].bNeedReconnect = FALSE;

			if (g_Channel_Info[nCnt].chStatus == channelStopped)
			{
				Connect_Channel(nCnt);
			}
		}
	}

	LeaveCriticalSection(&m_CS);
}
//=================================================================
//	Function   : InitialParameters
//	Description: initial the g_Channel_Info
//				 
//	Parameters :                     
//	Return     : 
//=================================================================
int CMP_APDlg::InitialParameters(void)
{
	ZeroMemory(g_Channel_Info,sizeof(g_Channel_Info));

	ReadParameters();// read parameters from mp_ap.ini

	char chTemp[64];
	for ( int i = 0 ; i < g_nMaxChannel ; i++)
	{
		g_Channel_Info[i].dwContext = i;
		sprintf(chTemp,"CH_%d",i);
		strcpy(g_Channel_Info[i].chDBLocation,chTemp);
	
		InitializeCriticalSection(&g_CS[i]);
		g_Channel_Info[i].hDisplay = GetDlgItem(IDC_STATIC_DISPLAY1 + i)->m_hWnd;
		g_Channel_Info[i].pvDlg = this;
	}

		g_hBMP = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE((WORD)IDB_B));
	
	return 0;
}
//=================================================================
//	Function   : OnNMReleasedcaptureSliderVolume 
//	Description: change the volume 
//				 
//	Parameters :                     
//	Return     : 
//=================================================================
void CMP_APDlg::OnNMReleasedcaptureSliderVolume(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: Add your control notification handler code here
	g_Channel_Info[g_iFocus].dwVolume = CSliderCtrl_Volume.GetPos();
	long int iSoundVolume = 50 * g_Channel_Info[g_iFocus].dwVolume; // 0~ 100 -> 0~5000
	// set sound volume

	TUPDATECHANNELOPTION tUpdateChannelOptions;
	tUpdateChannelOptions.dwVolume = iSoundVolume;
	
	tUpdateChannelOptions.dwFlags = UPCH_VOLUME;
	if ( g_Channel_Info[g_iFocus].hChannel != NULL )
		AvSynchronizer_UpdateChannelSettings (g_Channel_Info[g_iFocus].hChannel, tUpdateChannelOptions);
	*pResult = 0;
}

void CMP_APDlg::OnNMReleasedcaptureSliderRange(NMHDR *pNMHDR, LRESULT *pResult)
{
	DWORD dwPosition;

	AvSynchronizer_SetChannelOption(g_Channel_Info[g_iFocus].hChannel, SETCH_RESUME_PLAYING, TRUE, 0);

	dwPosition = CSliderCtrl_Range.GetPos();

	DataBroker_JumpMediaStreaming(
		g_Channel_Info[g_iFocus].hConn,
		dwPosition
	);
}


void CMP_APDlg::UpdateStatusToEdit(const char *pszMsg)
{
	CEdit *pEdit = (CEdit *) GetDlgItem(IDC_UPGRADE_STATUS);

	pEdit->SetSel(-1, 0, FALSE);
	CString strOrg;
	pEdit->GetWindowText(strOrg);
	if (strOrg.GetLength() > 0)
		pEdit->ReplaceSel("\r\n");
	pEdit->ReplaceSel(pszMsg);
}



void CMP_APDlg::TxOnChannel(int nIndex)
{
	if (!g_Channel_Info[nIndex].bConnecting)
		return;

	if (g_Channel_Info[nIndex].nTxConn == 1)
	{
		g_Channel_Info[nIndex].nTxConn = 0;
		g_Channel_Info[nIndex].eTalkState = eTalkStopping;

		SCODE sRet = DataBroker_StopTxConnection(g_Channel_Info[nIndex].hConn);
		if (sRet != S_OK)
		{
			MessageBox("Unable to stop tx connection");
			return;
		}
		fclose(g_Channel_Info[nIndex].pFileMedia);
		g_Channel_Info[nIndex].pFileMedia = NULL;
	}
	else if (g_Channel_Info[nIndex].nTxConn == 0)
	{
		SCODE sRet = DataBroker_StartTxConnection(g_Channel_Info[nIndex].hConn);
		if (sRet != S_OK)
		{
			MessageBox("Unable to start tx connection");
			return;
		}
		g_Channel_Info[nIndex].nTxConn = 1;
		g_Channel_Info[nIndex].eTalkState = eTalkEstablishing;
	}

	CheckUI();
}

LRESULT CMP_APDlg::OnDeleteDataBrokerConn(WPARAM wParam, LPARAM lParam)
{
	int index = wParam;
	Connect_Channel(index);
	return 0;
}

void CMP_APDlg::TalkOneChannel(int nIndex)
{
	EnterCriticalSection(&m_CS);

	if (g_Channel_Info[nIndex].nTxConn == 0)
	{
		g_Channel_Info[nIndex].nTxConn = 2;
		g_Channel_Info[nIndex].eTalkState = eTalkEstablishing;
		m_nTalkChNum++;
		DataBroker_StartTxConnection(g_Channel_Info[nIndex].hConn);
	}
	else if (g_Channel_Info[nIndex].nTxConn == 2)
	{
		g_Channel_Info[nIndex].nTxConn = 0;
		g_Channel_Info[nIndex].eTalkState = eTalkStopping;
		m_nTalkChNum--;
		// stop talk
		DataBroker_StopTxConnection(g_Channel_Info[nIndex].hConn);
	}

	LeaveCriticalSection(&m_CS);
	CheckUI();
}




SCODE __stdcall CMP_APDlg::StaticAudioCapturePacketCB(DWORD dwContent, TMediaDataPacketInfo *ptMediaPacket, DWORD dwDataTimePeriod)
{
	CMP_APDlg *pCaller = (CMP_APDlg *) dwContent;
	EnterCriticalSection(&pCaller->m_CS);

	for (int nCnt = 0; nCnt < g_nMaxChannel; nCnt++)
	{
		if (g_Channel_Info[nCnt].hConn && g_Channel_Info[nCnt].nTxConn == 2 &&
			g_Channel_Info[nCnt].eTalkState == eTalkTalking)
		{
			DataBroker_InputTxPacket(g_Channel_Info[nCnt].hConn, ptMediaPacket, dwDataTimePeriod);
		}
	}

	LeaveCriticalSection(&pCaller->m_CS);
	return S_OK;
}

SCODE __stdcall CMP_APDlg::StaticAudioCaptureStatusCB(DWORD dwContent, DWORD dwStatus, DWORD dwParam1, DWORD dwParam2)
{
	// do nothing here
	return S_OK;
}

int CMP_APDlg::InitialAudioCapture()
{
	EnterCriticalSection(&m_CS);

	TPMACAPCHANNELOPTION tChOpt;
	memset(&tChOpt, 0, sizeof(tChOpt));

	tChOpt.dwAudioCodec = mctG729A;
	tChOpt.dwAudioChannelNum = 1;
	tChOpt.dwAudioFramesPerPacket = 5;
	tChOpt.dwAudioSampleFreq = 8000;
	tChOpt.dwAudioSizePerFrame = 160;
	tChOpt.dwBitsPerSample = 16;
	tChOpt.dwPacketContext = (DWORD) this;
	tChOpt.dwStatusContext = (DWORD) this;
	tChOpt.pfPacketCB = StaticAudioCapturePacketCB;
	tChOpt.pfStatusCB = StaticAudioCaptureStatusCB;

	SCODE scRet = PacketMaker_CreateAudioCaptureChannel(m_hPacketMaker, &m_hAudioCapCh, &tChOpt);

	LeaveCriticalSection(&m_CS);
	if (scRet != S_OK)
		return -1;

	return 0;
}

void CMP_APDlg::ReleaseAudioCapture()
{
	EnterCriticalSection(&m_CS);
	if (m_hAudioCapCh)
		PacketMaker_DeleteAudioCaptureChannel(&m_hAudioCapCh);

	if (m_hPacketMaker)
		PacketMaker_Release(&m_hPacketMaker);
	LeaveCriticalSection(&m_CS);
}

LRESULT CMP_APDlg::OnShowError(WPARAM wParam, LPARAM lParam)
{
	char *pszMsg, *pszTitle, *pszExtra;
	BOOL bFormat = FALSE;
	int nIndex = LOWORD(lParam);
	int nExtra = HIWORD(lParam);

	if (wParam == eOnAudioDisabled)
	{
		pszTitle = "Warning";

		if ((g_Channel_Info[nIndex].dwPrivilege & ePrivilegeTALK) == 0 ||
			g_Channel_Info[nIndex].iAudioMode == 4)
		{
			// none is enable, just close th

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -