多路訪問一定要考慮並發問題
若使用全域變數,此函數可能引起顯示混亂。PlayM4_GetPort以及相關函數的參數用一個數組取代全域變數
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser){int m = -1;for (int i=0; i<mainDlg->m_staticNum; i++){if (lRealHandle == mainDlg->m_RealPlayHandles[i])//尋找播放控制代碼索引{m = i;break;;}}if (-1 == m){return;}switch (dwDataType){case NET_DVR_SYSHEAD: //系統頭if (!PlayM4_GetPort(&mainDlg->m_lPorts[m])) //擷取播放庫未使用的通道號{break;}//m_iPort = lPort; //第一次回調的是系統頭,將擷取的播放庫port號賦值給全域port,下次回調資料時即使用此port號播放if (dwBufSize > 0){if (!PlayM4_SetStreamOpenMode(mainDlg->m_lPorts[m], STREAME_REALTIME)) //設定即時資料流播放模式{break;}if (!PlayM4_OpenStream(mainDlg->m_lPorts[m], pBuffer, dwBufSize, 1024*1024)) //開啟流介面{break;}HWND hWnd = mainDlg->m_staticList[m].m_hWnd;if (!PlayM4_Play(mainDlg->m_lPorts[m], hWnd)) //播放開始{break;}}case NET_DVR_STREAMDATA: //碼流資料if (dwBufSize > 0 && mainDlg->m_lPorts[m] != -1){if (!PlayM4_InputData(mainDlg->m_lPorts[m], pBuffer, dwBufSize)){break;} }}}