diff --git a/windows/APIExample/APIExample/APIExample.rc b/windows/APIExample/APIExample/APIExample.rc index 7621d33ff..b18a2de3d 100755 --- a/windows/APIExample/APIExample/APIExample.rc +++ b/windows/APIExample/APIExample/APIExample.rc @@ -84,34 +84,38 @@ IDD_DIALOG_LIVEBROADCASTING DIALOGEX 0, 0, 632, 407 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - LTEXT "",IDC_STATIC_VIDEO,1,0,483,309 - LISTBOX IDC_LIST_INFO_BROADCASTING,495,0,137,309,LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + LTEXT "",IDC_STATIC_VIDEO,0,0,483,283 + LISTBOX IDC_LIST_INFO_BROADCASTING,495,0,137,283,LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO_ROLE,52,323,60,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO_PERSONS,169,323,60,30,CBS_DROPDOWNLIST | WS_VSCROLL LTEXT "Client Role",IDC_STATIC_ROLE,7,324,41,10 LTEXT "Persons",IDC_STATIC_PERSONS,126,325,39,8 - LTEXT "Channel Name",IDC_STATIC_CHANNELNAME,339,325,48,8 - EDITTEXT IDC_EDIT_CHANNELNAME,393,323,129,12,ES_AUTOHSCROLL - PUSHBUTTON "JoinChannel",IDC_BUTTON_JOINCHANNEL,530,322,50,14 + LTEXT "Channel Name",IDC_STATIC_CHANNELNAME,16,298,48,8 + EDITTEXT IDC_EDIT_CHANNELNAME,75,296,129,12,ES_AUTOHSCROLL + PUSHBUTTON "JoinChannel",IDC_BUTTON_JOINCHANNEL,211,295,50,14 COMBOBOX IDC_COMBO_ENCODER,258,323,60,30,CBS_DROPDOWNLIST | WS_VSCROLL CONTROL "Report",IDC_CHECK_REPORT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,343,59,10 CONTROL "Moderation",IDC_CHECK_MODERATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,355,52,10 - PUSHBUTTON "Snapshot",IDC_BUTTON_SNAPSHOT,530,346,50,14 - GROUPBOX "Encoder",IDC_STATIC_ENCODE_GROUP,100,346,60,54 + PUSHBUTTON "Snapshot",IDC_BUTTON_SNAPSHOT,339,295,50,14 + GROUPBOX "Encoder",IDC_STATIC_ENCODE_GROUP,100,347,60,53 CONTROL "Auto",IDC_RADIO_ENCODE_AUTO,"Button",BS_AUTORADIOBUTTON | WS_GROUP,105,358,49,10 CONTROL "Hardward",IDC_RADIO_ENCODE_HARD,"Button",BS_AUTORADIOBUTTON,105,372,49,10 CONTROL "Softward",IDC_RADIO_ENCODE_SOFT,"Button",BS_AUTORADIOBUTTON,105,386,49,10 CONTROL "B Frame",IDC_CHECK_B_FRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,379,42,10 - EDITTEXT IDC_EDIT_DETAIL_INFO,339,346,183,53,ES_MULTILINE | ES_READONLY | NOT WS_BORDER | WS_VSCROLL + EDITTEXT IDC_EDIT_DETAIL_INFO,339,314,114,85,ES_MULTILINE | ES_READONLY | NOT WS_BORDER | WS_VSCROLL CONTROL "FirstFrameOptimization",IDC_CHECK_FIRST_FRAME_OPT, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,367,89,10 - PUSHBUTTON "PreLoad",IDC_BUTTON_PRELOAD,582,322,50,14 - GROUPBOX "Canvas",IDC_STATIC,169,346,150,43 + PUSHBUTTON "PreLoad",IDC_BUTTON_PRELOAD,273,295,50,14 + GROUPBOX "Canvas",IDC_STATIC,169,347,150,43 CONTROL "Hidden",IDC_RADIO_CANVAS_HIDDEN,"Button",BS_AUTORADIOBUTTON | WS_GROUP,177,359,38,10 CONTROL "Fit",IDC_RADIO_CANVAS_FIT,"Button",BS_AUTORADIOBUTTON,221,359,34,10 CONTROL "",IDC_SLIDER_CANVAS_COLOR,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,176,371,99,15 LTEXT "",IDC_STATIC_CANVAS_COLOR,275,373,39,10 CONTROL "VideoImage",IDC_CHECK_VIDEO_IMAGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,392,53,10 + LTEXT "Local Fps",IDC_STATIC_Local_fps,461,298,30,8 + CONTROL "",IDC_SLIDER_Local_fps,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,516,295,100,15 + LTEXT "Remote Fps",IDC_STATIC_Remote_fps,461,325,39,8 + CONTROL "",IDC_SLIDER_Remote_fps,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,515,322,100,15 END IDD_DIALOG_RTMPINJECT DIALOGEX 0, 0, 632, 400 @@ -248,8 +252,8 @@ BEGIN COMBOBOX IDC_COMBO_BEAUTE_LIGHTENING_CONTRAST_LEVEL,71,333,79,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "",IDC_STATIC_DETAIL,498,341,132,56 LTEXT "lightening",IDC_STATIC_BEAUTY_LIGHTENING,12,351,45,8 - LTEXT "redness",IDC_STATIC_BEAUTY_REDNESS,167,334,41,8 - LTEXT "smoothness",IDC_STATIC_BEAUTY_SMOOTHNESS,167,352,42,8 + LTEXT "redness",IDC_STATIC_BEAUTY_REDNESS,169,328,41,8 + LTEXT "smoothness",IDC_STATIC_BEAUTY_SMOOTHNESS,165,338,42,8 CONTROL "Beauty Enable",IDC_CHECK_BEAUTY_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,251,307,62,10 GROUPBOX "Beauty",IDC_STATIC_BEaUTY,5,297,352,67 GROUPBOX "Enhance",IDC_STATIC,5,368,412,24 @@ -260,32 +264,38 @@ BEGIN CONTROL "",IDC_SLIDER_SKIN_PROTECT,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,291,375,110,15 CONTROL "Video Denoise",IDC_CHECK_VIDEO_DENOISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,367,306,58,10 CONTROL "Virtual Background",IDC_CHECK_VIDEO_DENOISE2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,367,323,72,10 - CONTROL "",IDC_SLIDER_REDNESS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,219,330,121,15 + CONTROL "",IDC_SLIDER_REDNESS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,218,328,121,10 CONTROL "",IDC_SLIDER_LIGHTENING,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,55,348,100,15 - CONTROL "",IDC_SLIDER_SMOOTHNESS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,218,346,121,15 + CONTROL "",IDC_SLIDER_SMOOTHNESS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,218,338,121,9 CONTROL "Lowlight Enhance",IDC_CHECK_LOWLIGHT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,368,340,71,10 CONTROL "Blur",IDC_RADIO_VIRTUAL_BG_BLUR,"Button",BS_AUTORADIOBUTTON,453,323,28,10 CONTROL "Color",IDC_RADIO_VIRTUAL_BG_COLOR,"Button",BS_AUTORADIOBUTTON,491,323,33,10 CONTROL "Video",IDC_RADIO_VIRTUAL_BG_VIDEO,"Button",BS_AUTORADIOBUTTON,567,323,33,10 GROUPBOX "",IDC_STATIC_VIRTUAL_BG_CHOOSE,443,316,159,20 CONTROL "Image",IDC_RADIO_VIRTUAL_BG_IMAGE,"Button",BS_AUTORADIOBUTTON,527,323,36,10 + LTEXT "brightness",IDC_STATIC,169,349,34,8 + CONTROL "",IDC_SLIDER_BRIHTNESS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,218,351,118,10 + CONTROL "SHOW BEAUTY EXTENTION",IDC_CHECK_EXTENTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,452,356,103,10 END IDD_DIALOG_AUDIO_PROFILE DIALOGEX 0, 0, 632, 400 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - LTEXT "",IDC_STATIC_VIDEO,1,0,483,310,NOT WS_VISIBLE - LISTBOX IDC_LIST_INFO_BROADCASTING,491,0,139,312,LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - LTEXT "Channel Name",IDC_STATIC_CHANNELNAME,11,328,48,8 - EDITTEXT IDC_EDIT_CHANNELNAME,71,326,218,13,ES_AUTOHSCROLL - PUSHBUTTON "JoinChannel",IDC_BUTTON_JOINCHANNEL,307,326,60,14 + LTEXT "",IDC_STATIC_VIDEO,1,0,483,296,NOT WS_VISIBLE + LISTBOX IDC_LIST_INFO_BROADCASTING,1123,0,139,296,LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + LTEXT "Channel Name",IDC_STATIC_CHANNELNAME,8,310,48,8 + EDITTEXT IDC_EDIT_CHANNELNAME,84,308,218,13,ES_AUTOHSCROLL + PUSHBUTTON "JoinChannel",IDC_BUTTON_JOINCHANNEL,322,307,60,14 LTEXT "profile",IDC_STATIC_ADUIO_PROFILE,11,352,48,8 - PUSHBUTTON "Set AudioProfile",IDC_BUTTON_SET_AUDIO_PROFILE,307,361,60,14 - COMBOBOX IDC_COMBO_AUDIO_PROFILE,71,350,218,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Set AudioProfile",IDC_BUTTON_SET_AUDIO_PROFILE,322,361,60,14 + COMBOBOX IDC_COMBO_AUDIO_PROFILE,84,350,218,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "",IDC_STATIC_DETAIL,442,325,181,58 LTEXT "scenario",IDC_STATIC_ADUIO_SCENARIO,10,374,48,8 - COMBOBOX IDC_COMBO_AUDIO_SCENARIO,71,372,218,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_AUDIO_SCENARIO,84,372,218,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Dest Channel Name",IDC_STATIC_Dest_Channel_Name,8,329,64,8 + EDITTEXT IDC_EDIT_DEST_CHANNEL_NAME,84,327,218,14,ES_AUTOHSCROLL + CONTROL "Forward Audio Stream",IDC_CHECK_SECOND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,323,330,79,10 END IDD_DIALOG_AUDIO_MIX DIALOGEX 0, 0, 632, 400 @@ -766,6 +776,68 @@ BEGIN LISTBOX IDC_LIST_INFO_BROADCASTING,491,0,139,312,LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP END +IDD_DIALOG_RTE_PLAYER DIALOGEX 0, 0, 663, 407 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LTEXT "RTE URL",IDC_STATIC,53,372,28,8 + EDITTEXT IDC_EDIT_RTE_URL,103,369,268,14,ES_AUTOHSCROLL + PUSHBUTTON "START",IDC_BUTTON_START,392,369,50,14 + PUSHBUTTON "PLAY",IDC_BUTTON_PLAY,521,369,50,14 + PUSHBUTTON "PAUSE",IDC_BUTTON_PAUSE,588,369,50,14 + PUSHBUTTON "STOP",IDC_BUTTON_STOP,458,369,50,14 + LTEXT "",IDC_STATIC_VIDEO,5,7,430,347 + LISTBOX IDC_LIST_INFO_BROADCASTING,475,7,181,347,LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP +END + +IDD_DIALOG_BEAUTY_EX DIALOGEX 0, 0, 633, 400 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + CONTROL "BeautyShape",IDC_CHECK_BEAUTY_SHAPE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,262,2,59,10 + LTEXT "BrowStyle",IDC_STATIC,19,23,33,8 + COMBOBOX IDC_COMBO_BROW_STYLE,84,20,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "BrowStrength",IDC_STATIC,19,54,45,8 + CONTROL "",IDC_SLIDER__BROW_STRENGTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,84,51,100,15 + LTEXT "FaceShapeStyle",IDC_STATIC,262,54,52,8 + COMBOBOX IDC_COMBO_FACE_SHAPE_STYLE,346,52,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "ShapeStyleIntensity",IDC_STATIC,262,68,66,8 + CONTROL "",IDC_SLIDER__SHAPE_STYLE_INTENSITY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,346,69,100,15 + CONTROL "Makeup",IDC_CHECK_MAKE_UP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,2,41,10 + LTEXT "BrowColor",IDC_STATIC,19,38,34,8 + COMBOBOX IDC_COMBO_BROW_COLOR,84,38,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "LashStyle",IDC_STATIC,19,72,32,8 + COMBOBOX IDC_COMBO_LASH_STYLE,84,70,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "LashStrength",IDC_STATIC,19,102,44,8 + CONTROL "",IDC_SLIDER__LASH_STRENGTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,84,100,100,15 + LTEXT "LashColor",IDC_STATIC,19,88,32,8 + COMBOBOX IDC_COMBO_LASH_COLOR,84,86,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "ShadowStyle",IDC_STATIC,19,118,42,8 + COMBOBOX IDC_COMBO_SHADOW_STYLE,84,116,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "ShadowStrength",IDC_STATIC,19,147,54,8 + CONTROL "",IDC_SLIDER__SHADOW_STRENGTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,84,145,100,15 + LTEXT "PupilStyle",IDC_STATIC,19,166,32,8 + COMBOBOX IDC_COMBO_PUPIL_STYLE,84,165,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "PupilStrength",IDC_STATIC,19,195,44,8 + CONTROL "",IDC_SLIDER__Pupil_STRENGTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,84,194,100,15 + LTEXT "BlushStyle",IDC_STATIC,19,217,34,8 + COMBOBOX IDC_COMBO_BLUSH_STYLE,84,217,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "BlushStrength",IDC_STATIC,19,251,46,8 + CONTROL "",IDC_SLIDER__BLUSH_STRENGTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,84,249,100,15 + LTEXT "BlushColor",IDC_STATIC,19,236,34,8 + COMBOBOX IDC_COMBO_BLUSH_COLOR,84,234,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "LipStyle",IDC_STATIC,19,267,26,8 + COMBOBOX IDC_COMBO_LIP_STYLE,84,265,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "LipStrength",IDC_STATIC,19,298,38,8 + CONTROL "",IDC_SLIDER__LIP_STRENGTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,84,295,100,15 + LTEXT "LipColor",IDC_STATIC,19,282,26,8 + COMBOBOX IDC_COMBO_LIP_COLOR,84,280,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "FaceShapeArea",IDC_STATIC,262,23,52,8 + COMBOBOX IDC_COMBO_FACE_SHAPE_AREA,345,21,102,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "ShapeAreaIntensity",IDC_STATIC,262,38,65,8 + CONTROL "",IDC_SLIDER__SHAPE_AREA_INTENSITY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,346,35,100,15 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -784,11 +856,12 @@ BEGIN VERTGUIDE, 160 VERTGUIDE, 169 VERTGUIDE, 339 - VERTGUIDE, 522 + VERTGUIDE, 461 BOTTOMMARGIN, 400 - HORZGUIDE, 309 + HORZGUIDE, 283 + HORZGUIDE, 302 HORZGUIDE, 329 - HORZGUIDE, 346 + HORZGUIDE, 347 HORZGUIDE, 364 HORZGUIDE, 378 HORZGUIDE, 390 @@ -867,8 +940,12 @@ BEGIN IDD_DIALOG_AUDIO_PROFILE, DIALOG BEGIN - RIGHTMARGIN, 630 - BOTTOMMARGIN, 397 + VERTGUIDE, 8 + VERTGUIDE, 84 + VERTGUIDE, 322 + HORZGUIDE, 296 + HORZGUIDE, 314 + HORZGUIDE, 334 END IDD_DIALOG_AUDIO_MIX, DIALOG @@ -1076,6 +1153,46 @@ BEGIN RIGHTMARGIN, 630 BOTTOMMARGIN, 397 END + + IDD_DIALOG_RTE_PLAYER, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 656 + TOPMARGIN, 1 + BOTTOMMARGIN, 400 + HORZGUIDE, 7 + HORZGUIDE, 354 + HORZGUIDE, 376 + END + + IDD_DIALOG_BEAUTY_EX, DIALOG + BEGIN + RIGHTMARGIN, 631 + VERTGUIDE, 19 + VERTGUIDE, 84 + VERTGUIDE, 262 + VERTGUIDE, 346 + BOTTOMMARGIN, 397 + HORZGUIDE, 6 + HORZGUIDE, 27 + HORZGUIDE, 42 + HORZGUIDE, 58 + HORZGUIDE, 76 + HORZGUIDE, 92 + HORZGUIDE, 107 + HORZGUIDE, 122 + HORZGUIDE, 152 + HORZGUIDE, 171 + HORZGUIDE, 201 + HORZGUIDE, 223 + HORZGUIDE, 240 + HORZGUIDE, 256 + HORZGUIDE, 271 + HORZGUIDE, 286 + HORZGUIDE, 302 + HORZGUIDE, 321 + HORZGUIDE, 382 + END END #endif // APSTUDIO_INVOKED @@ -1220,6 +1337,16 @@ BEGIN 0 END +IDD_DIALOG_RTE_PLAYER AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_DIALOG_BEAUTY_EX AFX_DIALOG_LAYOUT +BEGIN + 0 +END + ///////////////////////////////////////////////////////////////////////////// // diff --git a/windows/APIExample/APIExample/APIExample.vcxproj b/windows/APIExample/APIExample/APIExample.vcxproj index ca7174446..5d3926e92 100644 --- a/windows/APIExample/APIExample/APIExample.vcxproj +++ b/windows/APIExample/APIExample/APIExample.vcxproj @@ -214,7 +214,8 @@ if exist en.ini (copy en.ini $(SolutionDir)$(Configuration)) copy $(SolutionDir)APIExample\Advanced\LocalVideoTranscoding\agora.png $(SolutionDir)$(Configuration) copy $(SolutionDir)APIExample\Advanced\LocalVideoTranscoding\agora.jpg $(SolutionDir)$(Configuration) -if exist sample.yuv (copy sample.yuv $(SolutionDir)$(Configuration)) +if exist sample.yuv (copy sample.yuv $(SolutionDir)$(Configuration)) +if exist $(SolutionDir)APIExample\res\yuvj_full_range_alpha_1280_540_left.mp4 (copy $(SolutionDir)APIExample\res\yuvj_full_range_alpha_1280_540_left.mp4 $(SolutionDir)$(Configuration)) @@ -262,7 +263,7 @@ if exist en.ini (copy en.ini $(SolutionDir)$(Platform)\$(Configuration)) copy $(SolutionDir)APIExample\Advanced\LocalVideoTranscoding\agora.jpg $(SolutionDir)$(Platform)\$(Configuration) if exist sample.yuv (copy sample.yuv $(SolutionDir)$(Platform)\$(Configuration)) - +if exist $(SolutionDir)APIExample\res\yuvj_full_range_alpha_1280_540_left.mp4 (copy $(SolutionDir)APIExample\res\yuvj_full_range_alpha_1280_540_left.mp4 $(SolutionDir)$(Configuration)) PerMonitorHighDPIAware @@ -276,6 +277,8 @@ if exist sample.yuv (copy sample.yuv $(SolutionDir)$(Platform)\$(Configuration)) + + @@ -294,6 +297,7 @@ if exist sample.yuv (copy sample.yuv $(SolutionDir)$(Platform)\$(Configuration)) + @@ -330,6 +334,8 @@ if exist sample.yuv (copy sample.yuv $(SolutionDir)$(Platform)\$(Configuration)) + + @@ -348,6 +354,7 @@ if exist sample.yuv (copy sample.yuv $(SolutionDir)$(Platform)\$(Configuration)) + diff --git a/windows/APIExample/APIExample/APIExample.vcxproj.filters b/windows/APIExample/APIExample/APIExample.vcxproj.filters index a16906e88..6bd3ba077 100644 --- a/windows/APIExample/APIExample/APIExample.vcxproj.filters +++ b/windows/APIExample/APIExample/APIExample.vcxproj.filters @@ -109,6 +109,9 @@ {f40fbcc5-c4fb-4581-a7b2-05cbcc5f737c} + + {2cf4beba-8f24-4801-932d-2ab0dd5da40e} + {ed782797-3b06-44a9-8894-6b9d93d0dfea} @@ -263,6 +266,9 @@ Basic\JoinChannelVideoByToken + + + Advanced\CrossChannel Advanced\Metadata @@ -273,6 +279,12 @@ Header Files + + Header Files + + + Advanced\Beauty + @@ -410,6 +422,9 @@ Basic\JoinChannelVideoByToken + + Advanced\CrossChannel + Advanced\Metadata @@ -419,6 +434,12 @@ Source Files + + Source Files + + + Advanced\Beauty + diff --git a/windows/APIExample/APIExample/APIExampleDlg.cpp b/windows/APIExample/APIExample/APIExampleDlg.cpp index 959268f1f..bf0030260 100755 --- a/windows/APIExample/APIExample/APIExampleDlg.cpp +++ b/windows/APIExample/APIExample/APIExampleDlg.cpp @@ -18,15 +18,15 @@ class CAboutDlg : public CDialogEx public: CAboutDlg(); -// Dialog Data + // Dialog Data #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif - protected: +protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support -// Implementation + // Implementation protected: DECLARE_MESSAGE_MAP() }; @@ -56,41 +56,41 @@ CAPIExampleDlg::CAPIExampleDlg(CWnd* pParent /*=nullptr*/) CAPIExampleDlg::~CAPIExampleDlg() { - + } void CAPIExampleDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); - DDX_Control(pDX, IDC_STATIC_MAIN, m_staMainArea); - DDX_Control(pDX, IDC_LIST_BASIC, m_lstBasicScene); - DDX_Control(pDX, IDC_LIST_ADVANCED, m_lstAdvanced); - DDX_Control(pDX, IDC_STATIC_LIST_INFO, m_stalstInfo); - DDX_Control(pDX, IDC_STATIC_ADVANCE, m_staAdvancedScene); - DDX_Control(pDX, IDC_STATIC_GROUP_LIST, m_grpBasicScene); - DDX_Control(pDX, IDC_BUTTON_DEMO, m_btnDemoWebSite); - DDX_Control(pDX, IDC_BUTTON_REGISTER, m_btnRegister); - DDX_Control(pDX, IDC_BUTTON_FAQ, m_btnFAQ); - DDX_Control(pDX, IDC_BUTTON_DOCUMENT_WEBSITE, m_btnDocWebsite); - DDX_Control(pDX, IDC_STATIC_GROUP_DOC, m_grpDoc); + CDialogEx::DoDataExchange(pDX); + DDX_Control(pDX, IDC_STATIC_MAIN, m_staMainArea); + DDX_Control(pDX, IDC_LIST_BASIC, m_lstBasicScene); + DDX_Control(pDX, IDC_LIST_ADVANCED, m_lstAdvanced); + DDX_Control(pDX, IDC_STATIC_LIST_INFO, m_stalstInfo); + DDX_Control(pDX, IDC_STATIC_ADVANCE, m_staAdvancedScene); + DDX_Control(pDX, IDC_STATIC_GROUP_LIST, m_grpBasicScene); + DDX_Control(pDX, IDC_BUTTON_DEMO, m_btnDemoWebSite); + DDX_Control(pDX, IDC_BUTTON_REGISTER, m_btnRegister); + DDX_Control(pDX, IDC_BUTTON_FAQ, m_btnFAQ); + DDX_Control(pDX, IDC_BUTTON_DOCUMENT_WEBSITE, m_btnDocWebsite); + DDX_Control(pDX, IDC_STATIC_GROUP_DOC, m_grpDoc); } BEGIN_MESSAGE_MAP(CAPIExampleDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() - ON_BN_CLICKED(IDC_BUTTON_FAQ, &CAPIExampleDlg::OnBnClickedButtonFaq) - ON_BN_CLICKED(IDC_BUTTON_REGISTER, &CAPIExampleDlg::OnBnClickedButtonRegister) - ON_BN_CLICKED(IDC_BUTTON_DEMO, &CAPIExampleDlg::OnBnClickedButtonDemo) - - ON_NOTIFY(NM_CLICK, IDC_LIST_BASIC, &CAPIExampleDlg::OnClickListBasic) - ON_NOTIFY(NM_CLICK, IDC_LIST_ADVANCED, &CAPIExampleDlg::OnClickListAdvanced) - ON_NOTIFY(TVN_SELCHANGED, IDC_LIST_ADVANCED, &CAPIExampleDlg::OnSelchangedListAdvanced) - ON_NOTIFY(TVN_SELCHANGED, IDC_LIST_BASIC, &CAPIExampleDlg::OnSelchangedListBasic) - ON_NOTIFY(TVN_SELCHANGING, IDC_LIST_BASIC, &CAPIExampleDlg::OnSelchangingListBasic) - //ON_MESSAGE(WM_MSGID(EID_JOINCHANNEL_SUCCESS), &CAPIExampleDlg::OnEIDJoinLeaveChannel) - ON_NOTIFY(TVN_SELCHANGING, IDC_LIST_ADVANCED, &CAPIExampleDlg::OnSelchangingListAdvanced) - ON_BN_CLICKED(IDC_BUTTON_DOCUMENT_WEBSITE, &CAPIExampleDlg::OnBnClickedButtonDocumentWebsite) + ON_BN_CLICKED(IDC_BUTTON_FAQ, &CAPIExampleDlg::OnBnClickedButtonFaq) + ON_BN_CLICKED(IDC_BUTTON_REGISTER, &CAPIExampleDlg::OnBnClickedButtonRegister) + ON_BN_CLICKED(IDC_BUTTON_DEMO, &CAPIExampleDlg::OnBnClickedButtonDemo) + + ON_NOTIFY(NM_CLICK, IDC_LIST_BASIC, &CAPIExampleDlg::OnClickListBasic) + ON_NOTIFY(NM_CLICK, IDC_LIST_ADVANCED, &CAPIExampleDlg::OnClickListAdvanced) + ON_NOTIFY(TVN_SELCHANGED, IDC_LIST_ADVANCED, &CAPIExampleDlg::OnSelchangedListAdvanced) + ON_NOTIFY(TVN_SELCHANGED, IDC_LIST_BASIC, &CAPIExampleDlg::OnSelchangedListBasic) + ON_NOTIFY(TVN_SELCHANGING, IDC_LIST_BASIC, &CAPIExampleDlg::OnSelchangingListBasic) + //ON_MESSAGE(WM_MSGID(EID_JOINCHANNEL_SUCCESS), &CAPIExampleDlg::OnEIDJoinLeaveChannel) + ON_NOTIFY(TVN_SELCHANGING, IDC_LIST_ADVANCED, &CAPIExampleDlg::OnSelchangingListAdvanced) + ON_BN_CLICKED(IDC_BUTTON_DOCUMENT_WEBSITE, &CAPIExampleDlg::OnBnClickedButtonDocumentWebsite) ON_WM_CLOSE() END_MESSAGE_MAP() @@ -133,10 +133,10 @@ BOOL CAPIExampleDlg::OnInitDialog() AfxMessageBox(_T("APP ID is not set, you can see readme file on how to get an APP ID.")); ExitProcess(1); } - InitCtrlText(); - InitSceneDialog(); - InitSceneList(); - + InitCtrlText(); + InitSceneDialog(); + InitSceneList(); + return TRUE; // return TRUE unless you set the focus to a control } @@ -191,298 +191,309 @@ HCURSOR CAPIExampleDlg::OnQueryDragIcon() void CAPIExampleDlg::InitCtrlText() { - m_staAdvancedScene.SetWindowText(commonAdvanceScene); - m_grpDoc.SetWindowText(commonGroupDoc); - m_grpBasicScene.SetWindowText(commonBasicScene); - m_btnFAQ.SetWindowText(commonFAQWebsite); - m_btnRegister.SetWindowText(commonRegisterWebsite); - m_btnDemoWebSite.SetWindowText(commonDemoWebsite); - m_btnDocWebsite.SetWindowText(commonDocumentWebsite); + m_staAdvancedScene.SetWindowText(commonAdvanceScene); + m_grpDoc.SetWindowText(commonGroupDoc); + m_grpBasicScene.SetWindowText(commonBasicScene); + m_btnFAQ.SetWindowText(commonFAQWebsite); + m_btnRegister.SetWindowText(commonRegisterWebsite); + m_btnDemoWebSite.SetWindowText(commonDemoWebsite); + m_btnDocWebsite.SetWindowText(commonDocumentWebsite); } void CAPIExampleDlg::InitSceneDialog() { - //basic list - m_vecBasic.push_back(basicLiveBroadcasting); - m_vecBasic.push_back(basicJoinChannelVideoByToken); - - m_pLiveBroadcasting = new CLiveBroadcastingDlg(&m_staMainArea); - RECT rcArea, rcWnd; - m_staMainArea.GetWindowRect(&rcArea); - - m_pLiveBroadcasting->Create(CLiveBroadcastingDlg::IDD); - m_pLiveBroadcasting->GetWindowRect(&rcWnd); - int w = rcWnd.right - rcWnd.left; - int h = rcWnd.bottom - rcWnd.top; - rcWnd = { rcArea.left, rcArea.top - MAIN_AREA_TOP, rcArea.left + w, rcArea.top + h}; - m_pLiveBroadcasting->MoveWindow(&rcWnd); - - - //join channel video by token - m_pJoinChannelVideoByTokenDlg = new CJoinChannelVideoByTokenDlg(&m_staMainArea); - m_pJoinChannelVideoByTokenDlg->Create(CJoinChannelVideoByTokenDlg::IDD); - m_pJoinChannelVideoByTokenDlg->MoveWindow(&rcWnd); - - //advanced list - // m_vecAdvanced.push_back(advancedRtmpInject); - m_vecAdvanced.push_back(advancedRtmpStreaming); - m_vecAdvanced.push_back(advancedMetadata); - m_vecAdvanced.push_back(advancedMediaPlayer); - m_vecAdvanced.push_back(advancedMediaRecorder); - m_vecAdvanced.push_back(advancedScreenCap); - m_vecAdvanced.push_back(advancedAudioProfile); - m_vecAdvanced.push_back(advancedAudioMixing); - // m_vecAdvanced.push_back(advancedAudioEffect); - m_vecAdvanced.push_back(advancedCustomVideoCapture); - m_vecAdvanced.push_back(advancedOriginalVideo); - m_vecAdvanced.push_back(advancedCustomAudioCapture); - m_vecAdvanced.push_back(advancedOriginalAudio); - m_vecAdvanced.push_back(advancedFaceCapture); - m_vecAdvanced.push_back(advancedCustomEncrypt); - m_vecAdvanced.push_back(advancedMultiChannel); - m_vecAdvanced.push_back(advancedMultiVideoSource); - m_vecAdvanced.push_back(advancedMultiVideoSourceTracks); - m_vecAdvanced.push_back(advancedPerCallTest); - m_vecAdvanced.push_back(advancedAudioVolume); - //m_vecAdvanced.push_back(advancedReportInCall); - m_vecAdvanced.push_back(advancedRegionConn); - m_vecAdvanced.push_back(advancedMediaEncrypt); - m_vecAdvanced.push_back(AdvancedLocalVideoTranscoding); - m_vecAdvanced.push_back(beautyFace); - m_vecAdvanced.push_back(advancedBeautyAudio); - m_vecAdvanced.push_back(SpatialAudio); - m_pMultiChannelDlg = new CAgoraMultiChannelDlg(&m_staMainArea); - m_pMultiChannelDlg->Create(CAgoraMultiChannelDlg::IDD); - m_pMultiChannelDlg->MoveWindow(&rcWnd); - - //transparent bg - m_vecAdvanced.push_back(TransparentBackground); - - //inject - m_pRtmpInjectDlg = new CAgoraRtmpInjectionDlg(&m_staMainArea); - m_pRtmpInjectDlg->Create(CAgoraRtmpInjectionDlg::IDD); - m_pRtmpInjectDlg->MoveWindow(&rcWnd); - //rtmp - m_pRtmpStreamingDlg = new CAgoraRtmpStreamingDlg(&m_staMainArea); - m_pRtmpStreamingDlg->Create(CAgoraRtmpStreamingDlg::IDD); - m_pRtmpStreamingDlg->MoveWindow(&rcWnd); - - //video sei - m_pVideoSEIDlg = new CAgoraMetaDataDlg(&m_staMainArea); - m_pVideoSEIDlg->Create(CAgoraMetaDataDlg::IDD); - m_pVideoSEIDlg->MoveWindow(&rcWnd); - - //screen share - m_pScreenCap = new CAgoraScreenCapture(&m_staMainArea); - m_pScreenCap->Create(CAgoraScreenCapture::IDD); - m_pScreenCap->MoveWindow(&rcWnd); - - - //audio profile - m_pAudioProfileDlg = new CAgoraAudioProfile(&m_staMainArea); - m_pAudioProfileDlg->Create(CAgoraAudioProfile::IDD); - m_pAudioProfileDlg->MoveWindow(&rcWnd); - - //audio mixing - m_pAudioMixingDlg = new CAgoraAudioMixingDlg(&m_staMainArea); - m_pAudioMixingDlg->Create(CAgoraAudioMixingDlg::IDD); - m_pAudioMixingDlg->MoveWindow(&rcWnd); - - //custom video capture -// m_pCaputreVideoDlg = new CAgoraCaptureVideoDlg(&m_staMainArea); -// m_pCaputreVideoDlg->Create(CAgoraCaptureVideoDlg::IDD); -// m_pCaputreVideoDlg->MoveWindow(&rcWnd); - - //original video process - m_pOriginalVideoDlg = new CAgoraOriginalVideoDlg(&m_staMainArea); - m_pOriginalVideoDlg->Create(CAgoraOriginalVideoDlg::IDD); - m_pOriginalVideoDlg->MoveWindow(&rcWnd); - - //custom audio capture - m_pCaptureAudioDlg = new CAgoraCaptureAduioDlg(&m_staMainArea); - m_pCaptureAudioDlg->Create(CAgoraCaptureAduioDlg::IDD); - m_pCaptureAudioDlg->MoveWindow(&rcWnd); - - //original video process - m_pOriginalAudioDlg = new CAgoraOriginalAudioDlg(&m_staMainArea); - m_pOriginalAudioDlg->Create(CAgoraOriginalAudioDlg::IDD); - m_pOriginalAudioDlg->MoveWindow(&rcWnd); - - m_pAgoraFaceCaptureDlg = new CAgoraFaceCaptureDlg(&m_staMainArea); - m_pAgoraFaceCaptureDlg->Create(CAgoraFaceCaptureDlg::IDD); - m_pAgoraFaceCaptureDlg->MoveWindow(&rcWnd); - - //custom encrypt - m_pCustomEncryptDlg = new CAgoraCustomEncryptDlg(&m_staMainArea); - m_pCustomEncryptDlg->Create(CAgoraCustomEncryptDlg::IDD); - m_pCustomEncryptDlg->MoveWindow(&rcWnd); - - - //multi video source - m_pMultiVideoSourceDlg = new CAgoraMutilVideoSourceDlg(&m_staMainArea); - m_pMultiVideoSourceDlg->Create(CAgoraMutilVideoSourceDlg::IDD); - m_pMultiVideoSourceDlg->MoveWindow(&rcWnd); - - //media player - m_pmediaPlayerDlg = new CAgoraMediaPlayer(&m_staMainArea); - m_pmediaPlayerDlg->Create(CAgoraMediaPlayer::IDD); - m_pmediaPlayerDlg->MoveWindow(&rcWnd); - - //media recorder - m_pmediaRecorderDlg = new CAgoraMediaRecorder(&m_staMainArea); - m_pmediaRecorderDlg->Create(CAgoraMediaRecorder::IDD); - m_pmediaRecorderDlg->MoveWindow(&rcWnd); - - //per call test - m_pPerCallTestDlg = new CAgoraPreCallTestDlg(&m_staMainArea); - m_pPerCallTestDlg->Create(CAgoraPreCallTestDlg::IDD); - m_pPerCallTestDlg->MoveWindow(&rcWnd); - - m_pAudioVolumeDlg = new CAgoraAudioVolumeDlg(&m_staMainArea); - m_pAudioVolumeDlg->Create(CAgoraAudioVolumeDlg::IDD); - m_pAudioVolumeDlg->MoveWindow(&rcWnd); - - - m_pReportInCallDlg = new CAgoraReportInCallDlg(&m_staMainArea); - m_pReportInCallDlg->Create(CAgoraReportInCallDlg::IDD); - m_pReportInCallDlg->MoveWindow(&rcWnd); - - m_pRegionConnDlg = new CAgoraRegionConnDlg(&m_staMainArea); - m_pRegionConnDlg->Create(CAgoraRegionConnDlg::IDD); - m_pRegionConnDlg->MoveWindow(&rcWnd); - - m_pMediaEncrptDlg = new CAgoraMediaEncryptDlg(&m_staMainArea); - m_pMediaEncrptDlg->Create(CAgoraMediaEncryptDlg::IDD); - m_pMediaEncrptDlg->MoveWindow(&rcWnd); - - m_pEffectDlg = new CAgoraEffectDlg(&m_staMainArea); - m_pEffectDlg->Create(CAgoraEffectDlg::IDD); - m_pEffectDlg->MoveWindow(&rcWnd); - - - m_pDlgBeautyAudio = new CAgoraBeautyAudio(&m_staMainArea); - m_pDlgBeautyAudio->Create(CAgoraBeautyAudio::IDD); - m_pDlgBeautyAudio->MoveWindow(&rcWnd); - - m_pLocalVideoTranscodingDlg = new CLocalVideoTranscodingDlg(&m_staMainArea); - m_pLocalVideoTranscodingDlg->Create(CLocalVideoTranscodingDlg::IDD); - m_pLocalVideoTranscodingDlg->MoveWindow(&rcWnd); - - m_pDlgBeauty = new CDlgBeauty(&m_staMainArea); - m_pDlgBeauty->Create(CDlgBeauty::IDD); - m_pDlgBeauty->MoveWindow(&rcWnd); - - - // spatial audio - m_pSpatialAudioDlg = new CAgoraSpatialAudioDlg(&m_staMainArea); - m_pSpatialAudioDlg->Create(CAgoraSpatialAudioDlg::IDD); - m_pSpatialAudioDlg->MoveWindow(&rcWnd); - - m_pPushExternalVideoYUV = new PushExternalVideoYUV(&m_staMainArea); - m_pPushExternalVideoYUV->Create(PushExternalVideoYUV::IDD); - m_pPushExternalVideoYUV->MoveWindow(&rcWnd); + //basic list + m_vecBasic.push_back(basicLiveBroadcasting); + m_vecBasic.push_back(basicJoinChannelVideoByToken); + + m_pLiveBroadcasting = new CLiveBroadcastingDlg(&m_staMainArea); + RECT rcArea, rcWnd; + m_staMainArea.GetWindowRect(&rcArea); + + m_pLiveBroadcasting->Create(CLiveBroadcastingDlg::IDD); + m_pLiveBroadcasting->GetWindowRect(&rcWnd); + int w = rcWnd.right - rcWnd.left; + int h = rcWnd.bottom - rcWnd.top; + rcWnd = { rcArea.left, rcArea.top - MAIN_AREA_TOP, rcArea.left + w, rcArea.top + h }; + m_pLiveBroadcasting->MoveWindow(&rcWnd); + + + //join channel video by token + m_pJoinChannelVideoByTokenDlg = new CJoinChannelVideoByTokenDlg(&m_staMainArea); + m_pJoinChannelVideoByTokenDlg->Create(CJoinChannelVideoByTokenDlg::IDD); + m_pJoinChannelVideoByTokenDlg->MoveWindow(&rcWnd); + + //advanced list + // m_vecAdvanced.push_back(advancedRtmpInject); + m_vecAdvanced.push_back(advancedRtmpStreaming); + m_vecAdvanced.push_back(advancedCrossChannel); + m_vecAdvanced.push_back(advancedMetadata); + m_vecAdvanced.push_back(advancedMediaPlayer); + m_vecAdvanced.push_back(advancedMediaRecorder); + m_vecAdvanced.push_back(advancedScreenCap); + m_vecAdvanced.push_back(advancedAudioProfile); + m_vecAdvanced.push_back(advancedAudioMixing); + // m_vecAdvanced.push_back(advancedAudioEffect); + m_vecAdvanced.push_back(advancedCustomVideoCapture); + m_vecAdvanced.push_back(advancedOriginalVideo); + m_vecAdvanced.push_back(advancedCustomAudioCapture); + m_vecAdvanced.push_back(advancedOriginalAudio); + m_vecAdvanced.push_back(advancedFaceCapture); + m_vecAdvanced.push_back(advancedCustomEncrypt); + m_vecAdvanced.push_back(advancedMultiChannel); + m_vecAdvanced.push_back(advancedMultiVideoSource); + m_vecAdvanced.push_back(advancedMultiVideoSourceTracks); + m_vecAdvanced.push_back(advancedPerCallTest); + m_vecAdvanced.push_back(advancedAudioVolume); + //m_vecAdvanced.push_back(advancedReportInCall); + m_vecAdvanced.push_back(advancedRegionConn); + m_vecAdvanced.push_back(advancedMediaEncrypt); + m_vecAdvanced.push_back(AdvancedLocalVideoTranscoding); + m_vecAdvanced.push_back(beautyFace); + m_vecAdvanced.push_back(advancedBeautyAudio); + m_vecAdvanced.push_back(SpatialAudio); + m_pMultiChannelDlg = new CAgoraMultiChannelDlg(&m_staMainArea); + m_pMultiChannelDlg->Create(CAgoraMultiChannelDlg::IDD); + m_pMultiChannelDlg->MoveWindow(&rcWnd); + + //transparent bg + m_vecAdvanced.push_back(TransparentBackground); + m_vecAdvanced.push_back(RteUrlPlayer); + + //inject + m_pRtmpInjectDlg = new CAgoraRtmpInjectionDlg(&m_staMainArea); + m_pRtmpInjectDlg->Create(CAgoraRtmpInjectionDlg::IDD); + m_pRtmpInjectDlg->MoveWindow(&rcWnd); + //rtmp + m_pRtmpStreamingDlg = new CAgoraRtmpStreamingDlg(&m_staMainArea); + m_pRtmpStreamingDlg->Create(CAgoraRtmpStreamingDlg::IDD); + m_pRtmpStreamingDlg->MoveWindow(&rcWnd); + + //video sei + m_pVideoSEIDlg = new CAgoraMetaDataDlg(&m_staMainArea); + m_pVideoSEIDlg->Create(CAgoraMetaDataDlg::IDD); + m_pVideoSEIDlg->MoveWindow(&rcWnd); + + //screen share + m_pScreenCap = new CAgoraScreenCapture(&m_staMainArea); + m_pScreenCap->Create(CAgoraScreenCapture::IDD); + m_pScreenCap->MoveWindow(&rcWnd); + + + //audio profile + m_pAudioProfileDlg = new CAgoraAudioProfile(&m_staMainArea); + m_pAudioProfileDlg->Create(CAgoraAudioProfile::IDD); + m_pAudioProfileDlg->MoveWindow(&rcWnd); + + //audio mixing + m_pAudioMixingDlg = new CAgoraAudioMixingDlg(&m_staMainArea); + m_pAudioMixingDlg->Create(CAgoraAudioMixingDlg::IDD); + m_pAudioMixingDlg->MoveWindow(&rcWnd); + + //custom video capture + // m_pCaputreVideoDlg = new CAgoraCaptureVideoDlg(&m_staMainArea); + // m_pCaputreVideoDlg->Create(CAgoraCaptureVideoDlg::IDD); + // m_pCaputreVideoDlg->MoveWindow(&rcWnd); + + //original video process + m_pOriginalVideoDlg = new CAgoraOriginalVideoDlg(&m_staMainArea); + m_pOriginalVideoDlg->Create(CAgoraOriginalVideoDlg::IDD); + m_pOriginalVideoDlg->MoveWindow(&rcWnd); + + //custom audio capture + m_pCaptureAudioDlg = new CAgoraCaptureAduioDlg(&m_staMainArea); + m_pCaptureAudioDlg->Create(CAgoraCaptureAduioDlg::IDD); + m_pCaptureAudioDlg->MoveWindow(&rcWnd); + + //original video process + m_pOriginalAudioDlg = new CAgoraOriginalAudioDlg(&m_staMainArea); + m_pOriginalAudioDlg->Create(CAgoraOriginalAudioDlg::IDD); + m_pOriginalAudioDlg->MoveWindow(&rcWnd); + + m_pAgoraFaceCaptureDlg = new CAgoraFaceCaptureDlg(&m_staMainArea); + m_pAgoraFaceCaptureDlg->Create(CAgoraFaceCaptureDlg::IDD); + m_pAgoraFaceCaptureDlg->MoveWindow(&rcWnd); + + //custom encrypt + m_pCustomEncryptDlg = new CAgoraCustomEncryptDlg(&m_staMainArea); + m_pCustomEncryptDlg->Create(CAgoraCustomEncryptDlg::IDD); + m_pCustomEncryptDlg->MoveWindow(&rcWnd); + + + //multi video source + m_pMultiVideoSourceDlg = new CAgoraMutilVideoSourceDlg(&m_staMainArea); + m_pMultiVideoSourceDlg->Create(CAgoraMutilVideoSourceDlg::IDD); + m_pMultiVideoSourceDlg->MoveWindow(&rcWnd); + + //media player + m_pmediaPlayerDlg = new CAgoraMediaPlayer(&m_staMainArea); + m_pmediaPlayerDlg->Create(CAgoraMediaPlayer::IDD); + m_pmediaPlayerDlg->MoveWindow(&rcWnd); + + //media recorder + m_pmediaRecorderDlg = new CAgoraMediaRecorder(&m_staMainArea); + m_pmediaRecorderDlg->Create(CAgoraMediaRecorder::IDD); + m_pmediaRecorderDlg->MoveWindow(&rcWnd); + + //per call test + m_pPerCallTestDlg = new CAgoraPreCallTestDlg(&m_staMainArea); + m_pPerCallTestDlg->Create(CAgoraPreCallTestDlg::IDD); + m_pPerCallTestDlg->MoveWindow(&rcWnd); + + m_pAudioVolumeDlg = new CAgoraAudioVolumeDlg(&m_staMainArea); + m_pAudioVolumeDlg->Create(CAgoraAudioVolumeDlg::IDD); + m_pAudioVolumeDlg->MoveWindow(&rcWnd); + + + m_pReportInCallDlg = new CAgoraReportInCallDlg(&m_staMainArea); + m_pReportInCallDlg->Create(CAgoraReportInCallDlg::IDD); + m_pReportInCallDlg->MoveWindow(&rcWnd); + + m_pRegionConnDlg = new CAgoraRegionConnDlg(&m_staMainArea); + m_pRegionConnDlg->Create(CAgoraRegionConnDlg::IDD); + m_pRegionConnDlg->MoveWindow(&rcWnd); + + m_pMediaEncrptDlg = new CAgoraMediaEncryptDlg(&m_staMainArea); + m_pMediaEncrptDlg->Create(CAgoraMediaEncryptDlg::IDD); + m_pMediaEncrptDlg->MoveWindow(&rcWnd); + + m_pEffectDlg = new CAgoraEffectDlg(&m_staMainArea); + m_pEffectDlg->Create(CAgoraEffectDlg::IDD); + m_pEffectDlg->MoveWindow(&rcWnd); + + + m_pDlgBeautyAudio = new CAgoraBeautyAudio(&m_staMainArea); + m_pDlgBeautyAudio->Create(CAgoraBeautyAudio::IDD); + m_pDlgBeautyAudio->MoveWindow(&rcWnd); + + m_pLocalVideoTranscodingDlg = new CLocalVideoTranscodingDlg(&m_staMainArea); + m_pLocalVideoTranscodingDlg->Create(CLocalVideoTranscodingDlg::IDD); + m_pLocalVideoTranscodingDlg->MoveWindow(&rcWnd); + + m_pDlgBeauty = new CDlgBeauty(&m_staMainArea); + m_pDlgBeauty->Create(CDlgBeauty::IDD); + m_pDlgBeauty->MoveWindow(&rcWnd); + + + // spatial audio + m_pSpatialAudioDlg = new CAgoraSpatialAudioDlg(&m_staMainArea); + m_pSpatialAudioDlg->Create(CAgoraSpatialAudioDlg::IDD); + m_pSpatialAudioDlg->MoveWindow(&rcWnd); + + m_pPushExternalVideoYUV = new PushExternalVideoYUV(&m_staMainArea); + m_pPushExternalVideoYUV->Create(PushExternalVideoYUV::IDD); + m_pPushExternalVideoYUV->MoveWindow(&rcWnd); + + m_pMultiVideoSourceTracks = new MultiVideoSourceTracks(&m_staMainArea); + m_pMultiVideoSourceTracks->Create(MultiVideoSourceTracks::IDD); + m_pMultiVideoSourceTracks->MoveWindow(&rcWnd); - m_pMultiVideoSourceTracks = new MultiVideoSourceTracks(&m_staMainArea); - m_pMultiVideoSourceTracks->Create(MultiVideoSourceTracks::IDD); - m_pMultiVideoSourceTracks->MoveWindow(&rcWnd); + m_pAgoraCrossChannelDlg = new CAgoraCrossChannelDlg(&m_staMainArea); + m_pAgoraCrossChannelDlg->Create(CAgoraCrossChannelDlg::IDD); + m_pAgoraCrossChannelDlg->MoveWindow(&rcWnd); - // transparent bg - m_TransparentDlg = new CTransparentBgDlg(&m_staMainArea); - m_TransparentDlg->Create(CTransparentBgDlg::IDD); - m_TransparentDlg->MoveWindow(&rcWnd); + // transparent bg + m_TransparentDlg = new CTransparentBgDlg(&m_staMainArea); + m_TransparentDlg->Create(CTransparentBgDlg::IDD); + m_TransparentDlg->MoveWindow(&rcWnd); + // rte player + m_RtePlayer = new CRtePlayerDlg(&m_staMainArea); + m_RtePlayer->Create(CRtePlayerDlg::IDD); + m_RtePlayer->MoveWindow(&rcWnd); + } void CAPIExampleDlg::InitSceneList() { - for (size_t i = 0; i < m_vecBasic.size(); i++){ - TVINSERTSTRUCT tvInsert; - tvInsert.hParent = NULL; - tvInsert.hInsertAfter = NULL; - tvInsert.item.mask = TVIF_TEXT; - tvInsert.item.pszText = m_vecBasic[i].GetBuffer(0); - m_lstBasicScene.InsertItem(&tvInsert); - } - - for (size_t i = 0; i < m_vecAdvanced.size(); i++) { - TVINSERTSTRUCT tvInsert; - tvInsert.hParent = NULL; - tvInsert.hInsertAfter = NULL; - tvInsert.item.mask = TVIF_TEXT; - tvInsert.item.pszText = m_vecAdvanced[i].GetBuffer(0); - m_lstAdvanced.InsertItem(&tvInsert); - } + for (size_t i = 0; i < m_vecBasic.size(); i++) { + TVINSERTSTRUCT tvInsert; + tvInsert.hParent = NULL; + tvInsert.hInsertAfter = NULL; + tvInsert.item.mask = TVIF_TEXT; + tvInsert.item.pszText = m_vecBasic[i].GetBuffer(0); + m_lstBasicScene.InsertItem(&tvInsert); + } + + for (size_t i = 0; i < m_vecAdvanced.size(); i++) { + TVINSERTSTRUCT tvInsert; + tvInsert.hParent = NULL; + tvInsert.hInsertAfter = NULL; + tvInsert.item.mask = TVIF_TEXT; + tvInsert.item.pszText = m_vecAdvanced[i].GetBuffer(0); + m_lstAdvanced.InsertItem(&tvInsert); + } } void CAPIExampleDlg::OnBnClickedButtonFaq() { - ShellExecute(NULL, L"open", L"https://docs.agora.io/cn/Video/faq", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(NULL, L"open", L"https://docs.agora.io/cn/Video/faq", NULL, NULL, SW_SHOWNORMAL); } void CAPIExampleDlg::OnBnClickedButtonRegister() { - ShellExecute(NULL, L"open", L"https://sso.agora.io/en/v2/signup", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(NULL, L"open", L"https://sso.agora.io/en/v2/signup", NULL, NULL, SW_SHOWNORMAL); } void CAPIExampleDlg::OnBnClickedButtonDemo() { - ShellExecute(NULL, L"open", L"https://github.com/AgoraIO/API-Examples", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(NULL, L"open", L"https://github.com/AgoraIO/API-Examples", NULL, NULL, SW_SHOWNORMAL); } -void CAPIExampleDlg::OnSelchangedListBasic(NMHDR *pNMHDR, LRESULT *pResult) +void CAPIExampleDlg::OnSelchangedListBasic(NMHDR* pNMHDR, LRESULT* pResult) { - LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); - // TODO: Add your control notification handler code here - *pResult = 0; + LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); + // TODO: Add your control notification handler code here + *pResult = 0; - HTREEITEM hItem = m_lstBasicScene.GetSelectedItem(); - m_preSelectedItemText = m_lstBasicScene.GetItemText(hItem); - CreateScene(m_lstBasicScene, m_preSelectedItemText); + HTREEITEM hItem = m_lstBasicScene.GetSelectedItem(); + m_preSelectedItemText = m_lstBasicScene.GetItemText(hItem); + CreateScene(m_lstBasicScene, m_preSelectedItemText); } -void CAPIExampleDlg::OnSelchangedListAdvanced(NMHDR *pNMHDR, LRESULT *pResult) +void CAPIExampleDlg::OnSelchangedListAdvanced(NMHDR* pNMHDR, LRESULT* pResult) { - LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); - *pResult = 0; - HTREEITEM hItem = m_lstAdvanced.GetSelectedItem(); - m_preSelectedItemText = m_lstAdvanced.GetItemText(hItem); - CreateScene(m_lstBasicScene, m_preSelectedItemText); + LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); + *pResult = 0; + HTREEITEM hItem = m_lstAdvanced.GetSelectedItem(); + m_preSelectedItemText = m_lstAdvanced.GetItemText(hItem); + CreateScene(m_lstBasicScene, m_preSelectedItemText); } -HTREEITEM CAPIExampleDlg::GetHitItem(NMHDR *pNMHDR) +HTREEITEM CAPIExampleDlg::GetHitItem(NMHDR* pNMHDR) { - DWORD dwPos = GetMessagePos(); - POINT pt; - pt.x = LOWORD(dwPos); - pt.y = HIWORD(dwPos); - ::ScreenToClient(pNMHDR->hwndFrom, &pt); - TVHITTESTINFO ht = { 0 }; - - ht.flags = TVHT_ONITEM; - HTREEITEM hitItem = TreeView_HitTest(pNMHDR->hwndFrom, &ht); - - return hitItem ; + DWORD dwPos = GetMessagePos(); + POINT pt; + pt.x = LOWORD(dwPos); + pt.y = HIWORD(dwPos); + ::ScreenToClient(pNMHDR->hwndFrom, &pt); + TVHITTESTINFO ht = { 0 }; + + ht.flags = TVHT_ONITEM; + HTREEITEM hitItem = TreeView_HitTest(pNMHDR->hwndFrom, &ht); + + return hitItem; } -void CAPIExampleDlg::OnClickListBasic(NMHDR *pNMHDR, LRESULT *pResult) +void CAPIExampleDlg::OnClickListBasic(NMHDR* pNMHDR, LRESULT* pResult) { - *pResult = 0; + *pResult = 0; } -void CAPIExampleDlg::OnClickListAdvanced(NMHDR *pNMHDR, LRESULT *pResult) -{ - *pResult = 0; +void CAPIExampleDlg::OnClickListAdvanced(NMHDR* pNMHDR, LRESULT* pResult) +{ + *pResult = 0; } -void CAPIExampleDlg::OnSelchangingListBasic(NMHDR *pNMHDR, LRESULT *pResult) +void CAPIExampleDlg::OnSelchangingListBasic(NMHDR* pNMHDR, LRESULT* pResult) { - LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); - HTREEITEM hOldItem = pNMTreeView->itemOld.hItem; - HTREEITEM hAdvancedItem = m_lstAdvanced.GetSelectedItem(); + LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); + HTREEITEM hOldItem = pNMTreeView->itemOld.hItem; + HTREEITEM hAdvancedItem = m_lstAdvanced.GetSelectedItem(); HTREEITEM hNewItem = pNMTreeView->itemNew.hItem; if (m_preSelectedItemText.Compare(m_lstBasicScene.GetItemText(hOldItem)) == 0) { @@ -496,11 +507,11 @@ void CAPIExampleDlg::OnSelchangingListBasic(NMHDR *pNMHDR, LRESULT *pResult) *pResult = 0; } -void CAPIExampleDlg::OnSelchangingListAdvanced(NMHDR *pNMHDR, LRESULT *pResult) +void CAPIExampleDlg::OnSelchangingListAdvanced(NMHDR* pNMHDR, LRESULT* pResult) { - LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); - HTREEITEM hBasicItem = m_lstBasicScene.GetSelectedItem(); - HTREEITEM hOldItem = pNMTreeView->itemOld.hItem; + LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); + HTREEITEM hBasicItem = m_lstBasicScene.GetSelectedItem(); + HTREEITEM hOldItem = pNMTreeView->itemOld.hItem; HTREEITEM hNewItem = pNMTreeView->itemNew.hItem; if (m_preSelectedItemText.Compare(m_lstBasicScene.GetItemText(hBasicItem)) == 0) { @@ -509,74 +520,98 @@ void CAPIExampleDlg::OnSelchangingListAdvanced(NMHDR *pNMHDR, LRESULT *pResult) else if (m_preSelectedItemText.Compare(m_lstAdvanced.GetItemText(hOldItem)) == 0) { ReleaseScene(m_lstAdvanced, hOldItem); } - - *pResult = 0; + + *pResult = 0; } // void CAPIExampleDlg::CreateScene(CTreeCtrl& treeScene, CString selectedText) { std::lock_guard_lock(m_mutex); - if (selectedText.Compare(basicLiveBroadcasting) == 0) { - m_pLiveBroadcasting->InitAgora(); - m_pLiveBroadcasting->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(basicJoinChannelVideoByToken) == 0) { + if (selectedText.Compare(basicLiveBroadcasting) == 0) { + m_pLiveBroadcasting->InitAgora(); + m_pLiveBroadcasting->ShowWindow(SW_SHOW); + } + else if (selectedText.Compare(basicJoinChannelVideoByToken) == 0) { m_pJoinChannelVideoByTokenDlg->InitAgora(); m_pJoinChannelVideoByTokenDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedRtmpInject) == 0) { - m_pRtmpInjectDlg->InitAgora(); - m_pRtmpInjectDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedRtmpStreaming) == 0) { - m_pRtmpStreamingDlg->InitAgora(); - m_pRtmpStreamingDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedMetadata) == 0) { - m_pVideoSEIDlg->InitAgora(); - m_pVideoSEIDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedScreenCap) == 0) { - m_pScreenCap->InitAgora(); - m_pScreenCap->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedCustomVideoCapture)==0) { - m_pPushExternalVideoYUV->InitAgora(); + } + else if (selectedText.Compare(advancedRtmpInject) == 0) { + m_pRtmpInjectDlg->InitAgora(); + m_pRtmpInjectDlg->ShowWindow(SW_SHOW); + } + else if (selectedText.Compare(advancedRtmpStreaming) == 0) { + m_pRtmpStreamingDlg->InitAgora(); + m_pRtmpStreamingDlg->ShowWindow(SW_SHOW); + } + else if (selectedText.Compare(advancedCrossChannel) == 0) { + m_pAgoraCrossChannelDlg->InitAgora(); + m_pAgoraCrossChannelDlg->ShowWindow(SW_SHOW); + } + else if (selectedText.Compare(advancedMetadata) == 0) { + m_pVideoSEIDlg->InitAgora(); + m_pVideoSEIDlg->ShowWindow(SW_SHOW); + } + else if (selectedText.Compare(advancedScreenCap) == 0) { + m_pScreenCap->InitAgora(); + m_pScreenCap->ShowWindow(SW_SHOW); + } + else if (selectedText.Compare(advancedCustomVideoCapture) == 0) { + m_pPushExternalVideoYUV->InitAgora(); m_pPushExternalVideoYUV->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedCustomAudioCapture)==0) { - m_pCaptureAudioDlg->InitAgora(); + } + else if (selectedText.Compare(advancedCustomAudioCapture) == 0) { + m_pCaptureAudioDlg->InitAgora(); m_pCaptureAudioDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedAudioProfile) == 0) { + } + else if (selectedText.Compare(advancedAudioProfile) == 0) { m_pAudioProfileDlg->InitAgora(); m_pAudioProfileDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedAudioMixing) == 0) { + } + else if (selectedText.Compare(advancedAudioMixing) == 0) { m_pAudioMixingDlg->InitAgora(); m_pAudioMixingDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedOriginalVideo) == 0) { + } + else if (selectedText.Compare(advancedOriginalVideo) == 0) { m_pOriginalVideoDlg->InitAgora(); m_pOriginalVideoDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedOriginalAudio) == 0) { + } + else if (selectedText.Compare(advancedOriginalAudio) == 0) { m_pOriginalAudioDlg->InitAgora(); m_pOriginalAudioDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedFaceCapture) == 0) { + } + else if (selectedText.Compare(advancedFaceCapture) == 0) { m_pAgoraFaceCaptureDlg->InitAgora(); m_pAgoraFaceCaptureDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedCustomEncrypt) == 0) { + } + else if (selectedText.Compare(advancedCustomEncrypt) == 0) { m_pCustomEncryptDlg->InitAgora(); m_pCustomEncryptDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedMultiChannel) == 0) { + } + else if (selectedText.Compare(advancedMultiChannel) == 0) { m_pMultiChannelDlg->InitAgora(); m_pMultiChannelDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedPerCallTest) == 0) { + } + else if (selectedText.Compare(advancedPerCallTest) == 0) { m_pPerCallTestDlg->InitAgora(); m_pPerCallTestDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedAudioVolume) == 0) { + } + else if (selectedText.Compare(advancedAudioVolume) == 0) { m_pAudioVolumeDlg->InitAgora(); m_pAudioVolumeDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedReportInCall) == 0) { + } + else if (selectedText.Compare(advancedReportInCall) == 0) { m_pReportInCallDlg->InitAgora(); m_pReportInCallDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedRegionConn) == 0) { + } + else if (selectedText.Compare(advancedRegionConn) == 0) { m_pRegionConnDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedMediaEncrypt) == 0) { + } + else if (selectedText.Compare(advancedMediaEncrypt) == 0) { m_pMediaEncrptDlg->InitAgora(); m_pMediaEncrptDlg->ShowWindow(SW_SHOW); - }else if (selectedText.Compare(advancedAudioEffect) == 0) { + } + else if (selectedText.Compare(advancedAudioEffect) == 0) { m_pEffectDlg->InitAgora(); m_pEffectDlg->ShowWindow(SW_SHOW); } @@ -596,7 +631,7 @@ void CAPIExampleDlg::CreateScene(CTreeCtrl& treeScene, CString selectedText) m_pDlgBeautyAudio->InitAgora(); m_pDlgBeautyAudio->ShowWindow(SW_SHOW); } - + else if (selectedText.Compare(AdvancedLocalVideoTranscoding) == 0) { m_pLocalVideoTranscodingDlg->InitAgora(); m_pLocalVideoTranscodingDlg->ShowWindow(SW_SHOW); @@ -617,6 +652,10 @@ void CAPIExampleDlg::CreateScene(CTreeCtrl& treeScene, CString selectedText) m_TransparentDlg->InitAgora(); m_TransparentDlg->ShowWindow(SW_SHOW); } + else if (selectedText.Compare(RteUrlPlayer) == 0) { + m_RtePlayer->InitAgora(); + m_RtePlayer->ShowWindow(SW_SHOW); + } //Sleep(500); } @@ -624,69 +663,93 @@ void CAPIExampleDlg::CreateScene(CTreeCtrl& treeScene, CString selectedText) void CAPIExampleDlg::ReleaseScene(CTreeCtrl& treeScene, HTREEITEM& hSelectItem) { std::lock_guard_lock(m_mutex); - CString str = treeScene.GetItemText(hSelectItem); - if (str.Compare(basicLiveBroadcasting) == 0 - && m_pLiveBroadcasting->IsWindowVisible()) {//pre sel release first - m_pLiveBroadcasting->UnInitAgora(); - m_pLiveBroadcasting->ShowWindow(SW_HIDE); - }else if (str.Compare(basicJoinChannelVideoByToken) == 0) { + CString str = treeScene.GetItemText(hSelectItem); + if (str.Compare(basicLiveBroadcasting) == 0 + && m_pLiveBroadcasting->IsWindowVisible()) {//pre sel release first + m_pLiveBroadcasting->UnInitAgora(); + m_pLiveBroadcasting->ShowWindow(SW_HIDE); + } + else if (str.Compare(basicJoinChannelVideoByToken) == 0) { m_pJoinChannelVideoByTokenDlg->UnInitAgora(); m_pJoinChannelVideoByTokenDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedRtmpInject) == 0) { - m_pRtmpInjectDlg->UnInitAgora(); - m_pRtmpInjectDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedRtmpStreaming) == 0) { - m_pRtmpStreamingDlg->UnInitAgora(); - m_pRtmpStreamingDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedMetadata) == 0) { - m_pVideoSEIDlg->UnInitAgora(); - m_pVideoSEIDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedScreenCap) == 0){ - m_pScreenCap->UnInitAgora(); - m_pScreenCap->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedCustomVideoCapture) == 0) { - m_pPushExternalVideoYUV->UnInitAgora(); + } + else if (str.Compare(advancedRtmpInject) == 0) { + m_pRtmpInjectDlg->UnInitAgora(); + m_pRtmpInjectDlg->ShowWindow(SW_HIDE); + } + else if (str.Compare(advancedRtmpStreaming) == 0) { + m_pRtmpStreamingDlg->UnInitAgora(); + m_pRtmpStreamingDlg->ShowWindow(SW_HIDE); + } + else if (str.Compare(advancedCrossChannel) == 0) { + m_pAgoraCrossChannelDlg->UnInitAgora(); + m_pAgoraCrossChannelDlg->ShowWindow(SW_HIDE); + } + else if (str.Compare(advancedMetadata) == 0) { + m_pVideoSEIDlg->UnInitAgora(); + m_pVideoSEIDlg->ShowWindow(SW_HIDE); + } + else if (str.Compare(advancedScreenCap) == 0) { + m_pScreenCap->UnInitAgora(); + m_pScreenCap->ShowWindow(SW_HIDE); + } + else if (str.Compare(advancedCustomVideoCapture) == 0) { + m_pPushExternalVideoYUV->UnInitAgora(); m_pPushExternalVideoYUV->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedCustomAudioCapture) == 0) { - m_pCaptureAudioDlg->UnInitAgora(); + } + else if (str.Compare(advancedCustomAudioCapture) == 0) { + m_pCaptureAudioDlg->UnInitAgora(); m_pCaptureAudioDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedAudioProfile) == 0) { + } + else if (str.Compare(advancedAudioProfile) == 0) { m_pAudioProfileDlg->UnInitAgora(); m_pAudioProfileDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedAudioMixing) == 0) { + } + else if (str.Compare(advancedAudioMixing) == 0) { m_pAudioMixingDlg->UnInitAgora(); m_pAudioMixingDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedOriginalVideo) == 0) { + } + else if (str.Compare(advancedOriginalVideo) == 0) { m_pOriginalVideoDlg->UnInitAgora(); m_pOriginalVideoDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedOriginalAudio) == 0) { + } + else if (str.Compare(advancedOriginalAudio) == 0) { m_pOriginalAudioDlg->UnInitAgora(); m_pOriginalAudioDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedFaceCapture) == 0) { + } + else if (str.Compare(advancedFaceCapture) == 0) { m_pAgoraFaceCaptureDlg->UnInitAgora(); m_pAgoraFaceCaptureDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedCustomEncrypt) == 0) { + } + else if (str.Compare(advancedCustomEncrypt) == 0) { m_pCustomEncryptDlg->UnInitAgora(); m_pCustomEncryptDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedMultiChannel) == 0) { + } + else if (str.Compare(advancedMultiChannel) == 0) { m_pMultiChannelDlg->UnInitAgora(); m_pMultiChannelDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedPerCallTest) == 0) { + } + else if (str.Compare(advancedPerCallTest) == 0) { m_pPerCallTestDlg->UnInitAgora(); m_pPerCallTestDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedAudioVolume) == 0) { + } + else if (str.Compare(advancedAudioVolume) == 0) { m_pAudioVolumeDlg->UnInitAgora(); m_pAudioVolumeDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedReportInCall) == 0) { + } + else if (str.Compare(advancedReportInCall) == 0) { m_pReportInCallDlg->UnInitAgora(); m_pReportInCallDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedRegionConn) == 0) { + } + else if (str.Compare(advancedRegionConn) == 0) { m_pRegionConnDlg->UnInitAgora(); m_pRegionConnDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedMediaEncrypt) == 0) { + } + else if (str.Compare(advancedMediaEncrypt) == 0) { m_pMediaEncrptDlg->UnInitAgora(); m_pMediaEncrptDlg->ShowWindow(SW_HIDE); - }else if (str.Compare(advancedAudioEffect) == 0) { + } + else if (str.Compare(advancedAudioEffect) == 0) { m_pEffectDlg->UnInitAgora(); m_pEffectDlg->ShowWindow(SW_HIDE); } @@ -726,26 +789,30 @@ void CAPIExampleDlg::ReleaseScene(CTreeCtrl& treeScene, HTREEITEM& hSelectItem) m_TransparentDlg->UnInitAgora(); m_TransparentDlg->ShowWindow(SW_HIDE); } + else if (str.Compare(RteUrlPlayer) == 0) { + m_RtePlayer->UnInitAgora(); + m_RtePlayer->ShowWindow(SW_HIDE); + } //Sleep(500); } LRESULT CAPIExampleDlg::OnEIDJoinLeaveChannel(WPARAM wParam, LPARAM lParam) { - m_bJoinChannel = (BOOL)wParam; - m_lstAdvanced.EnableWindow(!m_bJoinChannel); - m_lstBasicScene.EnableWindow(!m_bJoinChannel); - if (m_bJoinChannel) { + m_bJoinChannel = (BOOL)wParam; + m_lstAdvanced.EnableWindow(!m_bJoinChannel); + m_lstBasicScene.EnableWindow(!m_bJoinChannel); + if (m_bJoinChannel) { m_stalstInfo.SetWindowText(L"you can leave channel first."); - } - else - m_stalstInfo.SetWindowText(_T("")); - return 0; + } + else + m_stalstInfo.SetWindowText(_T("")); + return 0; } void CAPIExampleDlg::OnBnClickedButtonDocumentWebsite() { - ShellExecute(NULL, L"open", L"https://docs.agora.io/cn", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(NULL, L"open", L"https://docs.agora.io/cn", NULL, NULL, SW_SHOWNORMAL); } diff --git a/windows/APIExample/APIExample/APIExampleDlg.h b/windows/APIExample/APIExample/APIExampleDlg.h index 295ed85c9..af7a753ed 100755 --- a/windows/APIExample/APIExample/APIExampleDlg.h +++ b/windows/APIExample/APIExample/APIExampleDlg.h @@ -34,6 +34,8 @@ #include "Advanced/MultiVideoSourceTracks/MultiVideoSourceTracks.h" #include "Advanced/FaceCapture/CAgoraFaceCaptureDlg.h" #include "Advanced/TransparentBg/TransparentBgDialog.h" +#include "Advanced/RtePlayer/RtePlayerDlg.h" +#include "Advanced/CrossChannel/CAgoraCrossChannelDlg.h" #include #include #include @@ -70,13 +72,13 @@ class CAPIExampleDlg : public CDialogEx afx_msg void OnBnClickedButtonRegister(); afx_msg void OnBnClickedButtonDemo(); afx_msg LRESULT OnEIDJoinLeaveChannel(WPARAM wParam, LPARAM lParam); - + private: void InitSceneDialog(); void InitSceneList(); void InitCtrlText(); HTREEITEM GetHitItem(NMHDR *pNMHDR); - + void ReleaseScene(CTreeCtrl& treeScene, HTREEITEM& hSelectItem); void CreateScene(CTreeCtrl& treeScene, CString selectedText); CLiveBroadcastingDlg *m_pLiveBroadcasting = nullptr; @@ -108,8 +110,10 @@ class CAPIExampleDlg : public CDialogEx PushExternalVideoYUV *m_pPushExternalVideoYUV = nullptr; MultiVideoSourceTracks *m_pMultiVideoSourceTracks = nullptr; CAgoraFaceCaptureDlg *m_pAgoraFaceCaptureDlg = nullptr; + CAgoraCrossChannelDlg *m_pAgoraCrossChannelDlg = nullptr; CDlgBeauty * m_pDlgBeauty = nullptr; CTransparentBgDlg* m_TransparentDlg = nullptr; + CRtePlayerDlg* m_RtePlayer = nullptr; CString m_preSelectedItemText = _T(""); std::vector m_vecBasic, m_vecAdvanced; std::mutex m_mutex; diff --git a/windows/APIExample/APIExample/Advanced/AudioProfile/CAgoraAudioProfile.cpp b/windows/APIExample/APIExample/Advanced/AudioProfile/CAgoraAudioProfile.cpp index 956ec9ac3..4f84f69f3 100644 --- a/windows/APIExample/APIExample/Advanced/AudioProfile/CAgoraAudioProfile.cpp +++ b/windows/APIExample/APIExample/Advanced/AudioProfile/CAgoraAudioProfile.cpp @@ -9,14 +9,33 @@ IMPLEMENT_DYNAMIC(CAgoraAudioProfile, CDialogEx) CAgoraAudioProfile::CAgoraAudioProfile(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_AUDIO_PROFILE, pParent) { - + sourceStreams =(MixedAudioStream*) malloc(sizeof(MixedAudioStream)*2); + mainchannelName = new char[128]; + mSubChannelName = new char[128]; + m_exChannelRtcConn.channelId = mSubChannelName; } CAgoraAudioProfile::~CAgoraAudioProfile() { + if (sourceStreams) + { + AfxMessageBox(_T("free sourceStreams")); + free(sourceStreams); + sourceStreams = nullptr; + } + if (mainchannelName) + { + delete[] mainchannelName; + mainchannelName = nullptr; + } + if (mSubChannelName) + { + delete[] mSubChannelName; + mSubChannelName = nullptr; + } } -void CAgoraAudioProfile::DoDataExchange(CDataExchange* pDX) +void CAgoraAudioProfile::DoDataExchange(CDataExchange *pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATIC_VIDEO, m_staVideoArea); @@ -30,9 +49,11 @@ void CAgoraAudioProfile::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_BUTTON_SET_AUDIO_PROFILE, m_btnSetAudioProfile); DDX_Control(pDX, IDC_LIST_INFO_BROADCASTING, m_lstInfo); DDX_Control(pDX, IDC_STATIC_DETAIL, m_staDetail); + DDX_Control(pDX, IDC_EDIT_DEST_CHANNEL_NAME, mDestChannelEc); + DDX_Control(pDX, IDC_CHECK_SECOND, mJoinSecondCheckbox); } -//init ctrl text. +// init ctrl text. void CAgoraAudioProfile::InitCtrlText() { m_staChannel.SetWindowText(commonCtrlChannel); @@ -42,27 +63,29 @@ void CAgoraAudioProfile::InitCtrlText() m_btnSetAudioProfile.SetWindowText(audioProfileCtrlSetAudioProfile); } -//Initialize the Agora SDK +// Initialize the Agora SDK bool CAgoraAudioProfile::InitAgora() { - //create Agora RTC engine - m_rtcEngine = createAgoraRtcEngine(); - if (!m_rtcEngine) { + // create Agora RTC engine + m_rtcEngine = static_cast(createAgoraRtcEngine()); + if (!m_rtcEngine) + { m_lstInfo.InsertString(m_lstInfo.GetCount() - 1, _T("createAgoraRtcEngine failed")); return false; } - //set message notify receiver window + // set message notify receiver window m_eventHandler.SetMsgReceiver(m_hWnd); RtcEngineContext context; std::string strAppID = GET_APP_ID; context.appId = strAppID.c_str(); context.eventHandler = &m_eventHandler; - //set channel profile in the engine to the CHANNEL_PROFILE_LIVE_BROADCASTING. + // set channel profile in the engine to the CHANNEL_PROFILE_LIVE_BROADCASTING. context.channelProfile = CHANNEL_PROFILE_LIVE_BROADCASTING; - //initialize the Agora RTC engine context. + // initialize the Agora RTC engine context. int ret = m_rtcEngine->initialize(context); - if (ret != 0) { + if (ret != 0) + { m_initialize = false; CString strInfo; strInfo.Format(_T("initialize failed: %d"), ret); @@ -72,31 +95,33 @@ bool CAgoraAudioProfile::InitAgora() else m_initialize = true; m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("initialize success")); - //enable video in the engine. + // enable video in the engine. m_rtcEngine->enableVideo(); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("enable video")); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("live broadcasting")); - //set client role in the engine to the CLIENT_ROLE_BROADCASTER. - //m_rtcEngine->setClientRole(CLIENT_ROLE_BROADCASTER); + // set client role in the engine to the CLIENT_ROLE_BROADCASTER. + // m_rtcEngine->setClientRole(CLIENT_ROLE_BROADCASTER); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("setClientRole broadcaster")); return true; } void CAgoraAudioProfile::UnInitAgora() { - if (m_rtcEngine) { + if (m_rtcEngine) + { if (m_joinChannel) - //leave channel + // leave channel m_joinChannel = !m_rtcEngine->leaveChannel(); - //stop preview in the engine. + // stop preview in the engine. m_rtcEngine->stopPreview(); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("stopPreview")); - //disable video in the engine. + // disable video in the engine. m_rtcEngine->disableVideo(); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("disableVideo")); - //release engine. - if (m_initialize) { + // release engine. + if (m_initialize) + { m_rtcEngine->release(true); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("release rtc engine")); } @@ -104,25 +129,25 @@ void CAgoraAudioProfile::UnInitAgora() } } - -//render local video from SDK local capture. +// render local video from SDK local capture. void CAgoraAudioProfile::RenderLocalVideo() { - if (m_rtcEngine) { - //start preview in the engine. + if (m_rtcEngine) + { + // start preview in the engine. m_rtcEngine->startPreview(); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("startPreview")); VideoCanvas canvas; canvas.renderMode = media::base::RENDER_MODE_FIT; canvas.uid = 0; canvas.view = m_localVideoWnd.GetSafeHwnd(); - //setup local video in the engine to canvas. + // setup local video in the engine to canvas. m_rtcEngine->setupLocalVideo(canvas); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("setupLocalVideo")); } } -//resume status. +// resume status. void CAgoraAudioProfile::ResumeStatus() { InitCtrlText(); @@ -137,35 +162,33 @@ void CAgoraAudioProfile::ResumeStatus() m_setAudio = false; } - BEGIN_MESSAGE_MAP(CAgoraAudioProfile, CDialogEx) - ON_WM_SHOWWINDOW() - ON_BN_CLICKED(IDC_BUTTON_JOINCHANNEL, &CAgoraAudioProfile::OnBnClickedButtonJoinchannel) - ON_BN_CLICKED(IDC_BUTTON_SET_AUDIO_PROFILE, &CAgoraAudioProfile::OnBnClickedButtonSetAudioProfile) - ON_MESSAGE(WM_MSGID(EID_JOINCHANNEL_SUCCESS), &CAgoraAudioProfile::OnEIDJoinChannelSuccess) - ON_MESSAGE(WM_MSGID(EID_LEAVE_CHANNEL), &CAgoraAudioProfile::OnEIDLeaveChannel) - ON_MESSAGE(WM_MSGID(EID_USER_JOINED), &CAgoraAudioProfile::OnEIDUserJoined) - ON_MESSAGE(WM_MSGID(EID_USER_OFFLINE), &CAgoraAudioProfile::OnEIDUserOffline) - ON_MESSAGE(WM_MSGID(EID_REMOTE_VIDEO_STATE_CHANGED), &CAgoraAudioProfile::OnEIDRemoteVideoStateChanged) - ON_LBN_SELCHANGE(IDC_LIST_INFO_BROADCASTING, &CAgoraAudioProfile::OnSelchangeListInfoBroadcasting) +ON_WM_SHOWWINDOW() +ON_BN_CLICKED(IDC_BUTTON_JOINCHANNEL, &CAgoraAudioProfile::OnBnClickedButtonJoinchannel) +ON_BN_CLICKED(IDC_BUTTON_SET_AUDIO_PROFILE, &CAgoraAudioProfile::OnBnClickedButtonSetAudioProfile) +ON_MESSAGE(WM_MSGID(EID_JOINCHANNEL_SUCCESS), &CAgoraAudioProfile::OnEIDJoinChannelSuccess) +ON_MESSAGE(WM_MSGID(EID_LEAVE_CHANNEL), &CAgoraAudioProfile::OnEIDLeaveChannel) +ON_MESSAGE(WM_MSGID(EID_USER_JOINED), &CAgoraAudioProfile::OnEIDUserJoined) +ON_MESSAGE(WM_MSGID(EID_USER_OFFLINE), &CAgoraAudioProfile::OnEIDUserOffline) +ON_MESSAGE(WM_MSGID(EID_REMOTE_VIDEO_STATE_CHANGED), &CAgoraAudioProfile::OnEIDRemoteVideoStateChanged) +ON_LBN_SELCHANGE(IDC_LIST_INFO_BROADCASTING, &CAgoraAudioProfile::OnSelchangeListInfoBroadcasting) +ON_BN_CLICKED(IDC_CHECK_SECOND, &CAgoraAudioProfile::OnBnClickedCheckSecond) END_MESSAGE_MAP() - - void CAgoraAudioProfile::OnShowWindow(BOOL bShow, UINT nStatus) { CDialogEx::OnShowWindow(bShow, nStatus); - if (bShow)//bShwo is true ,show window + if (bShow) // bShwo is true ,show window { InitCtrlText(); RenderLocalVideo(); } - else { + else + { ResumeStatus(); } } - BOOL CAgoraAudioProfile::OnInitDialog() { CDialogEx::OnInitDialog(); @@ -181,7 +204,7 @@ BOOL CAgoraAudioProfile::OnInitDialog() m_cmbAudioProfile.InsertString(nIndex++, _T("AUDIO_PROFILE_MUSIC_STANDARD")); m_cmbAudioProfile.InsertString(nIndex++, _T("AUDIO_PROFILE_MUSIC_STANDARD_STEREO")); m_cmbAudioProfile.InsertString(nIndex++, _T("AUDIO_PROFILE_MUSIC_HIGH_QUALITY")); - + m_cmbAudioProfile.InsertString(nIndex++, _T("AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO")); nIndex = 0; @@ -194,7 +217,7 @@ BOOL CAgoraAudioProfile::OnInitDialog() m_cmbAudioScenario.InsertString(nIndex++, _T("AUDIO_SCENARIO_CHATROOM_GAMING")); ResumeStatus(); - return TRUE; + return TRUE; } @@ -203,27 +226,34 @@ void CAgoraAudioProfile::OnBnClickedButtonJoinchannel() if (!m_rtcEngine || !m_initialize) return; CString strInfo; - if (!m_joinChannel) { + if (!m_joinChannel) + { CString strChannelName; m_edtChannel.GetWindowText(strChannelName); - if (strChannelName.IsEmpty()) { + if (strChannelName.IsEmpty()) + { AfxMessageBox(_T("Fill channel name first")); return; } - std::string szChannelId = cs2utf8(strChannelName); - + std::string mainChannelId = cs2utf8(strChannelName); ChannelMediaOptions options; options.channelProfile = CHANNEL_PROFILE_LIVE_BROADCASTING; options.clientRoleType = CLIENT_ROLE_BROADCASTER; - //join channel in the engine. - if (0 == m_rtcEngine->joinChannel(APP_TOKEN, szChannelId.c_str(), 0, options)) { + // join channel in the engine. + if (0 == m_rtcEngine->joinChannel(APP_TOKEN, mainChannelId.c_str(), 0, options)) + { + strcpy(mainchannelName, mainChannelId.c_str()); strInfo.Format(_T("join channel %s, use ChannelMediaOptions"), getCurrentTime()); m_btnJoinChannel.EnableWindow(FALSE); } } - else { - //leave channel in the engine. - if (0 == m_rtcEngine->leaveChannel()) { + else + { + leaveSecondChannelAndStopAudioMixer(); + mJoinSecondCheckbox.SetCheck(0); + // leave channel in the engine. + if (0 == m_rtcEngine->leaveChannel()) + { strInfo.Format(_T("leave channel %s"), getCurrentTime()); } } @@ -247,10 +277,12 @@ void CAgoraAudioProfile::OnBnClickedButtonSetAudioProfile() AUDIO_SCENARIO_TYPE type = AUDIO_SCENARIO_DEFAULT; if (nScenSel == 1) type = AUDIO_SCENARIO_GAME_STREAMING; - //set audio profile. + // set audio profile. m_rtcEngine->setAudioProfile((AUDIO_PROFILE_TYPE)nProfileSel, (AUDIO_SCENARIO_TYPE)nScenSel); m_btnSetAudioProfile.SetWindowText(audioProfileCtrlUnSetAudioProfile); - }else{ + } + else + { m_rtcEngine->setAudioProfile((AUDIO_PROFILE_TYPE)0, (AUDIO_SCENARIO_TYPE)0); m_btnSetAudioProfile.SetWindowText(audioProfileCtrlSetAudioProfile); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("reset default audio profile")); @@ -258,8 +290,66 @@ void CAgoraAudioProfile::OnBnClickedButtonSetAudioProfile() m_setAudio = !m_setAudio; } +void CAgoraAudioProfile::joinSecondChannelAndStartAudioMixer() +{ + CString channelNameEx; + mDestChannelEc.GetWindowTextW(channelNameEx); + if (channelNameEx.IsEmpty()) + { + AfxMessageBox(_T("Fill ex channel name first")); + return; + } + std::string subChannelId = cs2utf8(channelNameEx); + + ChannelMediaOptions options; + options.channelProfile = CHANNEL_PROFILE_LIVE_BROADCASTING; + options.clientRoleType = CLIENT_ROLE_BROADCASTER; + options.publishMicrophoneTrack = false; + options.publishMixedAudioTrack = true; + options.enableAudioRecordingOrPlayout = false; + options.autoSubscribeAudio = false; + + m_exChannelRtcConn.localUid = generateUid(); + strcpy(mSubChannelName, subChannelId.c_str()); + int ret = m_rtcEngine->joinChannelEx("", m_exChannelRtcConn, options, &m_eventHandlerEx); + if (ret == 0) + { + CString strInfo; + strInfo.Format(_T("join channelEx %s , ret=%d"), channelNameEx, ret); + m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); + + LocalAudioMixerConfiguration config; + config.syncWithLocalMic = false; + config.streamCount = 2; + config.sourceStreams = sourceStreams; + + MixedAudioStream remoteStream( AUDIO_SOURCE_REMOTE_CHANNEL); + remoteStream.channelName = mainchannelName; + config.sourceStreams[0] = remoteStream; + + MixedAudioStream remoteStream2(AUDIO_SOURCE_MICROPHONE); + remoteStream2.channelName = mainchannelName; + config.sourceStreams[1] = remoteStream2; + int ret = m_rtcEngine->startLocalAudioMixer(config); + if (ret != 0) + { + AfxMessageBox(_T("startLocalAudioMixer failed")); + } + } + else + { + AfxMessageBox(_T("join channelEx failed")); + } + +} + +void CAgoraAudioProfile::leaveSecondChannelAndStopAudioMixer() +{ + m_rtcEngine->stopLocalAudioMixer(); + m_rtcEngine->leaveChannelEx(m_exChannelRtcConn); +} -//EID_JOINCHANNEL_SUCCESS message window handler +// EID_JOINCHANNEL_SUCCESS message window handler LRESULT CAgoraAudioProfile::OnEIDJoinChannelSuccess(WPARAM wParam, LPARAM lParam) { m_joinChannel = true; @@ -269,12 +359,12 @@ LRESULT CAgoraAudioProfile::OnEIDJoinChannelSuccess(WPARAM wParam, LPARAM lParam strInfo.Format(_T("%s:join success, uid=%u"), getCurrentTime(), wParam); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); m_localVideoWnd.SetUID(wParam); - //notify parent window + // notify parent window ::PostMessage(GetParent()->GetSafeHwnd(), WM_MSGID(EID_JOINCHANNEL_SUCCESS), TRUE, 0); return 0; } -//EID_LEAVEHANNEL_SUCCESS message window handler +// EID_LEAVEHANNEL_SUCCESS message window handler LRESULT CAgoraAudioProfile::OnEIDLeaveChannel(WPARAM wParam, LPARAM lParam) { m_joinChannel = false; @@ -287,7 +377,7 @@ LRESULT CAgoraAudioProfile::OnEIDLeaveChannel(WPARAM wParam, LPARAM lParam) return 0; } -//EID_USER_JOINED message window handler +// EID_USER_JOINED message window handler LRESULT CAgoraAudioProfile::OnEIDUserJoined(WPARAM wParam, LPARAM lParam) { CString strInfo; @@ -297,7 +387,7 @@ LRESULT CAgoraAudioProfile::OnEIDUserJoined(WPARAM wParam, LPARAM lParam) return 0; } -//EID_USER_OFFLINE message handler. +// EID_USER_OFFLINE message handler. LRESULT CAgoraAudioProfile::OnEIDUserOffline(WPARAM wParam, LPARAM lParam) { uid_t remoteUid = (uid_t)wParam; @@ -307,14 +397,16 @@ LRESULT CAgoraAudioProfile::OnEIDUserOffline(WPARAM wParam, LPARAM lParam) return 0; } -//EID_REMOTE_VIDEO_STATE_CHANGED message window handler. +// EID_REMOTE_VIDEO_STATE_CHANGED message window handler. LRESULT CAgoraAudioProfile::OnEIDRemoteVideoStateChanged(WPARAM wParam, LPARAM lParam) { PVideoStateStateChanged stateChanged = (PVideoStateStateChanged)wParam; - if (stateChanged) { - //onRemoteVideoStateChanged + if (stateChanged) + { + // onRemoteVideoStateChanged CString strSateInfo; - switch (stateChanged->state) { + switch (stateChanged->state) + { case REMOTE_VIDEO_STATE_STARTING: strSateInfo = _T("REMOTE_VIDEO_STATE_STARTING"); break; @@ -338,7 +430,6 @@ LRESULT CAgoraAudioProfile::OnEIDRemoteVideoStateChanged(WPARAM wParam, LPARAM l return 0; } - /* note: Join the channel callback.This callback method indicates that the client @@ -351,9 +442,10 @@ LRESULT CAgoraAudioProfile::OnEIDRemoteVideoStateChanged(WPARAM wParam, LPARAM l Otherwise, use the ID automatically assigned by the Agora server. elapsed: The Time from the joinChannel until this event occurred (ms). */ -void CAudioProfileEventHandler::onJoinChannelSuccess(const char* channel, uid_t uid, int elapsed) +void CAudioProfileEventHandler::onJoinChannelSuccess(const char *channel, uid_t uid, int elapsed) { - if (m_hMsgHanlder) { + if (m_hMsgHanlder) + { ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_JOINCHANNEL_SUCCESS), (WPARAM)uid, (LPARAM)elapsed); } } @@ -372,7 +464,8 @@ void CAudioProfileEventHandler::onJoinChannelSuccess(const char* channel, uid_t */ void CAudioProfileEventHandler::onUserJoined(uid_t uid, int elapsed) { - if (m_hMsgHanlder) { + if (m_hMsgHanlder) + { ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_USER_JOINED), (WPARAM)uid, (LPARAM)elapsed); } } @@ -395,7 +488,8 @@ void CAudioProfileEventHandler::onUserJoined(uid_t uid, int elapsed) */ void CAudioProfileEventHandler::onUserOffline(uid_t uid, USER_OFFLINE_REASON_TYPE reason) { - if (m_hMsgHanlder) { + if (m_hMsgHanlder) + { ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_USER_OFFLINE), (WPARAM)uid, (LPARAM)reason); } } @@ -410,9 +504,10 @@ void CAudioProfileEventHandler::onUserOffline(uid_t uid, USER_OFFLINE_REASON_TYP stats: Call statistics. */ -void CAudioProfileEventHandler::onLeaveChannel(const RtcStats& stats) +void CAudioProfileEventHandler::onLeaveChannel(const RtcStats &stats) { - if (m_hMsgHanlder) { + if (m_hMsgHanlder) + { ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_LEAVE_CHANNEL), 0, 0); } } @@ -430,7 +525,8 @@ void CAudioProfileEventHandler::onLeaveChannel(const RtcStats& stats) */ void CAudioProfileEventHandler::onRemoteVideoStateChanged(uid_t uid, REMOTE_VIDEO_STATE state, REMOTE_VIDEO_STATE_REASON reason, int elapsed) { - if (m_hMsgHanlder) { + if (m_hMsgHanlder) + { PVideoStateStateChanged stateChanged = new VideoStateStateChanged; stateChanged->uid = uid; stateChanged->reason = reason; @@ -439,23 +535,47 @@ void CAudioProfileEventHandler::onRemoteVideoStateChanged(uid_t uid, REMOTE_VIDE } } - - - -BOOL CAgoraAudioProfile::PreTranslateMessage(MSG* pMsg) +BOOL CAgoraAudioProfile::PreTranslateMessage(MSG *pMsg) { - if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { + if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) + { return TRUE; } return CDialogEx::PreTranslateMessage(pMsg); } - void CAgoraAudioProfile::OnSelchangeListInfoBroadcasting() { int sel = m_lstInfo.GetCurSel(); - if (sel < 0)return; + if (sel < 0) + return; CString strDetail; m_lstInfo.GetText(sel, strDetail); m_staDetail.SetWindowText(strDetail); } + + +void CAgoraAudioProfile::OnBnClickedCheckSecond() +{ + int isChecked = mJoinSecondCheckbox.GetCheck(); + if (!isChecked) { + leaveSecondChannelAndStopAudioMixer(); + } + else { + if (!m_joinChannel) + { + AfxMessageBox(TEXT("Join main channel first")); + mJoinSecondCheckbox.SetCheck(0); + return; + } + CString channelNameEx; + mDestChannelEc.GetWindowTextW(channelNameEx); + if (channelNameEx.IsEmpty()) + { + AfxMessageBox(TEXT("Fill ex channel name first")); + mJoinSecondCheckbox.SetCheck(0); + return; + } + joinSecondChannelAndStartAudioMixer(); + } +} diff --git a/windows/APIExample/APIExample/Advanced/AudioProfile/CAgoraAudioProfile.h b/windows/APIExample/APIExample/Advanced/AudioProfile/CAgoraAudioProfile.h index 4bc29b3fd..e62069fce 100644 --- a/windows/APIExample/APIExample/Advanced/AudioProfile/CAgoraAudioProfile.h +++ b/windows/APIExample/APIExample/Advanced/AudioProfile/CAgoraAudioProfile.h @@ -1,6 +1,6 @@ 锘#pragma once #include "AGVideoWnd.h" - +#include class CAudioProfileEventHandler : public IRtcEngineEventHandler { @@ -77,7 +77,7 @@ class CAudioProfileEventHandler : public IRtcEngineEventHandler */ virtual void onRemoteVideoStateChanged(uid_t uid, REMOTE_VIDEO_STATE state, REMOTE_VIDEO_STATE_REASON reason, int elapsed) override; private: - HWND m_hMsgHanlder; + HWND m_hMsgHanlder = nullptr; }; @@ -110,9 +110,16 @@ class CAgoraAudioProfile : public CDialogEx bool m_joinChannel = false; bool m_initialize = false; bool m_setAudio = false; - IRtcEngine* m_rtcEngine = nullptr; + char* mainchannelName = nullptr; + char * mSubChannelName =nullptr; + IRtcEngineEx* m_rtcEngine = nullptr; CAGVideoWnd m_localVideoWnd; CAudioProfileEventHandler m_eventHandler; + CAudioProfileEventHandler m_eventHandlerEx; + void joinSecondChannelAndStartAudioMixer(); + void leaveSecondChannelAndStopAudioMixer(); + RtcConnection m_exChannelRtcConn; + MixedAudioStream* sourceStreams = nullptr; public: LRESULT OnEIDJoinChannelSuccess(WPARAM wParam, LPARAM lParam); @@ -141,4 +148,8 @@ class CAgoraAudioProfile : public CDialogEx CButton m_btnSetAudioProfile; CListBox m_lstInfo; CStatic m_staDetail; + CEdit mDestChannelEc; + afx_msg void OnBnClickedButtonDestJoin(); + afx_msg void OnBnClickedCheckSecond(); + CButton mJoinSecondCheckbox; }; diff --git a/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeauty.cpp b/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeauty.cpp index 29e395339..07c42010d 100755 --- a/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeauty.cpp +++ b/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeauty.cpp @@ -13,11 +13,17 @@ IMPLEMENT_DYNAMIC(CDlgBeauty, CDialogEx) CDlgBeauty::CDlgBeauty(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_BEAUTY, pParent) { - + mBeautyDlgEx = new CDlgBeautyEx(); } CDlgBeauty::~CDlgBeauty() { + if (mBeautyDlgEx) + { + delete mBeautyDlgEx; + mBeautyDlgEx = nullptr; + } + } void CDlgBeauty::DoDataExchange(CDataExchange* pDX) @@ -48,6 +54,8 @@ void CDlgBeauty::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_RADIO_VIRTUAL_BG_COLOR, m_radioVirtualBgColor); DDX_Control(pDX, IDC_RADIO_VIRTUAL_BG_IMAGE, m_radioVirtualBgImage); DDX_Control(pDX, IDC_RADIO_VIRTUAL_BG_VIDEO, m_radioVirtualBgVideo); + DDX_Control(pDX, IDC_SLIDER_BRIHTNESS, mSliderBright); + DDX_Control(pDX, IDC_CHECK_EXTENTION, mCkExtention); } @@ -68,6 +76,8 @@ BEGIN_MESSAGE_MAP(CDlgBeauty, CDialogEx) ON_BN_CLICKED(IDC_CHECK_LOWLIGHT, &CDlgBeauty::OnBnClickedCheckLowlight) ON_WM_SHOWWINDOW() ON_CONTROL_RANGE(BN_CLICKED, IDC_RADIO_VIRTUAL_BG_BLUR, IDC_RADIO_VIRTUAL_BG_IMAGE, &CDlgBeauty::OnBnClickedStaticVirtualBgChoose) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_BRIHTNESS, &CDlgBeauty::OnNMCustomdrawSliderBrihtness) + ON_BN_CLICKED(IDC_CHECK_EXTENTION, &CDlgBeauty::OnBnClickedCheckExtention) END_MESSAGE_MAP() @@ -133,10 +143,16 @@ void CDlgBeauty::OnShowWindow(BOOL bShow, UINT nStatus) if (bShow) { //init control text. InitCtrlText(); + mBeautyDlgEx->InitCtrlText(); } else { //resume window status. ResumeStatus(); + if (mBeautyDlgEx) + { + mCkExtention.SetCheck(false); + mBeautyDlgEx->ShowWindow(SW_HIDE); + } } } @@ -247,6 +263,11 @@ void CDlgBeauty::InitCtrlText() m_btnJoinChannel.SetWindowText(commonCtrlJoinChannel); } +void CDlgBeauty::UpdateExtentCbState(bool isCheck) +{ + mCkExtention.SetCheck(isCheck); +} + // resume window status. void CDlgBeauty::ResumeStatus() { @@ -277,6 +298,8 @@ void CDlgBeauty::ResumeStatus() m_sldRedness.SetPos(0); m_sldSmoothness.SetRange(0, 100); m_sldSmoothness.SetPos(0); + + mSliderBright.SetRange(0, 100); } @@ -306,6 +329,9 @@ LRESULT CDlgBeauty::OnEIDLeaveChannel(WPARAM wParam, LPARAM lParam) BOOL CDlgBeauty::OnInitDialog() { CDialogEx::OnInitDialog(); + mBeautyDlgEx->Create(CDlgBeautyEx::IDD); + mBeautyDlgEx->initData(&m_initialize, &m_rtcEngine,this); + mBeautyDlgEx->InitCtrlText(); InitCtrlText(); for (int i = 0; i < 2; ++i) { m_videoWnds[i].Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CRect(0, 0, 1, 1), &m_staVideoArea, i); @@ -335,6 +361,16 @@ void CDlgBeauty::SetBeauty() strInfo.Format(_T("setBeautyEffectOptions: %d"), ret); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); } + + FilterEffectOptions optionFilter; + optionFilter.path = "built_in_whiten_filter"; + optionFilter.strength = mSliderBright.GetPos() / 100.0f; + ret = m_rtcEngine->setFilterEffectOptions(m_chkBeauty.GetCheck() != 0, optionFilter); + if (ret < 0) { + CString strInfo; + strInfo.Format(_T("setFilterEffectOptions: %d"), ret); + m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); + } } void CDlgBeauty::SetColorful() @@ -477,3 +513,24 @@ void CDlgBeauty::OnBnClickedStaticVirtualBgChoose(UINT idCtl) m_rtcEngine->enableVirtualBackground(true, source, SegmentationProperty(), PRIMARY_CAMERA_SOURCE); } } + + +void CDlgBeauty::OnNMCustomdrawSliderBrihtness(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + SetBeauty(); + *pResult = 0; +} + + +void CDlgBeauty::OnBnClickedCheckExtention() +{ + int checked = mCkExtention.GetCheck(); + if (checked) + { + mBeautyDlgEx->ShowWindow(SW_SHOW); + } + else { + mBeautyDlgEx->ShowWindow(SW_HIDE); + } +} diff --git a/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeauty.h b/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeauty.h index ebfa2ca18..1b3ee9cba 100644 --- a/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeauty.h +++ b/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeauty.h @@ -2,6 +2,7 @@ #include #include "AGVideoWnd.h" +#include "CDlgBeautyEx.h" // CDlgBeauty @@ -76,6 +77,7 @@ class CDlgBeauty : public CDialogEx agora::rtc::IRtcEngine* m_rtcEngine = nullptr; CBeautyEventHandler m_eventHandler; CAGVideoWnd m_videoWnds[2]; + CDlgBeautyEx* mBeautyDlgEx; public: afx_msg void OnBnClickedButtonJoinchannel(); LRESULT OnEIDJoinChannelSuccess(WPARAM wParam, LPARAM lParam); @@ -89,6 +91,8 @@ class CDlgBeauty : public CDialogEx //Initialize the Ctrl Text. void InitCtrlText(); + void UpdateExtentCbState(bool isCheck); + CStatic m_staChannel; CEdit m_edtChannel; CButton m_btnJoinChannel; @@ -131,4 +135,8 @@ class CDlgBeauty : public CDialogEx afx_msg void OnBnClickedStaticVirtualBgChoose(UINT idCtl); afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); + CSliderCtrl mSliderBright; + afx_msg void OnNMCustomdrawSliderBrihtness(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnBnClickedCheckExtention(); + CButton mCkExtention; }; diff --git a/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeautyEx.cpp b/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeautyEx.cpp new file mode 100644 index 000000000..2adeb7d38 --- /dev/null +++ b/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeautyEx.cpp @@ -0,0 +1,381 @@ +锘#include "stdafx.h" +#include "APIExample.h" +#include "CDlgBeautyEx.h" +#include "CDlgBeauty.h" + +IMPLEMENT_DYNAMIC(CDlgBeautyEx, CDialogEx) + +CDlgBeautyEx::CDlgBeautyEx(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_BEAUTY_EX, pParent) +{ +} + +CDlgBeautyEx::~CDlgBeautyEx() +{ +} + +void CDlgBeautyEx::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); + DDX_Control(pDX, IDC_CHECK_MAKE_UP, mCbMakeup); + DDX_Control(pDX, IDC_COMBO_BROW_STYLE, mDdBrowStyle); + DDX_Control(pDX, IDC_COMBO_BROW_COLOR, mDdBrowColor); + DDX_Control(pDX, IDC_SLIDER__BROW_STRENGTH, mSdBrowStrength); + DDX_Control(pDX, IDC_COMBO_LASH_STYLE, mDdLashStyle); + DDX_Control(pDX, IDC_COMBO_LASH_COLOR, mDdLashColor); + DDX_Control(pDX, IDC_SLIDER__LASH_STRENGTH, mSdLashStrength); + DDX_Control(pDX, IDC_COMBO_SHADOW_STYLE, mDdShadowStyle); + DDX_Control(pDX, IDC_SLIDER__SHADOW_STRENGTH, mSdShadowStrenght); + DDX_Control(pDX, IDC_COMBO_PUPIL_STYLE, mDdPupilStyle); + DDX_Control(pDX, IDC_SLIDER__Pupil_STRENGTH, mSdPupilStrength); + DDX_Control(pDX, IDC_COMBO_BLUSH_STYLE, mDdBlushStyle); + DDX_Control(pDX, IDC_COMBO_BLUSH_COLOR, mDdBlushColor); + DDX_Control(pDX, IDC_SLIDER__BLUSH_STRENGTH, mSdBlushStrength); + DDX_Control(pDX, IDC_COMBO_LIP_STYLE, mDdLipStyle); + DDX_Control(pDX, IDC_COMBO_LIP_COLOR, mDdLipColor); + DDX_Control(pDX, IDC_SLIDER__LIP_STRENGTH, mSdLipStrength); + DDX_Control(pDX, IDC_CHECK_BEAUTY_SHAPE, mCbBeautyShape); + DDX_Control(pDX, IDC_COMBO_FACE_SHAPE_AREA, mDdShapeArea); + DDX_Control(pDX, IDC_SLIDER__SHAPE_AREA_INTENSITY, mSdShapeAreaIntensity); + DDX_Control(pDX, IDC_COMBO_FACE_SHAPE_STYLE, mDdShapeStyle); + DDX_Control(pDX, IDC_SLIDER__SHAPE_STYLE_INTENSITY, mSdShapeStyleIntensity); +} + +BEGIN_MESSAGE_MAP(CDlgBeautyEx, CDialogEx) + ON_WM_CLOSE() + ON_BN_CLICKED(IDC_CHECK_MAKE_UP, &CDlgBeautyEx::OnBnClickedCheckMakeUp) + ON_CBN_SELCHANGE(IDC_COMBO_BROW_COLOR, &CDlgBeautyEx::OnCbnSelchangeComboBrowColor) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER__BROW_STRENGTH, &CDlgBeautyEx::OnNMCustomdrawSliderBrowStrength) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER__LASH_STRENGTH, &CDlgBeautyEx::OnNMCustomdrawSliderLashStrength) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER__SHADOW_STRENGTH, &CDlgBeautyEx::OnNMCustomdrawSliderShadowStrength) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER__Pupil_STRENGTH, &CDlgBeautyEx::OnNMCustomdrawSliderPupilStrength) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER__BLUSH_STRENGTH, &CDlgBeautyEx::OnNMCustomdrawSliderBlushStrength) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER__LIP_STRENGTH, &CDlgBeautyEx::OnNMCustomdrawSliderLipStrength) + ON_CBN_SELCHANGE(IDC_COMBO_LASH_STYLE, &CDlgBeautyEx::OnCbnSelchangeComboLashStyle) + ON_CBN_SELCHANGE(IDC_COMBO_LASH_COLOR, &CDlgBeautyEx::OnCbnSelchangeComboLashColor) + ON_CBN_SELCHANGE(IDC_COMBO_SHADOW_STYLE, &CDlgBeautyEx::OnCbnSelchangeComboShadowStyle) + ON_CBN_SELCHANGE(IDC_COMBO_PUPIL_STYLE, &CDlgBeautyEx::OnCbnSelchangeComboPupilStyle) + ON_CBN_SELCHANGE(IDC_COMBO_BLUSH_STYLE, &CDlgBeautyEx::OnCbnSelchangeComboBlushStyle) + ON_CBN_SELCHANGE(IDC_COMBO_BLUSH_COLOR, &CDlgBeautyEx::OnCbnSelchangeComboBlushColor) + ON_CBN_SELCHANGE(IDC_COMBO_LIP_STYLE, &CDlgBeautyEx::OnCbnSelchangeComboLipStyle) + ON_CBN_SELCHANGE(IDC_COMBO_LIP_COLOR, &CDlgBeautyEx::OnCbnSelchangeComboLipColor) + ON_BN_CLICKED(IDC_CHECK_BEAUTY_SHAPE, &CDlgBeautyEx::OnBnClickedCheckBeautyShape) + ON_CBN_SELCHANGE(IDC_COMBO_FACE_SHAPE_AREA, &CDlgBeautyEx::OnCbnSelchangeComboFaceShapeArea) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER__SHAPE_AREA_INTENSITY, &CDlgBeautyEx::OnNMCustomdrawSliderShpaeAreaIntensity) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER__SHAPE_STYLE_INTENSITY, &CDlgBeautyEx::OnNMCustomdrawSliderShpaeStyleIntensity) + ON_CBN_SELCHANGE(IDC_COMBO_FACE_SHAPE_STYLE, &CDlgBeautyEx::OnCbnSelchangeComboFaceShapeStyle) + ON_CBN_SELCHANGE(IDC_COMBO_BROW_STYLE, &CDlgBeautyEx::OnCbnSelchangeComboBrowStyle) +END_MESSAGE_MAP() + +void CDlgBeautyEx::OnClose() +{ + if (m_beautyDlg) { + m_beautyDlg->UpdateExtentCbState(false); + } + CDialogEx::OnClose(); +} + +BOOL CDlgBeautyEx::OnInitDialog() +{ + CDialogEx::OnInitDialog(); + + InitCtrlText(); + return TRUE; +} + + +void CDlgBeautyEx::initData(bool* initialize, agora::rtc::IRtcEngine** engine, CDlgBeauty* beautyDlg) +{ + m_initialize = initialize; + m_rtcEngine = engine; + m_beautyDlg = beautyDlg; +} + +void CDlgBeautyEx::InitCtrlData() +{ + m_makeupOptions.reset(); + //make up + mCbMakeup.SetCheck(m_makeupOptions.enable_mu); + + mDdBrowStyle.SetCurSel(m_makeupOptions.browStyle); + mDdBrowColor.SetCurSel(m_makeupOptions.browColor); + mSdBrowStrength.SetRange(0, 100); + mSdBrowStrength.SetPos(m_makeupOptions.browStrength); + + mDdLashStyle.SetCurSel(m_makeupOptions.lashStyle); + mDdLashColor.SetCurSel(m_makeupOptions.lashColor); + mSdLashStrength.SetRange(0, 100); + mSdLashStrength.SetPos(m_makeupOptions.lashStrength); + + mDdShadowStyle.SetCurSel(m_makeupOptions.shadowStyle); + mSdShadowStrenght.SetRange(0, 100); + mSdShadowStrenght.SetPos(m_makeupOptions.shadowStrength); + + mDdPupilStyle.SetCurSel(m_makeupOptions.pupilStyle); + mSdPupilStrength.SetRange(0, 100); + mSdPupilStrength.SetPos(m_makeupOptions.pupilStrength); + + mDdBlushStyle.SetCurSel(m_makeupOptions.blushStyle); + mDdBlushColor.SetCurSel(m_makeupOptions.blushColor); + mSdBlushStrength.SetRange(0, 100); + mSdBlushStrength.SetPos(m_makeupOptions.blushStrength); + + mDdLipStyle.SetCurSel(m_makeupOptions.lipStyle); + mDdLipColor.SetCurSel(m_makeupOptions.lipColor); + mSdLipStrength.SetRange(0, 100); + mSdLipStrength.SetPos(m_makeupOptions.lipStrength); + + //beauty shape + mCbBeautyShape.SetCheck(0); + mDdShapeArea.SetCurSel(0); + mSdShapeAreaIntensity.SetRange(0, 100); + mSdShapeAreaIntensity.SetPos(0); + mDdShapeStyle.SetCurSel(0); + mSdShapeStyleIntensity.SetRange(0, 100); + mSdShapeStyleIntensity.SetPos(0); +} + +// set control text from config. +void CDlgBeautyEx::InitCtrlText() +{ + //make up + mDdBrowStyle.ResetContent(); + mDdBrowStyle.InsertString(0,TEXT("CLOSE")); + mDdBrowStyle.InsertString(1,TEXT("TYPE1")); + mDdBrowStyle.InsertString(2,TEXT("TYPE2")); + mDdBrowColor.ResetContent(); + mDdBrowColor.InsertString(0,TEXT("NONE")); + mDdBrowColor.InsertString(1,TEXT("BLACK")); + mDdBrowColor.InsertString(2,TEXT("BROWN")); + + mDdLashStyle.ResetContent(); + mDdLashStyle.InsertString(0,TEXT("CLOSE")); + mDdLashStyle.InsertString(1,TEXT("TYPE1")); + mDdLashStyle.InsertString(2,TEXT("TYPE2")); + mDdLashColor.ResetContent(); + mDdLashColor.InsertString(0,TEXT("NONE")); + mDdLashColor.InsertString(1,TEXT("BLACK")); + mDdLashColor.InsertString(2,TEXT("BROWN")); + + mDdShadowStyle.ResetContent(); + mDdShadowStyle.InsertString(0,TEXT("CLOSE")); + mDdShadowStyle.InsertString(1,TEXT("TYPE1")); + mDdShadowStyle.InsertString(2,TEXT("TYPE2")); + + mDdPupilStyle.ResetContent(); + mDdPupilStyle.InsertString(0,TEXT("CLOSE")); + mDdPupilStyle.InsertString(1,TEXT("TYPE1")); + mDdPupilStyle.InsertString(2,TEXT("TYPE2")); + + mDdBlushStyle.ResetContent(); + mDdBlushStyle.InsertString(0,TEXT("CLOSE")); + mDdBlushStyle.InsertString(1,TEXT("TYPE1")); + mDdBlushStyle.InsertString(2,TEXT("TYPE2")); + mDdBlushColor.ResetContent(); + mDdBlushColor.InsertString(0,TEXT("NONE")); + mDdBlushColor.InsertString(1,TEXT("COLOR1")); + mDdBlushColor.InsertString(2,TEXT("COLOR2")); + mDdBlushColor.InsertString(3,TEXT("COLOR3")); + mDdBlushColor.InsertString(4,TEXT("COLOR4")); + mDdBlushColor.InsertString(5,TEXT("COLOR5")); + + mDdLipStyle.ResetContent(); + mDdLipStyle.InsertString(0,TEXT("CLOSE")); + mDdLipStyle.InsertString(1,TEXT("TYPE1")); + mDdLipStyle.InsertString(2,TEXT("TYPE2")); + mDdLipColor.ResetContent(); + mDdLipColor.InsertString(0,TEXT("NONE")); + mDdLipColor.InsertString(1,TEXT("COLOR1")); + mDdLipColor.InsertString(2,TEXT("COLOR2")); + mDdLipColor.InsertString(3,TEXT("COLOR3")); + mDdLipColor.InsertString(4,TEXT("COLOR4")); + mDdLipColor.InsertString(5,TEXT("COLOR5")); + + //beauty shape + mDdShapeArea.ResetContent(); + mDdShapeArea.InsertString(0,TEXT("FACE_SHAPE_AREA_NONE")); + mDdShapeArea.InsertString(1,TEXT("FACE_SHAPE_AREA_HEADSCALE")); + mDdShapeArea.InsertString(2,TEXT("FACE_SHAPE_AREA_FOREHEAD")); + mDdShapeArea.InsertString(3,TEXT("FACE_SHAPE_AREA_FACECONTOUR")); + mDdShapeArea.InsertString(4,TEXT("FACE_SHAPE_AREA_FACELENGTH")); + mDdShapeArea.InsertString(5,TEXT("FACE_SHAPE_AREA_FACEWIDTH")); + mDdShapeArea.InsertString(6,TEXT("FACE_SHAPE_AREA_CHEEKBONE")); + mDdShapeArea.InsertString(7,TEXT("FACE_SHAPE_AREA_CHEEK")); + mDdShapeArea.InsertString(8,TEXT("FACE_SHAPE_AREA_CHIN")); + mDdShapeArea.InsertString(9,TEXT("FACE_SHAPE_AREA_EYESCALE")); + mDdShapeArea.InsertString(10,TEXT("FACE_SHAPE_AREA_NOSELENGTH")); + mDdShapeArea.InsertString(11,TEXT("FACE_SHAPE_AREA_NOSEWIDTH")); + mDdShapeArea.InsertString(12,TEXT("FACE_SHAPE_AREA_MOUTHSCALE")); + + mDdShapeStyle.ResetContent(); + mDdShapeStyle.InsertString(0,TEXT("FACE_SHAPE_STYLE_FEMALE")); + mDdShapeStyle.InsertString(1,TEXT("FACE_SHAPE_STYLE_MALE")); + + InitCtrlData(); + +} + +void CDlgBeautyEx::SetBeauty() +{ + if (*m_initialize && *m_rtcEngine) + { + std::string str = m_makeupOptions.toJsonString(); + (*m_rtcEngine)->setExtensionProperty("agora_video_filters_clear_vision", "clear_vision", "makeup_options", str.c_str(), PRIMARY_CAMERA_SOURCE); + bool flag = mCbBeautyShape.GetCheck() != 0; + (*m_rtcEngine)->setFaceShapeBeautyOptions(flag, m_faceShapeBeautyOptions); + (*m_rtcEngine)->setFaceShapeAreaOptions(m_faceShapeAreaOptions); + } +} + + + + +void CDlgBeautyEx::OnBnClickedCheckMakeUp() +{ + m_makeupOptions.enable_mu = mCbMakeup.GetCheck(); + SetBeauty(); +} + +void CDlgBeautyEx::OnCbnSelchangeComboBrowStyle() +{ + m_makeupOptions.browStyle = mDdBrowStyle.GetCurSel(); + SetBeauty(); +} + +void CDlgBeautyEx::OnCbnSelchangeComboBrowColor() +{ + m_makeupOptions.browColor = mDdBrowColor.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnNMCustomdrawSliderBrowStrength(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + m_makeupOptions.browStrength = mSdBrowStrength.GetPos() / 100.0f; + SetBeauty(); + *pResult = 0; +} +void CDlgBeautyEx::OnNMCustomdrawSliderLashStrength(NMHDR* pNMHDR, LRESULT* pResult) { + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + m_makeupOptions.lashStrength = mSdLashStrength.GetPos() / 100.0f; + SetBeauty(); + *pResult = 0; +} +void CDlgBeautyEx::OnNMCustomdrawSliderShadowStrength(NMHDR* pNMHDR, LRESULT* pResult) { + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + m_makeupOptions.shadowStrength = mSdShadowStrenght.GetPos() / 100.0f; + SetBeauty(); + *pResult = 0; +} +void CDlgBeautyEx::OnNMCustomdrawSliderPupilStrength(NMHDR* pNMHDR, LRESULT* pResult) { + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + m_makeupOptions.pupilStrength = mSdPupilStrength.GetPos() / 100.0f; + SetBeauty(); + *pResult = 0; +} +void CDlgBeautyEx::OnNMCustomdrawSliderBlushStrength(NMHDR* pNMHDR, LRESULT* pResult) { + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + m_makeupOptions.blushStrength = mSdBlushStrength.GetPos() / 100.0f; + SetBeauty(); + *pResult = 0; +} +void CDlgBeautyEx::OnNMCustomdrawSliderLipStrength(NMHDR* pNMHDR, LRESULT* pResult) { + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + m_makeupOptions.lipStrength = mSdLipStrength.GetPos() / 100.0f; + SetBeauty(); + *pResult = 0; +} + + + +void CDlgBeautyEx::OnCbnSelchangeComboLashStyle() +{ + m_makeupOptions.lashStyle = mDdLashStyle.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnCbnSelchangeComboLashColor() +{ + m_makeupOptions.lashColor = mDdLashColor.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnCbnSelchangeComboShadowStyle() +{ + m_makeupOptions.shadowStyle = mDdShadowStyle.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnCbnSelchangeComboPupilStyle() +{ + m_makeupOptions.pupilStyle = mDdPupilStyle.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnCbnSelchangeComboBlushStyle() +{ + m_makeupOptions.blushStyle = mDdBlushStyle.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnCbnSelchangeComboBlushColor() +{ + m_makeupOptions.blushColor = mDdBlushColor.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnCbnSelchangeComboLipStyle() +{ + m_makeupOptions.lipStyle = mDdLipStyle.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnCbnSelchangeComboLipColor() +{ + m_makeupOptions.lipColor = mDdLipColor.GetCurSel(); + SetBeauty(); +} + + +void CDlgBeautyEx::OnBnClickedCheckBeautyShape() { + SetBeauty(); +} + + +void CDlgBeautyEx::OnCbnSelchangeComboFaceShapeArea() +{ + m_faceShapeAreaOptions.shapeArea = (FaceShapeAreaOptions::FACE_SHAPE_AREA)(mDdShapeArea.GetCurSel() - 1); + SetBeauty(); +} + + +void CDlgBeautyEx::OnNMCustomdrawSliderShpaeAreaIntensity(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + m_faceShapeAreaOptions.shapeIntensity = mSdShapeAreaIntensity.GetPos(); + SetBeauty(); + *pResult = 0; +} + +void CDlgBeautyEx::OnNMCustomdrawSliderShpaeStyleIntensity(NMHDR* pNMHDR, LRESULT* pResult) +{ + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + m_faceShapeBeautyOptions.styleIntensity = mSdShapeStyleIntensity.GetPos(); + SetBeauty(); + *pResult = 0; +} + + +void CDlgBeautyEx::OnCbnSelchangeComboFaceShapeStyle() +{ + m_faceShapeBeautyOptions.shapeStyle = (FaceShapeBeautyOptions::FACE_SHAPE_BEAUTY_STYLE)mDdShapeStyle.GetCurSel(); + SetBeauty(); +} + diff --git a/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeautyEx.h b/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeautyEx.h new file mode 100644 index 000000000..ba3107704 --- /dev/null +++ b/windows/APIExample/APIExample/Advanced/Beauty/CDlgBeautyEx.h @@ -0,0 +1,164 @@ +锘#pragma once +#include "AGVideoWnd.h" + +class CDlgBeauty; + +struct MakeupOptions +{ + bool enable_mu; + + int browStyle; + int browColor; + float browStrength; + + int lashStyle; + int lashColor; + float lashStrength; + + int shadowStyle; + float shadowStrength; + + int pupilStyle; + float pupilStrength; + + int blushStyle; + int blushColor; + float blushStrength; + + int lipStyle; + int lipColor; + float lipStrength; + + void reset() + { + enable_mu = false; + + browStyle = 0; + browColor = 0; + browStrength = 0.0f; + + lashStyle = 0; + lashColor = 0; + lashStrength = 0.0f; + + shadowStyle = 0; + shadowStrength = 0.0f; + + pupilStyle = 0; + pupilStrength = 0.0f; + + blushStyle = 0; + blushColor = 0; + blushStrength = 0.0f; + + lipStyle = 0; + lipColor = 0; + lipStrength = 0.0f; + } + + MakeupOptions() + { + reset(); + } + //to json string + std::string toJsonString() + { + std::string jsonStr = "{\"enable_mu\":"; + jsonStr += enable_mu ? "true" : "false"; + jsonStr += ",\"browStyle\":" + std::to_string(browStyle); + jsonStr += ",\"browColor\":" + std::to_string(browColor); + jsonStr += ",\"browStrength\":" + std::to_string(browStrength); + jsonStr += ",\"lashStyle\":" + std::to_string(lashStyle); + jsonStr += ",\"lashColor\":" + std::to_string(lashColor); + jsonStr += ",\"lashStrength\":" + std::to_string(lashStrength); + jsonStr += ",\"shadowStyle\":" + std::to_string(shadowStyle); + jsonStr += ",\"shadowStrength\":" + std::to_string(shadowStrength); + jsonStr += ",\"pupilStyle\":" + std::to_string(pupilStyle); + jsonStr += ",\"pupilStrength\":" + std::to_string(pupilStrength); + jsonStr += ",\"blushStyle\":" + std::to_string(blushStyle); + jsonStr += ",\"blushColor\":" + std::to_string(blushColor); + jsonStr += ",\"blushStrength\":" + std::to_string(blushStrength); + jsonStr += ",\"lipStyle\":" + std::to_string(lipStyle); + jsonStr += ",\"lipColor\":" + std::to_string(lipColor); + jsonStr += ",\"lipStrength\":" + std::to_string(lipStrength); + jsonStr += "}"; + return jsonStr; + } + +}; + +class CDlgBeautyEx : public CDialogEx +{ + DECLARE_DYNAMIC(CDlgBeautyEx) + +public: + CDlgBeautyEx(CWnd* pParent = nullptr); // standard constructor + virtual ~CDlgBeautyEx(); + enum + { + IDD = IDD_DIALOG_BEAUTY_EX + }; +private: + bool* m_initialize = nullptr; + agora::rtc::IRtcEngine** m_rtcEngine = nullptr; + CDlgBeauty* m_beautyDlg = nullptr; + MakeupOptions m_makeupOptions; + FaceShapeAreaOptions m_faceShapeAreaOptions; + FaceShapeBeautyOptions m_faceShapeBeautyOptions; +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual BOOL OnInitDialog(); + afx_msg void OnClose(); + DECLARE_MESSAGE_MAP() + +public: + void initData(bool* initialize, agora::rtc::IRtcEngine** engine, CDlgBeauty* beautyDlg); + void InitCtrlText(); + void InitCtrlData(); + void SetBeauty(); + + CButton mCbMakeup; + CComboBox mDdBrowColor; + CComboBox mDdBrowStyle; + CSliderCtrl mSdBrowStrength; + CComboBox mDdLashStyle; + CComboBox mDdLashColor; + CSliderCtrl mSdLashStrength; + CComboBox mDdShadowStyle; + CSliderCtrl mSdShadowStrenght; + CComboBox mDdPupilStyle; + CSliderCtrl mSdPupilStrength; + CComboBox mDdBlushStyle; + CComboBox mDdBlushColor; + CSliderCtrl mSdBlushStrength; + CComboBox mDdLipStyle; + CComboBox mDdLipColor; + CSliderCtrl mSdLipStrength; + CButton mCbBeautyShape; + CComboBox mDdShapeArea; + CSliderCtrl mSdShapeAreaIntensity; + CComboBox mDdShapeStyle; + CSliderCtrl mSdShapeStyleIntensity; + afx_msg void OnBnClickedCheckMakeUp(); + afx_msg void OnCbnSelchangeComboBrowColor(); + afx_msg void OnNMCustomdrawSliderBrowStrength(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnNMCustomdrawSliderLashStrength(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnNMCustomdrawSliderShadowStrength(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnNMCustomdrawSliderPupilStrength(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnNMCustomdrawSliderBlushStrength(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnNMCustomdrawSliderLipStrength(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnCbnSelchangeComboLashStyle(); + afx_msg void OnCbnSelchangeComboLashColor(); + afx_msg void OnCbnSelchangeComboShadowStyle(); + afx_msg void OnCbnSelchangeComboPupilStyle(); + afx_msg void OnCbnSelchangeComboBlushStyle(); + afx_msg void OnCbnSelchangeComboBlushColor(); + afx_msg void OnCbnSelchangeComboLipStyle(); + afx_msg void OnCbnSelchangeComboLipColor(); + afx_msg void OnBnClickedCheckBeautyShape(); + afx_msg void OnCbnSelchangeComboFaceShapeArea(); + afx_msg void OnNMCustomdrawSliderShpaeAreaIntensity(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnNMCustomdrawSliderShpaeStyleIntensity(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnCbnSelchangeComboFaceShapeStyle(); + afx_msg void OnCbnSelchangeComboBrowStyle(); +}; diff --git a/windows/APIExample/APIExample/Advanced/CrossChannel/CAgoraCrossChannelDlg.cpp b/windows/APIExample/APIExample/Advanced/CrossChannel/CAgoraCrossChannelDlg.cpp index 6458b83b8..367602195 100644 --- a/windows/APIExample/APIExample/Advanced/CrossChannel/CAgoraCrossChannelDlg.cpp +++ b/windows/APIExample/APIExample/Advanced/CrossChannel/CAgoraCrossChannelDlg.cpp @@ -151,7 +151,7 @@ void CAgoraCrossChannelDlg::RenderLocalVideo() m_rtcEngine->startPreview(); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("startPreview")); VideoCanvas canvas; - canvas.renderMode = RENDER_MODE_FIT; + canvas.renderMode = media::base::RENDER_MODE_FIT; canvas.uid = 0; canvas.view = m_localVideoWnd.GetSafeHwnd(); //setup local video in the engine to canvas. @@ -187,7 +187,7 @@ void CAgoraCrossChannelDlg::ResumeStatus() void CAgoraCrossChannelDlg::OnShowWindow(BOOL bShow, UINT nStatus) { CDialogEx::OnShowWindow(bShow, nStatus); - if (bShow)//bShwo is true ,show window + if (bShow)//bShwo is true ,show window { InitCtrlText(); RenderLocalVideo(); @@ -327,8 +327,8 @@ void CAgoraCrossChannelDlg::OnBnClickedButtonStartMediaRelay() cmrc.destCount = nDestCount; int ret = 0; //start Channel Media Relay from cmrc. - ret = m_rtcEngine->startChannelMediaRelay(cmrc); - m_lstInfo.AddString(_T("startChannelMediaRelay")); + ret = m_rtcEngine->startOrUpdateChannelMediaRelay(cmrc); + m_lstInfo.AddString(_T("startOrUpdateChannelMediaRelay")); delete lpDestInfos; m_btnStartMediaRelay.SetWindowText(CrossChannelStopMediaRelay); } @@ -339,7 +339,7 @@ void CAgoraCrossChannelDlg::OnBnClickedButtonStartMediaRelay() m_btnStartMediaRelay.SetWindowText(CrossChannelStartMediaRelay); } m_startMediaRelay = !m_startMediaRelay; - + } //update update Channel Media Relay. @@ -360,8 +360,8 @@ void CAgoraCrossChannelDlg::OnBnClickedButtonUpdate() cmrc.destCount = nDestCount; int ret = 0; //update Channel Media Relay. - ret = m_rtcEngine->updateChannelMediaRelay(cmrc); - m_lstInfo.AddString(_T("updateChannelMediaRelay")); + ret = m_rtcEngine->startOrUpdateChannelMediaRelay(cmrc); + m_lstInfo.AddString(_T("startOrUpdateChannelMediaRelay")); delete lpDestInfos; } } @@ -439,7 +439,7 @@ LRESULT CAgoraCrossChannelDlg::OnEIDChannelMediaRelayStateChanged(WPARAM wParam, // media relay event handler. LRESULT CAgoraCrossChannelDlg::OnEIDChannelMediaRelayEvent(WPARAM wParam, LPARAM lParam) { - CHANNEL_MEDIA_RELAY_EVENT evt = CHANNEL_MEDIA_RELAY_EVENT(wParam); + int evt = wParam; CString strInfo; strInfo.Format(_T("channel media event:%d"), evt); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); diff --git a/windows/APIExample/APIExample/Advanced/CrossChannel/CAgoraCrossChannelDlg.h b/windows/APIExample/APIExample/Advanced/CrossChannel/CAgoraCrossChannelDlg.h index db69eecb1..878cfedef 100644 --- a/windows/APIExample/APIExample/Advanced/CrossChannel/CAgoraCrossChannelDlg.h +++ b/windows/APIExample/APIExample/Advanced/CrossChannel/CAgoraCrossChannelDlg.h @@ -83,15 +83,8 @@ class CAgoraCrossChannelEventHandler : public IRtcEngineEventHandler } } - /** Occurs when the state of the media stream relay changes. - * - * The SDK returns the state of the current media relay with any error - * message. - * - * @param state The state code in #CHANNEL_MEDIA_RELAY_STATE. - * @param code The error code in #CHANNEL_MEDIA_RELAY_ERROR. - */ - virtual void onChannelMediaRelayStateChanged(CHANNEL_MEDIA_RELAY_STATE state, CHANNEL_MEDIA_RELAY_ERROR code)override { + + virtual void onChannelMediaRelayStateChanged(int state, int code)override { if (m_hMsgHanlder) ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_CHANNEL_MEDIA_RELAY_STATE_CHNAGENED), state, code); } @@ -100,7 +93,7 @@ class CAgoraCrossChannelEventHandler : public IRtcEngineEventHandler * * @param code The event code in #CHANNEL_MEDIA_RELAY_EVENT. */ - virtual void onChannelMediaRelayEvent(CHANNEL_MEDIA_RELAY_EVENT code) { + virtual void onChannelMediaRelayEvent(int code) { if (m_hMsgHanlder) ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_CHANNEL_MEDIA_RELAY_EVENT), code, 0); } diff --git a/windows/APIExample/APIExample/Advanced/RtePlayer/RtePlayerDlg.cpp b/windows/APIExample/APIExample/Advanced/RtePlayer/RtePlayerDlg.cpp new file mode 100644 index 000000000..9b9299a9c --- /dev/null +++ b/windows/APIExample/APIExample/Advanced/RtePlayer/RtePlayerDlg.cpp @@ -0,0 +1,355 @@ +锘#include "stdafx.h" +#include "APIExample.h" +#include "RtePlayerDlg.h" + +PlayerObserverAdapter::PlayerObserverAdapter() {} +PlayerObserverAdapter::~PlayerObserverAdapter() {} +void PlayerObserverAdapter::onStateChanged(rte::PlayerState old_state, rte::PlayerState new_state, + rte::Error* err) {} +void PlayerObserverAdapter::onPositionChanged(uint64_t curr_time, + uint64_t utc_time) {} +void PlayerObserverAdapter::onResolutionChanged(int width, int height) {} +void PlayerObserverAdapter::onEvent(rte::PlayerEvent event) {} +void PlayerObserverAdapter::onMetadata(rte::PlayerMetadataType type, + const uint8_t* data, size_t length) {} +void PlayerObserverAdapter::onPlayerInfoUpdated(const rte::PlayerInfo* info) {} +void PlayerObserverAdapter::onAudioVolumeIndication(int32_t volume) {} + +IMPLEMENT_DYNAMIC(CRtePlayerDlg, CDialogEx) + +CRtePlayerDlg::CRtePlayerDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_RTE_PLAYER, pParent) +{ +} + +CRtePlayerDlg::~CRtePlayerDlg() +{ +} + +void CRtePlayerDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT_RTE_URL, mRteUrlEc); + DDX_Control(pDX, IDC_BUTTON_START, mBtStart); + DDX_Control(pDX, IDC_BUTTON_STOP, mBtStop); + DDX_Control(pDX, IDC_BUTTON_PLAY, mBtPlay); + DDX_Control(pDX, IDC_BUTTON_PAUSE, mBtPause); + DDX_Control(pDX, IDC_LIST_INFO_BROADCASTING, mListInfo); + DDX_Control(pDX, IDC_STATIC_VIDEO, mVideoWnd); +} + +BEGIN_MESSAGE_MAP(CRtePlayerDlg, CDialogEx) + ON_MESSAGE(WM_MSGID(WM_PLAYER_INIT), &CRtePlayerDlg::OnInit) + ON_MESSAGE(WM_MSGID(WM_PLAYER_PREPARED), &CRtePlayerDlg::OnPrepared) + ON_MESSAGE(WM_MSGID(WM_PLAYER_STATE), &CRtePlayerDlg::OnPlayerStateChanged) + ON_MESSAGE(WM_MSGID(WM_PLAYER_EVENT), &CRtePlayerDlg::OnPlayerOnEvent) + ON_BN_CLICKED(IDC_BUTTON_START, &CRtePlayerDlg::OnBnClickedButtonStart) + ON_BN_CLICKED(IDC_BUTTON_STOP, &CRtePlayerDlg::OnBnClickedButtonStop) + ON_BN_CLICKED(IDC_BUTTON_PLAY, &CRtePlayerDlg::OnBnClickedButtonPlay) + ON_BN_CLICKED(IDC_BUTTON_PAUSE, &CRtePlayerDlg::OnBnClickedButtonPause) +END_MESSAGE_MAP() + +BOOL CRtePlayerDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); + InitCtrlText(); + return TRUE; +} + +// set control text from config. +void CRtePlayerDlg::InitCtrlText() +{ + std::string strAppID = GET_APP_ID; + std::string str = "ret://" + strAppID + "/"; + mRteUrlEc.SetWindowTextW(CA2W(str.c_str())); + updateUiState(); +} + +int CRtePlayerDlg::JoinChannel(const char* channel) +{ + + return 0; +} + +int CRtePlayerDlg::LeaveChannel() +{ + + return 0; +} + +void CRtePlayerDlg::start() +{ + if (isInitSuccess && mRtePlayer) + { + mRtePlayer->OpenWithUrl(mRteUrl.c_str(), 0, [&](rte::Error* err) { + ErrorCode code = kRteOk; + if (err != nullptr && err->Code() != kRteOk) + { + code = err->Code(); + } + ::PostMessage(m_hWnd, WM_MSGID(WM_PLAYER_PREPARED), (WPARAM)code, 0); + }); + + } +} + +void CRtePlayerDlg::stop() +{ + if (isInitSuccess && mRtePlayer) + { + mRtePlayer->Stop(); + } +} + +void CRtePlayerDlg::play() +{ + if (isInitSuccess && mRtePlayer) + { + mRtePlayer->Play(); + } +} + +void CRtePlayerDlg::pause() +{ + if (isInitSuccess && mRtePlayer) + { + mRtePlayer->Pause(); + } +} + +void CRtePlayerDlg::updateUiState() +{ + if (isInitSuccess) + { + if (isPrepareSuccess) + { + mBtStart.EnableWindow(FALSE); + mBtStop.EnableWindow(); + mBtPlay.EnableWindow(); + mBtPause.EnableWindow(); + } + else + { + mBtStart.EnableWindow(); + mBtStop.EnableWindow(FALSE); + mBtPlay.EnableWindow(FALSE); + mBtPause.EnableWindow(FALSE); + } + } + else + { + mBtStart.EnableWindow(); + mBtStop.EnableWindow(FALSE); + mBtPlay.EnableWindow(FALSE); + mBtPause.EnableWindow(FALSE); + } +} + +// Initialize the Agora SDK +bool CRtePlayerDlg::InitAgora() +{ + rte::Config rteConfig; + rteConfig.SetAppId(GET_APP_ID.c_str()); + mRte = new rte::Rte(); + mRte->SetConfigs(&rteConfig); + mRte->InitMediaEngine([this](rte::Error* err) + { + ErrorCode code = kRteOk; + if (err != nullptr && err->Code() != kRteOk) + { + code = err->Code(); + } + ::PostMessage(m_hWnd, WM_MSGID(WM_PLAYER_INIT), (WPARAM)code, 0); + + }); + + return true; +} + +// UnInitialize the Agora SDK +void CRtePlayerDlg::UnInitAgora() +{ + if (mCanvas) + { + delete mCanvas; + mCanvas = nullptr; + } + if (mRtePlayer) + { + delete mRtePlayer; + mRtePlayer = nullptr; + } + if (mRte) + { + delete mRte; + mRte = nullptr; + } +} + +void CRtePlayerDlg::onStateChanged(rte::PlayerState old_state, rte::PlayerState new_state, rte::Error* err) +{ + + ErrorCode code = kRteOk; + if (err != nullptr && err->Code() != kRteOk) + { + code = err->Code(); + } + ::PostMessage(m_hWnd, WM_MSGID(WM_PLAYER_STATE), (WPARAM)new_state, (LPARAM)code); + +} + +void CRtePlayerDlg::onEvent(rte::PlayerEvent event) +{ + ::PostMessage(m_hWnd, WM_MSGID(WM_PLAYER_EVENT), (WPARAM)event, 0); +} + +void CRtePlayerDlg::OnBnClickedButtonStart() +{ + CString url; + mRteUrlEc.GetWindowText(url); + mRteUrl = cs2utf8(url); + start(); +} + +void CRtePlayerDlg::OnBnClickedButtonStop() +{ + stop(); +} + +void CRtePlayerDlg::OnBnClickedButtonPlay() +{ + play(); +} + +void CRtePlayerDlg::OnBnClickedButtonPause() +{ + pause(); +} + +LRESULT CRtePlayerDlg::OnInit(WPARAM wParam, LPARAM lParam) +{ + ErrorCode code = (ErrorCode)wParam; + if (code == kRteOk) + { + mRtePlayer = new rte::Player(mRte); + mCanvas = new rte::Canvas(mRte); + RteViewConfig viewConfig; + RteView view = mVideoWnd.GetSafeHwnd(); + mCanvas->AddView(&view, &viewConfig); + mRtePlayer->RegisterObserver(this); + mRtePlayer->SetCanvas(mCanvas); + isInitSuccess = true; + mListInfo.AddString(_T("InitMediaEngine success")); + } + else + { + isInitSuccess = false; + CString str; + str.Format(_T("InitMediaEngine failed, code:%d"), code); + mListInfo.AddString(str); + } + return 0; +} +LRESULT CRtePlayerDlg::OnPrepared(WPARAM wParam, LPARAM lParam) +{ + ErrorCode code = (ErrorCode)wParam; + CString str; + if (code == kRteOk) + { + isPrepareSuccess = true; + mListInfo.AddString(_T("OpenWithUrl success")); + } + else + { + isPrepareSuccess = false; + str.Format(_T("OpenWithUrl failed, code:%d"), code); + mListInfo.AddString(str); + stop(); + } + updateUiState(); + return 0; +} +LRESULT CRtePlayerDlg::OnPlayerStateChanged(WPARAM wParam, LPARAM lParam) +{ + rte::PlayerState new_state = (rte::PlayerState)wParam; + ErrorCode code = (ErrorCode)lParam; + CString str; + switch (new_state) + { + case kRtePlayerStateIdle: + mListInfo.AddString(_T("kRtePlayerStateIdle")); + break; + case kRtePlayerStateOpening: + mListInfo.AddString(_T("kRtePlayerStateOpening")); + break; + case kRtePlayerStateOpenCompleted: + mListInfo.AddString(_T("kRtePlayerStateOpenCompleted")); + break; + case kRtePlayerStatePlaying: + mListInfo.AddString(_T("kRtePlayerStatePlaying")); + break; + case kRtePlayerStatePaused: + mListInfo.AddString(_T("kRtePlayerStatePaused")); + break; + case kRtePlayerStatePlaybackCompleted: + mListInfo.AddString(_T("kRtePlayerStatePlaybackCompleted")); + break; + case kRtePlayerStateStopped: + mListInfo.AddString(_T("kRtePlayerStateStopped")); + isPrepareSuccess = false; + break; + case kRtePlayerStateFailed: + str.Format(_T("kRtePlayerStateFailed, code:%d"), code); + mListInfo.AddString(str); + isPrepareSuccess = false; + stop(); + break; + default: + break; + } + updateUiState(); + return 0; +} +LRESULT CRtePlayerDlg::OnPlayerOnEvent(WPARAM wParam, LPARAM lParam) +{ + rte::PlayerEvent event = (rte::PlayerEvent)wParam; + switch (event) + { + case kRtePlayerEventSeekBegin: + mListInfo.AddString(_T("onEvent kRtePlayerEventSeekBegin")); + break; + case kRtePlayerEventSeekComplete: + mListInfo.AddString(_T("onEvent kRtePlayerEventSeekComplete")); + break; + case kRtePlayerEventSeekError: + mListInfo.AddString(_T("onEvent kRtePlayerEventSeekError")); + break; + case kRtePlayerEventBufferLow: + mListInfo.AddString(_T("onEvent kRtePlayerEventBufferLow")); + break; + case kRtePlayerEventBufferRecover: + mListInfo.AddString(_T("onEvent kRtePlayerEventBufferRecover")); + break; + case kRtePlayerEventFreezeStart: + mListInfo.AddString(_T("onEvent kRtePlayerEventFreezeStart")); + break; + case kRtePlayerEventFreezeStop: + mListInfo.AddString(_T("onEvent kRtePlayerEventFreezeStop")); + break; + case kRtePlayerEventOneLoopPlaybackCompleted: + mListInfo.AddString(_T("onEvent kRtePlayerEventOneLoopPlaybackCompleted")); + break; + case kRtePlayerEventAuthenticationWillExpire: + mListInfo.AddString(_T("onEvent kRtePlayerEventAuthenticationWillExpire")); + break; + case kRtePlayerEventAbrFallbackToAudioOnlyLayer: + mListInfo.AddString(_T("onEvent kRtePlayerEventAbrFallbackToAudioOnlyLayer")); + break; + case kRtePlayerEventAbrRecoverFromAudioOnlyLayer: + mListInfo.AddString(_T("onEvent kRtePlayerEventAbrRecoverFromAudioOnlyLayer")); + break; + + default: + break; + } + return 0; +} diff --git a/windows/APIExample/APIExample/Advanced/RtePlayer/RtePlayerDlg.h b/windows/APIExample/APIExample/Advanced/RtePlayer/RtePlayerDlg.h new file mode 100644 index 000000000..4fc0e465a --- /dev/null +++ b/windows/APIExample/APIExample/Advanced/RtePlayer/RtePlayerDlg.h @@ -0,0 +1,85 @@ +锘#pragma once +#include "AGVideoWnd.h" +#include +#include +#include "stdafx.h" +#include "rte_cpp.h" +using namespace rte; +#define WM_PLAYER_INIT (WM_USER + 10001) +#define WM_PLAYER_PREPARED (WM_USER + 10002) +#define WM_PLAYER_STATE (WM_USER + 10003) +#define WM_PLAYER_EVENT (WM_USER + 1004) +class PlayerObserverAdapter:public PlayerObserver +{ +public: + PlayerObserverAdapter(); + virtual~PlayerObserverAdapter(); + void onStateChanged(rte::PlayerState old_state, rte::PlayerState new_state, + rte::Error* err) override; + void onPositionChanged(uint64_t curr_time, + uint64_t utc_time) override; + void onResolutionChanged(int width, int height) override; + void onEvent(rte::PlayerEvent event) override; + void onMetadata(rte::PlayerMetadataType type, + const uint8_t* data, size_t length) override; + void onPlayerInfoUpdated(const rte::PlayerInfo* info) override; + void onAudioVolumeIndication(int32_t volume) override; + +}; + + +class CRtePlayerDlg : public CDialogEx,public PlayerObserverAdapter +{ + DECLARE_DYNAMIC(CRtePlayerDlg) + +public: + CRtePlayerDlg(CWnd* pParent = nullptr); // standard constructor + virtual ~CRtePlayerDlg(); + bool InitAgora(); + void UnInitAgora(); + void onStateChanged(rte::PlayerState old_state, rte::PlayerState new_state,rte::Error* err) override; + void onEvent(rte::PlayerEvent event) override; + enum + { + IDD = IDD_DIALOG_RTE_PLAYER + }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual BOOL OnInitDialog(); + DECLARE_MESSAGE_MAP() + +private: + void InitCtrlText(); + int JoinChannel(const char* channel); + int LeaveChannel(); + HWND hWnd = NULL; + rte::Rte *mRte = nullptr; + rte::Player *mRtePlayer = nullptr; + rte::Canvas *mCanvas = nullptr; + std::string mRteUrl; + + bool isInitSuccess = false; + bool isPrepareSuccess = false; + + void start(); + void stop(); + void play(); + void pause(); + void updateUiState(); + CEdit mRteUrlEc; + CButton mBtStart; + CButton mBtStop; + CButton mBtPlay; + CButton mBtPause; + afx_msg void OnBnClickedButtonStart(); + afx_msg void OnBnClickedButtonStop(); + afx_msg void OnBnClickedButtonPlay(); + afx_msg void OnBnClickedButtonPause(); + afx_msg LRESULT OnInit(WPARAM wParam, LPARAM lParam); + afx_msg LRESULT OnPrepared(WPARAM wParam, LPARAM lParam); + afx_msg LRESULT OnPlayerStateChanged(WPARAM wParam, LPARAM lParam); + afx_msg LRESULT OnPlayerOnEvent(WPARAM wParam, LPARAM lParam); + CListBox mListInfo; + CStatic mVideoWnd; +}; diff --git a/windows/APIExample/APIExample/Advanced/ScreenShare/AgoraScreenCapture.cpp b/windows/APIExample/APIExample/Advanced/ScreenShare/AgoraScreenCapture.cpp index 93d59c6ca..cf87b40cc 100755 --- a/windows/APIExample/APIExample/Advanced/ScreenShare/AgoraScreenCapture.cpp +++ b/windows/APIExample/APIExample/Advanced/ScreenShare/AgoraScreenCapture.cpp @@ -365,7 +365,7 @@ void CAgoraScreenCapture::OnBnClickedButtonStartShare() //start screen capture in the engine. agora::rtc::Rectangle rcCapWnd; m_screenParam.windowFocus = true; - ret = m_rtcEngine->startScreenCaptureByWindowId(hWnd, rcCapWnd, m_screenParam); + ret = m_rtcEngine->startScreenCaptureByWindowId((int64_t)hWnd, rcCapWnd, m_screenParam); //start preview in the engine. m_rtcEngine->startPreview(VIDEO_SOURCE_TYPE::VIDEO_SOURCE_SCREEN); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("startPreview")); @@ -1040,7 +1040,7 @@ void CAgoraScreenCapture::OnBnClickedButtonHwndExeclude() while (pos != NULL) { index++; agora::rtc::ScreenCaptureSourceInfo info = m_listWndExecluded.GetNext(pos); - excludeViews[index] = info.sourceId; + excludeViews[index] = (view_t)info.sourceId; } if (m_screenParam.excludeWindowList != nullptr) { diff --git a/windows/APIExample/APIExample/Advanced/TransparentBg/TransparentBgDialog.cpp b/windows/APIExample/APIExample/Advanced/TransparentBg/TransparentBgDialog.cpp index f3f7cb8d2..ab9108ead 100644 --- a/windows/APIExample/APIExample/Advanced/TransparentBg/TransparentBgDialog.cpp +++ b/windows/APIExample/APIExample/Advanced/TransparentBg/TransparentBgDialog.cpp @@ -161,16 +161,16 @@ BOOL CTransparentBgDlg::OnInitDialog() if (AfxRegisterClass(&wndcls)) { hWnd = CreateWindowEx( - 0, // 鎵╁睍绐楀彛鏍峰紡 - className, // 绐楀彛绫诲悕 - _T("閫忔槑绐楀彛"), // 绐楀彛鏍囬 - WS_OVERLAPPEDWINDOW & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX & ~WS_SYSMENU, // 绐楀彛鏍峰紡 - CW_USEDEFAULT, CW_USEDEFAULT, // 绐楀彛浣嶇疆 - 800, 600, // 绐楀彛澶у皬 - this->GetSafeHwnd(), // 鐖剁獥鍙e彞鏌 - NULL, // 鑿滃崟鍙ユ焺 - AfxGetInstanceHandle(), // 搴旂敤绋嬪簭瀹炰緥鍙ユ焺 - NULL // 绐楀彛鍒涘缓鏁版嵁 + 0, + className, + _T("Transparent Windows"), + WS_OVERLAPPEDWINDOW & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX & ~WS_SYSMENU, + CW_USEDEFAULT, CW_USEDEFAULT, + 800, 600, + this->GetSafeHwnd(), + NULL, + AfxGetInstanceHandle(), + NULL ); if (hWnd) { @@ -185,16 +185,16 @@ void CTransparentBgDlg::ShowTransparentWindow() { if (hWnd) { - ::ShowWindow(hWnd, SW_SHOW); // 鏄剧ず绐楀彛 - UpdateWindow(); // 鏇存柊绐楀彛 + ::ShowWindow(hWnd, SW_SHOW); + UpdateWindow(); } } void CTransparentBgDlg::HideTransparentWindow() { if (hWnd) { - ::ShowWindow(hWnd, SW_HIDE); // 闅愯棌绐楀彛 - UpdateWindow(); // 鏇存柊绐楀彛 + ::ShowWindow(hWnd, SW_HIDE); + UpdateWindow(); } } @@ -279,8 +279,6 @@ void CTransparentBgDlg::onFrame(const VideoFrame *frame) { if (m_rtcEngine) { - - // 鍒涘缓ExternalVideoFrame瀵硅薄 agora::media::base::ExternalVideoFrame externalFrame; externalFrame.alphaStitchMode = ALPHA_STITCH_LEFT; externalFrame.type = agora::media::base::ExternalVideoFrame::VIDEO_BUFFER_TYPE::VIDEO_BUFFER_RAW_DATA; @@ -295,7 +293,6 @@ void CTransparentBgDlg::onFrame(const VideoFrame *frame) memcpy((uint8_t *)externalFrame.buffer + frame->yStride * frame->height, frame->uBuffer, frame->uStride * (frame->height >> 1)); memcpy((uint8_t *)externalFrame.buffer + frame->yStride * frame->height + frame->uStride * (frame->height >> 1), frame->vBuffer, frame->vStride * (frame->height / 2)); mediaEngine->pushVideoFrame(&externalFrame); - // 閲婃斁缂撳啿鍖 delete[] externalFrame.buffer; // CString strInfo; @@ -622,7 +619,7 @@ void CTransparentBgDlg::OnBnClickedButtonJoinchannel() m_editChannel.GetWindowText(strChannelName); if (strChannelName.IsEmpty()) { - MessageBox(_T("棰戦亾鍙蜂笉鑳戒负绌")); + MessageBox(_T("channel name is empty")); return; } diff --git a/windows/APIExample/APIExample/Basic/LiveBroadcasting/CLiveBroadcastingDlg.cpp b/windows/APIExample/APIExample/Basic/LiveBroadcasting/CLiveBroadcastingDlg.cpp index 428d9b7f1..cb20d2fd9 100755 --- a/windows/APIExample/APIExample/Basic/LiveBroadcasting/CLiveBroadcastingDlg.cpp +++ b/windows/APIExample/APIExample/Basic/LiveBroadcasting/CLiveBroadcastingDlg.cpp @@ -6,87 +6,92 @@ /* note: - Join the channel callback.This callback method indicates that the client - successfully joined the specified channel.Channel ids are assigned based - on the channel name specified in the joinChannel. If IRtcEngine::joinChannel - is called without a user ID specified. The server will automatically assign one + Join the channel callback.This callback method indicates that the client + successfully joined the specified channel.Channel ids are assigned based + on the channel name specified in the joinChannel. If IRtcEngine::joinChannel + is called without a user ID specified. The server will automatically assign one parameters: - channel:channel name. - uid: user ID。If the UID is specified in the joinChannel, that ID is returned here; - Otherwise, use the ID automatically assigned by the Agora server. - elapsed: The Time from the joinChannel until this event occurred (ms). + channel:channel name. + uid: user ID锟斤拷If the UID is specified in the joinChannel, that ID is returned here; + Otherwise, use the ID automatically assigned by the Agora server. + elapsed: The Time from the joinChannel until this event occurred (ms). */ -void CLiveBroadcastingRtcEngineEventHandler::onJoinChannelSuccess(const char* channel, uid_t uid, int elapsed) +void CLiveBroadcastingRtcEngineEventHandler::onJoinChannelSuccess(const char *channel, uid_t uid, int elapsed) { - if (m_hMsgHanlder) { - ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_JOINCHANNEL_SUCCESS), (WPARAM)uid, (LPARAM)elapsed); - } + if (m_hMsgHanlder) + { + ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_JOINCHANNEL_SUCCESS), (WPARAM)uid, (LPARAM)elapsed); + } } /* note: - In the live broadcast scene, each anchor can receive the callback - of the new anchor joining the channel, and can obtain the uID of the anchor. - Viewers also receive a callback when a new anchor joins the channel and - get the anchor's UID.When the Web side joins the live channel, the SDK will - default to the Web side as long as there is a push stream on the - Web side and trigger the callback. + In the live broadcast scene, each anchor can receive the callback + of the new anchor joining the channel, and can obtain the uID of the anchor. + Viewers also receive a callback when a new anchor joins the channel and + get the anchor's UID.When the Web side joins the live channel, the SDK will + default to the Web side as long as there is a push stream on the + Web side and trigger the callback. parameters: - uid: remote user/anchor ID for newly added channel. - elapsed: The joinChannel is called from the local user to the delay triggered - by the callback(ms). + uid: remote user/anchor ID for newly added channel. + elapsed: The joinChannel is called from the local user to the delay triggered + by the callback锟斤拷ms). */ -void CLiveBroadcastingRtcEngineEventHandler::onUserJoined(uid_t uid, int elapsed) { - if (m_hMsgHanlder) { - ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_USER_JOINED), (WPARAM)uid, (LPARAM)elapsed); - } +void CLiveBroadcastingRtcEngineEventHandler::onUserJoined(uid_t uid, int elapsed) +{ + if (m_hMsgHanlder) + { + ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_USER_JOINED), (WPARAM)uid, (LPARAM)elapsed); + } } /* note: - Remote user (communication scenario)/anchor (live scenario) is called back from - the current channel.A remote user/anchor has left the channel (or dropped the line). - There are two reasons for users to leave the channel, namely normal departure and - time-out:When leaving normally, the remote user/anchor will send a message like - "goodbye". After receiving this message, determine if the user left the channel. - The basis of timeout dropout is that within a certain period of time - (live broadcast scene has a slight delay), if the user does not receive any - packet from the other side, it will be judged as the other side dropout. - False positives are possible when the network is poor. We recommend using the - Agora Real-time messaging SDK for reliable drop detection. + Remote user (communication scenario)/anchor (live scenario) is called back from + the current channel.A remote user/anchor has left the channel (or dropped the line). + There are two reasons for users to leave the channel, namely normal departure and + time-out:When leaving normally, the remote user/anchor will send a message like + "goodbye". After receiving this message, determine if the user left the channel. + The basis of timeout dropout is that within a certain period of time + (live broadcast scene has a slight delay), if the user does not receive any + packet from the other side, it will be judged as the other side dropout. + False positives are possible when the network is poor. We recommend using the + Agora Real-time messaging SDK for reliable drop detection. parameters: - uid: The user ID of an offline user or anchor. - reason:Offline reason: USER_OFFLINE_REASON_TYPE. + uid: The user ID of an offline user or anchor. + reason:Offline reason: USER_OFFLINE_REASON_TYPE. */ void CLiveBroadcastingRtcEngineEventHandler::onUserOffline(uid_t uid, USER_OFFLINE_REASON_TYPE reason) { - if (m_hMsgHanlder) { - ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_USER_OFFLINE), (WPARAM)uid, (LPARAM)reason); - } + if (m_hMsgHanlder) + { + ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_USER_OFFLINE), (WPARAM)uid, (LPARAM)reason); + } } /* note: - When the App calls the leaveChannel method, the SDK indicates that the App - has successfully left the channel. In this callback method, the App can get - the total call time, the data traffic sent and received by THE SDK and other - information. The App obtains the call duration and data statistics received - or sent by the SDK through this callback. + When the App calls the leaveChannel method, the SDK indicates that the App + has successfully left the channel. In this callback method, the App can get + the total call time, the data traffic sent and received by THE SDK and other + information. The App obtains the call duration and data statistics received + or sent by the SDK through this callback. parametes: - stats: Call statistics. + stats: Call statistics. */ -void CLiveBroadcastingRtcEngineEventHandler::onLeaveChannel(const RtcStats& stats) +void CLiveBroadcastingRtcEngineEventHandler::onLeaveChannel(const RtcStats &stats) { - if (m_hMsgHanlder) { - ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_LEAVE_CHANNEL), 0, 0); - } + if (m_hMsgHanlder) + { + ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_LEAVE_CHANNEL), 0, 0); + } } - -void CLiveBroadcastingRtcEngineEventHandler::onLocalVideoStats(VIDEO_SOURCE_TYPE source, const LocalVideoStats& stats) +void CLiveBroadcastingRtcEngineEventHandler::onLocalVideoStats(VIDEO_SOURCE_TYPE source, const LocalVideoStats &stats) { - if (m_hMsgHanlder && report) { - LocalVideoStats* s = new LocalVideoStats; + if (m_hMsgHanlder && report) + { + LocalVideoStats *s = new LocalVideoStats; *s = stats; ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_LOCAL_VIDEO_STATS), (WPARAM)s, 0); } @@ -94,8 +99,9 @@ void CLiveBroadcastingRtcEngineEventHandler::onLocalVideoStats(VIDEO_SOURCE_TYPE void CLiveBroadcastingRtcEngineEventHandler::onVideoRenderingTracingResult(uid_t uid, MEDIA_TRACE_EVENT currentEvent, VideoRenderingTracingInfo info) { - if (m_hMsgHanlder) { - VideoRenderingTracingInfo* i = new VideoRenderingTracingInfo; + if (m_hMsgHanlder) + { + VideoRenderingTracingInfo *i = new VideoRenderingTracingInfo; *i = info; ::PostMessage(m_hMsgHanlder, WM_MSGID(EID_VIDEO_RENDERING_TRACING_RESULT), (WPARAM)i, uid); } @@ -104,18 +110,16 @@ void CLiveBroadcastingRtcEngineEventHandler::onVideoRenderingTracingResult(uid_t // CLiveBroadcastingDlg dialog IMPLEMENT_DYNAMIC(CLiveBroadcastingDlg, CDialogEx) -CLiveBroadcastingDlg::CLiveBroadcastingDlg(CWnd* pParent /*=nullptr*/) - : CDialogEx(IDD_DIALOG_LIVEBROADCASTING, pParent) - , m_canvasRenderModeValue(0) +CLiveBroadcastingDlg::CLiveBroadcastingDlg(CWnd *pParent /*=nullptr*/) + : CDialogEx(IDD_DIALOG_LIVEBROADCASTING, pParent), m_canvasRenderModeValue(0) { - } CLiveBroadcastingDlg::~CLiveBroadcastingDlg() { } -void CLiveBroadcastingDlg::DoDataExchange(CDataExchange* pDX) +void CLiveBroadcastingDlg::DoDataExchange(CDataExchange *pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_ROLE, m_cmbRole); @@ -143,64 +147,66 @@ void CLiveBroadcastingDlg::DoDataExchange(CDataExchange* pDX) DDX_Radio(pDX, IDC_RADIO_CANVAS_HIDDEN, m_canvasRenderModeValue); DDX_Control(pDX, IDC_STATIC_CANVAS_COLOR, m_staCavasColor); DDX_Control(pDX, IDC_SLIDER_CANVAS_COLOR, m_sldCanvasColor); + DDX_Control(pDX, IDC_SLIDER_Local_fps, mLocalFpsSlider); + DDX_Control(pDX, IDC_SLIDER_Remote_fps, mRemoteFpsSlider); } - BEGIN_MESSAGE_MAP(CLiveBroadcastingDlg, CDialogEx) - ON_BN_CLICKED(IDC_BUTTON_JOINCHANNEL, &CLiveBroadcastingDlg::OnBnClickedButtonJoinchannel) - ON_CBN_SELCHANGE(IDC_COMBO_PERSONS, &CLiveBroadcastingDlg::OnSelchangeComboPersons) - ON_CBN_SELCHANGE(IDC_COMBO_ROLE, &CLiveBroadcastingDlg::OnSelchangeComboRole) - ON_MESSAGE(WM_MSGID(EID_JOINCHANNEL_SUCCESS), &CLiveBroadcastingDlg::OnEIDJoinChannelSuccess) - ON_MESSAGE(WM_MSGID(EID_LEAVE_CHANNEL), &CLiveBroadcastingDlg::OnEIDLeaveChannel) - ON_MESSAGE(WM_MSGID(EID_USER_JOINED), &CLiveBroadcastingDlg::OnEIDUserJoined) - ON_MESSAGE(WM_MSGID(EID_USER_OFFLINE), &CLiveBroadcastingDlg::OnEIDUserOffline) - - ON_MESSAGE(WM_MSGID(EID_NETWORK_QUALITY), &CLiveBroadcastingDlg::OnEIDNetworkQuality) - ON_MESSAGE(WM_MSGID(EID_RTC_STATS), &CLiveBroadcastingDlg::onEIDRtcStats) - ON_MESSAGE(WM_MSGID(EID_LOCAL_AUDIO_STATS), &CLiveBroadcastingDlg::onEIDLocalAudioStats) - ON_MESSAGE(WM_MSGID(EID_LOCAL_AUDIO_STATE_CHANED), &CLiveBroadcastingDlg::onEIDLocalAudioStateChanged) - ON_MESSAGE(WM_MSGID(EID_REMOTE_AUDIO_STATS), &CLiveBroadcastingDlg::onEIDRemoteAudioStats) - ON_MESSAGE(WM_MSGID(EID_REMOTE_AUDIO_STATE_CHANGED), &CLiveBroadcastingDlg::onEIDRemoteAudioStateChanged) - ON_MESSAGE(WM_MSGID(EID_LOCAL_VIDEO_STATS), &CLiveBroadcastingDlg::onEIDLocalVideoStats) - ON_MESSAGE(WM_MSGID(EID_LOCAL_VIDEO_STATE_CHANGED), &CLiveBroadcastingDlg::onEIDLocalVideoStateChanged) - ON_MESSAGE(WM_MSGID(EID_REMOTE_VIDEO_STATS), &CLiveBroadcastingDlg::onEIDRemoteVideoStats) - ON_MESSAGE(WM_MSGID(EID_REMOTE_VIDEO_STATE_CHANGED), &CLiveBroadcastingDlg::onEIDRemoteVideoStateChanged) - ON_MESSAGE(WM_MSGID(EID_CONTENT_INSPECT_RESULT), &CLiveBroadcastingDlg::onEIDContentInspectResult) - ON_MESSAGE(WM_MSGID(EID_SNAPSHOT_TAKEN), &CLiveBroadcastingDlg::onEIDSnapshotTaken) - ON_MESSAGE(WM_MSGID(EID_VIDEO_RENDERING_TRACING_RESULT), &CLiveBroadcastingDlg::onEIDVideoRenderingTracingResult) - - ON_WM_SHOWWINDOW() - ON_LBN_SELCHANGE(IDC_LIST_INFO_BROADCASTING, &CLiveBroadcastingDlg::OnSelchangeListInfoBroadcasting) - ON_STN_CLICKED(IDC_STATIC_VIDEO, &CLiveBroadcastingDlg::OnStnClickedStaticVideo) - ON_BN_CLICKED(IDC_CHECK_REPORT, &CLiveBroadcastingDlg::OnBnClickedCheckReport) - ON_BN_CLICKED(IDC_CHECK_MODERATION, &CLiveBroadcastingDlg::OnBnClickedModeration) - ON_BN_CLICKED(IDC_BUTTON_SNAPSHOT, &CLiveBroadcastingDlg::OnBnClickedSnapshot) - ON_CONTROL_RANGE(BN_CLICKED, IDC_RADIO_ENCODE_AUTO, IDC_RADIO_ENCODE_SOFT, &CLiveBroadcastingDlg::OnBnClickedRadioEncoder) - ON_BN_CLICKED(IDC_CHECK_B_FRAME, &CLiveBroadcastingDlg::OnBnClickedCheckBFrame) - ON_BN_CLICKED(IDC_CHECK_FIRST_FRAME_OPT, &CLiveBroadcastingDlg::OnBnClickedCheckFirstFrameOpt) - ON_BN_CLICKED(IDC_BUTTON_PRELOAD, &CLiveBroadcastingDlg::OnBnClickedButtonPreload) - ON_BN_CLICKED(IDC_RADIO_CANVAS_HIDDEN, &CLiveBroadcastingDlg::OnBnClickedRadioCanvasRenderMode) - ON_BN_CLICKED(IDC_RADIO_CANVAS_FIT, &CLiveBroadcastingDlg::OnBnClickedRadioCanvasRenderMode) - ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_CANVAS_COLOR, &CLiveBroadcastingDlg::OnNMCustomdrawSliderCanvasColor) - ON_BN_CLICKED(IDC_CHECK_VIDEO_IMAGE, &CLiveBroadcastingDlg::OnBnClickedCheckVideoImage) +ON_BN_CLICKED(IDC_BUTTON_JOINCHANNEL, &CLiveBroadcastingDlg::OnBnClickedButtonJoinchannel) +ON_CBN_SELCHANGE(IDC_COMBO_PERSONS, &CLiveBroadcastingDlg::OnSelchangeComboPersons) +ON_CBN_SELCHANGE(IDC_COMBO_ROLE, &CLiveBroadcastingDlg::OnSelchangeComboRole) +ON_MESSAGE(WM_MSGID(EID_JOINCHANNEL_SUCCESS), &CLiveBroadcastingDlg::OnEIDJoinChannelSuccess) +ON_MESSAGE(WM_MSGID(EID_LEAVE_CHANNEL), &CLiveBroadcastingDlg::OnEIDLeaveChannel) +ON_MESSAGE(WM_MSGID(EID_USER_JOINED), &CLiveBroadcastingDlg::OnEIDUserJoined) +ON_MESSAGE(WM_MSGID(EID_USER_OFFLINE), &CLiveBroadcastingDlg::OnEIDUserOffline) + +ON_MESSAGE(WM_MSGID(EID_NETWORK_QUALITY), &CLiveBroadcastingDlg::OnEIDNetworkQuality) +ON_MESSAGE(WM_MSGID(EID_RTC_STATS), &CLiveBroadcastingDlg::onEIDRtcStats) +ON_MESSAGE(WM_MSGID(EID_LOCAL_AUDIO_STATS), &CLiveBroadcastingDlg::onEIDLocalAudioStats) +ON_MESSAGE(WM_MSGID(EID_LOCAL_AUDIO_STATE_CHANED), &CLiveBroadcastingDlg::onEIDLocalAudioStateChanged) +ON_MESSAGE(WM_MSGID(EID_REMOTE_AUDIO_STATS), &CLiveBroadcastingDlg::onEIDRemoteAudioStats) +ON_MESSAGE(WM_MSGID(EID_REMOTE_AUDIO_STATE_CHANGED), &CLiveBroadcastingDlg::onEIDRemoteAudioStateChanged) +ON_MESSAGE(WM_MSGID(EID_LOCAL_VIDEO_STATS), &CLiveBroadcastingDlg::onEIDLocalVideoStats) +ON_MESSAGE(WM_MSGID(EID_LOCAL_VIDEO_STATE_CHANGED), &CLiveBroadcastingDlg::onEIDLocalVideoStateChanged) +ON_MESSAGE(WM_MSGID(EID_REMOTE_VIDEO_STATS), &CLiveBroadcastingDlg::onEIDRemoteVideoStats) +ON_MESSAGE(WM_MSGID(EID_REMOTE_VIDEO_STATE_CHANGED), &CLiveBroadcastingDlg::onEIDRemoteVideoStateChanged) +ON_MESSAGE(WM_MSGID(EID_CONTENT_INSPECT_RESULT), &CLiveBroadcastingDlg::onEIDContentInspectResult) +ON_MESSAGE(WM_MSGID(EID_SNAPSHOT_TAKEN), &CLiveBroadcastingDlg::onEIDSnapshotTaken) +ON_MESSAGE(WM_MSGID(EID_VIDEO_RENDERING_TRACING_RESULT), &CLiveBroadcastingDlg::onEIDVideoRenderingTracingResult) + +ON_WM_SHOWWINDOW() +ON_LBN_SELCHANGE(IDC_LIST_INFO_BROADCASTING, &CLiveBroadcastingDlg::OnSelchangeListInfoBroadcasting) +ON_STN_CLICKED(IDC_STATIC_VIDEO, &CLiveBroadcastingDlg::OnStnClickedStaticVideo) +ON_BN_CLICKED(IDC_CHECK_REPORT, &CLiveBroadcastingDlg::OnBnClickedCheckReport) +ON_BN_CLICKED(IDC_CHECK_MODERATION, &CLiveBroadcastingDlg::OnBnClickedModeration) +ON_BN_CLICKED(IDC_BUTTON_SNAPSHOT, &CLiveBroadcastingDlg::OnBnClickedSnapshot) +ON_CONTROL_RANGE(BN_CLICKED, IDC_RADIO_ENCODE_AUTO, IDC_RADIO_ENCODE_SOFT, &CLiveBroadcastingDlg::OnBnClickedRadioEncoder) +ON_BN_CLICKED(IDC_CHECK_B_FRAME, &CLiveBroadcastingDlg::OnBnClickedCheckBFrame) +ON_BN_CLICKED(IDC_CHECK_FIRST_FRAME_OPT, &CLiveBroadcastingDlg::OnBnClickedCheckFirstFrameOpt) +ON_BN_CLICKED(IDC_BUTTON_PRELOAD, &CLiveBroadcastingDlg::OnBnClickedButtonPreload) +ON_BN_CLICKED(IDC_RADIO_CANVAS_HIDDEN, &CLiveBroadcastingDlg::OnBnClickedRadioCanvasRenderMode) +ON_BN_CLICKED(IDC_RADIO_CANVAS_FIT, &CLiveBroadcastingDlg::OnBnClickedRadioCanvasRenderMode) +ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_CANVAS_COLOR, &CLiveBroadcastingDlg::OnNMCustomdrawSliderCanvasColor) +ON_BN_CLICKED(IDC_CHECK_VIDEO_IMAGE, &CLiveBroadcastingDlg::OnBnClickedCheckVideoImage) +ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_Local_fps, &CLiveBroadcastingDlg::OnNMCustomdrawSliderLocalfps) +ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_Remote_fps, &CLiveBroadcastingDlg::OnNMCustomdrawSliderRemotefps) END_MESSAGE_MAP() - // CLiveBroadcastingDlg message handlers BOOL CLiveBroadcastingDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); - CreateAllVideoWnds(); - // clientRole - int i = 0; - m_cmbRole.InsertString(i++, agoraRoleBroadcaster); - m_cmbRole.InsertString(i++, agoraRoleAudience); - // - i = 0; - m_cmbPersons.InsertString(i++, _T("1V1")); - m_cmbPersons.InsertString(i++, _T("1V3")); - m_cmbPersons.InsertString(i++, _T("1V8")); - m_cmbPersons.InsertString(i++, _T("1V15")); + CDialogEx::OnInitDialog(); + CreateAllVideoWnds(); + // clientRole + int i = 0; + m_cmbRole.InsertString(i++, agoraRoleBroadcaster); + m_cmbRole.InsertString(i++, agoraRoleAudience); + // + i = 0; + m_cmbPersons.InsertString(i++, _T("1V1")); + m_cmbPersons.InsertString(i++, _T("1V3")); + m_cmbPersons.InsertString(i++, _T("1V8")); + m_cmbPersons.InsertString(i++, _T("1V15")); i = 0; m_cmbVideoEncoder.InsertString(i++, _T("VP8")); @@ -211,17 +217,16 @@ BOOL CLiveBroadcastingDlg::OnInitDialog() m_cmbVideoEncoder.InsertString(i++, _T("Generic H264")); ResumeStatus(); - return TRUE; + return TRUE; } - -//set control text from config. +// set control text from config. void CLiveBroadcastingDlg::InitCtrlText() { - m_staRole.SetWindowText(commonCtrlClientRole); - m_staPersons.SetWindowText(liveCtrlPersons); - m_staChannelName.SetWindowText(commonCtrlChannel); - m_btnJoinChannel.SetWindowText(commonCtrlJoinChannel); + m_staRole.SetWindowText(commonCtrlClientRole); + m_staPersons.SetWindowText(liveCtrlPersons); + m_staChannelName.SetWindowText(commonCtrlChannel); + m_btnJoinChannel.SetWindowText(commonCtrlJoinChannel); m_chkReport.SetWindowText(liveBraodcastingReport); m_chkModeration.SetWindowText(liveBraodcastingModeration); m_rdiEncodeAuto.SetWindowText(liveBraodcastingAutoEncode); @@ -231,150 +236,169 @@ void CLiveBroadcastingDlg::InitCtrlText() m_staEncode.SetWindowText(liveBraodcastingEncode); m_chkFirstFrameOpt.SetWindowText(liveBraodcastingFristFrameOpt); m_chkVideoImage.SetWindowText(liveBraodcastingVideoImage); + + mLocalFpsSlider.SetRange(1, 60); + mLocalFpsSlider.SetPos(15); + mRemoteFpsSlider.SetRange(1, 60); + mRemoteFpsSlider.SetPos(15); } -//create all video window to save m_videoWnds. +// create all video window to save m_videoWnds. void CLiveBroadcastingDlg::CreateAllVideoWnds() { - for (int i = 0; i < VIDEO_COUNT; ++i) { - m_videoWnds[i].Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CRect(0, 0, 1, 1), this, IDC_BASEWND_VIDEO + i); - //set window background color. - m_videoWnds[i].SetFaceColor(RGB(0x58, 0x58, 0x58)); - } + for (int i = 0; i < VIDEO_COUNT; ++i) + { + m_videoWnds[i].Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CRect(0, 0, 1, 1), this, IDC_BASEWND_VIDEO + i); + // set window background color. + m_videoWnds[i].SetFaceColor(RGB(0x58, 0x58, 0x58)); + } } -//show all video window from m_videoWnds. +// show all video window from m_videoWnds. void CLiveBroadcastingDlg::ShowVideoWnds() { - m_videoArea.ShowWindow(SW_HIDE); - int row = 2; - int col = 2; - m_maxVideoCount = 4; - switch (m_cmbPersons.GetCurSel()) { - case PEOPLE_IN_CHANNEL_2: { - row = 1; - col = 2; - m_maxVideoCount = 2; - } - break; - case PEOPLE_IN_CHANNEL_4: { - int row = 2; - int col = 2; - m_maxVideoCount = 4; - } - break; - case PEOPLE_IN_CHANNEL_9: { - row = 3; - col = 3; - m_maxVideoCount = 9; - } - break; - case PEOPLE_IN_CHANNEL_16: { - row = 4; - col = 4; - m_maxVideoCount = 16; - } - break; - } - - - RECT rcArea; - m_videoArea.GetClientRect( &rcArea); - int space = 1; - - int w = (rcArea.right -rcArea.left - space * (col - 1)) / col; - int h = (rcArea.bottom - rcArea.top - space * (row - 1)) / row; - - for (int r = 0; r < row; r++) { - for (int c = 0; c < col; c++) { - int x = rcArea.left + (w + space) * c; - int y = rcArea.top + (h + space) * r; - int nIndex = r * col + c; - m_videoWnds[nIndex].MoveWindow(x, y, w, h, TRUE); - m_videoWnds[nIndex].ShowWindow(SW_SHOW); - m_videoWnds[nIndex].SetParent(this); - - if (!m_videoWnds[nIndex].IsWindowVisible()) { - m_videoWnds[nIndex].ShowWindow(SW_SHOW); - } - } - } - - for (int i = m_maxVideoCount; i < VIDEO_COUNT; i++) { - m_videoWnds[i].ShowWindow(0); - if (m_videoWnds[i].GetUID() != 0) { - VideoCanvas canvas; - canvas.uid = m_videoWnds[i].GetUID(); - canvas.view = nullptr; - m_rtcEngine->setupRemoteVideo(canvas); + m_videoArea.ShowWindow(SW_HIDE); + int row = 2; + int col = 2; + m_maxVideoCount = 4; + switch (m_cmbPersons.GetCurSel()) + { + case PEOPLE_IN_CHANNEL_2: + { + row = 1; + col = 2; + m_maxVideoCount = 2; + } + break; + case PEOPLE_IN_CHANNEL_4: + { + int row = 2; + int col = 2; + m_maxVideoCount = 4; + } + break; + case PEOPLE_IN_CHANNEL_9: + { + row = 3; + col = 3; + m_maxVideoCount = 9; + } + break; + case PEOPLE_IN_CHANNEL_16: + { + row = 4; + col = 4; + m_maxVideoCount = 16; + } + break; + } + + RECT rcArea; + m_videoArea.GetClientRect(&rcArea); + int space = 1; + + int w = (rcArea.right - rcArea.left - space * (col - 1)) / col; + int h = (rcArea.bottom - rcArea.top - space * (row - 1)) / row; + + for (int r = 0; r < row; r++) + { + for (int c = 0; c < col; c++) + { + int x = rcArea.left + (w + space) * c; + int y = rcArea.top + (h + space) * r; + int nIndex = r * col + c; + m_videoWnds[nIndex].MoveWindow(x, y, w, h, TRUE); + m_videoWnds[nIndex].ShowWindow(SW_SHOW); + m_videoWnds[nIndex].SetParent(this); + + if (!m_videoWnds[nIndex].IsWindowVisible()) + { + m_videoWnds[nIndex].ShowWindow(SW_SHOW); + } + } + } + + for (int i = m_maxVideoCount; i < VIDEO_COUNT; i++) + { + m_videoWnds[i].ShowWindow(0); + if (m_videoWnds[i].GetUID() != 0) + { + VideoCanvas canvas; + canvas.uid = m_videoWnds[i].GetUID(); + canvas.view = nullptr; + m_rtcEngine->setupRemoteVideo(canvas); m_videoWnds[i].SetUID(0); - } - } + } + } } -//Initialize the Agora SDK +// Initialize the Agora SDK bool CLiveBroadcastingDlg::InitAgora() { - //create Agora RTC engine - m_rtcEngine = createAgoraRtcEngine(); - if (!m_rtcEngine) { - m_lstInfo.InsertString(m_lstInfo.GetCount()-1, _T("createAgoraRtcEngine failed")); - return false; - } - //set message notify receiver window - m_eventHandler.SetMsgReceiver(m_hWnd); - - RtcEngineContext context; + // create Agora RTC engine + m_rtcEngine = createAgoraRtcEngine(); + if (!m_rtcEngine) + { + m_lstInfo.InsertString(m_lstInfo.GetCount() - 1, _T("createAgoraRtcEngine failed")); + return false; + } + // set message notify receiver window + m_eventHandler.SetMsgReceiver(m_hWnd); + + RtcEngineContext context; std::string strAppID = GET_APP_ID; context.appId = strAppID.c_str(); - context.eventHandler = &m_eventHandler; - //set channel profile in the engine to the CHANNEL_PROFILE_LIVE_BROADCASTING. + context.eventHandler = &m_eventHandler; + // set channel profile in the engine to the CHANNEL_PROFILE_LIVE_BROADCASTING. context.channelProfile = CHANNEL_PROFILE_LIVE_BROADCASTING; - //initialize the Agora RTC engine context. - int ret = m_rtcEngine->initialize(context); - if (ret != 0) { - m_initialize = false; - CString strInfo; - strInfo.Format(_T("initialize failed: %d"), ret); - m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - return false; - } - else - m_initialize = true; - m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("initialize success")); - //enable video in the engine. - m_rtcEngine->enableVideo(); + // initialize the Agora RTC engine context. + int ret = m_rtcEngine->initialize(context); + if (ret != 0) + { + m_initialize = false; + CString strInfo; + strInfo.Format(_T("initialize failed: %d"), ret); + m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); + return false; + } + else + m_initialize = true; + m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("initialize success")); + // enable video in the engine. + m_rtcEngine->enableVideo(); m_rtcEngine->enableAudio(); - m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("enable video")); - - m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("live broadcasting")); + m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("enable video")); + + m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("live broadcasting")); m_audioDeviceManager = new AAudioDeviceManager(m_rtcEngine); m_rtcEngine->setVideoEncoderConfiguration(m_videoEncoderConfig); - return true; + return true; } -//UnInitialize the Agora SDK +// UnInitialize the Agora SDK void CLiveBroadcastingDlg::UnInitAgora() { - if (m_rtcEngine) { - if(m_joinChannel) - //leave channel - m_rtcEngine->leaveChannel(); + if (m_rtcEngine) + { + if (m_joinChannel) + // leave channel + m_rtcEngine->leaveChannel(); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("leaveChannel")); - //stop preview in the engine. - // m_rtcEngine->stopPreview(); - m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("stopPreview")); - //disable video in the engine. - m_rtcEngine->disableVideo(); - m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("disableVideo")); - //release engine. - if (m_initialize) { + // stop preview in the engine. + // m_rtcEngine->stopPreview(); + m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("stopPreview")); + // disable video in the engine. + m_rtcEngine->disableVideo(); + m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("disableVideo")); + // release engine. + if (m_initialize) + { m_rtcEngine->release(true); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("release rtc engine")); } - m_rtcEngine = NULL; - } + m_rtcEngine = NULL; + } } void CLiveBroadcastingDlg::ResumeStatus() @@ -385,7 +409,7 @@ void CLiveBroadcastingDlg::ResumeStatus() m_cmbVideoEncoder.SetCurSel(1); ShowVideoWnds(); InitCtrlText(); - + m_rdiEncodeAuto.SetCheck(TRUE); m_btnJoinChannel.EnableWindow(TRUE); m_cmbRole.EnableWindow(TRUE); @@ -396,39 +420,40 @@ void CLiveBroadcastingDlg::ResumeStatus() m_initialize = false; } -//render local video from SDK local capture. +// render local video from SDK local capture. void CLiveBroadcastingDlg::RenderLocalVideo() { - if (m_rtcEngine) { - //start preview in the engine. + if (m_rtcEngine) + { + // start preview in the engine. m_rtcEngine->enableLocalVideo(true); - m_rtcEngine->startPreview(); - VideoCanvas canvas; - canvas.renderMode = m_canvasRenderMode; - canvas.uid = 0; - canvas.view = m_videoWnds[0].GetSafeHwnd(); + m_rtcEngine->startPreview(); + VideoCanvas canvas; + canvas.renderMode = m_canvasRenderMode; + canvas.uid = 0; + canvas.view = m_videoWnds[0].GetSafeHwnd(); canvas.backgroundColor = m_canvasColor; - //setup local video in the engine to the canvas. - m_rtcEngine->setupLocalVideo(canvas); - m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("render local video")); - } + // setup local video in the engine to the canvas. + m_rtcEngine->setupLocalVideo(canvas); + m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("render local video")); + } } void CLiveBroadcastingDlg::StopLocalVideo() { - if (m_rtcEngine) { - //start preview in the engine. + if (m_rtcEngine) + { + // start preview in the engine. m_rtcEngine->stopPreview(); VideoCanvas canvas; canvas.uid = 0; canvas.view = NULL; - //setup local video in the engine to the canvas. + // setup local video in the engine to the canvas. m_rtcEngine->setupLocalVideo(canvas); m_lstInfo.InsertString(m_lstInfo.GetCount(), _T("stop local video")); } } - void CLiveBroadcastingDlg::ResetVideoView() { VideoCanvas canvas; @@ -439,16 +464,18 @@ void CLiveBroadcastingDlg::ResetVideoView() canvas.backgroundColor = m_canvasColor; m_rtcEngine->setupLocalVideo(canvas); - for (int i = 1; i < m_maxVideoCount; i++) { + for (int i = 1; i < m_maxVideoCount; i++) + { int uid = m_videoWnds[i].GetUID(); - if (uid != 0) { + if (uid != 0) + { VideoCanvas canvas; canvas.uid = uid; canvas.renderMode = m_canvasRenderMode; m_rtcEngine->setupRemoteVideo(canvas); canvas.view = m_videoWnds[i].GetSafeHwnd(); canvas.backgroundColor = m_canvasColor; - //setup remote video in engine to the canvas. + // setup remote video in engine to the canvas. m_rtcEngine->setupRemoteVideo(canvas); break; } @@ -457,41 +484,45 @@ void CLiveBroadcastingDlg::ResetVideoView() void CLiveBroadcastingDlg::OnSelchangeComboPersons() { - int index = m_cmbPersons.GetCurSel(); - ShowVideoWnds(); + int index = m_cmbPersons.GetCurSel(); + ShowVideoWnds(); } - void CLiveBroadcastingDlg::OnSelchangeComboRole() { - if (m_rtcEngine) { - m_rtcEngine->setClientRole(m_cmbRole.GetCurSel() == 0 ? CLIENT_ROLE_BROADCASTER : CLIENT_ROLE_AUDIENCE); + if (m_rtcEngine) + { + m_rtcEngine->setClientRole(m_cmbRole.GetCurSel() == 0 ? CLIENT_ROLE_BROADCASTER : CLIENT_ROLE_AUDIENCE); - if (m_cmbRole.GetCurSel() == 0) { + if (m_cmbRole.GetCurSel() == 0) + { // start video and render local video RenderLocalVideo(); - } else { + } + else + { // stop video and unbind local video StopLocalVideo(); } - m_lstInfo.InsertString(m_lstInfo.GetCount(), m_cmbRole.GetCurSel() == 0 ? _T("setClientRole broadcaster"): _T("setClientRole Audience")); - } + m_lstInfo.InsertString(m_lstInfo.GetCount(), m_cmbRole.GetCurSel() == 0 ? _T("setClientRole broadcaster") : _T("setClientRole Audience")); + } } - void CLiveBroadcastingDlg::OnBnClickedButtonJoinchannel() { - if (!m_rtcEngine || !m_initialize) - return; - CString strInfo; - if (!m_joinChannel) { - CString strChannelName; - m_edtChannelName.GetWindowText(strChannelName); - if (strChannelName.IsEmpty()) { - AfxMessageBox(_T("Fill channel name first")); - return; - } + if (!m_rtcEngine || !m_initialize) + return; + CString strInfo; + if (!m_joinChannel) + { + CString strChannelName; + m_edtChannelName.GetWindowText(strChannelName); + if (strChannelName.IsEmpty()) + { + AfxMessageBox(_T("Fill channel name first")); + return; + } VideoEncoderConfiguration config; if (m_cmbVideoEncoder.GetCurSel() < 3) @@ -499,7 +530,7 @@ void CLiveBroadcastingDlg::OnBnClickedButtonJoinchannel() else config.codecType = (VIDEO_CODEC_TYPE)(m_cmbVideoEncoder.GetCurSel() + 2); m_rtcEngine->setVideoEncoderConfiguration(config); - std::string szChannelId = cs2utf8(strChannelName); + std::string szChannelId = cs2utf8(strChannelName); m_rtcEngine->startMediaRenderingTracing(); @@ -508,30 +539,32 @@ void CLiveBroadcastingDlg::OnBnClickedButtonJoinchannel() options.clientRoleType = CLIENT_ROLE_TYPE(m_cmbRole.GetCurSel() + 1); options.autoSubscribeAudio = true; options.autoSubscribeVideo = true; - //join channel in the engine. - if (0 == m_rtcEngine->joinChannel(APP_TOKEN, szChannelId.c_str(), m_uid, options)) { - strInfo.Format(_T("join channel %s, use ChannelMediaOptions"), getCurrentTime()); - m_btnJoinChannel.EnableWindow(FALSE); - } - } - else { - if (0 == m_rtcEngine->leaveChannel()) { - strInfo.Format(_T("leave channel %s"), getCurrentTime()); - m_btnJoinChannel.EnableWindow(FALSE); - } - } - - m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); -} - + // join channel in the engine. + if (0 == m_rtcEngine->joinChannel(APP_TOKEN, szChannelId.c_str(), m_uid, options)) + { + strInfo.Format(_T("join channel %s, use ChannelMediaOptions"), getCurrentTime()); + m_btnJoinChannel.EnableWindow(FALSE); + } + } + else + { + if (0 == m_rtcEngine->leaveChannel()) + { + strInfo.Format(_T("leave channel %s"), getCurrentTime()); + m_btnJoinChannel.EnableWindow(FALSE); + } + } + m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); +} void CLiveBroadcastingDlg::OnShowWindow(BOOL bShow, UINT nStatus) { - CDialogEx::OnShowWindow(bShow, nStatus); + CDialogEx::OnShowWindow(bShow, nStatus); - if (bShow) { - RenderLocalVideo(); + if (bShow) + { + RenderLocalVideo(); } else { @@ -541,121 +574,128 @@ void CLiveBroadcastingDlg::OnShowWindow(BOOL bShow, UINT nStatus) LRESULT CLiveBroadcastingDlg::OnEIDJoinChannelSuccess(WPARAM wParam, LPARAM lParam) { - m_btnJoinChannel.EnableWindow(TRUE); + m_btnJoinChannel.EnableWindow(TRUE); m_edtChannelName.EnableWindow(TRUE); - + m_joinChannel = true; - m_btnJoinChannel.SetWindowText(commonCtrlLeaveChannel); + m_btnJoinChannel.SetWindowText(commonCtrlLeaveChannel); - CString strInfo; - strInfo.Format(_T("%s:join success, uid=%u"), getCurrentTime(), wParam); - m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); + CString strInfo; + strInfo.Format(_T("%s:join success, uid=%u"), getCurrentTime(), wParam); + m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - m_videoWnds[0].SetUID(wParam); - m_lstUids.push_back(wParam); - //notify parent window - ::PostMessage(GetParent()->GetSafeHwnd(), WM_MSGID(EID_JOINCHANNEL_SUCCESS), TRUE, 0); - return 0; + m_videoWnds[0].SetUID(wParam); + m_lstUids.push_back(wParam); + // notify parent window + ::PostMessage(GetParent()->GetSafeHwnd(), WM_MSGID(EID_JOINCHANNEL_SUCCESS), TRUE, 0); + return 0; } LRESULT CLiveBroadcastingDlg::OnEIDLeaveChannel(WPARAM wParam, LPARAM lParam) { - m_btnJoinChannel.EnableWindow(TRUE); + m_btnJoinChannel.EnableWindow(TRUE); m_joinChannel = false; - m_btnJoinChannel.SetWindowText(commonCtrlJoinChannel); - - CString strInfo; - strInfo.Format(_T("leave channel success %s"), getCurrentTime()); - m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - m_lstUids.clear(); - for (int i = 0; i < m_maxVideoCount; i++) { - m_videoWnds[i].SetUID(0); - } - - //notify parent window - ::PostMessage(GetParent()->GetSafeHwnd(), WM_MSGID(EID_JOINCHANNEL_SUCCESS), FALSE, 0); - return 0; + m_btnJoinChannel.SetWindowText(commonCtrlJoinChannel); + + CString strInfo; + strInfo.Format(_T("leave channel success %s"), getCurrentTime()); + m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); + m_lstUids.clear(); + for (int i = 0; i < m_maxVideoCount; i++) + { + m_videoWnds[i].SetUID(0); + } + + // notify parent window + ::PostMessage(GetParent()->GetSafeHwnd(), WM_MSGID(EID_JOINCHANNEL_SUCCESS), FALSE, 0); + return 0; } LRESULT CLiveBroadcastingDlg::OnEIDUserJoined(WPARAM wParam, LPARAM lParam) { - if (m_lstUids.size() == m_maxVideoCount) - return 0; - CString strInfo; - strInfo.Format(_T("%u joined"), wParam); - m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - - m_lstUids.push_back(wParam); - for (int i = 1; i < m_maxVideoCount; i++) { - if (m_videoWnds[i].GetUID() == 0) { - VideoCanvas canvas; - canvas.uid = wParam; - canvas.view = m_videoWnds[i].GetSafeHwnd(); - canvas.renderMode = m_canvasRenderMode; + if (m_lstUids.size() == m_maxVideoCount) + return 0; + CString strInfo; + strInfo.Format(_T("%u joined"), wParam); + m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); + + m_lstUids.push_back(wParam); + for (int i = 1; i < m_maxVideoCount; i++) + { + if (m_videoWnds[i].GetUID() == 0) + { + VideoCanvas canvas; + canvas.uid = wParam; + canvas.view = m_videoWnds[i].GetSafeHwnd(); + canvas.renderMode = m_canvasRenderMode; canvas.backgroundColor = m_canvasColor; - //setup remote video in engine to the canvas. - m_rtcEngine->setupRemoteVideo(canvas); + // setup remote video in engine to the canvas. + m_rtcEngine->setupRemoteVideo(canvas); m_videoWnds[i].SetUID(wParam); - break; - } - } - return 0; + break; + } + } + return 0; } LRESULT CLiveBroadcastingDlg::OnEIDUserOffline(WPARAM wParam, LPARAM lParam) { - uid_t remoteUid = (uid_t)wParam; - VideoCanvas canvas; - canvas.uid = remoteUid; - canvas.view = NULL; - m_rtcEngine->setupRemoteVideo(canvas); - CString strInfo; - strInfo.Format(_T("%u offline, reason:%d"), remoteUid, lParam); - m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - - for (int i = 1; i < m_maxVideoCount; i++){ - if (m_videoWnds[i].GetUID() == remoteUid) { - m_videoWnds[i].SetUID(0); - m_videoWnds[i].Invalidate(); - break; - } - } - - for (auto iter = m_lstUids.begin(); - iter != m_lstUids.end(); iter++){ - if (*iter == remoteUid) { - m_lstUids.erase(iter); - break; - } - } - return 0; -} + uid_t remoteUid = (uid_t)wParam; + VideoCanvas canvas; + canvas.uid = remoteUid; + canvas.view = NULL; + m_rtcEngine->setupRemoteVideo(canvas); + CString strInfo; + strInfo.Format(_T("%u offline, reason:%d"), remoteUid, lParam); + m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); + + for (int i = 1; i < m_maxVideoCount; i++) + { + if (m_videoWnds[i].GetUID() == remoteUid) + { + m_videoWnds[i].SetUID(0); + m_videoWnds[i].Invalidate(); + break; + } + } + for (auto iter = m_lstUids.begin(); + iter != m_lstUids.end(); iter++) + { + if (*iter == remoteUid) + { + m_lstUids.erase(iter); + break; + } + } + return 0; +} void CLiveBroadcastingDlg::OnSelchangeListInfoBroadcasting() { - int sel = m_lstInfo.GetCurSel(); - if (sel < 0)return; - CString strDetail; - m_lstInfo.GetText(sel, strDetail); + int sel = m_lstInfo.GetCurSel(); + if (sel < 0) + return; + CString strDetail; + m_lstInfo.GetText(sel, strDetail); m_edtDetailInfo.SetWindowText(strDetail); } - void CLiveBroadcastingDlg::OnStnClickedStaticVideo() { } - -BOOL CLiveBroadcastingDlg::PreTranslateMessage(MSG* pMsg) +BOOL CLiveBroadcastingDlg::PreTranslateMessage(MSG *pMsg) { - if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { + if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) + { return TRUE; } return CDialogEx::PreTranslateMessage(pMsg); } -LRESULT CLiveBroadcastingDlg::OnEIDNetworkQuality(WPARAM wParam, LPARAM lParam) { +LRESULT CLiveBroadcastingDlg::OnEIDNetworkQuality(WPARAM wParam, LPARAM lParam) +{ PNetworkQuality quality = (PNetworkQuality)wParam; CString strInfo = _T("===onNetworkQuality==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); @@ -666,14 +706,16 @@ LRESULT CLiveBroadcastingDlg::OnEIDNetworkQuality(WPARAM wParam, LPARAM lParam) strInfo.Format(_T("rxQuality:%u"), quality->rxQuality); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - if (quality) { + if (quality) + { delete quality; quality = nullptr; } return 0; } -LRESULT CLiveBroadcastingDlg::onEIDRtcStats(WPARAM wParam, LPARAM lParam) { - RtcStats* stats = (RtcStats*)wParam; +LRESULT CLiveBroadcastingDlg::onEIDRtcStats(WPARAM wParam, LPARAM lParam) +{ + RtcStats *stats = (RtcStats *)wParam; CString strInfo = _T("===onRtcStats==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); strInfo.Format(_T("duration:%u"), stats->duration); @@ -718,7 +760,6 @@ LRESULT CLiveBroadcastingDlg::onEIDRtcStats(WPARAM wParam, LPARAM lParam) { strInfo.Format(_T("cpuTotalUsage:%u"), stats->cpuTotalUsage); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - strInfo.Format(_T("gatewayRtt:%u"), stats->gatewayRtt); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); strInfo.Format(_T("memoryAppUsageRatio:%u"), stats->memoryAppUsageRatio); @@ -755,16 +796,17 @@ LRESULT CLiveBroadcastingDlg::onEIDRtcStats(WPARAM wParam, LPARAM lParam) { strInfo.Format(_T("rxPacketLossRate:%u"), stats->rxPacketLossRate); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - - if (stats) { + if (stats) + { delete stats; stats = nullptr; } return 0; } -LRESULT CLiveBroadcastingDlg::onEIDLocalAudioStats(WPARAM wParam, LPARAM lParam) { - LocalAudioStats* stats = (LocalAudioStats*)wParam; +LRESULT CLiveBroadcastingDlg::onEIDLocalAudioStats(WPARAM wParam, LPARAM lParam) +{ + LocalAudioStats *stats = (LocalAudioStats *)wParam; CString strInfo = _T("===onLocalAudioStats==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); @@ -779,16 +821,18 @@ LRESULT CLiveBroadcastingDlg::onEIDLocalAudioStats(WPARAM wParam, LPARAM lParam) m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); m_videoWnds[0].SetAudioStatsInfo(stats->sentBitrate, stats->txPacketLossRate); - - if (stats) { + + if (stats) + { delete stats; stats = nullptr; } return 0; } -LRESULT CLiveBroadcastingDlg::onEIDLocalAudioStateChanged(WPARAM wParam, LPARAM lParam) { - LOCAL_AUDIO_STREAM_STATE state = (LOCAL_AUDIO_STREAM_STATE)wParam; +LRESULT CLiveBroadcastingDlg::onEIDLocalAudioStateChanged(WPARAM wParam, LPARAM lParam) +{ + LOCAL_AUDIO_STREAM_STATE state = (LOCAL_AUDIO_STREAM_STATE)wParam; LOCAL_AUDIO_STREAM_REASON error = (LOCAL_AUDIO_STREAM_REASON)lParam; CString strInfo = _T("===onLocalAudioStateChanged==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); @@ -798,11 +842,11 @@ LRESULT CLiveBroadcastingDlg::onEIDLocalAudioStateChanged(WPARAM wParam, LPARAM strInfo.Format(_T("error:%d"), error); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - return 0; } -LRESULT CLiveBroadcastingDlg::onEIDRemoteAudioStats(WPARAM wParam, LPARAM lParam) { - RemoteAudioStats* stats = (RemoteAudioStats*)wParam; +LRESULT CLiveBroadcastingDlg::onEIDRemoteAudioStats(WPARAM wParam, LPARAM lParam) +{ + RemoteAudioStats *stats = (RemoteAudioStats *)wParam; CString strInfo = _T("===onRemoteAudioStats==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); @@ -839,19 +883,22 @@ LRESULT CLiveBroadcastingDlg::onEIDRemoteAudioStats(WPARAM wParam, LPARAM lParam for (int i = 0; i < VIDEO_COUNT; i++) { - if (m_videoWnds[i].GetUID() == stats->uid) { + if (m_videoWnds[i].GetUID() == stats->uid) + { m_videoWnds[i].SetAudioStatsInfo(stats->receivedBitrate, stats->audioLossRate, stats->jitterBufferDelay); break; } } - if (stats) { + if (stats) + { delete stats; stats = nullptr; } return 0; } -LRESULT CLiveBroadcastingDlg::onEIDRemoteAudioStateChanged(WPARAM wParam, LPARAM lParam) { +LRESULT CLiveBroadcastingDlg::onEIDRemoteAudioStateChanged(WPARAM wParam, LPARAM lParam) +{ CString strInfo = _T("===onRemoteAudioStateChanged==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); PRemoteAudioState state = (PRemoteAudioState)wParam; @@ -866,8 +913,9 @@ LRESULT CLiveBroadcastingDlg::onEIDRemoteAudioStateChanged(WPARAM wParam, LPARAM m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); return 0; } -LRESULT CLiveBroadcastingDlg::onEIDLocalVideoStats(WPARAM wParam, LPARAM lParam) { - LocalVideoStats* stats = (LocalVideoStats*)wParam; +LRESULT CLiveBroadcastingDlg::onEIDLocalVideoStats(WPARAM wParam, LPARAM lParam) +{ + LocalVideoStats *stats = (LocalVideoStats *)wParam; CString strInfo = _T("===onLocalVideoStats==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); @@ -875,7 +923,7 @@ LRESULT CLiveBroadcastingDlg::onEIDLocalVideoStats(WPARAM wParam, LPARAM lParam) m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); strInfo.Format(_T("sentBitrate:%d"), stats->sentBitrate); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - + strInfo.Format(_T("sentFrameRate:%d"), stats->sentFrameRate); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); strInfo.Format(_T("encoderOutputFrameRate:%d"), stats->encoderOutputFrameRate); @@ -896,18 +944,18 @@ LRESULT CLiveBroadcastingDlg::onEIDLocalVideoStats(WPARAM wParam, LPARAM lParam) strInfo.Format(_T("codecType:%d"), stats->codecType); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - m_videoWnds[0].SetVideoStatsInfo(stats->encodedFrameWidth, stats->encodedFrameHeight, stats->sentFrameRate, stats->sentBitrate, stats->txPacketLossRate); - if (stats) { + if (stats) + { delete stats; stats = nullptr; } - return 0; } -LRESULT CLiveBroadcastingDlg::onEIDLocalVideoStateChanged(WPARAM wParam, LPARAM lParam) { +LRESULT CLiveBroadcastingDlg::onEIDLocalVideoStateChanged(WPARAM wParam, LPARAM lParam) +{ LOCAL_VIDEO_STREAM_STATE state = (LOCAL_VIDEO_STREAM_STATE)wParam; LOCAL_VIDEO_STREAM_REASON error = (LOCAL_VIDEO_STREAM_REASON)lParam; @@ -920,8 +968,9 @@ LRESULT CLiveBroadcastingDlg::onEIDLocalVideoStateChanged(WPARAM wParam, LPARAM m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); return 0; } -LRESULT CLiveBroadcastingDlg::onEIDRemoteVideoStats(WPARAM wParam, LPARAM lParam) { - RemoteVideoStats* stats = (RemoteVideoStats*)wParam; +LRESULT CLiveBroadcastingDlg::onEIDRemoteVideoStats(WPARAM wParam, LPARAM lParam) +{ + RemoteVideoStats *stats = (RemoteVideoStats *)wParam; CString strInfo = _T("===onRemoteVideoStats==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); @@ -965,20 +1014,23 @@ LRESULT CLiveBroadcastingDlg::onEIDRemoteVideoStats(WPARAM wParam, LPARAM lParam for (int i = 0; i < VIDEO_COUNT; i++) { - if (m_videoWnds[i].GetUID() == stats->uid) { - m_videoWnds[i].SetVideoStatsInfo(stats->width, stats->height, stats->decoderOutputFrameRate, - stats->receivedBitrate, stats->packetLossRate, stats->delay); + if (m_videoWnds[i].GetUID() == stats->uid) + { + m_videoWnds[i].SetVideoStatsInfo(stats->width, stats->height, stats->decoderOutputFrameRate, + stats->receivedBitrate, stats->packetLossRate, stats->delay); break; } } - if (stats) { + if (stats) + { delete stats; stats = nullptr; } return 0; } -LRESULT CLiveBroadcastingDlg::onEIDRemoteVideoStateChanged(WPARAM wParam, LPARAM lParam) { +LRESULT CLiveBroadcastingDlg::onEIDRemoteVideoStateChanged(WPARAM wParam, LPARAM lParam) +{ CString strInfo = _T("===onRemoteVideoStateChanged==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); PRemoteVideoState state = (PRemoteVideoState)wParam; @@ -995,7 +1047,8 @@ LRESULT CLiveBroadcastingDlg::onEIDRemoteVideoStateChanged(WPARAM wParam, LPARAM return 0; } -LRESULT CLiveBroadcastingDlg::onEIDContentInspectResult(WPARAM wParam, LPARAM lParam) { +LRESULT CLiveBroadcastingDlg::onEIDContentInspectResult(WPARAM wParam, LPARAM lParam) +{ CString strInfo = _T("===onContentInspectResult==="); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); CONTENT_INSPECT_RESULT result = (CONTENT_INSPECT_RESULT)wParam; @@ -1004,26 +1057,28 @@ LRESULT CLiveBroadcastingDlg::onEIDContentInspectResult(WPARAM wParam, LPARAM lP return 0; } -LRESULT CLiveBroadcastingDlg::onEIDSnapshotTaken(WPARAM wParam, LPARAM lParam) { +LRESULT CLiveBroadcastingDlg::onEIDSnapshotTaken(WPARAM wParam, LPARAM lParam) +{ CString strInfo = _T("===onEIDSnapshotTaken==="); - CString* filePath = reinterpret_cast(wParam); + CString *filePath = reinterpret_cast(wParam); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); int errCode = (int)lParam; strInfo.Format(_T("snapshot taken err:%d"), errCode); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); - if (errCode == 0) { + if (errCode == 0) + { strInfo.Format(_T("path: %s"), *filePath); m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); } - + delete filePath; return 0; } LRESULT CLiveBroadcastingDlg::onEIDVideoRenderingTracingResult(WPARAM wParam, LPARAM lParam) { - VideoRenderingTracingInfo* info = (VideoRenderingTracingInfo*)wParam; + VideoRenderingTracingInfo *info = (VideoRenderingTracingInfo *)wParam; uid_t uid = lParam; CString strInfo; @@ -1062,7 +1117,7 @@ void CLiveBroadcastingDlg::OnBnClickedCheckReport() { bool isCheck = m_chkReport.GetCheck() != 0; m_eventHandler.SetReport(isCheck); - + for (int i = 0; i < VIDEO_COUNT; i++) { m_videoWnds[i].ShowStatsInfo(isCheck, i != 0); @@ -1078,7 +1133,7 @@ void CLiveBroadcastingDlg::OnBnClickedModeration() config.moduleCount = 1; config.modules[0] = module; m_rtcEngine->enableContentInspect(m_chkModeration.GetCheck() != 0, config); - //TODO no callback + // TODO no callback } void CLiveBroadcastingDlg::OnBnClickedSnapshot() @@ -1087,7 +1142,6 @@ void CLiveBroadcastingDlg::OnBnClickedSnapshot() ::GetModuleFileName(NULL, szFilePath, MAX_PATH); LPTSTR lpLastSlash = _tcsrchr(szFilePath, _T('\\')); - SIZE_T nNameLen = MAX_PATH - (lpLastSlash - szFilePath + 1); _tcscpy_s(lpLastSlash + 1, nNameLen, _T("snapshot.jpg")); char filePath[MAX_PATH]; @@ -1097,43 +1151,46 @@ void CLiveBroadcastingDlg::OnBnClickedSnapshot() void CLiveBroadcastingDlg::OnBnClickedRadioEncoder(UINT idCtl) { - if (idCtl == IDC_RADIO_ENCODE_AUTO) { + if (idCtl == IDC_RADIO_ENCODE_AUTO) + { m_videoEncoderConfig.advanceOptions.encodingPreference = PREFER_AUTO; } - else if (idCtl == IDC_RADIO_ENCODE_HARD) { + else if (idCtl == IDC_RADIO_ENCODE_HARD) + { m_videoEncoderConfig.advanceOptions.encodingPreference = PREFER_HARDWARE; } - else if (idCtl == IDC_RADIO_ENCODE_SOFT) { + else if (idCtl == IDC_RADIO_ENCODE_SOFT) + { m_videoEncoderConfig.advanceOptions.encodingPreference = PREFER_SOFTWARE; } m_rtcEngine->setVideoEncoderConfiguration(m_videoEncoderConfig); } - void CLiveBroadcastingDlg::OnBnClickedCheckBFrame() { m_videoEncoderConfig.advanceOptions.compressionPreference = m_chkBFrame.GetCheck() ? PREFER_QUALITY : PREFER_LOW_LATENCY; m_rtcEngine->setVideoEncoderConfiguration(m_videoEncoderConfig); } - void CLiveBroadcastingDlg::OnBnClickedCheckFirstFrameOpt() { - if (m_chkFirstFrameOpt.GetCheck()) { + if (m_chkFirstFrameOpt.GetCheck()) + { UINT ret = MessageBox(liveBraodcastingFristFrameTipContent, liveBraodcastingFristFrameTip, MB_YESNO | MB_ICONQUESTION); - if (ret == IDYES) { + if (ret == IDYES) + { m_rtcEngine->enableInstantMediaRendering(); m_chkFirstFrameOpt.EnableWindow(FALSE); } - else { + else + { m_chkFirstFrameOpt.SetCheck(FALSE); } } } - void CLiveBroadcastingDlg::OnBnClickedButtonPreload() { if (!m_rtcEngine || !m_initialize) @@ -1141,15 +1198,17 @@ void CLiveBroadcastingDlg::OnBnClickedButtonPreload() CString strInfo; CString strChannelName; m_edtChannelName.GetWindowText(strChannelName); - if (strChannelName.IsEmpty()) { + if (strChannelName.IsEmpty()) + { AfxMessageBox(_T("Fill channel name first")); return; } std::string szChannelId = cs2utf8(strChannelName); m_uid = generateUid(); - //join channel in the engine. - if (0 == m_rtcEngine->preloadChannel(APP_TOKEN, szChannelId.c_str(), m_uid)) { + // join channel in the engine. + if (0 == m_rtcEngine->preloadChannel(APP_TOKEN, szChannelId.c_str(), m_uid)) + { strInfo.Format(_T("preloadChannel %s, uid=%d"), strChannelName, m_uid); m_edtChannelName.EnableWindow(FALSE); } @@ -1157,7 +1216,6 @@ void CLiveBroadcastingDlg::OnBnClickedButtonPreload() m_lstInfo.InsertString(m_lstInfo.GetCount(), strInfo); } - void CLiveBroadcastingDlg::OnBnClickedRadioCanvasRenderMode() { UpdateData(TRUE); @@ -1176,8 +1234,7 @@ void CLiveBroadcastingDlg::OnBnClickedRadioCanvasRenderMode() ResetVideoView(); } - -void CLiveBroadcastingDlg::OnNMCustomdrawSliderCanvasColor(NMHDR* pNMHDR, LRESULT* pResult) +void CLiveBroadcastingDlg::OnNMCustomdrawSliderCanvasColor(NMHDR *pNMHDR, LRESULT *pResult) { LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); *pResult = 0; @@ -1189,7 +1246,6 @@ void CLiveBroadcastingDlg::OnNMCustomdrawSliderCanvasColor(NMHDR* pNMHDR, LRESUL ResetVideoView(); } - void CLiveBroadcastingDlg::OnBnClickedCheckVideoImage() { if (!m_rtcEngine || !m_initialize) @@ -1201,3 +1257,29 @@ void CLiveBroadcastingDlg::OnBnClickedCheckVideoImage() options.fps = 15; m_rtcEngine->enableVideoImageSource(m_chkVideoImage.GetCheck(), options); } + +void CLiveBroadcastingDlg::OnNMCustomdrawSliderLocalfps(NMHDR *pNMHDR, LRESULT *pResult) +{ + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + *pResult = 0; + if (!m_rtcEngine || !m_initialize) + return; + int localfps = mLocalFpsSlider.GetPos(); + CString localfpsStr; + localfpsStr.Format(_T("local fps %d"), localfps); + m_lstInfo.InsertString(m_lstInfo.GetCount(),localfpsStr); + m_rtcEngine->setLocalRenderTargetFps(VIDEO_SOURCE_CAMERA,localfps); +} + +void CLiveBroadcastingDlg::OnNMCustomdrawSliderRemotefps(NMHDR *pNMHDR, LRESULT *pResult) +{ + LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR); + *pResult = 0; + if (!m_rtcEngine || !m_initialize) + return; + int remotefps = mRemoteFpsSlider.GetPos(); + CString remotefpsStr; + remotefpsStr.Format(_T("local fps %d"), remotefps); + m_lstInfo.InsertString(m_lstInfo.GetCount(),remotefpsStr); + m_rtcEngine->setRemoteRenderTargetFps(remotefps); +} diff --git a/windows/APIExample/APIExample/Basic/LiveBroadcasting/CLiveBroadcastingDlg.h b/windows/APIExample/APIExample/Basic/LiveBroadcasting/CLiveBroadcastingDlg.h index 4afde71a3..7ecf8ef6a 100755 --- a/windows/APIExample/APIExample/Basic/LiveBroadcasting/CLiveBroadcastingDlg.h +++ b/windows/APIExample/APIExample/Basic/LiveBroadcasting/CLiveBroadcastingDlg.h @@ -302,4 +302,8 @@ class CLiveBroadcastingDlg : public CDialogEx CStatic m_staCavasColor; CSliderCtrl m_sldCanvasColor; afx_msg void OnBnClickedCheckVideoImage(); + CSliderCtrl mLocalFpsSlider; + CSliderCtrl mRemoteFpsSlider; + afx_msg void OnNMCustomdrawSliderLocalfps(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnNMCustomdrawSliderRemotefps(NMHDR* pNMHDR, LRESULT* pResult); }; diff --git a/windows/APIExample/APIExample/Language.h b/windows/APIExample/APIExample/Language.h index 9a18d37b6..11455b740 100755 --- a/windows/APIExample/APIExample/Language.h +++ b/windows/APIExample/APIExample/Language.h @@ -351,3 +351,18 @@ extern wchar_t advancedMetadataSend[INFO_LEN]; //transparent background extern wchar_t TransparentBackground[INFO_LEN]; + +extern wchar_t RteUrlPlayer[INFO_LEN]; +extern wchar_t VideoEnhance[INFO_LEN]; + +extern wchar_t CrossChannelUpdateMediaRelay[INFO_LEN]; +extern wchar_t CrossChannelAddChannel[INFO_LEN]; +extern wchar_t CrossChannelRemoveChannel[INFO_LEN]; +extern wchar_t CrossChannelStartMediaRelay[INFO_LEN]; +extern wchar_t CrossChannelStopMediaRelay[INFO_LEN]; +extern wchar_t CrossChannelCtrlCrossChannel[INFO_LEN]; +extern wchar_t CrossChannelCrossChannelList[INFO_LEN]; +extern wchar_t CrossChannelCtrlToken[INFO_LEN]; +extern wchar_t CrossChannelCtrlUid[INFO_LEN]; + + diff --git a/windows/APIExample/APIExample/en.ini b/windows/APIExample/APIExample/en.ini index 0fad41a7c..1648e9c0e 100755 --- a/windows/APIExample/APIExample/en.ini +++ b/windows/APIExample/APIExample/en.ini @@ -306,4 +306,17 @@ Metadata.Video=Video Metadata Metadata.Audio=Audio Metadata Metadata.Send=Send -TransparentBackground=TransparentBackground \ No newline at end of file +TransparentBackground=TransparentBackground +RteUrlPlayer=RTE player +VideoEnhance=Video Enhance + + +CrossChannel.Ctrl.CrossChannel = CrossChannel +CrossChannel.Ctrl.Token = Token +CrossChannel.Ctrl.Uid = Uid +CrossChannel.Ctrl.CrossChannelList = CrossChannelList +CrossChannel.Ctrl.AddChannel = AddChannel +CrossChannel.Ctrl.RemoveChannel = RemoveChannel +CrossChannel.Ctrl.StartMediaRelay = StartMediaRelay +CrossChannel.Ctrl.StopMediaRelay = StopMediaRelay +CrossChannel.Ctrl.UpdateMediaRelay = UpdateMediaRelay \ No newline at end of file diff --git a/windows/APIExample/APIExample/resource.h b/windows/APIExample/APIExample/resource.h index 5cfaac205..e8e8825d1 100755 --- a/windows/APIExample/APIExample/resource.h +++ b/windows/APIExample/APIExample/resource.h @@ -50,6 +50,10 @@ #define IDB_BITMAP_REMOTE 170 #define IDB_BITMAP_SPEAKER 171 #define IDB_BITMAP_BG_LYELLOW 172 +#define IDD_DIALOG_RTE_PLAYER 177 +#define IDD_DIALOG_BEAUTY1 178 +#define IDD_DIALOG_VIDEO_ENHANCE 178 +#define IDD_DIALOG_BEAUTY_EX 178 #define IDC_BUTTON_FAQ 1000 #define IDC_BUTTON_DOCUMENT2 1001 #define IDC_BUTTON_DOCUMENT_WEBSITE 1001 @@ -70,7 +74,6 @@ #define IDC_STATIC_PERSONS 1018 #define IDC_STATIC_CHANNELNAME 1019 #define IDC_EDIT_CHANNELNAME 1020 -#define IDC_BUTTON1 1021 #define IDC_BUTTON_JOINCHANNEL 1021 #define IDC_BUTTON_START 1021 #define IDC_STATIC_INJECT_URL 1022 @@ -284,10 +287,12 @@ #define IDC_CHECK_ 1102 #define IDC_CHECK_LOWLIGHT 1102 #define IDC_CHECK_MUTE_LOCAL_AUDIO 1102 +#define IDC_CHECK_BEAUTY_SHAPE 1102 #define IDC_BUTTON_REMOVE 1103 #define IDC_COMBO_PLAYBACK 1103 #define IDC_CHECK_AUDIO_ZONE 1103 #define IDC_BUTTON_PRELOAD 1104 +#define IDC_CHECK_MAKE_UP 1104 #define IDC_BUTTON_PLAY_EFFECT 1105 #define IDC_STATIC_PLAYBACK 1105 #define IDC_BUTTON_PAUSE_EFFECT 1106 @@ -355,6 +360,8 @@ #define IDC_EDIT1 1129 #define IDC_EDIT_DETAIL_INFO 1129 #define IDC_STATIC_VIDEO_ECHO_TEST 1129 +#define IDC_EDIT_DEST_CHANNEL_NAME 1129 +#define IDC_EDIT_RTE_URL 1129 #define IDC_STATIC_TXBYTES_RXBTYES 1130 #define IDC_BUTTON_VIDEO_ECHO_TEST 1130 #define IDC_STATIC_TXBYTES_RXBYTES_VAL 1131 @@ -406,29 +413,60 @@ #define IDC_USER_ID 1152 #define IDC_STATIC_VIDEO_RIGHT 1152 #define IDC_EDIT_USER_ID 1153 +#define IDC_STATIC_Local_fps 1153 #define IDC_BUTTON_ADD_CROSS_CHANNEL 1154 +#define IDC_SLIDER_Local_fps 1154 #define IDC_CROSS_CHANNEL_LIST 1155 +#define IDC_SLIDER_Remote_fps 1155 #define IDC_COMBO_CROSS_CAHNNEL_LIST 1156 +#define IDC_STATIC_Remote_fps 1156 #define IDC_BUTTON_REMOVE_CROSS_CHANNEL2 1157 +#define IDC_STATIC_Dest_Channel_Name 1157 #define IDC_BUTTON_START_MEDIA_RELAY 1158 #define IDC_BUTTON_START_MEDIA_RELAY2 1159 #define IDC_BUTTON_UPDATE 1159 +#define IDC_CHEC_SECOND 1159 +#define IDC_CHECK_SECOND 1159 #define IDC_EDIT_PARAM1 1160 #define IDC_EDIT_PARAM2 1161 +#define IDC_BUTTON_PAUSE 1161 #define IDC_STATIC_PARAM1 1162 #define IDC_STATIC_PARAM2 1163 +#define IDC_SLIDER_BRIHTNESS 1163 #define IDC_CHECK_MODERATION 1164 +#define IDC_COMBO_BROW_STYLE 1164 #define IDC_CHECK_B_FRAME 1165 +#define IDC_SLIDER__BROW_STRENGTH 1165 #define IDC_CHECK_FIRST_FRAME_OPT 1166 +#define IDC_COMBO_BROW_COLOR 1166 #define IDC_CHECK_VIDEO_IMAGE 1167 +#define IDC_COMBO_FACE_SHAPE_STYLE 1167 +#define IDC_CHECK4 1167 +#define IDC_CHECK_EXTENTION 1167 +#define IDC_SLIDER__SHAPE_STYLE_INTENSITY 1168 +#define IDC_COMBO_LASH_STYLE 1169 +#define IDC_SLIDER__LASH_STRENGTH 1170 +#define IDC_COMBO_LASH_COLOR 1171 +#define IDC_COMBO_SHADOW_STYLE 1172 +#define IDC_SLIDER__SHADOW_STRENGTH 1173 +#define IDC_COMBO_PUPIL_STYLE 1174 +#define IDC_SLIDER__Pupil_STRENGTH 1175 +#define IDC_COMBO_BLUSH_STYLE 1176 +#define IDC_SLIDER__BLUSH_STRENGTH 1177 +#define IDC_COMBO_BLUSH_COLOR 1178 +#define IDC_COMBO_LIP_STYLE 1179 +#define IDC_SLIDER__LIP_STRENGTH 1180 +#define IDC_COMBO_LIP_COLOR 1181 +#define IDC_COMBO_FACE_SHAPE_AREA 1182 +#define IDC_SLIDER__SHAPE_AREA_INTENSITY 1183 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 177 +#define _APS_NEXT_RESOURCE_VALUE 181 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1153 +#define _APS_NEXT_CONTROL_VALUE 1168 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/windows/APIExample/APIExample/stdafx.cpp b/windows/APIExample/APIExample/stdafx.cpp index 8797e7223..e818aec38 100755 --- a/windows/APIExample/APIExample/stdafx.cpp +++ b/windows/APIExample/APIExample/stdafx.cpp @@ -323,6 +323,19 @@ wchar_t advancedMetadataSend[INFO_LEN] = { 0 }; //transparent backgroud wchar_t TransparentBackground[INFO_LEN] = { 0 }; +wchar_t RteUrlPlayer[INFO_LEN] = { 0 }; + +wchar_t VideoEnhance[INFO_LEN] = { 0 }; + +wchar_t CrossChannelUpdateMediaRelay[INFO_LEN] = { 0 }; +wchar_t CrossChannelAddChannel[INFO_LEN] = { 0 }; +wchar_t CrossChannelRemoveChannel[INFO_LEN] = { 0 }; +wchar_t CrossChannelStartMediaRelay[INFO_LEN] = { 0 }; +wchar_t CrossChannelStopMediaRelay[INFO_LEN] = { 0 }; +wchar_t CrossChannelCtrlCrossChannel[INFO_LEN] = { 0 }; +wchar_t CrossChannelCrossChannelList[INFO_LEN] = { 0 }; +wchar_t CrossChannelCtrlToken[INFO_LEN] = { 0 }; +wchar_t CrossChannelCtrlUid[INFO_LEN] = { 0 }; std::string cs2utf8(CString str) { @@ -773,8 +786,22 @@ void InitKeyInfomation() _tcscpy_s(advancedMetadataAudio, INFO_LEN, Str(_T("Metadata.Audio"))); _tcscpy_s(advancedMetadataSend, INFO_LEN, Str(_T("Metadata.Send"))); - //transparent bg - _tcscpy_s(TransparentBackground, INFO_LEN, Str(_T("TransparentBackground"))); + //transparent bg + _tcscpy_s(TransparentBackground, INFO_LEN, Str(_T("TransparentBackground"))); + //RteUrlPlayer + _tcscpy_s(RteUrlPlayer, INFO_LEN, Str(_T("RteUrlPlayer"))); + _tcscpy_s(VideoEnhance, INFO_LEN, Str(_T("VideoEnhance"))); + + + _tcscpy_s(CrossChannelAddChannel, INFO_LEN, Str(_T("CrossChannel.Ctrl.AddChannel"))); + _tcscpy_s(CrossChannelCrossChannelList, INFO_LEN, Str(_T("CrossChannel.Ctrl.CrossChannelList"))); + _tcscpy_s(CrossChannelCtrlCrossChannel, INFO_LEN, Str(_T("CrossChannel.Ctrl.CrossChannel"))); + _tcscpy_s(CrossChannelCtrlToken, INFO_LEN, Str(_T("CrossChannel.Ctrl.Token"))); + _tcscpy_s(CrossChannelCtrlUid, INFO_LEN, Str(_T("CrossChannel.Ctrl.Uid"))); + _tcscpy_s(CrossChannelRemoveChannel, INFO_LEN, Str(_T("CrossChannel.Ctrl.RemoveChannel"))); + _tcscpy_s(CrossChannelStartMediaRelay, INFO_LEN, Str(_T("CrossChannel.Ctrl.StartMediaRelay"))); + _tcscpy_s(CrossChannelStopMediaRelay, INFO_LEN, Str(_T("CrossChannel.Ctrl.StopMediaRelay"))); + _tcscpy_s(CrossChannelUpdateMediaRelay, INFO_LEN, Str(_T("CrossChannel.Ctrl.UpdateMediaRelay"))); /* _tcscpy_s(, INFO_LEN, Str(_T(""))); diff --git a/windows/APIExample/APIExample/zh-cn.ini b/windows/APIExample/APIExample/zh-cn.ini index 7d44135cb..ad54593b4 100755 --- a/windows/APIExample/APIExample/zh-cn.ini +++ b/windows/APIExample/APIExample/zh-cn.ini @@ -296,4 +296,16 @@ Metadata.Video= Metadata.Audio=音频元数据 Metadata.Send=发送 -TransparentBackground=透明背景 \ No newline at end of file +TransparentBackground=透明背景 +RteUrlPlayer=极速直播URL拉流 +VideoEnhance=视频增强 + +CrossChannel.Ctrl.CrossChannel = 跨越的频道名 +CrossChannel.Ctrl.Token = 令牌 +CrossChannel.Ctrl.Uid = 用户id +CrossChannel.Ctrl.CrossChannelList = 频道列表 +CrossChannel.Ctrl.AddChannel = 添加频道 +CrossChannel.Ctrl.RemoveChannel = 移除频道 +CrossChannel.Ctrl.StartMediaRelay = 开始媒体连接 +CrossChannel.Ctrl.StopMediaRelay = 断开媒体连接 +CrossChannel.Ctrl.UpdateMediaRelay = 更新媒体连接 \ No newline at end of file diff --git a/windows/APIExample/install.ps1 b/windows/APIExample/install.ps1 index 64d207336..7f457dcb4 100644 --- a/windows/APIExample/install.ps1 +++ b/windows/APIExample/install.ps1 @@ -1,6 +1,6 @@ $ThirdPartysrc = 'https://fullapp.oss-cn-beijing.aliyuncs.com/API-Examples/ThirdParty.zip' $ThirdPartydes = 'ThirdParty.zip' -$agora_sdk = 'https://download.agora.io/sdk/release/Agora_Native_SDK_for_Windows_v4.4.0_FULL.zip' +$agora_sdk = 'https://download.agora.io/sdk/release/Agora_Native_SDK_for_Windows_v4.5.0_FULL.zip' $agora_des = 'AgoraSdk.zip' $agora_local_sdk = '../../sdk' @@ -21,9 +21,9 @@ if (-not (Test-Path sdk)){ mkdir sdk\x64 mkdir sdk\high_level_api mkdir sdk\high_level_api\include - Copy-Item $agora_local_sdk\x86\* sdk - Copy-Item $agora_local_sdk\x86_64\* sdk\x64 - Copy-Item $agora_local_sdk\high_level_api\include\* sdk\high_level_api\include + Copy-Item $agora_local_sdk\x86\* sdk -Recurse + Copy-Item $agora_local_sdk\x86_64\* sdk\x64 -Recurse + Copy-Item $agora_local_sdk\high_level_api\include\* sdk\high_level_api\include -Recurse }else{ echo "download $agora_des" mkdir sdk diff --git a/windows/README.md b/windows/README.md index d1409a81d..3c10e12b8 100644 --- a/windows/README.md +++ b/windows/README.md @@ -128,6 +128,17 @@ You can directly run `APIExample/installThirdParty.bat` to automatically environ * Decrypt a video stream after receiving it from an onReceiveVideoPacket +### Transparent Background + +* Join the channel, send video streams, and receive video streams. +* Configure the canvas property `enableAlphaMask = true` during rendering. + +### Ultra-Low Latency Live Streaming URL Pull + +* Initialize Rte, Player, and register relevant callbacks. +* After successful initialization, you can call media-related methods, such as play, pause, etc. +* Handle exceptions in the player callback methods. + ## Connect Us - For potential issues, take a look at our [FAQ](https://docs.agora.io/cn/faq) first diff --git a/windows/README.zh.md b/windows/README.zh.md index 94fb52aa5..ebde19d87 100644 --- a/windows/README.zh.md +++ b/windows/README.zh.md @@ -151,6 +151,17 @@ * 浣跨敤MeidaPlayerExtensions 鍚慉goraRtc Engine鐨勯閬撴帹娴併 * 浣跨敤IMediaPlayerObserver鏉ュ鐞哅eidaPlayer鐨勫洖璋冧簨浠躲備緥濡傦紙鎵撳紑锛屾挱鏀撅級 +### 閫忔槑鑳屾櫙 + +* 鍔犲叆棰戦亾锛屽彂閫佽棰戞祦,鎺ュ彈瑙嗛娴侊紱 +* 娓叉煋鐨勬椂鍊欓厤缃甤anvas灞炴nableAlphaMask = true锛 + +### 鏋侀熺洿鎾璘RL鎷夋祦 + +* 鍒濆鍖朢te,Player,骞舵敞鍐岀浉鍏冲洖璋冿紱 +* 鍒濆鍖栨垚鍔熷悗,鍙互璋冪敤濯掍綋鐩稿叧鐨勬柟娉,姣斿play,pause绛夛紱 +* 鍦ㄦ挱鏀惧櫒鍥炶皟鏂规硶閲岄潰澶勭悊寮傚父鎯呭喌锛 + ## 鑱旂郴鎴戜滑 - 濡傛灉浣犻亣鍒颁簡鍥伴毦锛屽彲浠ュ厛鍙傞槄[甯歌闂](https://docs.agora.io/cn/faq)