\hypertarget{classagora_1_1rtc_1_1_i_rtc_engine}{}\doxysection{agora\+::rtc\+::I\+Rtc\+Engine Class Reference}
\label{classagora_1_1rtc_1_1_i_rtc_engine}\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}


{\ttfamily \#include $<$I\+Agora\+Rtc\+Engine.\+h$>$}

Inheritance diagram for agora\+::rtc\+::I\+Rtc\+Engine\+:\begin{figure}[H]
\begin{center}
\leavevmode
\includegraphics[height=3.000000cm]{classagora_1_1rtc_1_1_i_rtc_engine}
\end{center}
\end{figure}
\doxysubsection*{Public Member Functions}
\begin{DoxyCompactItemize}
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac71db65e66942e4e0a0550e95c16890f}{initialize}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_engine_context}{Rtc\+Engine\+Context}} \&context)=0
\begin{DoxyCompactList}\small\item\em Initializes {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}}. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a72d3f2bd9d94e1013fbf777790ac1447}{query\+Interface}} (I\+N\+T\+E\+R\+F\+A\+C\+E\+\_\+\+I\+D\+\_\+\+T\+Y\+PE iid, void $\ast$$\ast$inter)=0
\begin{DoxyCompactList}\small\item\em Gets the pointer to the specified interface. \end{DoxyCompactList}\item 
virtual const char $\ast$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa5605279f597cca69f77a062045675d6}{get\+Version}} (int $\ast$build)=0
\begin{DoxyCompactList}\small\item\em Gets the S\+DK version. \end{DoxyCompactList}\item 
virtual const char $\ast$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_af567b0dd7a1a498319549139fdf13f32}{get\+Error\+Description}} (int code)=0
\begin{DoxyCompactList}\small\item\em Gets the warning or error description. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a32294dda5cf780cd010dc6f4966957f2}{query\+Codec\+Capability}} (\mbox{\hyperlink{structagora_1_1rtc_1_1_codec_cap_info}{Codec\+Cap\+Info}} $\ast$codec\+Info, int \&size)=0
\begin{DoxyCompactList}\small\item\em Queries the video codec capabilities of the S\+DK. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a449e18c0f358915d93f33d84ba076aa3}{query\+Device\+Score}} ()=0
\begin{DoxyCompactList}\small\item\em Queries device score. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a88bf62cbd6542535f352fd75e69d84fc}{preload\+Channel}} (const char $\ast$token, const char $\ast$channel\+Id, uid\+\_\+t uid)=0
\begin{DoxyCompactList}\small\item\em Preloads a channel with {\ttfamily token}, {\ttfamily channel\+Id}, and {\ttfamily uid}. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8a1c886aa13e45a4a10902290b385f4a}{preload\+Channel\+With\+User\+Account}} (const char $\ast$token, const char $\ast$channel\+Id, const char $\ast$user\+Account)=0
\begin{DoxyCompactList}\small\item\em Preloads a channel with {\ttfamily token}, {\ttfamily channel\+Id}, and {\ttfamily user\+Account}. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_af1191ff4fcea57616ffa1fee5fb12f29}{update\+Preload\+Channel\+Token}} (const char $\ast$token)=0
\begin{DoxyCompactList}\small\item\em Updates the wildcard token for preloading channels. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_adc937172e59bd2695ea171553a88188c}{join\+Channel}} (const char $\ast$token, const char $\ast$channel\+Id, const char $\ast$info, uid\+\_\+t uid)=0
\begin{DoxyCompactList}\small\item\em Joins a channel. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3ea4eb99c644348bb88c91fb539873ae}{join\+Channel}} (const char $\ast$token, const char $\ast$channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Joins a channel with media options. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a42055d6697427736a267bf3ba04eb6cf}{update\+Channel\+Media\+Options}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Updates the channel media options after joining the channel. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a51c12d209373650638bfd82e28777081}{leave\+Channel}} ()=0
\begin{DoxyCompactList}\small\item\em Leaves a channel. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad5c2ef631e3e4076f6aec96ed1152262}{leave\+Channel}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_leave_channel_options}{Leave\+Channel\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Sets channel options and leaves the channel. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8f25b5ff97e2a070a69102e379295739}{renew\+Token}} (const char $\ast$token)=0
\begin{DoxyCompactList}\small\item\em Renews the token. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aab53788c74da25080bad61f0525d12ae}{set\+Channel\+Profile}} (C\+H\+A\+N\+N\+E\+L\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE profile)=0
\begin{DoxyCompactList}\small\item\em Sets the channel profile. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a89ca6a15d5a388f3c82038e74bad4040}{set\+Client\+Role}} (C\+L\+I\+E\+N\+T\+\_\+\+R\+O\+L\+E\+\_\+\+T\+Y\+PE role)=0
\begin{DoxyCompactList}\small\item\em Sets the client role. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7f01b7bbf512a041afa99ec7ecfa11c4}{set\+Client\+Role}} (C\+L\+I\+E\+N\+T\+\_\+\+R\+O\+L\+E\+\_\+\+T\+Y\+PE role, const \mbox{\hyperlink{structagora_1_1rtc_1_1_client_role_options}{Client\+Role\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Sets the user role and the audience latency level in a live streaming scenario. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a394c60056c0cd31af48e8015b0c553f4}{start\+Echo\+Test}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_echo_test_configuration}{Echo\+Test\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Starts an audio device loopback test. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae779da1c3fe153d73e8dfb2eb59ba9e4}{stop\+Echo\+Test}} ()=0
\begin{DoxyCompactList}\small\item\em Stops the audio call test. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7d35fc62d74685d25636f04b04051958}{enable\+Video}} ()=0
\begin{DoxyCompactList}\small\item\em Enables the video module. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac8eca0135b3ab7cecb84e2b81b89a85d}{disable\+Video}} ()=0
\begin{DoxyCompactList}\small\item\em Disables the video module. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aabd5f0d670a6cd26badc316083519512}{start\+Preview}} ()=0
\begin{DoxyCompactList}\small\item\em Enables the local video preview. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad0673c4d00d24983098fb3421bd59e01}{start\+Preview}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type)=0
\begin{DoxyCompactList}\small\item\em Enables the local video preview and specifies the video source for the preview. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab15f532e7a282050721ddcbb2075f27c}{stop\+Preview}} ()=0
\begin{DoxyCompactList}\small\item\em Stops the local video preview. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac4382fa969a0f23cbc066f2771f8b0ab}{stop\+Preview}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type)=0
\begin{DoxyCompactList}\small\item\em Stops the local video preview. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_adb3ab7a20afca02f5a5ab6fafe026f2b}{start\+Lastmile\+Probe\+Test}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_lastmile_probe_config}{Lastmile\+Probe\+Config}} \&config)=0
\begin{DoxyCompactList}\small\item\em Starts the last mile network probe test. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a94f3494035429684a750e1dee7ef1593}{stop\+Lastmile\+Probe\+Test}} ()=0
\begin{DoxyCompactList}\small\item\em Stops the last mile network probe test. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9bcbdcee0b5c52f96b32baec1922cf2e}{set\+Video\+Encoder\+Configuration}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_encoder_configuration}{Video\+Encoder\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Sets the video encoder configuration. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3823039f3d9749fda1c988659a3f3ead}{set\+Beauty\+Effect\+Options}} (bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_beauty_options}{Beauty\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Sets the image enhancement options. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2f2ed2bc4e091502857a5a10be604b31}{set\+Face\+Shape\+Beauty\+Options}} (bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_beauty_options}{Face\+Shape\+Beauty\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Sets the face shape options and specifies the media source. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8a7d8cc8ea8642453cd0fd7cea9c1b36}{set\+Face\+Shape\+Area\+Options}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_area_options}{Face\+Shape\+Area\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Sets the image enhancement options for facial areas and specifies the media source. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a35ce3e99fcaecfb6f73e1c07f3edaccc}{get\+Face\+Shape\+Beauty\+Options}} (\mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_beauty_options}{Face\+Shape\+Beauty\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Gets the beauty effect options. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a0c31f6ae7a49d94e70bb50a410e241b3}{get\+Face\+Shape\+Area\+Options}} (\mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_area_options_a97f633a1f186ffda5b0311ab429b4952}{agora\+::rtc\+::\+Face\+Shape\+Area\+Options\+::\+F\+A\+C\+E\+\_\+\+S\+H\+A\+P\+E\+\_\+\+A\+R\+EA}} shape\+Area, \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_area_options}{Face\+Shape\+Area\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Gets the facial beauty area options. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a60db339363023039dda38600c1e91d20}{set\+Filter\+Effect\+Options}} (bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_filter_effect_options}{Filter\+Effect\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Sets the filter effect options and specifies the media source. \end{DoxyCompactList}\item 
virtual \mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_video_effect_object}{I\+Video\+Effect\+Object}} $>$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a45545151306d919a617b01c1391c183e}{create\+Video\+Effect\+Object}} (const char $\ast$bundle\+Path, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Creates a video effect object. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_abee7355936e9de76c58da79562c070ac}{destroy\+Video\+Effect\+Object}} (\mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_video_effect_object}{I\+Video\+Effect\+Object}} $>$ video\+Effect\+Object)=0
\begin{DoxyCompactList}\small\item\em Destroys a video effect object. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_abbc47eef63740189f9ee6a02d8f231da}{set\+Lowlight\+Enhance\+Options}} (bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_lowlight_enhance_options}{Lowlight\+Enhance\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Sets low-\/light enhancement. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab1a6aabdd8a30919cca75ce27fd9f108}{set\+Video\+Denoiser\+Options}} (bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_denoiser_options}{Video\+Denoiser\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Sets video noise reduction. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a4275673ad9f1b717222e2339b3aaac2f}{set\+Color\+Enhance\+Options}} (bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_color_enhance_options}{Color\+Enhance\+Options}} \&options, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Sets color enhancement. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a704ef3e98e918bb2d3b1740bb2a6f6eb}{enable\+Virtual\+Background}} (bool enabled, \mbox{\hyperlink{structagora_1_1rtc_1_1_virtual_background_source}{Virtual\+Background\+Source}} background\+Source, \mbox{\hyperlink{structagora_1_1rtc_1_1_segmentation_property}{Segmentation\+Property}} segproperty, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Enables/\+Disables the virtual background. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac166814787b0a1d8da5f5c632dd7cdcf}{setup\+Remote\+Video}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_canvas}{Video\+Canvas}} \&canvas)=0
\begin{DoxyCompactList}\small\item\em Initializes the video view of a remote user. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a744003a9c0230684e985e42d14361f28}{setup\+Local\+Video}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_canvas}{Video\+Canvas}} \&canvas)=0
\begin{DoxyCompactList}\small\item\em Initializes the local video view. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acfbbb5486c091896605ee94254ab0665}{set\+Video\+Scenario}} (V\+I\+D\+E\+O\+\_\+\+A\+P\+P\+L\+I\+C\+A\+T\+I\+O\+N\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE scenario\+Type)=0
\begin{DoxyCompactList}\small\item\em Sets video application scenarios. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_add24d11a66e2afe95253e01ffe2002a5}{set\+Video\+Qo\+E\+Preference}} (V\+I\+D\+E\+O\+\_\+\+Q\+O\+E\+\_\+\+P\+R\+E\+F\+E\+R\+E\+N\+C\+E\+\_\+\+T\+Y\+PE qoe\+Preference)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a996401c7ba33c6ec59527c5d109f548f}{enable\+Audio}} ()=0
\begin{DoxyCompactList}\small\item\em Enables the audio module. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1929f01411e983ed776275fe8e8ad45e}{disable\+Audio}} ()=0
\begin{DoxyCompactList}\small\item\em Disables the audio module. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7c9aef3f4c8f9cb62e5ae3c4aa7ed81a}{set\+Audio\+Profile}} (A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE profile, A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE scenario) \+\_\+\+\_\+deprecated=0
\begin{DoxyCompactList}\small\item\em Sets the audio profile and audio scenario. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile}} (A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE profile)=0
\begin{DoxyCompactList}\small\item\em Sets audio profiles. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a81ae6611cdcdf32cf3e402fd64e364ef}{set\+Audio\+Scenario}} (A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE scenario)=0
\begin{DoxyCompactList}\small\item\em Sets audio scenarios. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa61051d91823a69fe6b04b5f541a8080}{enable\+Local\+Audio}} (bool enabled)=0
\begin{DoxyCompactList}\small\item\em Enables or disables the local audio capture. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a08a34d5b85a225390a18467c92a7b6f9}{mute\+Local\+Audio\+Stream}} (bool mute)=0
\begin{DoxyCompactList}\small\item\em Stops or resumes publishing the local audio stream. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac061a3c81eba2d203a7511e59466e6a0}{mute\+All\+Remote\+Audio\+Streams}} (bool mute)=0
\begin{DoxyCompactList}\small\item\em Stops or resumes subscribing to the audio streams of all remote users. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3dcf5cb6eea02d3e7b9da2638c510ca3}{mute\+Remote\+Audio\+Stream}} (uid\+\_\+t uid, bool mute)=0
\begin{DoxyCompactList}\small\item\em Stops or resumes subscribing to the audio stream of a specified user. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7707fb7110c72637ee98f659e8b796e9}{mute\+Local\+Video\+Stream}} (bool mute)=0
\begin{DoxyCompactList}\small\item\em Stops or resumes publishing the local video stream. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1877bb2aa655bbcbed57ffadd6424e51}{enable\+Local\+Video}} (bool enabled)=0
\begin{DoxyCompactList}\small\item\em Enables/\+Disables the local video capture. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a897a09788641f26252be642bb7045ee4}{mute\+All\+Remote\+Video\+Streams}} (bool mute)=0
\begin{DoxyCompactList}\small\item\em Stops or resumes subscribing to the video streams of all remote users. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9c7430fc0d692ad67e76b2a544deb354}{set\+Remote\+Default\+Video\+Stream\+Type}} (V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+T\+Y\+PE stream\+Type)=0
\begin{DoxyCompactList}\small\item\em Sets the default video stream type to subscribe to. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a00bda165de0a9e8558495bea18b1ee72}{mute\+Remote\+Video\+Stream}} (uid\+\_\+t uid, bool mute)=0
\begin{DoxyCompactList}\small\item\em Stops or resumes subscribing to the video stream of a specified user. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7c4564b1f4a00658b4f54960ede571a9}{set\+Remote\+Video\+Stream\+Type}} (uid\+\_\+t uid, V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+T\+Y\+PE stream\+Type)=0
\begin{DoxyCompactList}\small\item\em Sets the video stream type to subscribe to. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9aa3a3c0ceaeaa889cc73173044c305d}{set\+Remote\+Video\+Subscription\+Options}} (uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_subscription_options}{Video\+Subscription\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Options for subscribing to remote video streams. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1438e53a4bc22443e2918c8b05208222}{set\+Subscribe\+Audio\+Blocklist}} (uid\+\_\+t $\ast$uid\+List, int uid\+Number)=0
\begin{DoxyCompactList}\small\item\em Sets the blocklist of subscriptions for audio streams. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1c67bbf6f21f063db837c8b8a8b3caa4}{set\+Subscribe\+Audio\+Allowlist}} (uid\+\_\+t $\ast$uid\+List, int uid\+Number)=0
\begin{DoxyCompactList}\small\item\em Sets the allowlist of subscriptions for audio streams. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac29e3a697f157afdaf7e5ed831c072a7}{set\+Subscribe\+Video\+Blocklist}} (uid\+\_\+t $\ast$uid\+List, int uid\+Number)=0
\begin{DoxyCompactList}\small\item\em Sets the blocklist of subscriptions for video streams. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae2f201fe42cb9b580e30b9e638faa4a1}{set\+Subscribe\+Video\+Allowlist}} (uid\+\_\+t $\ast$uid\+List, int uid\+Number)=0
\begin{DoxyCompactList}\small\item\em Sets the allowlist of subscriptions for video streams. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a23981734852c4171c6e55f3ff910cde3}{enable\+Audio\+Volume\+Indication}} (int interval, int smooth, bool report\+Vad)=0
\begin{DoxyCompactList}\small\item\em Enables the reporting of users\textquotesingle{} volume indication. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2bcdb3713d087c6318a2e1972c1e8cc6}{start\+Audio\+Recording}} (const char $\ast$file\+Path, A\+U\+D\+I\+O\+\_\+\+R\+E\+C\+O\+R\+D\+I\+N\+G\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+T\+Y\+PE quality)=0
\begin{DoxyCompactList}\small\item\em Starts client-\/side audio recording with recording configuration. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3c05d82c97a9d63ebda116b9a1e5ca3f}{start\+Audio\+Recording}} (const char $\ast$file\+Path, int sample\+Rate, A\+U\+D\+I\+O\+\_\+\+R\+E\+C\+O\+R\+D\+I\+N\+G\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+T\+Y\+PE quality)=0
\begin{DoxyCompactList}\small\item\em Starts client-\/side audio recording and sets the recording sample rate. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ace2bdbb7456d52e117e80a96c9e9b7b4}{start\+Audio\+Recording}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_audio_recording_configuration}{Audio\+Recording\+Configuration}} \&config)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a92470d0cf6a44deb6b720faafbca522c}{register\+Audio\+Encoded\+Frame\+Observer}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_audio_encoded_frame_observer_config}{Audio\+Encoded\+Frame\+Observer\+Config}} \&config, \mbox{\hyperlink{classagora_1_1rtc_1_1_i_audio_encoded_frame_observer}{I\+Audio\+Encoded\+Frame\+Observer}} $\ast$observer)=0
\begin{DoxyCompactList}\small\item\em Registers an encoded audio observer. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_adb392026425663e5b9f90fe90130e5a5}{stop\+Audio\+Recording}} ()=0
\begin{DoxyCompactList}\small\item\em Stops client-\/side audio recording. \end{DoxyCompactList}\item 
virtual \mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ I\+Media\+Player $>$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae5fd78464db9420fdca3d493d7443bd0}{create\+Media\+Player}} ()=0
\begin{DoxyCompactList}\small\item\em Creates a media player object. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a71cb948b53e2d17c13bef4a6bfa57efc}{destroy\+Media\+Player}} (\mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ I\+Media\+Player $>$ media\+\_\+player)=0
\begin{DoxyCompactList}\small\item\em Destroys the media player instance. \end{DoxyCompactList}\item 
virtual \mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_media_recorder}{I\+Media\+Recorder}} $>$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae92091361a67f144662069758bceda5a}{create\+Media\+Recorder}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_recorder_stream_info}{Recorder\+Stream\+Info}} \&info)=0
\begin{DoxyCompactList}\small\item\em Creates an audio and video recording object. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac52255dc624918588b73837c07be0ae6}{destroy\+Media\+Recorder}} (\mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_media_recorder}{I\+Media\+Recorder}} $>$ media\+Recorder)=0
\begin{DoxyCompactList}\small\item\em Destroys an audio and video recording object. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8739ebb08c6d97c1ee708889ef834d5f}{start\+Audio\+Mixing}} (const char $\ast$file\+Path, bool loopback, int cycle)=0
\begin{DoxyCompactList}\small\item\em Starts playing the music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a88a90b9433ec193f9821738ba55e6ec3}{start\+Audio\+Mixing}} (const char $\ast$file\+Path, bool loopback, int cycle, int start\+Pos)=0
\begin{DoxyCompactList}\small\item\em Starts playing the music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2b90cbf4142c913b3efa795482713b08}{stop\+Audio\+Mixing}} ()=0
\begin{DoxyCompactList}\small\item\em Stops playing the music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab86885c38e7ee7a4b37d5bbacafcaa24}{pause\+Audio\+Mixing}} ()=0
\begin{DoxyCompactList}\small\item\em Pauses playing and mixing the music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a5a9606ad7ca4995e0d37fcf1642fe401}{resume\+Audio\+Mixing}} ()=0
\begin{DoxyCompactList}\small\item\em Resumes playing and mixing the music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a21e4aa7b76079be0f91f19acd5e9c42b}{select\+Audio\+Track}} (int index)=0
\begin{DoxyCompactList}\small\item\em Selects the audio track used during playback. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7d365b13d852a46192c663440c598304}{get\+Audio\+Track\+Count}} ()=0
\begin{DoxyCompactList}\small\item\em Gets the index of audio tracks of the current music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a544aee96b789ac5a57d26b61b7e1a5fa}{adjust\+Audio\+Mixing\+Volume}} (int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the volume during audio mixing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9fafbaaf39578810ec9c11360fc7f027}{adjust\+Audio\+Mixing\+Publish\+Volume}} (int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the volume of audio mixing for publishing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa65e55a9a331cfd32b36d8847a9631a4}{get\+Audio\+Mixing\+Publish\+Volume}} ()=0
\begin{DoxyCompactList}\small\item\em Retrieves the audio mixing volume for publishing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8677c3f3160927d25d9814a88ab06da6}{adjust\+Audio\+Mixing\+Playout\+Volume}} (int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the volume of audio mixing for local playback. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aed9dda5a7b2683776f41f6ba0e1f281c}{get\+Audio\+Mixing\+Playout\+Volume}} ()=0
\begin{DoxyCompactList}\small\item\em Retrieves the audio mixing volume for local playback. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6a87b6b9135a6f45095dcf6aa62295cb}{get\+Audio\+Mixing\+Duration}} ()=0
\begin{DoxyCompactList}\small\item\em Retrieves the duration (ms) of the music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aae54b86e9e6a7c0ed955b96f011855cb}{get\+Audio\+Mixing\+Current\+Position}} ()=0
\begin{DoxyCompactList}\small\item\em Retrieves the playback position (ms) of the music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6c69e2229c438fd587b8f81df34214ad}{set\+Audio\+Mixing\+Position}} (int pos)=0
\begin{DoxyCompactList}\small\item\em Sets the audio mixing position. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a4e7f7adc91ae46996f19c975357370e7}{set\+Audio\+Mixing\+Dual\+Mono\+Mode}} (media\+::\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+D\+U\+A\+L\+\_\+\+M\+O\+N\+O\+\_\+\+M\+O\+DE mode)=0
\begin{DoxyCompactList}\small\item\em Sets the channel mode of the current audio file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a26b117f7e097801b03522f7da9257425}{set\+Audio\+Mixing\+Pitch}} (int pitch)=0
\begin{DoxyCompactList}\small\item\em Sets the pitch of the local music file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1850045b8ced9a43118b660f808fed9e}{set\+Audio\+Mixing\+Playback\+Speed}} (int speed)=0
\begin{DoxyCompactList}\small\item\em Sets the playback speed of the current audio file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a0e9787c57db5b5e8fcc53ef5bb6d24c7}{get\+Effects\+Volume}} ()=0
\begin{DoxyCompactList}\small\item\em Retrieves the volume of the audio effects. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_add9a7fd856700acd288d47ff3c7da19d}{set\+Effects\+Volume}} (int volume)=0
\begin{DoxyCompactList}\small\item\em Sets the volume of the audio effects. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a075dd8a712ecd5f610004ca1bc089d4b}{preload\+Effect}} (int sound\+Id, const char $\ast$file\+Path, int start\+Pos=0)=0
\begin{DoxyCompactList}\small\item\em Preloads a specified audio effect file into the memory. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a49de4c18c3fbac4a5e905cd0e0243557}{play\+Effect}} (int sound\+Id, const char $\ast$file\+Path, int loop\+Count, double pitch, double pan, int gain, bool publish=false, int start\+Pos=0)=0
\begin{DoxyCompactList}\small\item\em Plays the specified local or online audio effect file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aba9b070620c7e7659841dd6f94331941}{play\+All\+Effects}} (int loop\+Count, double pitch, double pan, int gain, bool publish=false)=0
\begin{DoxyCompactList}\small\item\em Plays all audio effect files. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab53220e4d12755dc17410531d2b2eebb}{get\+Volume\+Of\+Effect}} (int sound\+Id)=0
\begin{DoxyCompactList}\small\item\em Gets the volume of a specified audio effect file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a08287428f277b7bf24d51a86ef61799b}{set\+Volume\+Of\+Effect}} (int sound\+Id, int volume)=0
\begin{DoxyCompactList}\small\item\em Gets the volume of a specified audio effect file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3c820db172c7fb43da58d81b7916d174}{pause\+Effect}} (int sound\+Id)=0
\begin{DoxyCompactList}\small\item\em Pauses a specified audio effect file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad731a94d9db9e2c3390e1443b379095f}{pause\+All\+Effects}} ()=0
\begin{DoxyCompactList}\small\item\em Pauses all audio effects. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6489955af474172afe4f4b44e4edb38a}{resume\+Effect}} (int sound\+Id)=0
\begin{DoxyCompactList}\small\item\em Resumes playing a specified audio effect. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2fc1b5996df964f8e12ce579e0eb5f98}{resume\+All\+Effects}} ()=0
\begin{DoxyCompactList}\small\item\em Resumes playing all audio effect files. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad74eb7c7799b8762bff2b1e7e7bba8b9}{stop\+Effect}} (int sound\+Id)=0
\begin{DoxyCompactList}\small\item\em Stops playing a specified audio effect. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a888ecfec4fda81831988898420d60e49}{stop\+All\+Effects}} ()=0
\begin{DoxyCompactList}\small\item\em Stops playing all audio effects. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa560240d5994be0c1a7853e96077e5f9}{unload\+Effect}} (int sound\+Id)=0
\begin{DoxyCompactList}\small\item\em Releases a specified preloaded audio effect from the memory. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8d94ddc41717887206a4502c42797919}{unload\+All\+Effects}} ()=0
\begin{DoxyCompactList}\small\item\em Releases a specified preloaded audio effect from the memory. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a4d2a31c0016d1da9106222edb6c395fd}{get\+Effect\+Duration}} (const char $\ast$file\+Path)=0
\begin{DoxyCompactList}\small\item\em Retrieves the duration of the audio effect file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acc753bf864b6c84d97c2d6778234c36e}{set\+Effect\+Position}} (int sound\+Id, int pos)=0
\begin{DoxyCompactList}\small\item\em Sets the playback position of an audio effect file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_abe60e8ce475a3fef96245ffc47e95e50}{get\+Effect\+Current\+Position}} (int sound\+Id)=0
\begin{DoxyCompactList}\small\item\em Retrieves the playback position of the audio effect file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac3f53f474760a834fef050937c4cf7fa}{enable\+Sound\+Position\+Indication}} (bool enabled)=0
\begin{DoxyCompactList}\small\item\em Enables or disables stereo panning for remote users. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac5c3755a1cca201b2a8066af07a653f6}{set\+Remote\+Voice\+Position}} (uid\+\_\+t uid, double pan, double gain)=0
\begin{DoxyCompactList}\small\item\em Sets the 2D position (the position on the horizontal plane) of the remote user\textquotesingle{}s voice. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac710640d68fa42f3130d1aaf3b8d3c4c}{enable\+Spatial\+Audio}} (bool enabled)=0
\begin{DoxyCompactList}\small\item\em Enables or disables the spatial audio effect. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a582150010c3e33a6acc23731c659f28e}{set\+Remote\+User\+Spatial\+Audio\+Params}} (uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1_spatial_audio_params}{agora\+::\+Spatial\+Audio\+Params}} \&params)=0
\begin{DoxyCompactList}\small\item\em Sets the spatial audio effect parameters of the remote user. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a577b68f53ed63771da80ec8901ed93e5}{set\+Voice\+Beautifier\+Preset}} (V\+O\+I\+C\+E\+\_\+\+B\+E\+A\+U\+T\+I\+F\+I\+E\+R\+\_\+\+P\+R\+E\+S\+ET preset)=0
\begin{DoxyCompactList}\small\item\em Sets a preset voice beautifier effect. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6111d2648909601c976b0190fe6de798}{set\+Audio\+Effect\+Preset}} (A\+U\+D\+I\+O\+\_\+\+E\+F\+F\+E\+C\+T\+\_\+\+P\+R\+E\+S\+ET preset)=0
\begin{DoxyCompactList}\small\item\em Sets an S\+DK preset audio effect. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aee9553948bf2c4e2b79a00cddce41499}{set\+Voice\+Conversion\+Preset}} (V\+O\+I\+C\+E\+\_\+\+C\+O\+N\+V\+E\+R\+S\+I\+O\+N\+\_\+\+P\+R\+E\+S\+ET preset)=0
\begin{DoxyCompactList}\small\item\em Sets a preset voice beautifier effect. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9e5a3c34818abd26b0d0a9434f7ce4ca}{set\+Audio\+Effect\+Parameters}} (A\+U\+D\+I\+O\+\_\+\+E\+F\+F\+E\+C\+T\+\_\+\+P\+R\+E\+S\+ET preset, int param1, int param2)=0
\begin{DoxyCompactList}\small\item\em Sets parameters for S\+DK preset audio effects. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe1e3302f3d1f670bc5cdaa870fe95e8}{set\+Voice\+Beautifier\+Parameters}} (V\+O\+I\+C\+E\+\_\+\+B\+E\+A\+U\+T\+I\+F\+I\+E\+R\+\_\+\+P\+R\+E\+S\+ET preset, int param1, int param2)=0
\begin{DoxyCompactList}\small\item\em Sets parameters for the preset voice beautifier effects. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a49e0ab572adf34b1b6be97f564ee5f20}{set\+Voice\+Conversion\+Parameters}} (V\+O\+I\+C\+E\+\_\+\+C\+O\+N\+V\+E\+R\+S\+I\+O\+N\+\_\+\+P\+R\+E\+S\+ET preset, int param1, int param2)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a43616f919e0906279dff5648830ce31a}{set\+Local\+Voice\+Pitch}} (double pitch)=0
\begin{DoxyCompactList}\small\item\em Changes the voice pitch of the local speaker. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a539a3345c38cc5d1d26edda69cf0661c}{set\+Local\+Voice\+Formant}} (double formant\+Ratio)=0
\begin{DoxyCompactList}\small\item\em Sets the formant ratio to change the timbre of human voice. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8c75994eb06ab26a1704715ec76e0189}{set\+Local\+Voice\+Equalization}} (A\+U\+D\+I\+O\+\_\+\+E\+Q\+U\+A\+L\+I\+Z\+A\+T\+I\+O\+N\+\_\+\+B\+A\+N\+D\+\_\+\+F\+R\+E\+Q\+U\+E\+N\+CY band\+Frequency, int band\+Gain)=0
\begin{DoxyCompactList}\small\item\em Sets the local voice equalization effect. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a4d1d1309f97f3c430a1aa2d060bb7316}{set\+Local\+Voice\+Reverb}} (A\+U\+D\+I\+O\+\_\+\+R\+E\+V\+E\+R\+B\+\_\+\+T\+Y\+PE reverb\+Key, int value)=0
\begin{DoxyCompactList}\small\item\em Sets the local voice reverberation. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3ca3d18cd35b00276d7ab4550805d943}{set\+Headphone\+E\+Q\+Preset}} (H\+E\+A\+D\+P\+H\+O\+N\+E\+\_\+\+E\+Q\+U\+A\+L\+I\+Z\+E\+R\+\_\+\+P\+R\+E\+S\+ET preset)=0
\begin{DoxyCompactList}\small\item\em Sets the preset headphone equalization effect. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a4938f94da646d1426aa64f7da7aa7791}{set\+Headphone\+E\+Q\+Parameters}} (int low\+Gain, int high\+Gain)=0
\begin{DoxyCompactList}\small\item\em Sets the low-\/ and high-\/frequency parameters of the headphone equalizer. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9dde13a03a2ba63d4ed310a704ce4d9a}{enable\+Voice\+A\+I\+Tuner}} (bool enabled, V\+O\+I\+C\+E\+\_\+\+A\+I\+\_\+\+T\+U\+N\+E\+R\+\_\+\+T\+Y\+PE type)=0
\begin{DoxyCompactList}\small\item\em Enables or disables the voice AI tuner. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae5a8ef2082a0ac196ecc128ee408def3}{set\+Log\+File}} (const char $\ast$file\+Path)=0
\begin{DoxyCompactList}\small\item\em Sets the log file. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acfc056b4c693d134bece8e7c0f05e69f}{set\+Log\+Filter}} (unsigned int filter)=0
\begin{DoxyCompactList}\small\item\em Sets the log output level of the S\+DK. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_af24a402778204b60effc6b3879391c10}{set\+Log\+Level}} (commons\+::\+L\+O\+G\+\_\+\+L\+E\+V\+EL level)=0
\begin{DoxyCompactList}\small\item\em Sets the output log level of the S\+DK. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1fa35cd4f874109a26895a95096a873f}{set\+Log\+File\+Size}} (unsigned int file\+Size\+In\+K\+Bytes)=0
\begin{DoxyCompactList}\small\item\em Sets the log file size. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a327761f03992c054589ce6ae3effd9c6}{upload\+Log\+File}} (\mbox{\hyperlink{classagora_1_1util_1_1_copyable_auto_ptr}{agora\+::util\+::\+A\+String}} \&request\+Id)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6c08c30ca9b36d84ac42282a4b2bfef3}{write\+Log}} (commons\+::\+L\+O\+G\+\_\+\+L\+E\+V\+EL level, const char $\ast$fmt,...)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad4b4ce6d5fda065b2c1d6aaff8f9884c}{set\+Local\+Render\+Mode}} (media\+::base\+::\+R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE render\+Mode, V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE mirror\+Mode)=0
\begin{DoxyCompactList}\small\item\em Updates the display mode of the local video view. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2aae3548ceb92aa929aafb61383a3dd6}{set\+Remote\+Render\+Mode}} (uid\+\_\+t uid, media\+::base\+::\+R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE render\+Mode, V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE mirror\+Mode)=0
\begin{DoxyCompactList}\small\item\em Updates the display mode of the video view of a remote user. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae1cc7218265d05caa22764091754ebb4}{set\+Local\+Render\+Target\+Fps}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type, int target\+Fps)=0
\begin{DoxyCompactList}\small\item\em Sets the maximum frame rate for rendering local video. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a732c9de0735852709030383c731c1042}{set\+Remote\+Render\+Target\+Fps}} (int target\+Fps)=0
\begin{DoxyCompactList}\small\item\em Sets the maximum frame rate for rendering remote video. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a87f5a5382b0dd7b54f30fc2f0ac83c4a}{set\+Local\+Render\+Mode}} (media\+::base\+::\+R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE render\+Mode) \+\_\+\+\_\+deprecated=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8f088ba753de27002bef49ede9d5ffbc}{set\+Local\+Video\+Mirror\+Mode}} (V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE mirror\+Mode) \+\_\+\+\_\+deprecated=0
\begin{DoxyCompactList}\small\item\em Sets the local video mirror mode. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3f67e39e02e64ffe4197ba243e71a2cf}{enable\+Dual\+Stream\+Mode}} (bool enabled) \+\_\+\+\_\+deprecated=0
\begin{DoxyCompactList}\small\item\em Enables or disables dual-\/stream mode on the sender side. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9db761169fa8d804d7fb8ea29484121c}{enable\+Dual\+Stream\+Mode}} (bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}} \&stream\+Config) \+\_\+\+\_\+deprecated=0
\begin{DoxyCompactList}\small\item\em Sets the dual-\/stream mode on the sender side and the low-\/quality video stream. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2c0cc7b801522f781bfd0eda3557f854}{set\+Dual\+Stream\+Mode}} (S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE mode)=0
\begin{DoxyCompactList}\small\item\em Sets the dual-\/stream mode on the sender side. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3902458a9581bbc36168518cfd10d19a}{set\+Simulcast\+Config}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_config}{Simulcast\+Config}} \&simulcast\+Config)=0
\begin{DoxyCompactList}\small\item\em Sets the simulcast video stream configuration. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a33c7eebc75e9a5bbde3904467657eb54}{set\+Dual\+Stream\+Mode}} (S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE mode, const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}} \&stream\+Config)=0
\begin{DoxyCompactList}\small\item\em Sets dual-\/stream mode configuration on the sender side. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a14e8afb96a2586a2eec56dec5c5abe45}{enable\+Custom\+Audio\+Local\+Playback}} (track\+\_\+id\+\_\+t track\+Id, bool enabled)=0
\begin{DoxyCompactList}\small\item\em Sets whether to enable the local playback of external audio source. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2c4717760b5fbf1bb8c1a3c16ca67fe5}{set\+Recording\+Audio\+Frame\+Parameters}} (int sample\+Rate, int channel, R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE mode, int samples\+Per\+Call)=0
\begin{DoxyCompactList}\small\item\em Sets the format of the captured raw audio data. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa5f2f6eb3db5acaaf8c40818d90694f1}{set\+Playback\+Audio\+Frame\+Parameters}} (int sample\+Rate, int channel, R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE mode, int samples\+Per\+Call)=0
\begin{DoxyCompactList}\small\item\em Sets the format of the raw audio playback data. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_af94beec91b7fcf0b20414b75b65580ff}{set\+Mixed\+Audio\+Frame\+Parameters}} (int sample\+Rate, int channel, int samples\+Per\+Call)=0
\begin{DoxyCompactList}\small\item\em Sets the format of the raw audio data after mixing for audio capture and playback. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a384f37f6a46ed650ca86e144aee9e5b9}{set\+Ear\+Monitoring\+Audio\+Frame\+Parameters}} (int sample\+Rate, int channel, R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE mode, int samples\+Per\+Call)=0
\begin{DoxyCompactList}\small\item\em Sets the format of the in-\/ear monitoring raw audio data. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_af6acd5694dad022464f21dcc5d0002fc}{set\+Playback\+Audio\+Frame\+Before\+Mixing\+Parameters}} (int sample\+Rate, int channel)=0
\begin{DoxyCompactList}\small\item\em Sets the format of the raw audio playback data before mixing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9244809c9f2fbe1f0fe85b3c8ea030a1}{set\+Playback\+Audio\+Frame\+Before\+Mixing\+Parameters}} (int sample\+Rate, int channel, int samples\+Per\+Call)=0
\begin{DoxyCompactList}\small\item\em Sets the format of audio data in the {\ttfamily on\+Playback\+Audio\+Frame\+Before\+Mixing} callback. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a719e9cf665fdd4fe4dfef84dd51828e2}{enable\+Audio\+Spectrum\+Monitor}} (int interval\+In\+MS=100)=0
\begin{DoxyCompactList}\small\item\em Turns on audio spectrum monitoring. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab00fdf2439e00078f8993cf6f3e38b88}{disable\+Audio\+Spectrum\+Monitor}} ()=0
\begin{DoxyCompactList}\small\item\em Disables audio spectrum monitoring. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a257451a0a792e2d2588154e216c429f6}{register\+Audio\+Spectrum\+Observer}} (\mbox{\hyperlink{classagora_1_1media_1_1_i_audio_spectrum_observer}{agora\+::media\+::\+I\+Audio\+Spectrum\+Observer}} $\ast$observer)=0
\begin{DoxyCompactList}\small\item\em Registers an audio spectrum observer. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6d6690527d2fcff60d1c2e8e8a74b7f0}{unregister\+Audio\+Spectrum\+Observer}} (\mbox{\hyperlink{classagora_1_1media_1_1_i_audio_spectrum_observer}{agora\+::media\+::\+I\+Audio\+Spectrum\+Observer}} $\ast$observer)=0
\begin{DoxyCompactList}\small\item\em Unregisters the audio spectrum observer. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acf94e9e0122f09d0450475d7c5809036}{adjust\+Recording\+Signal\+Volume}} (int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the capturing signal volume. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3d0ebedd137aa0dcc8e8978854c26682}{mute\+Recording\+Signal}} (bool mute)=0
\begin{DoxyCompactList}\small\item\em Whether to mute the recording signal. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a98919705c8b2346811f91f9ce5e97a79}{adjust\+Playback\+Signal\+Volume}} (int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the playback signal volume of all remote users. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_abf7aed322b8f0979cf9313ad99b85775}{adjust\+User\+Playback\+Signal\+Volume}} (uid\+\_\+t uid, int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the playback signal volume of a specified remote user. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afd251e3f353a31d470ff9e60c3c3c5de}{set\+Remote\+Subscribe\+Fallback\+Option}} (S\+T\+R\+E\+A\+M\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+T\+I\+O\+NS option)=0
\begin{DoxyCompactList}\small\item\em Sets the fallback option for the subscribed video stream based on the network conditions. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6d91b4c3234f741d1210db9d0c6a96ba}{set\+High\+Priority\+User\+List}} (uid\+\_\+t $\ast$uid\+List, int uid\+Num, S\+T\+R\+E\+A\+M\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+T\+I\+O\+NS option)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac6fc97b54f53ebc5cc28049a04d51170}{enable\+Extension}} (const char $\ast$provider, const char $\ast$extension, const \mbox{\hyperlink{structagora_1_1rtc_1_1_extension_info}{Extension\+Info}} \&extension\+Info, bool enable=true)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afd6dc645147e9d4021dfa7ff673f2b3d}{set\+Extension\+Property}} (const char $\ast$provider, const char $\ast$extension, const \mbox{\hyperlink{structagora_1_1rtc_1_1_extension_info}{Extension\+Info}} \&extension\+Info, const char $\ast$key, const char $\ast$value)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa43c2767b29faee996d99e6d785d13f7}{get\+Extension\+Property}} (const char $\ast$provider, const char $\ast$extension, const \mbox{\hyperlink{structagora_1_1rtc_1_1_extension_info}{Extension\+Info}} \&extension\+Info, const char $\ast$key, char $\ast$value, int buf\+\_\+len)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a86e2db9244c0edc395168a1ab6708102}{enable\+Loopback\+Recording}} (bool enabled, const char $\ast$device\+Name=N\+U\+LL)=0
\begin{DoxyCompactList}\small\item\em Enables loopback audio capturing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a95cdc3a285845cb35d56f470a0b488fb}{adjust\+Loopback\+Signal\+Volume}} (int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the volume of the signal captured by the sound card. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac94bc111056036c08e259c84696bb9bd}{get\+Loopback\+Recording\+Volume}} ()=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab4650e81f9f5496f63d472b548e03aaa}{enable\+In\+Ear\+Monitoring}} (bool enabled, int include\+Audio\+Filters)=0
\begin{DoxyCompactList}\small\item\em Enables in-\/ear monitoring. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a407fdc268519a4a23a102afec44bf2e6}{set\+In\+Ear\+Monitoring\+Volume}} (int volume)=0
\begin{DoxyCompactList}\small\item\em Sets the volume of the in-\/ear monitor. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a518b9d2f480aa83c4e58cc9992f4cbd0}{set\+Extension\+Provider\+Property}} (const char $\ast$provider, const char $\ast$key, const char $\ast$value)=0
\begin{DoxyCompactList}\small\item\em Sets the properties of the extension provider. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aaff3d6b73766da76f3a8e8173a901409}{register\+Extension}} (const char $\ast$provider, const char $\ast$extension, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+U\+N\+K\+N\+O\+W\+N\+\_\+\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Registers an extension. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6c4e1fabb81aef573de88a215a19da9b}{enable\+Extension}} (const char $\ast$provider, const char $\ast$extension, bool enable=true, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+U\+N\+K\+N\+O\+W\+N\+\_\+\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Enables or disables extensions. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa268792b9208cf687afff31c106166f9}{set\+Extension\+Property}} (const char $\ast$provider, const char $\ast$extension, const char $\ast$key, const char $\ast$value, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+U\+N\+K\+N\+O\+W\+N\+\_\+\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Sets the properties of the extension. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a18ecaaccf0c6ddb32f05a443c0d8c98c}{get\+Extension\+Property}} (const char $\ast$provider, const char $\ast$extension, const char $\ast$key, char $\ast$value, int buf\+\_\+len, agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type=agora\+::media\+::\+U\+N\+K\+N\+O\+W\+N\+\_\+\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+CE)=0
\begin{DoxyCompactList}\small\item\em Gets detailed information on the extensions. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aaa9b17c5a938b8331dba774f37f94e65}{set\+Camera\+Capturer\+Configuration}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_camera_capturer_configuration}{Camera\+Capturer\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Sets the camera capture configuration. \end{DoxyCompactList}\item 
virtual video\+\_\+track\+\_\+id\+\_\+t \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a94236ec10e44896d3a133d411d0b8958}{create\+Custom\+Video\+Track}} ()=0
\begin{DoxyCompactList}\small\item\em Creates a custom video track. \end{DoxyCompactList}\item 
virtual video\+\_\+track\+\_\+id\+\_\+t \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad89333616fea3ae501b77000624b95a1}{create\+Custom\+Encoded\+Video\+Track}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_sender_options}{Sender\+Options}} \&sender\+\_\+option)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a5adc6cc95c913646b2a993ed21729440}{destroy\+Custom\+Video\+Track}} (video\+\_\+track\+\_\+id\+\_\+t video\+\_\+track\+\_\+id)=0
\begin{DoxyCompactList}\small\item\em Destroys the specified video track. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a84e88acc42701119a7a5d997e3142f5b}{destroy\+Custom\+Encoded\+Video\+Track}} (video\+\_\+track\+\_\+id\+\_\+t video\+\_\+track\+\_\+id)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_af67688d89526926718edb26938d65541}{get\+Call\+Id}} (\mbox{\hyperlink{classagora_1_1util_1_1_copyable_auto_ptr}{agora\+::util\+::\+A\+String}} \&call\+Id)=0
\begin{DoxyCompactList}\small\item\em Retrieves the call ID. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a748c30a6339ec9798daa0d1b21585411}{rate}} (const char $\ast$call\+Id, int rating, const char $\ast$description)=0
\begin{DoxyCompactList}\small\item\em Allows a user to rate a call after the call ends. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab8031b21d72c846e9d501fbe6ca10678}{complain}} (const char $\ast$call\+Id, const char $\ast$description)=0
\begin{DoxyCompactList}\small\item\em Allows a user to complain about the call quality after a call ends. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acfc4de5d9454cad1dfd1d154e180d78c}{start\+Rtmp\+Stream\+Without\+Transcoding}} (const char $\ast$url)=0
\begin{DoxyCompactList}\small\item\em Starts pushing media streams to a C\+DN without transcoding. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a0f91aa3af0a7c9a8428966028b5a010c}{start\+Rtmp\+Stream\+With\+Transcoding}} (const char $\ast$url, const \mbox{\hyperlink{structagora_1_1rtc_1_1_live_transcoding}{Live\+Transcoding}} \&transcoding)=0
\begin{DoxyCompactList}\small\item\em Starts Media Push and sets the transcoding configuration. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8689685218a15a34a376944555340261}{update\+Rtmp\+Transcoding}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_live_transcoding}{Live\+Transcoding}} \&transcoding)=0
\begin{DoxyCompactList}\small\item\em Updates the transcoding configuration. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3eea37dd1b80a9246816903b965716ca}{start\+Local\+Video\+Transcoder}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_transcoder_configuration}{Local\+Transcoder\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Starts the local video mixing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7057d7b1b8b5bca1b622fe10c4e29950}{update\+Local\+Transcoder\+Configuration}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_transcoder_configuration}{Local\+Transcoder\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Updates the local video mixing configuration. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab9807b2e5fb708d01066759af02cc630}{stop\+Rtmp\+Stream}} (const char $\ast$url)=0
\begin{DoxyCompactList}\small\item\em Stops pushing media streams to a C\+DN. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a417bb1e2c3564a4c349357cdba1bb11b}{stop\+Local\+Video\+Transcoder}} ()=0
\begin{DoxyCompactList}\small\item\em Stops the local video mixing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3b43b690a4137b0172cd09f70b079a4b}{start\+Local\+Audio\+Mixer}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_audio_mixer_configuration}{Local\+Audio\+Mixer\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Starts local audio mixing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a24e94ea7f4ec5f5830608d05965eacf4}{update\+Local\+Audio\+Mixer\+Configuration}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_audio_mixer_configuration}{Local\+Audio\+Mixer\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Updates the configurations for mixing audio streams locally. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afde87fec9cd23387436b5a918975a454}{stop\+Local\+Audio\+Mixer}} ()=0
\begin{DoxyCompactList}\small\item\em Stops the local audio mixing. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad01a4f17cfec60596b5cae7bb59b2394}{start\+Camera\+Capture}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type, const \mbox{\hyperlink{structagora_1_1rtc_1_1_camera_capturer_configuration}{Camera\+Capturer\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Starts camera capture. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a28bd9fd55b81d3790c8f6792f10ff739}{stop\+Camera\+Capture}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type)=0
\begin{DoxyCompactList}\small\item\em Stops camera capture. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab035f52a3b59ac873e08f792d9e76620}{set\+Camera\+Device\+Orientation}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type, V\+I\+D\+E\+O\+\_\+\+O\+R\+I\+E\+N\+T\+A\+T\+I\+ON orientation)=0
\begin{DoxyCompactList}\small\item\em Sets the rotation angle of the captured video. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae05a33fd4fb688bb24dbbb5162100528}{set\+Screen\+Capture\+Orientation}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE type, V\+I\+D\+E\+O\+\_\+\+O\+R\+I\+E\+N\+T\+A\+T\+I\+ON orientation)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad984f3f62e584e8909a0491aac41c4e8}{start\+Screen\+Capture}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type, const \mbox{\hyperlink{structagora_1_1rtc_1_1_screen_capture_configuration}{Screen\+Capture\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Starts screen capture from the specified video source. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a93e3f9ae0e115a54d2af79d1b96dda7d}{stop\+Screen\+Capture}} (V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type)=0
\begin{DoxyCompactList}\small\item\em Stops screen capture from the specified video source. \end{DoxyCompactList}\item 
virtual C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+T\+Y\+PE \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a512b149d4dc249c04f9e30bd31767362}{get\+Connection\+State}} ()=0
\begin{DoxyCompactList}\small\item\em Gets the current connection state of the S\+DK. \end{DoxyCompactList}\item 
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae10bc942d2684b474d53b9c0c2d442ab}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae10bc942d2684b474d53b9c0c2d442ab}} 
virtual bool {\bfseries register\+Event\+Handler} (\mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler}{I\+Rtc\+Engine\+Event\+Handler}} $\ast$event\+Handler)=0
\item 
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aafe546bd6adc0a82847bdcd2f9201823}\label{classagora_1_1rtc_1_1_i_rtc_engine_aafe546bd6adc0a82847bdcd2f9201823}} 
virtual bool {\bfseries unregister\+Event\+Handler} (\mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler}{I\+Rtc\+Engine\+Event\+Handler}} $\ast$event\+Handler)=0
\item 
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aecb5d85e9b3a60947d569b88253da710}\label{classagora_1_1rtc_1_1_i_rtc_engine_aecb5d85e9b3a60947d569b88253da710}} 
virtual int {\bfseries set\+Remote\+User\+Priority} (uid\+\_\+t uid, P\+R\+I\+O\+R\+I\+T\+Y\+\_\+\+T\+Y\+PE user\+Priority)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a95b53a32d598c3d98a51c24f7f9af4b4}{register\+Packet\+Observer}} (\mbox{\hyperlink{classagora_1_1rtc_1_1_i_packet_observer}{I\+Packet\+Observer}} $\ast$observer)=0
\begin{DoxyCompactList}\small\item\em Registers a packet observer. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad5ea5f0dfd8117f38d9c4b12fe01fece}{enable\+Encryption}} (bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_encryption_config}{Encryption\+Config}} \&config)=0
\begin{DoxyCompactList}\small\item\em Enables or disables the built-\/in encryption. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a5a3f0168ca6e2e298e4677e9a8b9550a}{create\+Data\+Stream}} (int $\ast$stream\+Id, bool reliable, bool ordered)=0
\begin{DoxyCompactList}\small\item\em Creates a data stream. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acf920f7dc761e2d7b7e28006c74238b7}{create\+Data\+Stream}} (int $\ast$stream\+Id, const \mbox{\hyperlink{structagora_1_1rtc_1_1_data_stream_config}{Data\+Stream\+Config}} \&config)=0
\begin{DoxyCompactList}\small\item\em Creates a data stream. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7006214f7ca3c08d83cc0a4ebcb9febc}{send\+Stream\+Message}} (int stream\+Id, const char $\ast$data, size\+\_\+t length)=0
\begin{DoxyCompactList}\small\item\em Sends data stream messages. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_abec7a493c27c4c0474dac59a23808879}{send\+Rdt\+Message}} (uid\+\_\+t uid, Rdt\+Stream\+Type type, const char $\ast$data, size\+\_\+t length)=0
\begin{DoxyCompactList}\small\item\em Send Reliable message to remote uid in channel. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8eac7c2de06ec8b37b187d4e66ef68fe}{send\+Media\+Control\+Message}} (uid\+\_\+t uid, const char $\ast$data, size\+\_\+t length)=0
\begin{DoxyCompactList}\small\item\em Send media control message. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a4caf3477d91c3aa0ea8b178948cad8d5}{add\+Video\+Watermark}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_image}{Rtc\+Image}} \&watermark) \+\_\+\+\_\+deprecated=0
\begin{DoxyCompactList}\small\item\em Adds a watermark image to the local video. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a36e51346ec3bd5a7370d7c70d58d9394}{add\+Video\+Watermark}} (const char $\ast$watermark\+Url, const \mbox{\hyperlink{structagora_1_1rtc_1_1_watermark_options}{Watermark\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Adds a watermark image to the local video. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a5cde5446ecdd10c5ee5c8926517d414d}{add\+Video\+Watermark}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_watermark_config}{Watermark\+Config}} \&configs)=0
\begin{DoxyCompactList}\small\item\em Adds a watermark image to the local video. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac9404c8b56e3fa20b94cbe5dcd489e5e}{remove\+Video\+Watermark}} (const char $\ast$id)=0
\begin{DoxyCompactList}\small\item\em Removes the watermark image from the local video. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aea42a1ea8b83bc807f68526945f40ec6}{clear\+Video\+Watermarks}} ()=0
\begin{DoxyCompactList}\small\item\em Removes the watermark image from the video stream. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7729c859bb2ae7f565ab7a57cf7b6158}{pause\+Audio}} () \+\_\+\+\_\+deprecated=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a566a23231286f5286fdb137966093e9f}{resume\+Audio}} () \+\_\+\+\_\+deprecated=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a5ac70d12ca9b204410c02a9cc1159606}{enable\+Web\+Sdk\+Interoperability}} (bool enabled) \+\_\+\+\_\+deprecated=0
\begin{DoxyCompactList}\small\item\em Enables interoperability with the Agora Web S\+DK (applicable only in the live streaming. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afb6b404d722dd664a39af3919e085213}{send\+Custom\+Report\+Message}} (const char $\ast$id, const char $\ast$category, const char $\ast$event, const char $\ast$label, int value)=0
\begin{DoxyCompactList}\small\item\em Reports customized messages. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a84dbf06de1d769b63200d7ec0289cca0}{register\+Media\+Metadata\+Observer}} (\mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer}{I\+Metadata\+Observer}} $\ast$observer, \mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer_a50ad8779d161456fc709d947b8c7c544}{I\+Metadata\+Observer\+::\+M\+E\+T\+A\+D\+A\+T\+A\+\_\+\+T\+Y\+PE}} type)=0
\begin{DoxyCompactList}\small\item\em Registers the metadata observer. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ace712f59f6fb50d3f9c5f89cffb5e49e}{unregister\+Media\+Metadata\+Observer}} (\mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer}{I\+Metadata\+Observer}} $\ast$observer, \mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer_a50ad8779d161456fc709d947b8c7c544}{I\+Metadata\+Observer\+::\+M\+E\+T\+A\+D\+A\+T\+A\+\_\+\+T\+Y\+PE}} type)=0
\begin{DoxyCompactList}\small\item\em Unregisters the specified metadata observer. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_af1e558f8fe811ca501f3c04234053a03}{start\+Audio\+Frame\+Dump}} (const char $\ast$channel\+\_\+id, uid\+\_\+t uid, const char $\ast$location, const char $\ast$uuid, const char $\ast$passwd, long duration\+\_\+ms, bool auto\+\_\+upload)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a273c143c4df3e74b9aea29d4027b2e9c}{stop\+Audio\+Frame\+Dump}} (const char $\ast$channel\+\_\+id, uid\+\_\+t uid, const char $\ast$location)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2a447c3a89480e5bca78af01d3188710}{set\+A\+I\+N\+S\+Mode}} (bool enabled, A\+U\+D\+I\+O\+\_\+\+A\+I\+N\+S\+\_\+\+M\+O\+DE mode)=0
\begin{DoxyCompactList}\small\item\em Sets whether to enable the AI ​​noise suppression function and set the noise suppression mode. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a0d44b74ced4005ee86353c13186f870d}{register\+Local\+User\+Account}} (const char $\ast$app\+Id, const char $\ast$user\+Account)=0
\begin{DoxyCompactList}\small\item\em Registers a user account. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a14f8c308c6c57c55653552b939a8527a}{join\+Channel\+With\+User\+Account}} (const char $\ast$token, const char $\ast$channel\+Id, const char $\ast$user\+Account)=0
\begin{DoxyCompactList}\small\item\em Joins a channel with a User Account and Token. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac503f610f1d6bdfa1def75a94646b489}{join\+Channel\+With\+User\+Account}} (const char $\ast$token, const char $\ast$channel\+Id, const char $\ast$user\+Account, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Join a channel using a user account and token, and set the media options. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a124148443b2438da668fb683e96a9f41}{join\+Channel\+With\+User\+Account\+Ex}} (const char $\ast$token, const char $\ast$channel\+Id, const char $\ast$user\+Account, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} \&options, \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler}{I\+Rtc\+Engine\+Event\+Handler}} $\ast$event\+Handler)=0
\begin{DoxyCompactList}\small\item\em Join a channel using a user account and token, and set the media options. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acba378be5f666f84c64713197587dc43}{get\+User\+Info\+By\+User\+Account}} (const char $\ast$user\+Account, \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{rtc\+::\+User\+Info}} $\ast$user\+Info)=0
\begin{DoxyCompactList}\small\item\em Gets the user information by passing in the user account. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7a34efc30c42f0c200aacd6a6f1dc386}{get\+User\+Info\+By\+Uid}} (uid\+\_\+t uid, \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{rtc\+::\+User\+Info}} $\ast$user\+Info)=0
\begin{DoxyCompactList}\small\item\em Gets the user information by passing in the user ID. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acba3bb84e41b87472ad9936bde372552}{start\+Or\+Update\+Channel\+Media\+Relay}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_relay_configuration}{Channel\+Media\+Relay\+Configuration}} \&configuration)=0
\begin{DoxyCompactList}\small\item\em Starts relaying media streams across channels or updates channels for media relay. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab4a1c52a83a08f7dacab6de36f4681b8}{stop\+Channel\+Media\+Relay}} ()=0
\begin{DoxyCompactList}\small\item\em Stops the media stream relay. Once the relay stops, the host quits all the target channels. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6761e2f090290567d1f592841c40d96c}{pause\+All\+Channel\+Media\+Relay}} ()=0
\begin{DoxyCompactList}\small\item\em Pauses the media stream relay to all target channels. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a92a74b5b3752d285dfdb769607220e70}{resume\+All\+Channel\+Media\+Relay}} ()=0
\begin{DoxyCompactList}\small\item\em Resumes the media stream relay to all target channels. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aab97152512979f2a3b23b7e2d725d43c}{set\+Direct\+Cdn\+Streaming\+Audio\+Configuration}} (A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE profile)=0
\begin{DoxyCompactList}\small\item\em Sets the audio profile of the audio streams directly pushed to the C\+DN by the host. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6c69261e800f7e7c691bdc439b97d077}{set\+Direct\+Cdn\+Streaming\+Video\+Configuration}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_encoder_configuration}{Video\+Encoder\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Sets the video profile of the media streams directly pushed to the C\+DN by the host. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a92946ac873b25e343da2f63b4d421ac6}{start\+Direct\+Cdn\+Streaming}} (\mbox{\hyperlink{classagora_1_1rtc_1_1_i_direct_cdn_streaming_event_handler}{I\+Direct\+Cdn\+Streaming\+Event\+Handler}} $\ast$event\+Handler, const char $\ast$publish\+Url, const \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Starts pushing media streams to the C\+DN directly. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1f179ea962004b38b31a43716162bb75}{stop\+Direct\+Cdn\+Streaming}} ()=0
\begin{DoxyCompactList}\small\item\em Stops pushing media streams to the C\+DN directly. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aaff02b17e9cc532b9ac907059d7926c0}{update\+Direct\+Cdn\+Streaming\+Media\+Options}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}} \&options)=0
\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2899990fedbf999432466b3f8ddaea1f}{start\+Rhythm\+Player}} (const char $\ast$sound1, const char $\ast$sound2, const Agora\+Rhythm\+Player\+Config \&config)=0
\begin{DoxyCompactList}\small\item\em Enables the virtual metronome. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab20b4c61b34a95b3f5e08dd2da48779e}{stop\+Rhythm\+Player}} ()=0
\begin{DoxyCompactList}\small\item\em Disables the virtual metronome. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab79a8bc476bcc23c81862576bd058d99}{config\+Rhythm\+Player}} (const Agora\+Rhythm\+Player\+Config \&config)=0
\begin{DoxyCompactList}\small\item\em Configures the virtual metronome. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a5a751731d775a65b67c52a9e4f167844}{take\+Snapshot}} (uid\+\_\+t uid, const char $\ast$file\+Path)=0
\begin{DoxyCompactList}\small\item\em Takes a snapshot of a video stream. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa2f627ab6af61861628c04066453e8df}{take\+Snapshot}} (uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1media_1_1_snapshot_config}{media\+::\+Snapshot\+Config}} \&config)=0
\begin{DoxyCompactList}\small\item\em Takes a screenshot of the video at the specified observation point. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac0caaeeaaffaebc35cd2312d05f85b93}{enable\+Content\+Inspect}} (bool enabled, const \mbox{\hyperlink{structagora_1_1media_1_1_content_inspect_config}{media\+::\+Content\+Inspect\+Config}} \&config)=0
\begin{DoxyCompactList}\small\item\em Enables or disables video screenshot and upload. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aad25371db340982772decfcf62aa2247}{adjust\+Custom\+Audio\+Publish\+Volume}} (track\+\_\+id\+\_\+t track\+Id, int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the volume of the custom audio track played remotely. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a6cbbb9eccfa51c5a62664050db67530f}{adjust\+Custom\+Audio\+Playout\+Volume}} (track\+\_\+id\+\_\+t track\+Id, int volume)=0
\begin{DoxyCompactList}\small\item\em Adjusts the volume of the custom audio track played locally. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aff1329c23bbcaff769101ae08f91b869}{set\+Cloud\+Proxy}} (C\+L\+O\+U\+D\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+T\+Y\+PE proxy\+Type)=0
\begin{DoxyCompactList}\small\item\em Sets up cloud proxy service. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a00358b706ea747938165984198b16009}{set\+Local\+Access\+Point}} (const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_access_point_configuration}{Local\+Access\+Point\+Configuration}} \&config)=0
\begin{DoxyCompactList}\small\item\em Configures the connection to Agora\textquotesingle{}s Private Media Server access module. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa670b2c3dff1726603c3a1a90f1afe49}{set\+Advanced\+Audio\+Options}} (\mbox{\hyperlink{structagora_1_1rtc_1_1_advanced_audio_options}{Advanced\+Audio\+Options}} \&options, int source\+Type=0)=0
\begin{DoxyCompactList}\small\item\em Sets audio advanced options. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab8ffc1ea81220f8002e4520265ecc93c}{set\+A\+V\+Sync\+Source}} (const char $\ast$channel\+Id, uid\+\_\+t uid)=0
\begin{DoxyCompactList}\small\item\em Sets audio-\/video synchronization for the sender. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a38dfb62675bf5d36d13aca09b08753f7}{enable\+Video\+Image\+Source}} (bool enable, const \mbox{\hyperlink{structagora_1_1rtc_1_1_image_track_options}{Image\+Track\+Options}} \&options)=0
\begin{DoxyCompactList}\small\item\em Sets whether to replace the current video feeds with images when publishing video streams. \end{DoxyCompactList}\item 
virtual int64\+\_\+t \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac584ff03c6ac1f0b23d8bf4d43d99075}{get\+Current\+Monotonic\+Time\+In\+Ms}} ()=0
\begin{DoxyCompactList}\small\item\em Gets the current Monotonic Time of the S\+DK. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a89cd1b4d85e8eac5e7faf5a199f20884}{get\+Network\+Type}} ()=0
\begin{DoxyCompactList}\small\item\em Gets the type of the local network connection. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae3eb20847152978256482faeefcafb7b}{set\+Parameters}} (const char $\ast$parameters)=0
\begin{DoxyCompactList}\small\item\em Provides technical preview functionalities or special customizations by configuring the S\+DK with J\+S\+ON options. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a48313e38de920085528b0017cfc91672}{start\+Media\+Rendering\+Tracing}} ()=0
\begin{DoxyCompactList}\small\item\em Enables tracing the video frame rendering process. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab47250a1a4e0e3eb82916ea75017dd4f}{enable\+Instant\+Media\+Rendering}} ()=0
\begin{DoxyCompactList}\small\item\em Enables audio and video frame instant rendering. \end{DoxyCompactList}\item 
virtual uint64\+\_\+t \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ae5109a2a8ca8a3106961ee783d6c0cf6}{get\+Ntp\+Wall\+Time\+In\+Ms}} ()=0
\begin{DoxyCompactList}\small\item\em Gets the current N\+TP (Network Time Protocol) time. \end{DoxyCompactList}\item 
virtual bool \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a90aef5ccd7a6002b407925c14ab11131}{is\+Feature\+Available\+On\+Device}} (Feature\+Type type)=0
\begin{DoxyCompactList}\small\item\em Checks whether the device supports the specified advanced feature. \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aebe07c328e87d4f374b06a437e2bacde}{send\+Audio\+Metadata}} (const char $\ast$metadata, size\+\_\+t length)=0
\begin{DoxyCompactList}\small\item\em send audio metadata \end{DoxyCompactList}\item 
virtual int \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a8ba17007e0e12805eba89378d4c0b0cb}{query\+H\+D\+R\+Capability}} (V\+I\+D\+E\+O\+\_\+\+M\+O\+D\+U\+L\+E\+\_\+\+T\+Y\+PE video\+Module, H\+D\+R\+\_\+\+C\+A\+P\+A\+B\+I\+L\+I\+TY \&capability)=0
\begin{DoxyCompactList}\small\item\em Queries the H\+DR capability of the video module. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Static Public Member Functions}
\begin{DoxyCompactItemize}
\item 
static A\+G\+O\+R\+A\+\_\+\+C\+P\+P\+\_\+\+A\+PI void \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aa71c4d4d192fa484c8cefb7b250a9d5a}{release}} (Rtc\+Engine\+Release\+Callback callback=nullptr)
\begin{DoxyCompactList}\small\item\em Releases the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} instance. \end{DoxyCompactList}\end{DoxyCompactItemize}


\doxysubsection{Detailed Description}
The \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}} class, which is the basic interface of the Agora S\+DK that implements the core functions of real-\/time communication.

{\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} provides the main methods that your app can call. 

\doxysubsection{Member Function Documentation}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa71c4d4d192fa484c8cefb7b250a9d5a}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa71c4d4d192fa484c8cefb7b250a9d5a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!release@{release}}
\index{release@{release}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{release()}{release()}}
{\footnotesize\ttfamily static A\+G\+O\+R\+A\+\_\+\+C\+P\+P\+\_\+\+A\+PI void agora\+::rtc\+::\+I\+Rtc\+Engine\+::release (\begin{DoxyParamCaption}\item[{Rtc\+Engine\+Release\+Callback}]{callback = {\ttfamily nullptr} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}}



Releases the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} instance. 

This method releases all resources used by the Agora S\+DK. Use this method for apps in which users occasionally make voice or video calls. When users do not make calls, you can free up resources for other operations. After a successful method call, you can no longer use any method or callback in the S\+DK anymore. If you want to use the real-\/time communication functions again, you must call {\ttfamily create\+Agora\+Rtc\+Engine} and {\ttfamily initialize} to create a new {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} instance.

\begin{DoxyNote}{Note}
Agora does not recommend you calling {\ttfamily release} in any callback of the S\+DK. Otherwise, the S\+DK cannot release the resources until the callbacks return results, which may result in a deadlock.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em callback} & (\mbox{\hyperlink{classagora_1_1_optional}{Optional}}) Callback function pointer for setting the destruction mode of the engine to either synchronous or asynchronous. See {\ttfamily Rtc\+Engine\+Release\+Callback}.
\begin{DoxyItemize}
\item Non {\ttfamily nullptr}\+: Destroy the engine asynchronously. The method will return immediately, at which point the engine resources may not have been fully released yet. After the engine is destroyed, the S\+DK triggers {\ttfamily Rtc\+Engine\+Release\+Callback}.
\item {\ttfamily nullptr}\+: Destroy the engine synchronously. This method only returns after the engine resources have been fully released. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac71db65e66942e4e0a0550e95c16890f}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac71db65e66942e4e0a0550e95c16890f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!initialize@{initialize}}
\index{initialize@{initialize}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{initialize()}{initialize()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::initialize (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_engine_context}{Rtc\+Engine\+Context}} \&}]{context }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Initializes {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}}. 

Call timing\+: Before calling other A\+P\+Is, you must call {\ttfamily create\+Agora\+Rtc\+Engine} and {\ttfamily initialize} to create and initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object.

\begin{DoxyNote}{Note}
The S\+DK supports creating only one {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} instance for an app. All called methods provided by the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} class are executed asynchronously. Agora recommends calling these methods in the same thread.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em context} & Configurations for the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} instance. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_engine_context}{Rtc\+Engine\+Context}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid.
\item -\/7\+: The S\+DK is not initialized.
\item -\/22\+: The resource request failed. The S\+DK fails to allocate resources because your app consumes too much system resource or the system resources are insufficient.
\item -\/101\+: The App ID is invalid. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a72d3f2bd9d94e1013fbf777790ac1447}\label{classagora_1_1rtc_1_1_i_rtc_engine_a72d3f2bd9d94e1013fbf777790ac1447}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!queryInterface@{queryInterface}}
\index{queryInterface@{queryInterface}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{queryInterface()}{queryInterface()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::query\+Interface (\begin{DoxyParamCaption}\item[{I\+N\+T\+E\+R\+F\+A\+C\+E\+\_\+\+I\+D\+\_\+\+T\+Y\+PE}]{iid,  }\item[{void $\ast$$\ast$}]{inter }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the pointer to the specified interface. 


\begin{DoxyParams}{Parameters}
{\em iid} & The ID of the interface. See {\ttfamily I\+N\+T\+E\+R\+F\+A\+C\+E\+\_\+\+I\+D\+\_\+\+T\+Y\+PE}. \\
\hline
{\em inter} & An output parameter. The pointer to the specified interface.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}


Implements \mbox{\hyperlink{classagora_1_1base_1_1_i_engine_base}{agora\+::base\+::\+I\+Engine\+Base}}.

\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa5605279f597cca69f77a062045675d6}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa5605279f597cca69f77a062045675d6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getVersion@{getVersion}}
\index{getVersion@{getVersion}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getVersion()}{getVersion()}}
{\footnotesize\ttfamily virtual const char$\ast$ agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Version (\begin{DoxyParamCaption}\item[{int $\ast$}]{build }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the S\+DK version. 


\begin{DoxyParams}{Parameters}
{\em build} & The S\+DK build index.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
The S\+DK version number. The format is a string. 
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_af567b0dd7a1a498319549139fdf13f32}\label{classagora_1_1rtc_1_1_i_rtc_engine_af567b0dd7a1a498319549139fdf13f32}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getErrorDescription@{getErrorDescription}}
\index{getErrorDescription@{getErrorDescription}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getErrorDescription()}{getErrorDescription()}}
{\footnotesize\ttfamily virtual const char$\ast$ agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Error\+Description (\begin{DoxyParamCaption}\item[{int}]{code }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the warning or error description. 


\begin{DoxyParams}{Parameters}
{\em code} & The error code reported by the S\+DK.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
The specific error description. 
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a32294dda5cf780cd010dc6f4966957f2}\label{classagora_1_1rtc_1_1_i_rtc_engine_a32294dda5cf780cd010dc6f4966957f2}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!queryCodecCapability@{queryCodecCapability}}
\index{queryCodecCapability@{queryCodecCapability}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{queryCodecCapability()}{queryCodecCapability()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::query\+Codec\+Capability (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_codec_cap_info}{Codec\+Cap\+Info}} $\ast$}]{codec\+Info,  }\item[{int \&}]{size }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Queries the video codec capabilities of the S\+DK. 


\begin{DoxyParams}{Parameters}
{\em codec\+Info} & Input and output parameter. An array representing the video codec capabilities of the S\+DK. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_codec_cap_info}{Codec\+Cap\+Info}}}.
\begin{DoxyItemize}
\item Input value\+: One {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_codec_cap_info}{Codec\+Cap\+Info}}} defined by the user when executing this method, representing the video codec capability to be queried.
\item Output value\+: The {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_codec_cap_info}{Codec\+Cap\+Info}}} after the method is executed, representing the actual video codec capabilities of the S\+DK. 
\end{DoxyItemize}\\
\hline
{\em size} & Input and output parameter, represent the size of the {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_codec_cap_info}{Codec\+Cap\+Info}}} array.
\begin{DoxyItemize}
\item Input value\+: Size of the {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_codec_cap_info}{Codec\+Cap\+Info}}} defined by the user when executing the method.
\item Output value\+: Size of the output {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_codec_cap_info}{Codec\+Cap\+Info}}} after this method is executed.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a449e18c0f358915d93f33d84ba076aa3}\label{classagora_1_1rtc_1_1_i_rtc_engine_a449e18c0f358915d93f33d84ba076aa3}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!queryDeviceScore@{queryDeviceScore}}
\index{queryDeviceScore@{queryDeviceScore}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{queryDeviceScore()}{queryDeviceScore()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::query\+Device\+Score (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Queries device score. 

Applicable scenarios\+: In high-\/definition or ultra-\/high-\/definition video scenarios, you can first call this method to query the device\textquotesingle{}s score. If the returned score is low (for example, below 60), you need to lower the video resolution to avoid affecting the video experience. The minimum device score required for different business scenarios is varied. For specific score recommendations, please {\ttfamily technical support}.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item $>$0\+: The method call succeeeds, the value is the current device\textquotesingle{}s score, the range is \mbox{[}0,100\mbox{]}, the larger the value, the stronger the device capability. Most devices are rated between 60 and 100.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a88bf62cbd6542535f352fd75e69d84fc}\label{classagora_1_1rtc_1_1_i_rtc_engine_a88bf62cbd6542535f352fd75e69d84fc}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!preloadChannel@{preloadChannel}}
\index{preloadChannel@{preloadChannel}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{preloadChannel()}{preloadChannel()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::preload\+Channel (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token,  }\item[{const char $\ast$}]{channel\+Id,  }\item[{uid\+\_\+t}]{uid }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Preloads a channel with {\ttfamily token}, {\ttfamily channel\+Id}, and {\ttfamily uid}. 

When audience members need to switch between different channels frequently, calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host. If you join a preloaded channel, leave it and want to rejoin the same channel, you do not need to call this method unless the token for preloading the channel expires. Call timing\+: To improve the user experience of preloading channels, Agora recommends that before joining the channel, calling this method as early as possible once confirming the channel name and user information.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item When calling this method, ensure you set the user role as audience and do not set the audio scenario as {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+C\+H\+O\+R\+US}, otherwise, this method does not take effect.
\item You also need to make sure that the channel name, user ID and token passed in for preloading are the same as the values passed in when joinning the channel, otherwise, this method does not take effect.
\item One {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} instance supports preloading 20 channels at most. When exceeding this limit, the latest 20 preloaded channels take effect. Failing to preload a channel does not mean that you can\textquotesingle{}t join a channel, nor will it increase the time of joining a channel.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em token} & The token generated on your server for authentication. See .When the token for preloading channels expires, you can update the token based on the number of channels you preload.
\begin{DoxyItemize}
\item When preloading one channel, calling this method to pass in the new token.
\item When preloading more than one channels\+:
\begin{DoxyItemize}
\item If you use a wildcard token for all preloaded channels, call {\ttfamily update\+Preload\+Channel\+Token} to update the token.\+Note\+: When generating a wildcard token, ensure the user ID is not set as 0. See {\ttfamily Secure authentication with tokens}.
\item If you use different tokens to preload different channels, call this method to pass in your user ID, channel name and the new token. 
\end{DoxyItemize}
\end{DoxyItemize}\\
\hline
{\em channel\+Id} & The channel name that you want to preload. This parameter signifies the channel in which users engage in real-\/time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total)\+:
\begin{DoxyItemize}
\item All lowercase English letters\+: a to z.
\item All uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em uid} & The user ID. This parameter is used to identify the user in the channel for real-\/time audio and video interaction. You need to set and manage user I\+Ds yourself, and ensure that each user ID in the same channel is unique. This parameter is a 32-\/bit unsigned integer. The value range is 1 to 2$^\wedge$32-\/1. If the user ID is not assigned (or set to 0), the S\+DK assigns a random user ID and {\ttfamily on\+Join\+Channel\+Success} returns it in the callback. Your application must record and maintain the returned user ID, because the S\+DK does not do so.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item -\/102\+: The channel name is invalid. You need to pass in a valid channel name and join the channel again. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8a1c886aa13e45a4a10902290b385f4a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8a1c886aa13e45a4a10902290b385f4a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!preloadChannelWithUserAccount@{preloadChannelWithUserAccount}}
\index{preloadChannelWithUserAccount@{preloadChannelWithUserAccount}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{preloadChannelWithUserAccount()}{preloadChannelWithUserAccount()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::preload\+Channel\+With\+User\+Account (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token,  }\item[{const char $\ast$}]{channel\+Id,  }\item[{const char $\ast$}]{user\+Account }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Preloads a channel with {\ttfamily token}, {\ttfamily channel\+Id}, and {\ttfamily user\+Account}. 

When audience members need to switch between different channels frequently, calling the method can help shortening the time of joining a channel, thus reducing the time it takes for audience members to hear and see the host. If you join a preloaded channel, leave it and want to rejoin the same channel, you do not need to call this method unless the token for preloading the channel expires. Call timing\+: To improve the user experience of preloading channels, Agora recommends that before joining the channel, calling this method as early as possible once confirming the channel name and user information.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item When calling this method, ensure you set the user role as audience and do not set the audio scenario as {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+C\+H\+O\+R\+US}, otherwise, this method does not take effect.
\item You also need to make sure that the User Account, channel ID and token passed in for preloading are the same as the values passed in when joining the channel, otherwise, this method does not take effect.
\item One {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} instance supports preloading 20 channels at most. When exceeding this limit, the latest 20 preloaded channels take effect. Failing to preload a channel does not mean that you can\textquotesingle{}t join a channel, nor will it increase the time of joining a channel.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em token} & The token generated on your server for authentication. See .When the token for preloading channels expires, you can update the token based on the number of channels you preload.
\begin{DoxyItemize}
\item When preloading one channel, calling this method to pass in the new token.
\item When preloading more than one channels\+:
\begin{DoxyItemize}
\item If you use a wildcard token for all preloaded channels, call {\ttfamily update\+Preload\+Channel\+Token} to update the token.\+Note\+: When generating a wildcard token, ensure the user ID is not set as 0. See {\ttfamily Secure authentication with tokens}.
\item If you use different tokens to preload different channels, call this method to pass in your user ID, channel name and the new token. 
\end{DoxyItemize}
\end{DoxyItemize}\\
\hline
{\em channel\+Id} & The channel name that you want to preload. This parameter signifies the channel in which users engage in real-\/time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total)\+:
\begin{DoxyItemize}
\item All lowercase English letters\+: a to z.
\item All uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em user\+Account} & The user account. This parameter is used to identify the user in the channel for real-\/time audio and video engagement. You need to set and manage user accounts yourself and ensure that each user account in the same channel is unique. The maximum length of this parameter is 255 bytes. Ensure that you set this parameter and do not set it as N\+U\+LL. Supported characters are as follows(89 in total)\+:
\begin{DoxyItemize}
\item The 26 lowercase English letters\+: a to z.
\item The 26 uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item Space
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{}
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid. For example, the User Account is empty. You need to pass in a valid parameter and join the channel again.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item -\/102\+: The channel name is invalid. You need to pass in a valid channel name and join the channel again. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_af1191ff4fcea57616ffa1fee5fb12f29}\label{classagora_1_1rtc_1_1_i_rtc_engine_af1191ff4fcea57616ffa1fee5fb12f29}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!updatePreloadChannelToken@{updatePreloadChannelToken}}
\index{updatePreloadChannelToken@{updatePreloadChannelToken}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{updatePreloadChannelToken()}{updatePreloadChannelToken()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::update\+Preload\+Channel\+Token (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Updates the wildcard token for preloading channels. 

You need to maintain the life cycle of the wildcard token by yourself. When the token expires, you need to generate a new wildcard token and then call this method to pass in the new token. Applicable scenarios\+: In scenarios involving multiple channels, such as switching between different channels, using a wildcard token means users do not need to apply for a new token every time joinning a new channel, which can save users time for switching channels and reduce the pressure on your token server.


\begin{DoxyParams}{Parameters}
{\em token} & The new token.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid. For example, the token is invalid. You need to pass in a valid parameter and join the channel again.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_adc937172e59bd2695ea171553a88188c}\label{classagora_1_1rtc_1_1_i_rtc_engine_adc937172e59bd2695ea171553a88188c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!joinChannel@{joinChannel}}
\index{joinChannel@{joinChannel}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{joinChannel()}{joinChannel()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::join\+Channel (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token,  }\item[{const char $\ast$}]{channel\+Id,  }\item[{const char $\ast$}]{info,  }\item[{uid\+\_\+t}]{uid }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Joins a channel. 

By default, the user subscribes to the audio and video streams of all the other users in the channel, giving rise to usage and {\bfseries{billings}}. To stop subscribing to a specified stream or all remote streams, call the corresponding {\ttfamily mute} methods. Call timing\+: Call this method after {\ttfamily initialize}. Related callbacks\+: A successful call of this method triggers the following callbacks\+:
\begin{DoxyItemize}
\item The local client\+: The {\ttfamily on\+Join\+Channel\+Success} and {\ttfamily on\+Connection\+State\+Changed} callbacks.
\item The remote client\+: The {\ttfamily on\+User\+Joined} callback, if a user joining the channel in the C\+O\+M\+M\+U\+N\+I\+C\+A\+T\+I\+ON profile, or a host joining a channel in the L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG profile. When the connection between the local client and Agora\textquotesingle{}s server is interrupted due to poor network conditions, the S\+DK tries reconnecting to the server. When the local client successfully rejoins the channel, the S\+DK triggers the {\ttfamily on\+Rejoin\+Channel\+Success} callback on the local client.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method only supports users joining one channel at a time.
\item Users with different App I\+Ds cannot call each other.
\item Before joining a channel, ensure that the App ID you use to generate a token is the same as that you pass in the {\ttfamily initialize} method; otherwise, you may fail to join the channel with the token.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em token} & The token generated on your server for authentication. See .Note\+:
\begin{DoxyItemize}
\item (Recommended) If your project has enabled the security mode (using A\+PP ID and Token for authentication), this parameter is required.
\item If you have only enabled the testing mode (using A\+PP ID for authentication), this parameter is optional. You will automatically exit the channel 24 hours after successfully joining in.
\item If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don\textquotesingle{}t need to apply for a new token every time joining a channel. See {\ttfamily Secure authentication with tokens}. 
\end{DoxyItemize}\\
\hline
{\em channel\+Id} & The channel name. This parameter signifies the channel in which users engage in real-\/time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total)\+:
\begin{DoxyItemize}
\item All lowercase English letters\+: a to z.
\item All uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em info} & (\mbox{\hyperlink{classagora_1_1_optional}{Optional}}) Reserved for future use. \\
\hline
{\em uid} & The user ID. This parameter is used to identify the user in the channel for real-\/time audio and video interaction. You need to set and manage user I\+Ds yourself, and ensure that each user ID in the same channel is unique. This parameter is a 32-\/bit unsigned integer. The value range is 1 to 2$^\wedge$32-\/1. If the user ID is not assigned (or set to 0), the S\+DK assigns a random user ID and {\ttfamily on\+Join\+Channel\+Success} returns it in the callback. Your application must record and maintain the returned user ID, because the S\+DK does not do so.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid. For example, the token is invalid, the {\ttfamily uid} parameter is not set to an integer, or the value of a member in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} is invalid. You need to pass in a valid parameter and join the channel again.
\item -\/3\+: Fails to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object. You need to reinitialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item -\/8\+: The internal state of the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object is wrong. The typical cause is that after calling {\ttfamily start\+Echo\+Test} to start a call loop test, you call this method to join the channel without calling {\ttfamily stop\+Echo\+Test} to stop the test. You need to call {\ttfamily stop\+Echo\+Test} before calling this method.
\item -\/17\+: The request to join the channel is rejected. The typical cause is that the user is already in the channel. Agora recommends that you use the {\ttfamily on\+Connection\+State\+Changed} callback to see whether the user is in the channel. Do not call this method to join the channel unless you receive the {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+ED} (1) state.
\item -\/102\+: The channel name is invalid. You need to pass in a valid channel name in {\ttfamily channel\+Id} to rejoin the channel.
\item -\/121\+: The user ID is invalid. You need to pass in a valid user ID in {\ttfamily uid} to rejoin the channel. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3ea4eb99c644348bb88c91fb539873ae}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3ea4eb99c644348bb88c91fb539873ae}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!joinChannel@{joinChannel}}
\index{joinChannel@{joinChannel}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{joinChannel()}{joinChannel()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::join\+Channel (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token,  }\item[{const char $\ast$}]{channel\+Id,  }\item[{uid\+\_\+t}]{uid,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Joins a channel with media options. 

Compared to {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_adc937172e59bd2695ea171553a88188c}{join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, const char$\ast$ info, uid\+\_\+t uid)}}}, this method has the {\ttfamily options} parameter which is used to set media options, such as whether to publish audio and video streams within a channel, or whether to automatically subscribe to the audio and video streams of all remote users when joining a channel. By default, the user subscribes to the audio and video streams of all the other users in the channel, giving rise to usage and {\bfseries{billings}}. To stop subscribing to other streams, set the {\ttfamily options} parameter or call the corresponding {\ttfamily mute} methods. Call timing\+: Call this method after {\ttfamily initialize}. Related callbacks\+: A successful call of this method triggers the following callbacks\+:
\begin{DoxyItemize}
\item The local client\+: The {\ttfamily on\+Join\+Channel\+Success} and {\ttfamily on\+Connection\+State\+Changed} callbacks.
\item The remote client\+: The {\ttfamily on\+User\+Joined} callback, if a user joining the channel in the C\+O\+M\+M\+U\+N\+I\+C\+A\+T\+I\+ON profile, or a host joining a channel in the L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG profile. When the connection between the local client and Agora\textquotesingle{}s server is interrupted due to poor network conditions, the S\+DK tries reconnecting to the server. When the local client successfully rejoins the channel, the S\+DK triggers the {\ttfamily on\+Rejoin\+Channel\+Success} callback on the local client.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method only supports users joining one channel at a time.
\item Users with different App I\+Ds cannot call each other.
\item Before joining a channel, ensure that the App ID you use to generate a token is the same as that you pass in the {\ttfamily initialize} method; otherwise, you may fail to join the channel with the token.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em token} & The token generated on your server for authentication. See .Note\+:
\begin{DoxyItemize}
\item (Recommended) If your project has enabled the security mode (using A\+PP ID and Token for authentication), this parameter is required.
\item If you have only enabled the testing mode (using A\+PP ID for authentication), this parameter is optional. You will automatically exit the channel 24 hours after successfully joining in.
\item If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don\textquotesingle{}t need to apply for a new token every time joining a channel. See {\ttfamily Secure authentication with tokens}. 
\end{DoxyItemize}\\
\hline
{\em channel\+Id} & The channel name. This parameter signifies the channel in which users engage in real-\/time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total)\+:
\begin{DoxyItemize}
\item All lowercase English letters\+: a to z.
\item All uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em uid} & The user ID. This parameter is used to identify the user in the channel for real-\/time audio and video interaction. You need to set and manage user I\+Ds yourself, and ensure that each user ID in the same channel is unique. This parameter is a 32-\/bit unsigned integer. The value range is 1 to 2$^\wedge$32-\/1. If the user ID is not assigned (or set to 0), the S\+DK assigns a random user ID and {\ttfamily on\+Join\+Channel\+Success} returns it in the callback. Your application must record and maintain the returned user ID, because the S\+DK does not do so. \\
\hline
{\em options} & The channel media options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid. For example, the token is invalid, the {\ttfamily uid} parameter is not set to an integer, or the value of a member in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} is invalid. You need to pass in a valid parameter and join the channel again.
\item -\/3\+: Fails to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object. You need to reinitialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item -\/8\+: The internal state of the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object is wrong. The typical cause is that after calling {\ttfamily start\+Echo\+Test} to start a call loop test, you call this method to join the channel without calling {\ttfamily stop\+Echo\+Test} to stop the test. You need to call {\ttfamily stop\+Echo\+Test} before calling this method.
\item -\/17\+: The request to join the channel is rejected. The typical cause is that the user is already in the channel. Agora recommends that you use the {\ttfamily on\+Connection\+State\+Changed} callback to see whether the user is in the channel. Do not call this method to join the channel unless you receive the {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+ED} (1) state.
\item -\/102\+: The channel name is invalid. You need to pass in a valid channel name in {\ttfamily channel\+Id} to rejoin the channel.
\item -\/121\+: The user ID is invalid. You need to pass in a valid user ID in {\ttfamily uid} to rejoin the channel. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a42055d6697427736a267bf3ba04eb6cf}\label{classagora_1_1rtc_1_1_i_rtc_engine_a42055d6697427736a267bf3ba04eb6cf}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!updateChannelMediaOptions@{updateChannelMediaOptions}}
\index{updateChannelMediaOptions@{updateChannelMediaOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{updateChannelMediaOptions()}{updateChannelMediaOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::update\+Channel\+Media\+Options (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Updates the channel media options after joining the channel. 


\begin{DoxyParams}{Parameters}
{\em options} & The channel media options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The value of a member in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} is invalid. For example, the token or the user ID is invalid. You need to fill in a valid parameter.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item -\/8\+: The internal state of the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object is wrong. The possible reason is that the user is not in the channel. Agora recommends that you use the {\ttfamily on\+Connection\+State\+Changed} callback to see whether the user is in the channel. If you receive the {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+ED} (1) or {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+ED} (5) state, the user is not in the channel. You need to call {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} to join a channel before calling this method. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a51c12d209373650638bfd82e28777081}\label{classagora_1_1rtc_1_1_i_rtc_engine_a51c12d209373650638bfd82e28777081}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!leaveChannel@{leaveChannel}}
\index{leaveChannel@{leaveChannel}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{leaveChannel()}{leaveChannel()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::leave\+Channel (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Leaves a channel. 

After calling this method, the S\+DK terminates the audio and video interaction, leaves the current channel, and releases all resources related to the session. After joining the channel, you must call this method to end the call; otherwise, the next call cannot be started. Call timing\+: Call this method after joining a channel. Related callbacks\+: A successful call of this method triggers the following callbacks\+:
\begin{DoxyItemize}
\item The local client\+: The {\ttfamily on\+Leave\+Channel} callback will be triggered.
\item The remote client\+: The {\ttfamily on\+User\+Offline} callback will be triggered after the remote host leaves the channel.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
If you call {\ttfamily release} immediately after calling this method, the S\+DK does not trigger the {\ttfamily on\+Leave\+Channel} callback.
\begin{DoxyItemize}
\item This method call is asynchronous. When this method returns, it does not necessarily mean that the user has left the channel.
\item If you have called {\ttfamily join\+Channel\+Ex} to join multiple channels, calling this method will leave all the channels you joined.
\end{DoxyItemize}
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid.
\item -\/7\+: The S\+DK is not initialized. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad5c2ef631e3e4076f6aec96ed1152262}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad5c2ef631e3e4076f6aec96ed1152262}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!leaveChannel@{leaveChannel}}
\index{leaveChannel@{leaveChannel}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{leaveChannel()}{leaveChannel()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::leave\+Channel (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_leave_channel_options}{Leave\+Channel\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets channel options and leaves the channel. 

After calling this method, the S\+DK terminates the audio and video interaction, leaves the current channel, and releases all resources related to the session. After joining a channel, you must call this method or {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a51c12d209373650638bfd82e28777081}{leave\+Channel()}}} to end the call, otherwise, the next call cannot be started. If you have called {\ttfamily join\+Channel\+Ex} to join multiple channels, calling this method will leave all the channels you joined. Call timing\+: Call this method after joining a channel. Related callbacks\+: A successful call of this method triggers the following callbacks\+:
\begin{DoxyItemize}
\item The local client\+: The {\ttfamily on\+Leave\+Channel} callback will be triggered.
\item The remote client\+: The {\ttfamily on\+User\+Offline} callback will be triggered after the remote host leaves the channel.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
If you call {\ttfamily release} immediately after calling this method, the S\+DK does not trigger the {\ttfamily on\+Leave\+Channel} callback. This method call is asynchronous. When this method returns, it does not necessarily mean that the user has left the channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em options} & The options for leaving the channel. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_leave_channel_options}{Leave\+Channel\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8f25b5ff97e2a070a69102e379295739}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8f25b5ff97e2a070a69102e379295739}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!renewToken@{renewToken}}
\index{renewToken@{renewToken}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{renewToken()}{renewToken()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::renew\+Token (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Renews the token. 

This method is used to update the token. After successfully calling this method, the S\+DK will trigger the {\ttfamily on\+Renew\+Token\+Result} callback. A token will expire after a certain period of time, at which point the S\+DK will be unable to establish a connection with the server. Call timing\+: In any of the following cases, Agora recommends that you generate a new token on your server and then call this method to renew your token\+:
\begin{DoxyItemize}
\item Receiving the {\ttfamily on\+Token\+Privilege\+Will\+Expire} callback reporting the token is about to expire.
\item Receiving the {\ttfamily on\+Request\+Token} callback reporting the token has expired.
\item Receiving the {\ttfamily on\+Connection\+State\+Changed} callback reporting {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+T\+O\+K\+E\+N\+\_\+\+E\+X\+P\+I\+R\+ED} (9).
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em token} & The new token.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid. For example, the token is empty.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item 110\+: Invalid token. Ensure the following\+:
\begin{DoxyItemize}
\item The user ID specified when generating the token is consistent with the user ID used when joining the channel.
\item The generated token is the same as the token passed in to join the channel. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aab53788c74da25080bad61f0525d12ae}\label{classagora_1_1rtc_1_1_i_rtc_engine_aab53788c74da25080bad61f0525d12ae}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setChannelProfile@{setChannelProfile}}
\index{setChannelProfile@{setChannelProfile}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setChannelProfile()}{setChannelProfile()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Channel\+Profile (\begin{DoxyParamCaption}\item[{C\+H\+A\+N\+N\+E\+L\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE}]{profile }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the channel profile. 

You can call this method to set the channel profile. The S\+DK adopts different optimization strategies for different channel profiles. For example, in a live streaming scenario, the S\+DK prioritizes video quality. After initializing the S\+DK, the default channel profile is the live streaming profile. Call timing\+: Call this method before joining a channel.

\begin{DoxyNote}{Note}
To ensure the quality of real-\/time communication, Agora recommends that all users in a channel use the same channel profile. In different channel scenarios, the default audio routing of the S\+DK is different. See {\ttfamily set\+Default\+Audio\+Route\+To\+Speakerphone}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em profile} & The channel profile. See {\ttfamily C\+H\+A\+N\+N\+E\+L\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid.
\item -\/7\+: The S\+DK is not initialized. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a89ca6a15d5a388f3c82038e74bad4040}\label{classagora_1_1rtc_1_1_i_rtc_engine_a89ca6a15d5a388f3c82038e74bad4040}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setClientRole@{setClientRole}}
\index{setClientRole@{setClientRole}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setClientRole()}{setClientRole()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Client\+Role (\begin{DoxyParamCaption}\item[{C\+L\+I\+E\+N\+T\+\_\+\+R\+O\+L\+E\+\_\+\+T\+Y\+PE}]{role }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the client role. 

By default,the S\+DK sets the user role as audience. You can call this method to set the user role as host. The user role ( {\ttfamily roles} ) determines the users\textquotesingle{} permissions at the S\+DK level, including whether they can publish audio and video streams in a channel. Call timing\+: You can call this method either before or after joining a channel. If you call this method to set the user role as the host before joining the channel and set the local video property through the {\ttfamily setup\+Local\+Video} method, the local video preview is automatically enabled when the user joins the channel. If you call this method to set the user role after joining a channel, the S\+DK will automatically call the {\ttfamily mute\+Local\+Audio\+Stream} and {\ttfamily mute\+Local\+Video\+Stream} method to change the state for publishing audio and video streams. Related callbacks\+: If you call this method to switch the user role after joining the channel, the S\+DK triggers the following callbacks\+:
\begin{DoxyItemize}
\item Triggers {\ttfamily on\+Client\+Role\+Changed} on the local client.\+Note\+: Calling this method before joining a channel and set the {\ttfamily role} to {\ttfamily A\+U\+D\+I\+E\+N\+CE} will trigger this callback as well.
\item Triggers {\ttfamily on\+User\+Joined} or {\ttfamily on\+User\+Offline} on the remote client. If you call this method to set the user role after joining a channel but encounter a failure, the S\+DK trigger the {\ttfamily on\+Client\+Role\+Change\+Failed} callback to report the reason for the failure and the current user role.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
When calling this method before joining a channel and setting the user role to {\ttfamily B\+R\+O\+A\+D\+C\+A\+S\+T\+ER}, the {\ttfamily on\+Client\+Role\+Changed} callback will not be triggered on the local client. Calling this method before joining a channel and set the {\ttfamily role} to {\ttfamily A\+U\+D\+I\+E\+N\+CE} will trigger this callback as well.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em role} & The user role. See {\ttfamily C\+L\+I\+E\+N\+T\+\_\+\+R\+O\+L\+E\+\_\+\+T\+Y\+PE}. Note\+: If you set the user role as an audience member, you cannot publish audio and video streams in the channel. If you want to publish media streams in a channel during live streaming, ensure you set the user role as broadcaster.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid.
\item -\/7\+: The S\+DK is not initialized. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7f01b7bbf512a041afa99ec7ecfa11c4}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7f01b7bbf512a041afa99ec7ecfa11c4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setClientRole@{setClientRole}}
\index{setClientRole@{setClientRole}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setClientRole()}{setClientRole()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Client\+Role (\begin{DoxyParamCaption}\item[{C\+L\+I\+E\+N\+T\+\_\+\+R\+O\+L\+E\+\_\+\+T\+Y\+PE}]{role,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_client_role_options}{Client\+Role\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the user role and the audience latency level in a live streaming scenario. 

By default,the S\+DK sets the user role as audience. You can call this method to set the user role as host. The user role ( {\ttfamily roles} ) determines the users\textquotesingle{} permissions at the S\+DK level, including whether they can publish audio and video streams in a channel. The difference between this method and {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a89ca6a15d5a388f3c82038e74bad4040}{set\+Client\+Role(\+C\+L\+I\+E\+N\+T\+\_\+\+R\+O\+L\+E\+\_\+\+T\+Y\+P\+E role)}}} is that, this method supports setting the {\ttfamily audience\+Latency\+Level}. {\ttfamily audience\+Latency\+Level} needs to be used together with {\ttfamily role} to determine the level of service that users can enjoy within their permissions. For example, an audience member can choose to receive remote streams with low latency or ultra-\/low latency. Call timing\+: You can call this method either before or after joining a channel. If you call this method to set the user role as the host before joining the channel and set the local video property through the {\ttfamily setup\+Local\+Video} method, the local video preview is automatically enabled when the user joins the channel. If you call this method to set the user role after joining a channel, the S\+DK will automatically call the {\ttfamily mute\+Local\+Audio\+Stream} and {\ttfamily mute\+Local\+Video\+Stream} method to change the state for publishing audio and video streams. Related callbacks\+: If you call this method to switch the user role after joining the channel, the S\+DK triggers the following callbacks\+:
\begin{DoxyItemize}
\item Triggers {\ttfamily on\+Client\+Role\+Changed} on the local client.\+Note\+: Calling this method before joining a channel and set the {\ttfamily role} to {\ttfamily A\+U\+D\+I\+E\+N\+CE} will trigger this callback as well.
\item Triggers {\ttfamily on\+User\+Joined} or {\ttfamily on\+User\+Offline} on the remote client. If you call this method to set the user role after joining a channel but encounter a failure, the S\+DK trigger the {\ttfamily on\+Client\+Role\+Change\+Failed} callback to report the reason for the failure and the current user role.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
When the user role is set to host, the audience latency level can only be set to A\+U\+D\+I\+E\+N\+C\+E\+\_\+\+L\+A\+T\+E\+N\+C\+Y\+\_\+\+L\+E\+V\+E\+L\+\_\+\+U\+L\+T\+R\+A\+\_\+\+L\+O\+W\+\_\+\+L\+A\+T\+E\+N\+CY. When calling this method before joining a channel and setting the {\ttfamily role} to {\ttfamily B\+R\+O\+A\+D\+C\+A\+S\+T\+ER}, the {\ttfamily on\+Client\+Role\+Changed} callback will not be triggered on the local client. Calling this method before joining a channel and set the {\ttfamily role} to {\ttfamily A\+U\+D\+I\+E\+N\+CE} will trigger this callback as well.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em role} & The user role. See {\ttfamily C\+L\+I\+E\+N\+T\+\_\+\+R\+O\+L\+E\+\_\+\+T\+Y\+PE}. Note\+: If you set the user role as an audience member, you cannot publish audio and video streams in the channel. If you want to publish media streams in a channel during live streaming, ensure you set the user role as broadcaster. \\
\hline
{\em options} & The detailed options of a user, including the user level. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_client_role_options}{Client\+Role\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid.
\item -\/5\+: The request is rejected.
\item -\/7\+: The S\+DK is not initialized. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a394c60056c0cd31af48e8015b0c553f4}\label{classagora_1_1rtc_1_1_i_rtc_engine_a394c60056c0cd31af48e8015b0c553f4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startEchoTest@{startEchoTest}}
\index{startEchoTest@{startEchoTest}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startEchoTest()}{startEchoTest()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Echo\+Test (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_echo_test_configuration}{Echo\+Test\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts an audio device loopback test. 

To test whether the user\textquotesingle{}s local sending and receiving streams are normal, you can call this method to perform an audio and video call loop test, which tests whether the audio and video devices and the user\textquotesingle{}s upstream and downstream networks are working properly. After starting the test, the user needs to make a sound or face the camera. The audio or video is output after about two seconds. If the audio playback is normal, the audio device and the user\textquotesingle{}s upstream and downstream networks are working properly; if the video playback is normal, the video device and the user\textquotesingle{}s upstream and downstream networks are working properly. Call timing\+: You can call this method either before or after joining a channel.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item When calling in a channel, make sure that no audio or video stream is being published.
\item After calling this method, call {\ttfamily stop\+Echo\+Test} to end the test; otherwise, the user cannot perform the next audio and video call loop test and cannot join the channel.
\item In live streaming scenarios, this method only applies to hosts.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & The configuration of the audio and video call loop test. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_echo_test_configuration}{Echo\+Test\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae779da1c3fe153d73e8dfb2eb59ba9e4}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae779da1c3fe153d73e8dfb2eb59ba9e4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopEchoTest@{stopEchoTest}}
\index{stopEchoTest@{stopEchoTest}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopEchoTest()}{stopEchoTest()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Echo\+Test (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops the audio call test. 

After calling {\ttfamily start\+Echo\+Test}, you must call this method to end the test; otherwise, the user cannot perform the next audio and video call loop test and cannot join the channel.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/5(E\+R\+R\+\_\+\+R\+E\+F\+U\+S\+ED)\+: Failed to stop the echo test. The echo test may not be running. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7d35fc62d74685d25636f04b04051958}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7d35fc62d74685d25636f04b04051958}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableVideo@{enableVideo}}
\index{enableVideo@{enableVideo}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableVideo()}{enableVideo()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Video (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables the video module. 

The video module is disabled by default, call this method to enable it. If you need to disable the video module later, you need to call {\ttfamily disable\+Video}. Call timing\+: This method can be called either before joining a channel or while in the channel\+:
\begin{DoxyItemize}
\item If called before joining a channel, it enables the video module.
\item If called during an audio-\/only call, the audio call automatically switches to a video call. Related callbacks\+: A successful call of this method triggers the {\ttfamily on\+Remote\+Video\+State\+Changed} callback on the remote client.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method enables the internal engine and is valid after leaving the channel.
\item Calling this method will reset the entire engine, resulting in a slow response time. You can use the following methods to independently control a specific function of the video module based on your actual needs\+:
\begin{DoxyItemize}
\item {\ttfamily enable\+Local\+Video}\+: Whether to enable the camera to create the local video stream.
\item {\ttfamily mute\+Local\+Video\+Stream}\+: Whether to publish the local video stream.
\item {\ttfamily mute\+Remote\+Video\+Stream}\+: Whether to subscribe to and play the remote video stream.
\item {\ttfamily mute\+All\+Remote\+Video\+Streams}\+: Whether to subscribe to and play all remote video streams.
\end{DoxyItemize}
\item A successful call of this method resets {\ttfamily enable\+Local\+Video}, {\ttfamily mute\+Remote\+Video\+Stream}, and {\ttfamily mute\+All\+Remote\+Video\+Streams}. Proceed it with caution.
\end{DoxyItemize}
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac8eca0135b3ab7cecb84e2b81b89a85d}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac8eca0135b3ab7cecb84e2b81b89a85d}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!disableVideo@{disableVideo}}
\index{disableVideo@{disableVideo}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{disableVideo()}{disableVideo()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::disable\+Video (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Disables the video module. 

This method is used to disable the video module. Call timing\+: This method can be called either before or after joining the channel.
\begin{DoxyItemize}
\item If it is called before joining the channel, the audio-\/only mode is enabled.
\item If it is called after joining the channel, it switches from video mode to audio-\/only mode. Then, calling {\ttfamily enable\+Video} can swithch to video mode again. Related callbacks\+: A successful call of this method triggers the {\ttfamily on\+User\+Enable\+Video} ({\ttfamily false}) callback on the remote client.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method affects the internal engine and can be called after leaving the channel.
\item Calling this method will reset the entire engine, resulting in a slow response time. You can use the following methods to independently control a specific function of the video module based on your actual needs\+:
\begin{DoxyItemize}
\item {\ttfamily enable\+Local\+Video}\+: Whether to enable the camera to create the local video stream.
\item {\ttfamily mute\+Local\+Video\+Stream}\+: Whether to publish the local video stream.
\item {\ttfamily mute\+Remote\+Video\+Stream}\+: Whether to subscribe to and play the remote video stream.
\item {\ttfamily mute\+All\+Remote\+Video\+Streams}\+: Whether to subscribe to and play all remote video streams.
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aabd5f0d670a6cd26badc316083519512}\label{classagora_1_1rtc_1_1_i_rtc_engine_aabd5f0d670a6cd26badc316083519512}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startPreview@{startPreview}}
\index{startPreview@{startPreview}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startPreview()}{startPreview()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Preview (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables the local video preview. 

You can call this method to enable local video preview. Call timing\+: This method must be called after {\ttfamily enable\+Video} and {\ttfamily setup\+Local\+Video}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item The local preview enables the mirror mode by default.
\item After leaving the channel, local preview remains enabled. You need to call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab15f532e7a282050721ddcbb2075f27c}{stop\+Preview()}}} to disable local preview.
\end{DoxyItemize}
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad0673c4d00d24983098fb3421bd59e01}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad0673c4d00d24983098fb3421bd59e01}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startPreview@{startPreview}}
\index{startPreview@{startPreview}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startPreview()}{startPreview()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Preview (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{source\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables the local video preview and specifies the video source for the preview. 

This method is used to start local video preview and specify the video source that appears in the preview screen. Call timing\+: This method must be called after {\ttfamily enable\+Video} and {\ttfamily setup\+Local\+Video}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item The local preview enables the mirror mode by default.
\item After leaving the channel, local preview remains enabled. You need to call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ab15f532e7a282050721ddcbb2075f27c}{stop\+Preview()}}} to disable local preview.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em source\+Type} & The type of the video source. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab15f532e7a282050721ddcbb2075f27c}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab15f532e7a282050721ddcbb2075f27c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopPreview@{stopPreview}}
\index{stopPreview@{stopPreview}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopPreview()}{stopPreview()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Preview (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops the local video preview. 

Applicable scenarios\+: After calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_aabd5f0d670a6cd26badc316083519512}{start\+Preview()}}} to start the preview, if you want to stop the local video preview, call this method. Call timing\+: Call this method before joining a channel or after leaving a channel.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac4382fa969a0f23cbc066f2771f8b0ab}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac4382fa969a0f23cbc066f2771f8b0ab}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopPreview@{stopPreview}}
\index{stopPreview@{stopPreview}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopPreview()}{stopPreview()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Preview (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{source\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops the local video preview. 

Applicable scenarios\+: After calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad0673c4d00d24983098fb3421bd59e01}{start\+Preview(\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+P\+E source\+Type)}}} to start the preview, if you want to stop the local video preview, call this method. Call timing\+: Call this method before joining a channel or after leaving a channel.


\begin{DoxyParams}{Parameters}
{\em source\+Type} & The type of the video source. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_adb3ab7a20afca02f5a5ab6fafe026f2b}\label{classagora_1_1rtc_1_1_i_rtc_engine_adb3ab7a20afca02f5a5ab6fafe026f2b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startLastmileProbeTest@{startLastmileProbeTest}}
\index{startLastmileProbeTest@{startLastmileProbeTest}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startLastmileProbeTest()}{startLastmileProbeTest()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Lastmile\+Probe\+Test (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_lastmile_probe_config}{Lastmile\+Probe\+Config}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts the last mile network probe test. 

This method starts the last-\/mile network probe test before joining a channel to get the uplink and downlink last mile network statistics, including the bandwidth, packet loss, jitter, and round-\/trip time (R\+TT). Call timing\+: Do not call other methods before receiving the {\ttfamily on\+Lastmile\+Quality} and {\ttfamily on\+Lastmile\+Probe\+Result} callbacks. Otherwise, the callbacks may be interrupted. Related callbacks\+: After successfully calling this method, the S\+DK sequentially triggers the following 2 callbacks\+:
\begin{DoxyItemize}
\item {\ttfamily on\+Lastmile\+Quality}\+: The S\+DK triggers this callback within two seconds depending on the network conditions. This callback rates the network conditions and is more closely linked to the user experience.
\item {\ttfamily on\+Lastmile\+Probe\+Result}\+: The S\+DK triggers this callback within 30 seconds depending on the network conditions. This callback returns the real-\/time statistics of the network conditions and is more objective.
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em config} & The configurations of the last-\/mile network probe test. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_lastmile_probe_config}{Lastmile\+Probe\+Config}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a94f3494035429684a750e1dee7ef1593}\label{classagora_1_1rtc_1_1_i_rtc_engine_a94f3494035429684a750e1dee7ef1593}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopLastmileProbeTest@{stopLastmileProbeTest}}
\index{stopLastmileProbeTest@{stopLastmileProbeTest}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopLastmileProbeTest()}{stopLastmileProbeTest()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Lastmile\+Probe\+Test (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops the last mile network probe test. 

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a9bcbdcee0b5c52f96b32baec1922cf2e}\label{classagora_1_1rtc_1_1_i_rtc_engine_a9bcbdcee0b5c52f96b32baec1922cf2e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVideoEncoderConfiguration@{setVideoEncoderConfiguration}}
\index{setVideoEncoderConfiguration@{setVideoEncoderConfiguration}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVideoEncoderConfiguration()}{setVideoEncoderConfiguration()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Video\+Encoder\+Configuration (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_encoder_configuration}{Video\+Encoder\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the video encoder configuration. 

Sets the encoder configuration for the local video. Each configuration profile corresponds to a set of video parameters, including the resolution, frame rate, and bitrate. Call timing\+: You can call this method either before or after joining a channel. If the user does not need to reset the video encoding properties after joining the channel, Agora recommends calling this method before {\ttfamily enable\+Video} to reduce the time to render the first video frame.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Both this method and the {\ttfamily get\+Mirror\+Applied} method support setting the mirroring effect. Agora recommends that you only choose one method to set it up. Using both methods at the same time causes the mirroring effect to overlap, and the mirroring settings fail.
\item The {\ttfamily config} specified in this method is the maximum value under ideal network conditions. If the video engine cannot render the video using the specified {\ttfamily config} due to unreliable network conditions, the parameters further down the list are considered until a successful configuration is found.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & Video profile. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_video_encoder_configuration}{Video\+Encoder\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3823039f3d9749fda1c988659a3f3ead}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3823039f3d9749fda1c988659a3f3ead}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setBeautyEffectOptions@{setBeautyEffectOptions}}
\index{setBeautyEffectOptions@{setBeautyEffectOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setBeautyEffectOptions()}{setBeautyEffectOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Beauty\+Effect\+Options (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_beauty_options}{Beauty\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the image enhancement options. 

Enables or disables image enhancement, and sets the options. Call timing\+: Call this method after calling {\ttfamily enable\+Video} or {\ttfamily start\+Preview(V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type)}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method relies on the image enhancement dynamic library {\ttfamily libagora\+\_\+clear\+\_\+vision\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\item This feature has high requirements on device performance. When calling this method, the S\+DK automatically checks the capabilities of the current device.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable the image enhancement function\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable the image enhancement function.
\item {\ttfamily false}\+: (Default) Disable the image enhancement function. 
\end{DoxyItemize}\\
\hline
{\em options} & The image enhancement options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_beauty_options}{Beauty\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/4\+: The current device does not support this feature. Possible reasons include\+:
\begin{DoxyItemize}
\item The current device capabilities do not meet the requirements for image enhancement. Agora recommends you replace it with a high-\/performance device. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2f2ed2bc4e091502857a5a10be604b31}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2f2ed2bc4e091502857a5a10be604b31}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setFaceShapeBeautyOptions@{setFaceShapeBeautyOptions}}
\index{setFaceShapeBeautyOptions@{setFaceShapeBeautyOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setFaceShapeBeautyOptions()}{setFaceShapeBeautyOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Face\+Shape\+Beauty\+Options (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_beauty_options}{Face\+Shape\+Beauty\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the face shape options and specifies the media source. 

Calling this method allows for modifying various parts of the face, achieving slimming, enlarging eyes, slimming nose, and other minor cosmetic effects all at once using preset parameters, supporting fine-\/tuning the overall modification intensity. Call timing\+: Call this method after calling {\ttfamily enable\+Video}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method only applies to Android 4.\+4 or later.
\item This method relies on the image enhancement dynamic library {\ttfamily libagora\+\_\+clear\+\_\+vision\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\item This feature has high requirements on device performance. When calling this method, the S\+DK automatically checks the capabilities of the current device.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable the face shape effect\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable the face shape effect.
\item {\ttfamily false}\+: (Default) Disable the face shape effect. 
\end{DoxyItemize}\\
\hline
{\em options} & Face shaping style options, see {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_beauty_options}{Face\+Shape\+Beauty\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/4\+: The current device does not support this feature. Possible reasons include\+:
\begin{DoxyItemize}
\item The current device capabilities do not meet the requirements for image enhancement. Agora recommends you replace it with a high-\/performance device.
\item The current device version is lower than Android 4.\+4 and does not support this feature. Agora recommends you replace the device or upgrade the operating system. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8a7d8cc8ea8642453cd0fd7cea9c1b36}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8a7d8cc8ea8642453cd0fd7cea9c1b36}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setFaceShapeAreaOptions@{setFaceShapeAreaOptions}}
\index{setFaceShapeAreaOptions@{setFaceShapeAreaOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setFaceShapeAreaOptions()}{setFaceShapeAreaOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Face\+Shape\+Area\+Options (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_area_options}{Face\+Shape\+Area\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the image enhancement options for facial areas and specifies the media source. 

If the preset beauty effects implemented in the {\ttfamily set\+Face\+Shape\+Beauty\+Options} method do not meet expectations, you can use this method to set beauty area options, individually fine-\/tune each part of the face, and achieve a more refined beauty effect. Call timing\+: Call this method after calling {\ttfamily set\+Face\+Shape\+Beauty\+Options}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method only applies to Android 4.\+4 or later.
\item This method relies on the image enhancement dynamic library {\ttfamily libagora\+\_\+clear\+\_\+vision\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\item This feature has high requirements on device performance. When calling this method, the S\+DK automatically checks the capabilities of the current device.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em options} & Facial enhancement areas, see {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_area_options}{Face\+Shape\+Area\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/4\+: The current device does not support this feature. Possible reasons include\+:
\begin{DoxyItemize}
\item The current device capabilities do not meet the requirements for image enhancement. Agora recommends you replace it with a high-\/performance device.
\item The current device version is lower than Android 4.\+4 and does not support this feature. Agora recommends you replace the device or upgrade the operating system. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a35ce3e99fcaecfb6f73e1c07f3edaccc}\label{classagora_1_1rtc_1_1_i_rtc_engine_a35ce3e99fcaecfb6f73e1c07f3edaccc}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getFaceShapeBeautyOptions@{getFaceShapeBeautyOptions}}
\index{getFaceShapeBeautyOptions@{getFaceShapeBeautyOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getFaceShapeBeautyOptions()}{getFaceShapeBeautyOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Face\+Shape\+Beauty\+Options (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_beauty_options}{Face\+Shape\+Beauty\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the beauty effect options. 

Calling this method can retrieve the current settings of the beauty effect. Applicable scenarios\+: When the user opens the beauty style and style intensity menu in the app, you can call this method to get the current beauty effect options, then refresh the menu in the user interface according to the results, and update the UI. Call timing\+: Call this method after calling {\ttfamily enable\+Video}.


\begin{DoxyParams}{Parameters}
{\em options} & Face shaping style options, see {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_beauty_options}{Face\+Shape\+Beauty\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a0c31f6ae7a49d94e70bb50a410e241b3}\label{classagora_1_1rtc_1_1_i_rtc_engine_a0c31f6ae7a49d94e70bb50a410e241b3}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getFaceShapeAreaOptions@{getFaceShapeAreaOptions}}
\index{getFaceShapeAreaOptions@{getFaceShapeAreaOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getFaceShapeAreaOptions()}{getFaceShapeAreaOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Face\+Shape\+Area\+Options (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_area_options_a97f633a1f186ffda5b0311ab429b4952}{agora\+::rtc\+::\+Face\+Shape\+Area\+Options\+::\+F\+A\+C\+E\+\_\+\+S\+H\+A\+P\+E\+\_\+\+A\+R\+EA}}}]{shape\+Area,  }\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_area_options}{Face\+Shape\+Area\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the facial beauty area options. 

Calling this method can retrieve the current settings of the beauty effect. Applicable scenarios\+: When the user opens the facial beauty area and shaping intensity menu in the app, you can call this method to get the current beauty effect options, then refresh the menu in the user interface according to the results, and update the UI. Call timing\+: Call this method after calling {\ttfamily enable\+Video}.


\begin{DoxyParams}{Parameters}
{\em shape\+Area} & Facial enhancement areas. See {\ttfamily F\+A\+C\+E\+\_\+\+S\+H\+A\+P\+E\+\_\+\+A\+R\+EA}. \\
\hline
{\em options} & Facial enhancement areas, see {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_face_shape_area_options}{Face\+Shape\+Area\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a60db339363023039dda38600c1e91d20}\label{classagora_1_1rtc_1_1_i_rtc_engine_a60db339363023039dda38600c1e91d20}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setFilterEffectOptions@{setFilterEffectOptions}}
\index{setFilterEffectOptions@{setFilterEffectOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setFilterEffectOptions()}{setFilterEffectOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Filter\+Effect\+Options (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_filter_effect_options}{Filter\+Effect\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the filter effect options and specifies the media source. 

\begin{DoxySince}{Since}
v4.\+4.\+1
\end{DoxySince}
Call timing\+: Call this method after calling {\ttfamily enable\+Video}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method relies on the image enhancement dynamic library {\ttfamily libagora\+\_\+clear\+\_\+vision\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\item This feature has high requirements on device performance. When calling this method, the S\+DK automatically checks the capabilities of the current device.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable the filter effect\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Yes.
\item {\ttfamily false}\+: (Default) No. 
\end{DoxyItemize}\\
\hline
{\em options} & The filter effect options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_filter_effect_options}{Filter\+Effect\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a45545151306d919a617b01c1391c183e}\label{classagora_1_1rtc_1_1_i_rtc_engine_a45545151306d919a617b01c1391c183e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!createVideoEffectObject@{createVideoEffectObject}}
\index{createVideoEffectObject@{createVideoEffectObject}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{createVideoEffectObject()}{createVideoEffectObject()}}
{\footnotesize\ttfamily virtual \mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$\mbox{\hyperlink{classagora_1_1rtc_1_1_i_video_effect_object}{I\+Video\+Effect\+Object}}$>$ agora\+::rtc\+::\+I\+Rtc\+Engine\+::create\+Video\+Effect\+Object (\begin{DoxyParamCaption}\item[{const char $\ast$}]{bundle\+Path,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Creates a video effect object. 

\begin{DoxySince}{Since}
v4.\+6.\+0
\end{DoxySince}
Creates an {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_video_effect_object}{I\+Video\+Effect\+Object}}} video effect object and returns its pointer.


\begin{DoxyParams}{Parameters}
{\em bundle\+Path} & The path to the video effect bundle. \\
\hline
{\em type} & The media source type. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_video_effect_object}{I\+Video\+Effect\+Object}}} object pointer, if the method call succeeds.
\item An empty pointer, if the method call fails. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_abee7355936e9de76c58da79562c070ac}\label{classagora_1_1rtc_1_1_i_rtc_engine_abee7355936e9de76c58da79562c070ac}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!destroyVideoEffectObject@{destroyVideoEffectObject}}
\index{destroyVideoEffectObject@{destroyVideoEffectObject}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{destroyVideoEffectObject()}{destroyVideoEffectObject()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::destroy\+Video\+Effect\+Object (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_video_effect_object}{I\+Video\+Effect\+Object}} $>$}]{video\+Effect\+Object }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Destroys a video effect object. 

\begin{DoxySince}{Since}
v4.\+6.\+0
\end{DoxySince}

\begin{DoxyParams}{Parameters}
{\em video\+Effect\+Object} & The video effect object to be destroyed. See {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_video_effect_object}{I\+Video\+Effect\+Object}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_abbc47eef63740189f9ee6a02d8f231da}\label{classagora_1_1rtc_1_1_i_rtc_engine_abbc47eef63740189f9ee6a02d8f231da}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLowlightEnhanceOptions@{setLowlightEnhanceOptions}}
\index{setLowlightEnhanceOptions@{setLowlightEnhanceOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLowlightEnhanceOptions()}{setLowlightEnhanceOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Lowlight\+Enhance\+Options (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_lowlight_enhance_options}{Lowlight\+Enhance\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets low-\/light enhancement. 

\begin{DoxySince}{Since}
v4.\+0.\+0
\end{DoxySince}
You can call this method to enable the color enhancement feature and set the options of the color enhancement effect. Applicable scenarios\+: The low-\/light enhancement feature can adaptively adjust the brightness value of the video captured in situations with low or uneven lighting, such as backlit, cloudy, or dark scenes. It restores or highlights the image details and improves the overall visual effect of the video. Call timing\+: Call this method after calling {\ttfamily enable\+Video}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method relies on the image enhancement dynamic library {\ttfamily libagora\+\_\+clear\+\_\+vision\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\item Dark light enhancement has certain requirements for equipment performance. The low-\/light enhancement feature has certain performance requirements on devices. If your device overheats after you enable low-\/light enhancement, Agora recommends modifying the low-\/light enhancement options to a less performance-\/consuming level or disabling low-\/light enhancement entirely.
\item If you want to prioritize image quality ( L\+O\+W\+\_\+\+L\+I\+G\+H\+T\+\_\+\+E\+N\+H\+A\+N\+C\+E\+\_\+\+L\+E\+V\+E\+L\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY ) when using the low-\/light enhancement function, you need to first call {\ttfamily set\+Video\+Denoiser\+Options} to achieve video noise reduction, the specific corresponding relationship is as follows\+:
\begin{DoxyItemize}
\item When low light enhancement is set to automatic mode ( L\+O\+W\+\_\+\+L\+I\+G\+H\+T\+\_\+\+E\+N\+H\+A\+N\+C\+E\+\_\+\+A\+U\+TO ), video noise reduction needs to be set to prioritize image quality ( V\+I\+D\+E\+O\+\_\+\+D\+E\+N\+O\+I\+S\+E\+R\+\_\+\+L\+E\+V\+E\+L\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY ) and automatic mode ( V\+I\+D\+E\+O\+\_\+\+D\+E\+N\+O\+I\+S\+E\+R\+\_\+\+A\+U\+TO ).
\item When low-\/light enhancement is set to manual mode ( L\+O\+W\+\_\+\+L\+I\+G\+H\+T\+\_\+\+E\+N\+H\+A\+N\+C\+E\+\_\+\+M\+A\+N\+U\+AL ), video noise reduction needs to be set to prioritize image quality ( V\+I\+D\+E\+O\+\_\+\+D\+E\+N\+O\+I\+S\+E\+R\+\_\+\+L\+E\+V\+E\+L\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY ) and manual mode ( V\+I\+D\+E\+O\+\_\+\+D\+E\+N\+O\+I\+S\+E\+R\+\_\+\+M\+A\+N\+U\+AL ).
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable low-\/light enhancement\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable low-\/light enhancement.
\item {\ttfamily false}\+: (Default) Disable low-\/light enhancement. 
\end{DoxyItemize}\\
\hline
{\em options} & The low-\/light enhancement options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_lowlight_enhance_options}{Lowlight\+Enhance\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab1a6aabdd8a30919cca75ce27fd9f108}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab1a6aabdd8a30919cca75ce27fd9f108}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVideoDenoiserOptions@{setVideoDenoiserOptions}}
\index{setVideoDenoiserOptions@{setVideoDenoiserOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVideoDenoiserOptions()}{setVideoDenoiserOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Video\+Denoiser\+Options (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_denoiser_options}{Video\+Denoiser\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets video noise reduction. 

\begin{DoxySince}{Since}
v4.\+0.\+0
\end{DoxySince}
You can call this method to enable the video noise reduction feature and set the options of the video noise reduction effect. Applicable scenarios\+: dark environments and low-\/end video capture devices can cause video images to contain significant noise, which affects video quality. In real-\/time interactive scenarios, video noise also consumes bitstream resources and reduces encoding efficiency during encoding. Call timing\+: Call this method after calling {\ttfamily enable\+Video}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method relies on the image enhancement dynamic library {\ttfamily libagora\+\_\+clear\+\_\+vision\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\item Video noise reduction has certain requirements for equipment performance. If your device overheats after you enable video noise reduction, Agora recommends modifying the video noise reduction options to a less performance-\/consuming level or disabling video noise reduction entirely. If the noise reduction implemented by this method does not meet your needs, Agora recommends that you call the {\ttfamily set\+Beauty\+Effect\+Options} method to enable the beauty and skin smoothing function to achieve better video noise reduction effects. The recommended {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_beauty_options}{Beauty\+Options}}} settings for intense noise reduction effect are as follows\+:
\item {\ttfamily lightening\+Contrast\+Level} L\+I\+G\+H\+T\+E\+N\+I\+N\+G\+\_\+\+C\+O\+N\+T\+R\+A\+S\+T\+\_\+\+N\+O\+R\+M\+AL
\item {\ttfamily lightening\+Level}\+: 0.\+0
\item {\ttfamily smoothness\+Level}\+: 0.\+5
\item {\ttfamily redness\+Level}\+: 0.\+0
\item {\ttfamily sharpness\+Level}\+: 0.\+1
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable video noise reduction\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable video noise reduction.
\item {\ttfamily false}\+: (Default) Disable video noise reduction. 
\end{DoxyItemize}\\
\hline
{\em options} & The video noise reduction options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_video_denoiser_options}{Video\+Denoiser\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a4275673ad9f1b717222e2339b3aaac2f}\label{classagora_1_1rtc_1_1_i_rtc_engine_a4275673ad9f1b717222e2339b3aaac2f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setColorEnhanceOptions@{setColorEnhanceOptions}}
\index{setColorEnhanceOptions@{setColorEnhanceOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setColorEnhanceOptions()}{setColorEnhanceOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Color\+Enhance\+Options (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_color_enhance_options}{Color\+Enhance\+Options}} \&}]{options,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets color enhancement. 

\begin{DoxySince}{Since}
v4.\+0.\+0
\end{DoxySince}
The video images captured by the camera can have color distortion. The color enhancement feature intelligently adjusts video characteristics such as saturation and contrast to enhance the video color richness and color reproduction, making the video more vivid. You can call this method to enable the color enhancement feature and set the options of the color enhancement effect.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Call this method after calling {\ttfamily enable\+Video}.
\item The color enhancement feature has certain performance requirements on devices. With color enhancement turned on, Agora recommends that you change the color enhancement level to one that consumes less performance or turn off color enhancement if your device is experiencing severe heat problems.
\item This method relies on the image enhancement dynamic library {\ttfamily libagora\+\_\+clear\+\_\+vision\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable color enhancement\+:
\begin{DoxyItemize}
\item {\ttfamily true} Enable color enhancement.
\item {\ttfamily false}\+: (Default) Disable color enhancement. 
\end{DoxyItemize}\\
\hline
{\em options} & The color enhancement options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_color_enhance_options}{Color\+Enhance\+Options}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a704ef3e98e918bb2d3b1740bb2a6f6eb}\label{classagora_1_1rtc_1_1_i_rtc_engine_a704ef3e98e918bb2d3b1740bb2a6f6eb}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableVirtualBackground@{enableVirtualBackground}}
\index{enableVirtualBackground@{enableVirtualBackground}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableVirtualBackground()}{enableVirtualBackground()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Virtual\+Background (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_virtual_background_source}{Virtual\+Background\+Source}}}]{background\+Source,  }\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_segmentation_property}{Segmentation\+Property}}}]{segproperty,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:PRIMARY\+\_\+CAMERA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables/\+Disables the virtual background. 

\begin{DoxySince}{Since}
v3.\+7.\+200
\end{DoxySince}
The virtual background feature enables the local user to replace their original background with a static image, dynamic video, blurred background, or portrait-\/background segmentation to achieve picture-\/in-\/picture effect. Once the virtual background feature is enabled, all users in the channel can see the custom background. Call this method after calling {\ttfamily enable\+Video} or {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad0673c4d00d24983098fb3421bd59e01}{start\+Preview(\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+P\+E source\+Type)}}}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Using a video as a your virtual background will lead to continuous increase in memory usage, which may cause issues such as app crashes. Therefore,it is recommended to reduce the resolution and frame rate of the video when using it.
\item This feature has high requirements on device performance. When calling this method, the S\+DK automatically checks the capabilities of the current device. Agora recommends you use virtual background on devices with the following processors\+:
\begin{DoxyItemize}
\item Snapdragon 700 series 750G and later
\item Snapdragon 800 series 835 and later
\item Dimensity 700 series 720 and later
\item Kirin 800 series 810 and later
\item Kirin 900 series 980 and later
\item Devices with an i5 C\+PU and better
\item Devices with an A9 chip and better, as follows\+:
\begin{DoxyItemize}
\item i\+Phone 6S and later
\item i\+Pad Air 3rd generation and later
\item i\+Pad 5th generation and later
\item i\+Pad Pro 1st generation and later
\item i\+Pad mini 5th generation and later
\end{DoxyItemize}
\end{DoxyItemize}
\item Agora recommends that you use this feature in scenarios that meet the following conditions\+:
\begin{DoxyItemize}
\item A high-\/definition camera device is used, and the environment is uniformly lit.
\item There are few objects in the captured video. Portraits are half-\/length and unobstructed. Ensure that the background is a solid color that is different from the color of the user\textquotesingle{}s clothing.
\end{DoxyItemize}
\item This method relies on the virtual background dynamic library {\ttfamily libagora\+\_\+segmentation\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable virtual background\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable virtual background.
\item {\ttfamily false}\+: Disable virtual background. 
\end{DoxyItemize}\\
\hline
{\em background\+Source} & The custom background. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_virtual_background_source}{Virtual\+Background\+Source}}}. To adapt the resolution of the custom background image to that of the video captured by the S\+DK, the S\+DK scales and crops the custom background image while ensuring that the content of the custom background image is not distorted. \\
\hline
{\em segproperty} & Processing properties for background images. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_segmentation_property}{Segmentation\+Property}}}. \\
\hline
{\em type} & The type of the media source to which the filter effect is applied. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: In this method, this parameter supports only the following two settings\+:
\begin{DoxyItemize}
\item Use the default value {\ttfamily P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE} if you use camera to capture local video.
\item Set this parameter to {\ttfamily C\+U\+S\+T\+O\+M\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+CE} if you use custom video source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/4\+: The device capabilities do not meet the requirements for the virtual background feature. Agora recommends you try it on devices with higher performance. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac166814787b0a1d8da5f5c632dd7cdcf}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac166814787b0a1d8da5f5c632dd7cdcf}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setupRemoteVideo@{setupRemoteVideo}}
\index{setupRemoteVideo@{setupRemoteVideo}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setupRemoteVideo()}{setupRemoteVideo()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::setup\+Remote\+Video (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_canvas}{Video\+Canvas}} \&}]{canvas }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Initializes the video view of a remote user. 

This method initializes the video view of a remote stream on the local device. It affects only the video view that the local user sees. Call this method to bind the remote video stream to a video view and to set the rendering and mirror modes of the video view. You need to specify the ID of the remote user in this method. If the remote user ID is unknown to the application, set it after the app receives the {\ttfamily on\+User\+Joined} callback. To unbind the remote user from the view, set the {\ttfamily view} parameter to N\+U\+LL. Once the remote user leaves the channel, the S\+DK unbinds the remote user. In the scenarios of custom layout for mixed videos on the mobile end, you can call this method and set a separate {\ttfamily view} for rendering each sub-\/video stream of the mixed video stream.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item To update the rendering or mirror mode of the remote video view during a call, use the {\ttfamily set\+Remote\+Render\+Mode} method.
\item When using the recording service, the app does not need to bind a view, as it does not send a video stream. If your app does not recognize the recording service, bind the remote user to the view when the S\+DK triggers the {\ttfamily on\+First\+Remote\+Video\+Decoded} callback.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em canvas} & The remote video view and settings. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_video_canvas}{Video\+Canvas}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a744003a9c0230684e985e42d14361f28}\label{classagora_1_1rtc_1_1_i_rtc_engine_a744003a9c0230684e985e42d14361f28}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setupLocalVideo@{setupLocalVideo}}
\index{setupLocalVideo@{setupLocalVideo}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setupLocalVideo()}{setupLocalVideo()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::setup\+Local\+Video (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_canvas}{Video\+Canvas}} \&}]{canvas }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Initializes the local video view. 

This method initializes the video view of a local stream on the local device. It only affects the video seen by the local user and does not impact the publishing of the local video. Call this method to bind the local video stream to a video view ( {\ttfamily view} ) and to set the rendering and mirror modes of the video view. The binding remains valid after leaving the channel. To stop rendering or unbind the local video from the view, set {\ttfamily view} as N\+U\+LL. Applicable scenarios\+: After initialization, call this method to set the local video and then join the channel. In real-\/time interactive scenarios, if you need to simultaneously view multiple preview frames in the local video preview, and each frame is at a different observation position along the video link, you can repeatedly call this method to set different {\ttfamily view} s and set different observation positions for each {\ttfamily view.} For example, by setting the video source to the camera and then configuring two {\ttfamily view} s with {\ttfamily position} setting to P\+O\+S\+I\+T\+I\+O\+N\+\_\+\+P\+O\+S\+T\+\_\+\+C\+A\+P\+T\+U\+R\+E\+R\+\_\+\+O\+R\+I\+G\+IN and P\+O\+S\+I\+T\+I\+O\+N\+\_\+\+P\+O\+S\+T\+\_\+\+C\+A\+P\+T\+U\+R\+ER, you can simultaneously preview the raw, unprocessed video frame and the video frame that has undergone preprocessing (image enhancement effects, virtual background, watermark) in the local video preview. Call timing\+: You can call this method either before or after joining a channel.

\begin{DoxyNote}{Note}
To update only the rendering or mirror mode of the local video view during a call, call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad4b4ce6d5fda065b2c1d6aaff8f9884c}{set\+Local\+Render\+Mode(media\+::base\+::\+R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+P\+E render\+Mode, V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+P\+E mirror\+Mode)}}} instead.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em canvas} & The local video view and settings. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_video_canvas}{Video\+Canvas}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_acfbbb5486c091896605ee94254ab0665}\label{classagora_1_1rtc_1_1_i_rtc_engine_acfbbb5486c091896605ee94254ab0665}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVideoScenario@{setVideoScenario}}
\index{setVideoScenario@{setVideoScenario}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVideoScenario()}{setVideoScenario()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Video\+Scenario (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+A\+P\+P\+L\+I\+C\+A\+T\+I\+O\+N\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE}]{scenario\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets video application scenarios. 

\begin{DoxySince}{Since}
v4.\+2.\+0
\end{DoxySince}
After successfully calling this method, the S\+DK will automatically enable the best practice strategies and adjust key performance metrics based on the specified scenario, to optimize the video experience.

\begin{DoxyNote}{Note}
Call this method before joining a channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em scenario\+Type} & The type of video application scenario. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+A\+P\+P\+L\+I\+C\+A\+T\+I\+O\+N\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE}.{\ttfamily A\+P\+P\+L\+I\+C\+A\+T\+I\+O\+N\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+M\+E\+E\+T\+I\+NG} (1) is suitable for meeting scenarios. The S\+DK automatically enables the following strategies\+:
\begin{DoxyItemize}
\item In meeting scenarios where low-\/quality video streams are required to have a high bitrate, the S\+DK automatically enables multiple technologies used to deal with network congestions, to enhance the performance of the low-\/quality streams and to ensure the smooth reception by subscribers.
\item The S\+DK monitors the number of subscribers to the high-\/quality video stream in real time and dynamically adjusts its configuration based on the number of subscribers.
\begin{DoxyItemize}
\item If nobody subscribers to the high-\/quality stream, the S\+DK automatically reduces its bitrate and frame rate to save upstream bandwidth.
\item If someone subscribes to the high-\/quality stream, the S\+DK resets the high-\/quality stream to the {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_video_encoder_configuration}{Video\+Encoder\+Configuration}}} configuration used in the most recent calling of {\ttfamily set\+Video\+Encoder\+Configuration}. If no configuration has been set by the user previously, the following values are used\+:
\begin{DoxyItemize}
\item Resolution\+: (Windows and mac\+OS) 1280 × 720; (Android and i\+OS) 960 × 540
\item Frame rate\+: 15 fps
\item Bitrate\+: (Windows and mac\+OS) 1600 Kbps; (Android and i\+OS) 1000 Kbps
\end{DoxyItemize}
\end{DoxyItemize}
\item The S\+DK monitors the number of subscribers to the low-\/quality video stream in real time and dynamically enables or disables it based on the number of subscribers.\+Note\+: If the user has called {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a33c7eebc75e9a5bbde3904467657eb54}{set\+Dual\+Stream\+Mode(\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+D\+E mode, const Simulcast\+Stream\+Config\& stream\+Config)}}} to set that never send low-\/quality video stream ( {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} ), the dynamic adjustment of the low-\/quality stream in meeting scenarios will not take effect.
\begin{DoxyItemize}
\item If nobody subscribes to the low-\/quality stream, the S\+DK automatically disables it to save upstream bandwidth.
\item If someone subscribes to the low-\/quality stream, the S\+DK enables the low-\/quality stream and resets it to the {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}}} configuration used in the most recent calling of {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a33c7eebc75e9a5bbde3904467657eb54}{set\+Dual\+Stream\+Mode(\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+D\+E mode, const Simulcast\+Stream\+Config\& stream\+Config)}}}. If no configuration has been set by the user previously, the following values are used\+:
\begin{DoxyItemize}
\item Resolution\+: 480 × 272
\item Frame rate\+: 15 fps
\item Bitrate\+: 500 Kbps {\ttfamily A\+P\+P\+L\+I\+C\+A\+T\+I\+O\+N\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+1\+V1} (2) This is applicable to the {\ttfamily one to one live} scenario. To meet the requirements for low latency and high-\/quality video in this scenario, the S\+DK optimizes its strategies, improving performance in terms of video quality, first frame rendering, latency on mid-\/to-\/low-\/end devices, and smoothness under weak network conditions.\+Attention\+: This enumeration value is only applicable to the broadcaster vs. broadcaster scenario. {\ttfamily A\+P\+P\+L\+I\+C\+A\+T\+I\+O\+N\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+L\+I\+V\+E\+S\+H\+OW} (3) This is applicable to the {\ttfamily show room} scenario. In this scenario, fast video rendering and high image quality are crucial. The S\+DK implements several performance optimizations, including automatically enabling accelerated audio and video frame rendering to minimize first-\/frame latency (no need to call {\ttfamily enable\+Instant\+Media\+Rendering} ), and B-\/frame encoding to achieve better image quality and bandwidth efficiency. The S\+DK also provides enhanced video quality and smooth playback, even in poor network conditions or on lower-\/end devices.
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/4\+: Video application scenarios are not supported. Possible reasons include that you use the Voice S\+DK instead of the Video S\+DK.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_add24d11a66e2afe95253e01ffe2002a5}\label{classagora_1_1rtc_1_1_i_rtc_engine_add24d11a66e2afe95253e01ffe2002a5}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVideoQoEPreference@{setVideoQoEPreference}}
\index{setVideoQoEPreference@{setVideoQoEPreference}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVideoQoEPreference()}{setVideoQoEPreference()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Video\+Qo\+E\+Preference (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+Q\+O\+E\+\_\+\+P\+R\+E\+F\+E\+R\+E\+N\+C\+E\+\_\+\+T\+Y\+PE}]{qoe\+Preference }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Sets the video qoe preference.

\begin{DoxySince}{Since}
v4.\+2.\+1
\end{DoxySince}
You can call this method to set the expected QoE Preference. The S\+DK will optimize the video experience for each preference you set.


\begin{DoxyParams}{Parameters}
{\em qoe\+Preference} & The qoe preference type. See \#\+V\+I\+D\+E\+O\+\_\+\+Q\+O\+E\+\_\+\+P\+R\+E\+F\+E\+R\+E\+N\+C\+E\+\_\+\+T\+Y\+PE.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\item E\+R\+R\+\_\+\+F\+A\+I\+L\+ED (1)\+: A general error occurs (no specified reason).
\item E\+R\+R\+\_\+\+N\+O\+T\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED (4)\+: Unable to set video application scenario.
\item E\+R\+R\+\_\+\+N\+O\+T\+\_\+\+I\+N\+I\+T\+I\+A\+L\+I\+Z\+ED (7)\+: The S\+DK is not initialized. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a996401c7ba33c6ec59527c5d109f548f}\label{classagora_1_1rtc_1_1_i_rtc_engine_a996401c7ba33c6ec59527c5d109f548f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableAudio@{enableAudio}}
\index{enableAudio@{enableAudio}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableAudio()}{enableAudio()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Audio (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables the audio module. 

The audio module is enabled by default After calling {\ttfamily disable\+Audio} to disable the audio module, you can call this method to re-\/enable it. Call timing\+: This method can be called either before or after joining the channel. It is still valid after one leaves channel.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Calling this method will reset the entire engine, resulting in a slow response time. You can use the following methods to independently control a specific function of the audio module based on your actual needs\+:
\begin{DoxyItemize}
\item {\ttfamily enable\+Local\+Audio}\+: Whether to enable the microphone to create the local audio stream.
\item {\ttfamily mute\+Local\+Audio\+Stream}\+: Whether to publish the local audio stream.
\item {\ttfamily mute\+Remote\+Audio\+Stream}\+: Whether to subscribe and play the remote audio stream.
\item {\ttfamily mute\+All\+Remote\+Audio\+Streams}\+: Whether to subscribe to and play all remote audio streams.
\end{DoxyItemize}
\item A successful call of this method resets {\ttfamily enable\+Local\+Audio}, {\ttfamily mute\+Remote\+Audio\+Stream}, and {\ttfamily mute\+All\+Remote\+Audio\+Streams}. Proceed it with caution.
\end{DoxyItemize}
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a1929f01411e983ed776275fe8e8ad45e}\label{classagora_1_1rtc_1_1_i_rtc_engine_a1929f01411e983ed776275fe8e8ad45e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!disableAudio@{disableAudio}}
\index{disableAudio@{disableAudio}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{disableAudio()}{disableAudio()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::disable\+Audio (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Disables the audio module. 

The audio module is enabled by default, and you can call this method to disable the audio module. Call timing\+: This method can be called either before or after joining the channel. It is still valid after one leaves channel.

\begin{DoxyNote}{Note}
This method resets the internal engine and takes some time to take effect. Agora recommends using the following A\+PI methods to control the audio modules separately\+:
\begin{DoxyItemize}
\item {\ttfamily enable\+Local\+Audio}\+: Whether to enable the microphone to create the local audio stream.
\item {\ttfamily enable\+Loopback\+Recording}\+: Whether to enable loopback audio capturing.
\item {\ttfamily mute\+Local\+Audio\+Stream}\+: Whether to publish the local audio stream.
\item {\ttfamily mute\+Remote\+Audio\+Stream}\+: Whether to subscribe and play the remote audio stream.
\item {\ttfamily mute\+All\+Remote\+Audio\+Streams}\+: Whether to subscribe to and play all remote audio streams.
\end{DoxyItemize}
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7c9aef3f4c8f9cb62e5ae3c4aa7ed81a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7c9aef3f4c8f9cb62e5ae3c4aa7ed81a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioProfile@{setAudioProfile}}
\index{setAudioProfile@{setAudioProfile}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioProfile()}{setAudioProfile()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Profile (\begin{DoxyParamCaption}\item[{A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE}]{profile,  }\item[{A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE}]{scenario }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the audio profile and audio scenario. 

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000045}{Deprecated}}]This method is deprecated. You can use the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}} = 0} method instead. To set the audio scenario, call the {\ttfamily initialize} method and pass value in the {\ttfamily audio\+Scenario} member in the \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_engine_context}{Rtc\+Engine\+Context}} struct.\end{DoxyRefDesc}


Applicable scenarios\+: This method is suitable for various audio scenarios. You can choose as needed. For example, in scenarios with high audio quality requirements such as music teaching, it is recommended to set {\ttfamily profile} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY}(4) and {\ttfamily scenario} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG}(3). Call timing\+: You can call this method either before or after joining a channel.

\begin{DoxyNote}{Note}
Due to i\+OS system restrictions, some audio routes cannot be recognized in call volume mode. Therefore, if you need to use an external sound card, it is recommended to set the audio scenario to {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG}(3). In this scenario, the S\+DK will switch to media volume to avoid this issue.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em profile} & The audio profile, including the sampling rate, bitrate, encoding mode, and the number of channels. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em scenario} & The audio scenarios. Under different audio scenarios, the device uses different volume types. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}\label{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioProfile@{setAudioProfile}}
\index{setAudioProfile@{setAudioProfile}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioProfile()}{setAudioProfile()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Profile (\begin{DoxyParamCaption}\item[{A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE}]{profile }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets audio profiles. 

If you need to set the audio scenario, you can either call {\ttfamily set\+Audio\+Scenario}, or {\ttfamily initialize} and set the {\ttfamily audio\+Scenario} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_engine_context}{Rtc\+Engine\+Context}}}. Applicable scenarios\+: This method is suitable for various audio scenarios. You can choose as needed. For example, in scenarios with high audio quality requirements such as music teaching, it is recommended to set {\ttfamily profile} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY}(4). Call timing\+: You can call this method either before or after joining a channel.


\begin{DoxyParams}{Parameters}
{\em profile} & The audio profile, including the sampling rate, bitrate, encoding mode, and the number of channels. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a81ae6611cdcdf32cf3e402fd64e364ef}\label{classagora_1_1rtc_1_1_i_rtc_engine_a81ae6611cdcdf32cf3e402fd64e364ef}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioScenario@{setAudioScenario}}
\index{setAudioScenario@{setAudioScenario}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioScenario()}{setAudioScenario()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Scenario (\begin{DoxyParamCaption}\item[{A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE}]{scenario }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets audio scenarios. 

Applicable scenarios\+: This method is suitable for various audio scenarios. You can choose as needed. For example, in scenarios such as music teaching that require high sound quality, it is recommended to set {\ttfamily scenario} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG}(3). Call timing\+: You can call this method either before or after joining a channel.

\begin{DoxyNote}{Note}
Due to i\+OS system restrictions, some audio routes cannot be recognized in call volume mode. Therefore, if you need to use an external sound card, it is recommended to set the audio scenario to {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG}(3). In this scenario, the S\+DK will switch to media volume to avoid this issue.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em scenario} & The audio scenarios. Under different audio scenarios, the device uses different volume types. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa61051d91823a69fe6b04b5f541a8080}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa61051d91823a69fe6b04b5f541a8080}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableLocalAudio@{enableLocalAudio}}
\index{enableLocalAudio@{enableLocalAudio}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableLocalAudio()}{enableLocalAudio()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Local\+Audio (\begin{DoxyParamCaption}\item[{bool}]{enabled }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables or disables the local audio capture. 

The audio function is enabled by default when users joining a channel. This method disables or re-\/enables the local audio function to stop or restart local audio capturing. The difference between this method and {\ttfamily mute\+Local\+Audio\+Stream} are as follows\+:
\begin{DoxyItemize}
\item {\ttfamily enable\+Local\+Audio}\+: Disables or re-\/enables the local audio capturing and processing. If you disable or re-\/enable local audio capturing using the {\ttfamily enable\+Local\+Audio} method, the local user might hear a pause in the remote audio playback.
\item {\ttfamily mute\+Local\+Audio\+Stream}\+: Sends or stops sending the local audio streams without affecting the audio capture status. Applicable scenarios\+: This method does not affect receiving the remote audio streams. {\ttfamily enable\+Local\+Audio} {\ttfamily (false)} is suitable for scenarios where the user wants to receive remote audio streams without sending locally captured audio. Call timing\+: You can call this method either before or after joining a channel. Calling it before joining a channel only sets the device state, and it takes effect immediately after you join the channel. Related callbacks\+: Once the local audio function is disabled or re-\/enabled, the S\+DK triggers the {\ttfamily on\+Local\+Audio\+State\+Changed} callback, which reports {\ttfamily L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+ED} (0) or {\ttfamily L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+C\+O\+R\+D\+I\+NG} (1).
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em enabled} & 
\begin{DoxyItemize}
\item {\ttfamily true}\+: (Default) Re-\/enable the local audio function, that is, to start the local audio capturing device (for example, the microphone).
\item {\ttfamily false}\+: Disable the local audio function, that is, to stop local audio capturing.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a08a34d5b85a225390a18467c92a7b6f9}\label{classagora_1_1rtc_1_1_i_rtc_engine_a08a34d5b85a225390a18467c92a7b6f9}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!muteLocalAudioStream@{muteLocalAudioStream}}
\index{muteLocalAudioStream@{muteLocalAudioStream}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{muteLocalAudioStream()}{muteLocalAudioStream()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::mute\+Local\+Audio\+Stream (\begin{DoxyParamCaption}\item[{bool}]{mute }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops or resumes publishing the local audio stream. 

This method is used to control whether to publish the locally captured audio stream. If you call this method to stop publishing locally captured audio streams, the audio capturing device will still work and won\textquotesingle{}t be affected. Call timing\+: This method can be called either before or after joining the channel. Related callbacks\+: After successfully calling this method, the local end triggers callback {\ttfamily on\+Audio\+Publish\+State\+Changed}; the remote end triggers {\ttfamily on\+User\+Mute\+Audio} and {\ttfamily on\+Remote\+Audio\+State\+Changed} callbacks.


\begin{DoxyParams}{Parameters}
{\em mute} & Whether to stop publishing the local audio stream\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Stops publishing the local audio stream.
\item {\ttfamily false}\+: (Default) Resumes publishing the local audio stream.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac061a3c81eba2d203a7511e59466e6a0}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac061a3c81eba2d203a7511e59466e6a0}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!muteAllRemoteAudioStreams@{muteAllRemoteAudioStreams}}
\index{muteAllRemoteAudioStreams@{muteAllRemoteAudioStreams}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{muteAllRemoteAudioStreams()}{muteAllRemoteAudioStreams()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::mute\+All\+Remote\+Audio\+Streams (\begin{DoxyParamCaption}\item[{bool}]{mute }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops or resumes subscribing to the audio streams of all remote users. 

Stops or resumes receiving all remote audio stream.

This method works for all remote users that join or will join a channel using the {\ttfamily join\+Channel} method. It is equivalent to the {\ttfamily auto\+Subscribe\+Audio} member in the \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} class.
\begin{DoxyItemize}
\item Ensure that you call this method after joining a channel.
\item If you call mute\+All\+Remote\+Audio\+Streams(true) after joining a channel, the local use stops receiving any audio stream from any user in the channel, including any user who joins the channel after you call this method.
\item If you call mute\+All\+Remote\+Audio\+Streams(true) after leaving a channel, the local user does not receive any audio stream the next time the user joins a channel.
\end{DoxyItemize}

After you successfully call mute\+All\+Remote\+Audio\+Streams(true), you can take the following actions\+:
\begin{DoxyItemize}
\item To resume receiving all remote audio streams, call mute\+All\+Remote\+Audio\+Streams(false).
\item To resume receiving the audio stream of a specified user, call mute\+Remote\+Audio\+Stream(uid, false), where uid is the ID of the user whose audio stream you want to resume receiving.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item The result of calling this method is affected by calling \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a996401c7ba33c6ec59527c5d109f548f}{enable\+Audio}} and \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1929f01411e983ed776275fe8e8ad45e}{disable\+Audio}}. Settings in mute\+All\+Remote\+Audio\+Streams stop taking effect if either of the following occurs\+:
\begin{DoxyItemize}
\item Calling {\ttfamily enable\+Audio} after mute\+All\+Remote\+Audio\+Streams(true).
\item Calling {\ttfamily disable\+Audio} after mute\+All\+Remote\+Audio\+Streams(false).
\end{DoxyItemize}
\item This method only works for the channel created by calling {\ttfamily join\+Channel}. To set whether to receive remote audio streams for a specific channel, Agora recommends using {\ttfamily auto\+Subscribe\+Audio} in the \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} class. 
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em mute} & Whether to stop receiving remote audio streams\+:
\begin{DoxyItemize}
\item true\+: Stop receiving any remote audio stream.
\item false\+: (Default) Resume receiving all remote audio streams. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\end{DoxyItemize}
\end{DoxyReturn}
After successfully calling this method, the local user stops or resumes subscribing to the audio streams of all remote users, including all subsequent users. Call timing\+: Call this method after joining a channel.

\begin{DoxyNote}{Note}
If you call this method and then call {\ttfamily enable\+Audio} or {\ttfamily disable\+Audio}, the latest call will prevail. By default, the S\+DK subscribes to the audio streams of all remote users when joining a channel. To modify this behavior, you can set {\ttfamily auto\+Subscribe\+Audio} to {\ttfamily false} when calling {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} to join the channel, which will cancel the subscription to the audio streams of all users upon joining the channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em mute} & Whether to stop subscribing to the audio streams of all remote users\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Stops subscribing to the audio streams of all remote users.
\item {\ttfamily false}\+: (Default) Subscribes to the audio streams of all remote users by default.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3dcf5cb6eea02d3e7b9da2638c510ca3}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3dcf5cb6eea02d3e7b9da2638c510ca3}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!muteRemoteAudioStream@{muteRemoteAudioStream}}
\index{muteRemoteAudioStream@{muteRemoteAudioStream}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{muteRemoteAudioStream()}{muteRemoteAudioStream()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::mute\+Remote\+Audio\+Stream (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{bool}]{mute }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops or resumes subscribing to the audio stream of a specified user. 

Call timing\+: Call this method after joining a channel. Related callbacks\+: After a successful method call, the S\+DK triggers the {\ttfamily on\+Audio\+Subscribe\+State\+Changed} callback.


\begin{DoxyParams}{Parameters}
{\em uid} & The user ID of the specified user. \\
\hline
{\em mute} & Whether to subscribe to the specified remote user\textquotesingle{}s audio stream.
\begin{DoxyItemize}
\item {\ttfamily true}\+: Stop subscribing to the audio stream of the specified user.
\item {\ttfamily false}\+: (Default) Subscribe to the audio stream of the specified user.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7707fb7110c72637ee98f659e8b796e9}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7707fb7110c72637ee98f659e8b796e9}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!muteLocalVideoStream@{muteLocalVideoStream}}
\index{muteLocalVideoStream@{muteLocalVideoStream}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{muteLocalVideoStream()}{muteLocalVideoStream()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::mute\+Local\+Video\+Stream (\begin{DoxyParamCaption}\item[{bool}]{mute }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops or resumes publishing the local video stream. 

This method is used to control whether to publish the locally captured video stream. If you call this method to stop publishing locally captured video streams, the video capturing device will still work and won\textquotesingle{}t be affected. Compared to {\ttfamily enable\+Local\+Video} ({\ttfamily false}), which can also cancel the publishing of local video stream by turning off the local video stream capture, this method responds faster. Call timing\+: This method can be called either before or after joining the channel. Related callbacks\+: After successfully calling this method, the local end triggers callback {\ttfamily on\+Video\+Publish\+State\+Changed}; the remote end triggers {\ttfamily on\+User\+Mute\+Video} and {\ttfamily on\+Remote\+Video\+State\+Changed} callbacks.


\begin{DoxyParams}{Parameters}
{\em mute} & Whether to stop publishing the local video stream.
\begin{DoxyItemize}
\item {\ttfamily true}\+: Stop publishing the local video stream.
\item {\ttfamily false}\+: (Default) Publish the local video stream.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a1877bb2aa655bbcbed57ffadd6424e51}\label{classagora_1_1rtc_1_1_i_rtc_engine_a1877bb2aa655bbcbed57ffadd6424e51}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableLocalVideo@{enableLocalVideo}}
\index{enableLocalVideo@{enableLocalVideo}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableLocalVideo()}{enableLocalVideo()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Local\+Video (\begin{DoxyParamCaption}\item[{bool}]{enabled }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables/\+Disables the local video capture. 

This method disables or re-\/enables the local video capture, and does not affect receiving the remote video stream. After calling {\ttfamily enable\+Video}, the local video capture is enabled by default. If you call {\ttfamily enable\+Local\+Video} ({\ttfamily false}) to disable local video capture within the channel, it also simultaneously stops publishing the video stream within the channel. If you want to restart video catpure, you can call {\ttfamily enable\+Local\+Video} ({\ttfamily true}) and then call {\ttfamily update\+Channel\+Media\+Options} to set the {\ttfamily options} parameter to publish the locally captured video stream in the channel. After the local video capturer is successfully disabled or re-\/enabled, the S\+DK triggers the {\ttfamily on\+Remote\+Video\+State\+Changed} callback on the remote client.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel. However, if you call it before joining, the settings will only take effect once you have joined the channel.
\item This method enables the internal engine and is valid after leaving the channel.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable the local video capture.
\begin{DoxyItemize}
\item {\ttfamily true}\+: (Default) Enable the local video capture.
\item {\ttfamily false}\+: Disable the local video capture. Once the local video is disabled, the remote users cannot receive the video stream of the local user, while the local user can still receive the video streams of remote users. When set to {\ttfamily false}, this method does not require a local camera.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a897a09788641f26252be642bb7045ee4}\label{classagora_1_1rtc_1_1_i_rtc_engine_a897a09788641f26252be642bb7045ee4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!muteAllRemoteVideoStreams@{muteAllRemoteVideoStreams}}
\index{muteAllRemoteVideoStreams@{muteAllRemoteVideoStreams}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{muteAllRemoteVideoStreams()}{muteAllRemoteVideoStreams()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::mute\+All\+Remote\+Video\+Streams (\begin{DoxyParamCaption}\item[{bool}]{mute }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops or resumes subscribing to the video streams of all remote users. 

Stops or resumes receiving all remote video streams.

This method works for all remote users that join or will join a channel using the {\ttfamily join\+Channel} method. It is equivalent to the {\ttfamily auto\+Subscribe\+Video} member in the \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} class.
\begin{DoxyItemize}
\item Ensure that you call this method after joining a channel.
\item If you call mute\+All\+Remote\+Video\+Streams(true) after joining a channel, the local use stops receiving any video stream from any user in the channel, including any user who joins the channel after you call this method.
\item If you call mute\+All\+Remote\+Video\+Streams(true) after leaving a channel, the local user does not receive any video stream the next time the user joins a channel.
\end{DoxyItemize}

After you successfully call mute\+All\+Remote\+Video\+Streams(true), you can take the following actions\+:
\begin{DoxyItemize}
\item To resume receiving all remote video streams, call mute\+All\+Remote\+Video\+Streams(false).
\item To resume receiving the video stream of a specified user, call mute\+Remote\+Video\+Stream(uid, false), where uid is the ID of the user whose video stream you want to resume receiving.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item The result of calling this method is affected by calling \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a7d35fc62d74685d25636f04b04051958}{enable\+Video}} and \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ac8eca0135b3ab7cecb84e2b81b89a85d}{disable\+Video}}. Settings in mute\+All\+Remote\+Video\+Streams stop taking effect if either of the following occurs\+:
\begin{DoxyItemize}
\item Calling {\ttfamily enable\+Video} after mute\+All\+Remote\+Video\+Streams(true).
\item Calling {\ttfamily disable\+Video} after mute\+All\+Remote\+Video\+Streams(false).
\end{DoxyItemize}
\item This method only works for the channel created by calling {\ttfamily join\+Channel}. To set whether to receive remote audio streams for a specific channel, Agora recommends using {\ttfamily auto\+Subscribe\+Video} in the \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} class. 
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em mute} & Whether to stop receiving remote video streams\+:
\begin{DoxyItemize}
\item true\+: Stop receiving any remote video stream.
\item false\+: (Default) Resume receiving all remote video streams. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\end{DoxyItemize}
\end{DoxyReturn}
After successfully calling this method, the local user stops or resumes subscribing to the video streams of all remote users, including all subsequent users. Call timing\+: Call this method after joining a channel.

\begin{DoxyNote}{Note}
If you call this method and then call {\ttfamily enable\+Video} or {\ttfamily disable\+Video}, the latest call will prevail. By default, the S\+DK subscribes to the video streams of all remote users when joining a channel. To modify this behavior, you can set {\ttfamily auto\+Subscribe\+Video} to{\ttfamily false} when calling {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} to join the channel, which will cancel the subscription to the video streams of all users upon joining the channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em mute} & Whether to stop subscribing to the video streams of all remote users.
\begin{DoxyItemize}
\item {\ttfamily true}\+: Stop subscribing to the video streams of all remote users.
\item {\ttfamily false}\+: (Default) Subscribe to the video streams of all remote users by default.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a9c7430fc0d692ad67e76b2a544deb354}\label{classagora_1_1rtc_1_1_i_rtc_engine_a9c7430fc0d692ad67e76b2a544deb354}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRemoteDefaultVideoStreamType@{setRemoteDefaultVideoStreamType}}
\index{setRemoteDefaultVideoStreamType@{setRemoteDefaultVideoStreamType}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRemoteDefaultVideoStreamType()}{setRemoteDefaultVideoStreamType()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Remote\+Default\+Video\+Stream\+Type (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+T\+Y\+PE}]{stream\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the default video stream type to subscribe to. 

Depending on the default behavior of the sender and the specific settings when calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a33c7eebc75e9a5bbde3904467657eb54}{set\+Dual\+Stream\+Mode(\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+D\+E mode, const Simulcast\+Stream\+Config\& stream\+Config)}}}, the scenarios for the receiver calling this method are as follows\+:
\begin{DoxyItemize}
\item The S\+DK enables low-\/quality video stream adaptive mode ( {\ttfamily A\+U\+T\+O\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} ) on the sender side by default, meaning only the high-\/quality video stream is transmitted. Only the receiver with the role of the $\ast$$\ast$host$\ast$$\ast$can call this method to initiate a low-\/quality video stream request. Once the sender receives the request, it starts automatically sending the low-\/quality video stream. At this point, all users in the channel can call this method to switch to low-\/quality video stream subscription mode.
\item If the sender calls {\ttfamily set\+Dual\+Stream\+Mode(S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE mode, const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}}\& stream\+Config)} and sets {\ttfamily mode} to {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} (never send low-\/quality video stream), then calling this method will have no effect.
\item If the sender calls {\ttfamily set\+Dual\+Stream\+Mode(S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE mode, const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}}\& stream\+Config)} and sets {\ttfamily mode} to {\ttfamily E\+N\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} (always send low-\/quality video stream), both the host and audience receivers can call this method to switch to low-\/quality video stream subscription mode. The S\+DK will dynamically adjust the size of the corresponding video stream based on the size of the video window to save bandwidth and computing resources. The default aspect ratio of the low-\/quality video stream is the same as that of the high-\/quality video stream. According to the current aspect ratio of the high-\/quality video stream, the system will automatically allocate the resolution, frame rate, and bitrate of the low-\/quality video stream. Call timing\+: Call this method before joining a channel. The S\+DK does not support changing the default subscribed video stream type after joining a channel.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
If you call both this method and {\ttfamily set\+Remote\+Video\+Stream\+Type}, the setting of {\ttfamily set\+Remote\+Video\+Stream\+Type} takes effect.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em stream\+Type} & The default video-\/stream type. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a00bda165de0a9e8558495bea18b1ee72}\label{classagora_1_1rtc_1_1_i_rtc_engine_a00bda165de0a9e8558495bea18b1ee72}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!muteRemoteVideoStream@{muteRemoteVideoStream}}
\index{muteRemoteVideoStream@{muteRemoteVideoStream}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{muteRemoteVideoStream()}{muteRemoteVideoStream()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::mute\+Remote\+Video\+Stream (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{bool}]{mute }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops or resumes subscribing to the video stream of a specified user. 

Call timing\+: Call this method after joining a channel. Related callbacks\+: After a successful method call, the S\+DK triggers the {\ttfamily on\+Video\+Subscribe\+State\+Changed} callback.


\begin{DoxyParams}{Parameters}
{\em uid} & The user ID of the specified user. \\
\hline
{\em mute} & Whether to subscribe to the specified remote user\textquotesingle{}s video stream.
\begin{DoxyItemize}
\item {\ttfamily true}\+: Stop subscribing to the video streams of the specified user.
\item {\ttfamily false}\+: (Default) Subscribe to the video stream of the specified user.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7c4564b1f4a00658b4f54960ede571a9}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7c4564b1f4a00658b4f54960ede571a9}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRemoteVideoStreamType@{setRemoteVideoStreamType}}
\index{setRemoteVideoStreamType@{setRemoteVideoStreamType}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRemoteVideoStreamType()}{setRemoteVideoStreamType()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Remote\+Video\+Stream\+Type (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+T\+Y\+PE}]{stream\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the video stream type to subscribe to. 

Depending on the default behavior of the sender and the specific settings when calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a33c7eebc75e9a5bbde3904467657eb54}{set\+Dual\+Stream\+Mode(\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+D\+E mode, const Simulcast\+Stream\+Config\& stream\+Config)}}}, the scenarios for the receiver calling this method are as follows\+:
\begin{DoxyItemize}
\item The S\+DK enables low-\/quality video stream adaptive mode ( {\ttfamily A\+U\+T\+O\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} ) on the sender side by default, meaning only the high-\/quality video stream is transmitted. Only the receiver with the role of the $\ast$$\ast$host$\ast$$\ast$can call this method to initiate a low-\/quality video stream request. Once the sender receives the request, it starts automatically sending the low-\/quality video stream. At this point, all users in the channel can call this method to switch to low-\/quality video stream subscription mode.
\item If the sender calls {\ttfamily set\+Dual\+Stream\+Mode(S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE mode, const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}}\& stream\+Config)} and sets {\ttfamily mode} to {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} (never send low-\/quality video stream), then calling this method will have no effect.
\item If the sender calls {\ttfamily set\+Dual\+Stream\+Mode(S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE mode, const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}}\& stream\+Config)} and sets {\ttfamily mode} to {\ttfamily E\+N\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} (always send low-\/quality video stream), both the host and audience receivers can call this method to switch to low-\/quality video stream subscription mode. The S\+DK will dynamically adjust the size of the corresponding video stream based on the size of the video window to save bandwidth and computing resources. The default aspect ratio of the low-\/quality video stream is the same as that of the high-\/quality video stream. According to the current aspect ratio of the high-\/quality video stream, the system will automatically allocate the resolution, frame rate, and bitrate of the low-\/quality video stream.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel.
\item If you call both this method and {\ttfamily set\+Remote\+Default\+Video\+Stream\+Type}, the setting of this method takes effect.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & The user ID. \\
\hline
{\em stream\+Type} & The video stream type, see {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a9aa3a3c0ceaeaa889cc73173044c305d}\label{classagora_1_1rtc_1_1_i_rtc_engine_a9aa3a3c0ceaeaa889cc73173044c305d}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRemoteVideoSubscriptionOptions@{setRemoteVideoSubscriptionOptions}}
\index{setRemoteVideoSubscriptionOptions@{setRemoteVideoSubscriptionOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRemoteVideoSubscriptionOptions()}{setRemoteVideoSubscriptionOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Remote\+Video\+Subscription\+Options (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_subscription_options}{Video\+Subscription\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Options for subscribing to remote video streams. 

When a remote user has enabled dual-\/stream mode, you can call this method to choose the option for subscribing to the video streams sent by the remote user. The default subscription behavior of the S\+DK for remote video streams depends on the type of registered video observer\+:
\begin{DoxyItemize}
\item If the {\ttfamily I\+Video\+Frame\+Observer} observer is registered, the default is to subscribe to both raw data and encoded data.
\item If the {\ttfamily I\+Video\+Encoded\+Frame\+Observer} observer is registered, the default is to subscribe only to the encoded data.
\item If both types of observers are registered, the default behavior follows the last registered video observer. For example, if the last registered observer is the {\ttfamily I\+Video\+Frame\+Observer} observer, the default is to subscribe to both raw data and encoded data. If you want to modify the default behavior, or set different subscription options for different {\ttfamily uids}, you can call this method to set it.
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em uid} & The user ID of the remote user. \\
\hline
{\em options} & The video subscription options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_video_subscription_options}{Video\+Subscription\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a1438e53a4bc22443e2918c8b05208222}\label{classagora_1_1rtc_1_1_i_rtc_engine_a1438e53a4bc22443e2918c8b05208222}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setSubscribeAudioBlocklist@{setSubscribeAudioBlocklist}}
\index{setSubscribeAudioBlocklist@{setSubscribeAudioBlocklist}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setSubscribeAudioBlocklist()}{setSubscribeAudioBlocklist()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Subscribe\+Audio\+Blocklist (\begin{DoxyParamCaption}\item[{uid\+\_\+t $\ast$}]{uid\+List,  }\item[{int}]{uid\+Number }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the blocklist of subscriptions for audio streams. 

You can call this method to specify the audio streams of a user that you do not want to subscribe to.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel.
\item The blocklist is not affected by the setting in {\ttfamily mute\+Remote\+Audio\+Stream}, {\ttfamily mute\+All\+Remote\+Audio\+Streams}, and {\ttfamily auto\+Subscribe\+Audio} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.
\item Once the blocklist of subscriptions is set, it is effective even if you leave the current channel and rejoin the channel.
\item If a user is added in the allowlist and blocklist at the same time, only the blocklist takes effect.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid\+List} & The user ID list of users that you do not want to subscribe to. If you want to specify the audio streams of a user that you do not want to subscribe to, add the user ID in this list. If you want to remove a user from the blocklist, you need to call the {\ttfamily set\+Subscribe\+Audio\+Blocklist} method to update the user ID list; this means you only add the {\ttfamily uid} of users that you do not want to subscribe to in the new user ID list. \\
\hline
{\em uid\+Number} & The number of users in the user ID list.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a1c67bbf6f21f063db837c8b8a8b3caa4}\label{classagora_1_1rtc_1_1_i_rtc_engine_a1c67bbf6f21f063db837c8b8a8b3caa4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setSubscribeAudioAllowlist@{setSubscribeAudioAllowlist}}
\index{setSubscribeAudioAllowlist@{setSubscribeAudioAllowlist}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setSubscribeAudioAllowlist()}{setSubscribeAudioAllowlist()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Subscribe\+Audio\+Allowlist (\begin{DoxyParamCaption}\item[{uid\+\_\+t $\ast$}]{uid\+List,  }\item[{int}]{uid\+Number }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the allowlist of subscriptions for audio streams. 

You can call this method to specify the audio streams of a user that you want to subscribe to.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel.
\item The allowlist is not affected by the setting in {\ttfamily mute\+Remote\+Audio\+Stream}, {\ttfamily mute\+All\+Remote\+Audio\+Streams} and {\ttfamily auto\+Subscribe\+Audio} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.
\item Once the allowlist of subscriptions is set, it is effective even if you leave the current channel and rejoin the channel.
\item If a user is added in the allowlist and blocklist at the same time, only the blocklist takes effect.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid\+List} & The user ID list of users that you want to subscribe to. If you want to specify the audio streams of a user for subscription, add the user ID in this list. If you want to remove a user from the allowlist, you need to call the {\ttfamily set\+Subscribe\+Audio\+Allowlist} method to update the user ID list; this means you only add the {\ttfamily uid} of users that you want to subscribe to in the new user ID list. \\
\hline
{\em uid\+Number} & The number of users in the user ID list.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac29e3a697f157afdaf7e5ed831c072a7}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac29e3a697f157afdaf7e5ed831c072a7}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setSubscribeVideoBlocklist@{setSubscribeVideoBlocklist}}
\index{setSubscribeVideoBlocklist@{setSubscribeVideoBlocklist}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setSubscribeVideoBlocklist()}{setSubscribeVideoBlocklist()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Subscribe\+Video\+Blocklist (\begin{DoxyParamCaption}\item[{uid\+\_\+t $\ast$}]{uid\+List,  }\item[{int}]{uid\+Number }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the blocklist of subscriptions for video streams. 

You can call this method to specify the video streams of a user that you do not want to subscribe to.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel.
\item The blocklist is not affected by the setting in {\ttfamily mute\+Remote\+Video\+Stream}, {\ttfamily mute\+All\+Remote\+Video\+Streams} and {\ttfamily auto\+Subscribe\+Audio} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.
\item Once the blocklist of subscriptions is set, it is effective even if you leave the current channel and rejoin the channel.
\item If a user is added in the allowlist and blocklist at the same time, only the blocklist takes effect.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid\+List} & The user ID list of users that you do not want to subscribe to. If you want to specify the video streams of a user that you do not want to subscribe to, add the user ID of that user in this list. If you want to remove a user from the blocklist, you need to call the {\ttfamily set\+Subscribe\+Video\+Blocklist} method to update the user ID list; this means you only add the {\ttfamily uid} of users that you do not want to subscribe to in the new user ID list. \\
\hline
{\em uid\+Number} & The number of users in the user ID list.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae2f201fe42cb9b580e30b9e638faa4a1}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae2f201fe42cb9b580e30b9e638faa4a1}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setSubscribeVideoAllowlist@{setSubscribeVideoAllowlist}}
\index{setSubscribeVideoAllowlist@{setSubscribeVideoAllowlist}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setSubscribeVideoAllowlist()}{setSubscribeVideoAllowlist()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Subscribe\+Video\+Allowlist (\begin{DoxyParamCaption}\item[{uid\+\_\+t $\ast$}]{uid\+List,  }\item[{int}]{uid\+Number }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the allowlist of subscriptions for video streams. 

You can call this method to specify the video streams of a user that you want to subscribe to.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel.
\item The allowlist is not affected by the setting in {\ttfamily mute\+Remote\+Video\+Stream}, {\ttfamily mute\+All\+Remote\+Video\+Streams} and {\ttfamily auto\+Subscribe\+Audio} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.
\item Once the allowlist of subscriptions is set, it is effective even if you leave the current channel and rejoin the channel.
\item If a user is added in the allowlist and blocklist at the same time, only the blocklist takes effect.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid\+List} & The user ID list of users that you want to subscribe to. If you want to specify the video streams of a user for subscription, add the user ID of that user in this list. If you want to remove a user from the allowlist, you need to call the {\ttfamily set\+Subscribe\+Video\+Allowlist} method to update the user ID list; this means you only add the {\ttfamily uid} of users that you want to subscribe to in the new user ID list. \\
\hline
{\em uid\+Number} & The number of users in the user ID list.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a23981734852c4171c6e55f3ff910cde3}\label{classagora_1_1rtc_1_1_i_rtc_engine_a23981734852c4171c6e55f3ff910cde3}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableAudioVolumeIndication@{enableAudioVolumeIndication}}
\index{enableAudioVolumeIndication@{enableAudioVolumeIndication}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableAudioVolumeIndication()}{enableAudioVolumeIndication()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Audio\+Volume\+Indication (\begin{DoxyParamCaption}\item[{int}]{interval,  }\item[{int}]{smooth,  }\item[{bool}]{report\+Vad }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables the reporting of users\textquotesingle{} volume indication. 

This method enables the S\+DK to regularly report the volume information to the app of the local user who sends a stream and remote users (three users at most) whose instantaneous volumes are the highest. Call timing\+: This method can be called either before or after joining the channel. Related callbacks\+: The S\+DK triggers the {\ttfamily on\+Audio\+Volume\+Indication} callback according to the interval you set if this method is successfully called and there are users publishing streams in the channel.


\begin{DoxyParams}{Parameters}
{\em interval} & Sets the time interval between two consecutive volume indications\+:
\begin{DoxyItemize}
\item ≤ 0\+: Disables the volume indication.
\item $>$ 0\+: Time interval (ms) between two consecutive volume indications. Ensure this parameter is set to a value greater than 10, otherwise you will not receive the {\ttfamily on\+Audio\+Volume\+Indication} callback. Agora recommends that this value is set as greater than 100. 
\end{DoxyItemize}\\
\hline
{\em smooth} & The smoothing factor that sets the sensitivity of the audio volume indicator. The value ranges between 0 and 10. The recommended value is 3. The greater the value, the more sensitive the indicator. \\
\hline
{\em report\+Vad} & -\/ {\ttfamily true}\+: Enables the voice activity detection of the local user. Once it is enabled, the {\ttfamily vad} parameter of the {\ttfamily on\+Audio\+Volume\+Indication} callback reports the voice activity status of the local user.
\begin{DoxyItemize}
\item {\ttfamily false}\+: (Default) Disables the voice activity detection of the local user. Once it is disabled, the {\ttfamily vad} parameter of the {\ttfamily on\+Audio\+Volume\+Indication} callback does not report the voice activity status of the local user, except for the scenario where the engine automatically detects the voice activity of the local user.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2bcdb3713d087c6318a2e1972c1e8cc6}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2bcdb3713d087c6318a2e1972c1e8cc6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startAudioRecording@{startAudioRecording}}
\index{startAudioRecording@{startAudioRecording}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startAudioRecording()}{startAudioRecording()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Audio\+Recording (\begin{DoxyParamCaption}\item[{const char $\ast$}]{file\+Path,  }\item[{A\+U\+D\+I\+O\+\_\+\+R\+E\+C\+O\+R\+D\+I\+N\+G\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+T\+Y\+PE}]{quality }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts client-\/side audio recording with recording configuration. 

The S\+DK supports recording on the client during a call. After calling this method, you can record the audio of users in the channel and obtain a recording file. The recording file supports the following formats only\+:
\begin{DoxyItemize}
\item W\+AV\+: Higher audio fidelity, larger file size. For example, with a sample rate of 32000 Hz, a 10-\/minute recording is about 73 MB.
\item A\+AC\+: Lower audio fidelity, smaller file size. For example, with a sample rate of 32000 Hz and recording quality set to A\+U\+D\+I\+O\+\_\+\+R\+E\+C\+O\+R\+D\+I\+N\+G\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+M\+E\+D\+I\+UM, a 10-\/minute recording is about 2 MB. Recording automatically stops when the user leaves the channel. Call timing\+: This method must be called after joining a channel.
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em config} & Recording configuration. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_audio_recording_configuration}{Audio\+Recording\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. See {\ttfamily Error Codes} for details and resolution suggestions. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3c05d82c97a9d63ebda116b9a1e5ca3f}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3c05d82c97a9d63ebda116b9a1e5ca3f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startAudioRecording@{startAudioRecording}}
\index{startAudioRecording@{startAudioRecording}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startAudioRecording()}{startAudioRecording()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Audio\+Recording (\begin{DoxyParamCaption}\item[{const char $\ast$}]{file\+Path,  }\item[{int}]{sample\+Rate,  }\item[{A\+U\+D\+I\+O\+\_\+\+R\+E\+C\+O\+R\+D\+I\+N\+G\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+T\+Y\+PE}]{quality }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts client-\/side audio recording and sets the recording sample rate. 

The S\+DK supports recording on the client during a call. After calling this method, you can record the audio of all users in the channel and obtain a recording file that includes all voices. The recording file supports the following formats only\+:
\begin{DoxyItemize}
\item .wav\+: Large file size, higher audio fidelity.
\item .aac\+: Smaller file size, lower audio fidelity.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Make sure the path you specify in this method exists and is writable.
\item This method must be called after {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)}. If {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad5c2ef631e3e4076f6aec96ed1152262}{leave\+Channel(const Leave\+Channel\+Options\& options)}}} is called while recording is in progress, the recording will automatically stop.
\item To ensure recording quality, when {\ttfamily sample\+Rate} is set to 44.\+1 k\+Hz or 48 k\+Hz, it is recommended to set {\ttfamily quality} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+R\+E\+C\+O\+R\+D\+I\+N\+G\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+M\+E\+D\+I\+UM} or {\ttfamily A\+U\+D\+I\+O\+\_\+\+R\+E\+C\+O\+R\+D\+I\+N\+G\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+H\+I\+GH}.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em file\+Path} & The absolute path where the recording file will be saved locally, including the file name and extension. For example\+: {\ttfamily C\+:\textbackslash{}music\textbackslash{}audio.\+aac}. Note\+: Make sure the specified path exists and is writable. \\
\hline
{\em sample\+Rate} & Recording sample rate (Hz). You can set it to one of the following values\+:
\begin{DoxyItemize}
\item 16000
\item 32000 (default)
\item 44100
\item 48000 
\end{DoxyItemize}\\
\hline
{\em quality} & Recording quality. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+R\+E\+C\+O\+R\+D\+I\+N\+G\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. See {\ttfamily Error Codes} for details and resolution suggestions. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ace2bdbb7456d52e117e80a96c9e9b7b4}\label{classagora_1_1rtc_1_1_i_rtc_engine_ace2bdbb7456d52e117e80a96c9e9b7b4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startAudioRecording@{startAudioRecording}}
\index{startAudioRecording@{startAudioRecording}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startAudioRecording()}{startAudioRecording()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Audio\+Recording (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_audio_recording_configuration}{Audio\+Recording\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Starts an audio recording.

The S\+DK allows recording during a call, which supports either one of the following two formats\+:


\begin{DoxyItemize}
\item .wav\+: Large file size with high sound fidelity
\item .aac\+: Small file size with low sound fidelity
\end{DoxyItemize}

Ensure that the directory to save the recording file exists and is writable. This method is usually called after the \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_adc937172e59bd2695ea171553a88188c}{join\+Channel()}} method. The recording automatically stops when the \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a51c12d209373650638bfd82e28777081}{leave\+Channel()}} method is called.


\begin{DoxyParams}{Parameters}
{\em config} & Audio recording config. \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a92470d0cf6a44deb6b720faafbca522c}\label{classagora_1_1rtc_1_1_i_rtc_engine_a92470d0cf6a44deb6b720faafbca522c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!registerAudioEncodedFrameObserver@{registerAudioEncodedFrameObserver}}
\index{registerAudioEncodedFrameObserver@{registerAudioEncodedFrameObserver}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{registerAudioEncodedFrameObserver()}{registerAudioEncodedFrameObserver()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::register\+Audio\+Encoded\+Frame\+Observer (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_audio_encoded_frame_observer_config}{Audio\+Encoded\+Frame\+Observer\+Config}} \&}]{config,  }\item[{\mbox{\hyperlink{classagora_1_1rtc_1_1_i_audio_encoded_frame_observer}{I\+Audio\+Encoded\+Frame\+Observer}} $\ast$}]{observer }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Registers an encoded audio observer. 

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Call this method after joining a channel.
\item You can call this method or {\ttfamily start\+Audio\+Recording \mbox{[}3/3\mbox{]}} to set the recording type and quality of audio files, but Agora does not recommend using this method and {\ttfamily start\+Audio\+Recording \mbox{[}3/3\mbox{]}} at the same time. Only the method called later will take effect.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & Observer settings for the encoded audio. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_audio_encoded_frame_observer_config}{Audio\+Encoded\+Frame\+Observer\+Config}}}. \\
\hline
{\em observer} & The encoded audio observer. See {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_audio_encoded_frame_observer}{I\+Audio\+Encoded\+Frame\+Observer}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_adb392026425663e5b9f90fe90130e5a5}\label{classagora_1_1rtc_1_1_i_rtc_engine_adb392026425663e5b9f90fe90130e5a5}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopAudioRecording@{stopAudioRecording}}
\index{stopAudioRecording@{stopAudioRecording}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopAudioRecording()}{stopAudioRecording()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Audio\+Recording (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops client-\/side audio recording. 

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. See {\ttfamily Error Codes} for details and resolution suggestions. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae5fd78464db9420fdca3d493d7443bd0}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae5fd78464db9420fdca3d493d7443bd0}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!createMediaPlayer@{createMediaPlayer}}
\index{createMediaPlayer@{createMediaPlayer}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{createMediaPlayer()}{createMediaPlayer()}}
{\footnotesize\ttfamily virtual \mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$I\+Media\+Player$>$ agora\+::rtc\+::\+I\+Rtc\+Engine\+::create\+Media\+Player (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Creates a media player object. 

Before calling any A\+P\+Is in the {\ttfamily I\+Media\+Player} class, you need to call this method to create an instance of the media player. If you need to create multiple instances, you can call this method multiple times. Call timing\+: You can call this method either before or after joining a channel.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item An {\ttfamily I\+Media\+Player} object, if the method call succeeds.
\item An empty pointer, if the method call fails. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a71cb948b53e2d17c13bef4a6bfa57efc}\label{classagora_1_1rtc_1_1_i_rtc_engine_a71cb948b53e2d17c13bef4a6bfa57efc}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!destroyMediaPlayer@{destroyMediaPlayer}}
\index{destroyMediaPlayer@{destroyMediaPlayer}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{destroyMediaPlayer()}{destroyMediaPlayer()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::destroy\+Media\+Player (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ I\+Media\+Player $>$}]{media\+\_\+player }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Destroys the media player instance. 


\begin{DoxyParams}{Parameters}
{\em media\+\_\+player} & {\ttfamily I\+Media\+Player} object.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item ≥ 0\+: Success. Returns the ID of media player instance.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae92091361a67f144662069758bceda5a}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae92091361a67f144662069758bceda5a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!createMediaRecorder@{createMediaRecorder}}
\index{createMediaRecorder@{createMediaRecorder}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{createMediaRecorder()}{createMediaRecorder()}}
{\footnotesize\ttfamily virtual \mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$\mbox{\hyperlink{classagora_1_1rtc_1_1_i_media_recorder}{I\+Media\+Recorder}}$>$ agora\+::rtc\+::\+I\+Rtc\+Engine\+::create\+Media\+Recorder (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_recorder_stream_info}{Recorder\+Stream\+Info}} \&}]{info }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Creates an audio and video recording object. 

Before starting to record audio and video streams, you need to call this method to create a recording object. The S\+DK supports recording multiple audio and video streams from local or remote users. You can call this method multiple times to create recording objects, and use the {\ttfamily info} parameter to specify the channel name and the user ID of the stream to be recorded. After successful creation, you need to call {\ttfamily set\+Media\+Recorder\+Observer} to register an observer for the recording object to listen for related callbacks, and then call {\ttfamily start\+Recording} to begin recording.


\begin{DoxyParams}{Parameters}
{\em info} & Information about the audio and video stream to be recorded. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_recorder_stream_info}{Recorder\+Stream\+Info}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item If the method call succeeds\+: Returns an {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_media_recorder}{I\+Media\+Recorder}}} object.
\item If the method call fails\+: Returns a null pointer. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac52255dc624918588b73837c07be0ae6}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac52255dc624918588b73837c07be0ae6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!destroyMediaRecorder@{destroyMediaRecorder}}
\index{destroyMediaRecorder@{destroyMediaRecorder}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{destroyMediaRecorder()}{destroyMediaRecorder()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::destroy\+Media\+Recorder (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1agora__refptr}{agora\+\_\+refptr}}$<$ \mbox{\hyperlink{classagora_1_1rtc_1_1_i_media_recorder}{I\+Media\+Recorder}} $>$}]{media\+Recorder }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Destroys an audio and video recording object. 

When you no longer need to record audio and video streams, you can call this method to destroy the corresponding recording object. If recording is in progress, call {\ttfamily stop\+Recording} first, then call this method to destroy the recording object.


\begin{DoxyParams}{Parameters}
{\em media\+Recorder} & The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_media_recorder}{I\+Media\+Recorder}}} object to be destroyed.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. See {\ttfamily Error Codes} for details and resolution suggestions. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8739ebb08c6d97c1ee708889ef834d5f}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8739ebb08c6d97c1ee708889ef834d5f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startAudioMixing@{startAudioMixing}}
\index{startAudioMixing@{startAudioMixing}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startAudioMixing()}{startAudioMixing()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Audio\+Mixing (\begin{DoxyParamCaption}\item[{const char $\ast$}]{file\+Path,  }\item[{bool}]{loopback,  }\item[{int}]{cycle }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts playing the music file. 

Starts playing and mixing the music file.

This method mixes the specified local audio file with the audio stream from the microphone. You can choose whether the other user can hear the local audio playback and specify the number of playback loops. This method also supports online music playback.

After calling this method successfully, the S\+DK triggers the

\mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler_ae2e257d7bbf120b970b600b9b3731a07}{on\+Audio\+Mixing\+State\+Changed}} (P\+L\+AY) callback on the local client. When the audio mixing file playback finishes after calling this method, the S\+DK triggers the \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler_ae2e257d7bbf120b970b600b9b3731a07}{on\+Audio\+Mixing\+State\+Changed}} (S\+T\+O\+P\+P\+ED) callback on the local client.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Call this method after joining a channel, otherwise issues may occur.
\item If the local audio mixing file does not exist, or if the S\+DK does not support the file format or cannot access the music file U\+RL, the S\+DK returns \#\+W\+A\+R\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+O\+P\+E\+N\+\_\+\+E\+R\+R\+OR (701).
\item If you want to play an online music file, ensure that the time interval between calling this method is more than 100 ms, or the {\ttfamily A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+E\+R\+R\+O\+R\+\_\+\+T\+O\+O\+\_\+\+F\+R\+E\+Q\+U\+E\+N\+T\+\_\+\+C\+A\+L\+L(702)} error code occurs.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em file\+Path} & Pointer to the absolute path (including the suffixes of the filename) of the local or online audio file to mix, for example, c\+:/music/au dio.\+mp4. Supported audio formats\+: 3GP, A\+SF, A\+D\+TS, A\+VI, M\+P3, M\+P4, M\+P\+E\+G-\/4, S\+A\+MI, and W\+A\+VE. \\
\hline
{\em loopback} & Sets which user can hear the audio mixing\+:
\begin{DoxyItemize}
\item true\+: Only the local user can hear the audio mixing.
\item false\+: Both users can hear the audio mixing.
\end{DoxyItemize}\\
\hline
{\em cycle} & Sets the number of playback loops\+:
\begin{DoxyItemize}
\item Positive integer\+: Number of playback loops.
\item {\ttfamily -\/1}\+: Infinite playback loops.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\end{DoxyItemize}
\end{DoxyReturn}
For the audio file formats supported by this method, see {\ttfamily What formats of audio files does the Agora R\+TC S\+DK support}. If the local music file does not exist, the S\+DK does not support the file format, or the the S\+DK cannot access the music file U\+RL, the S\+DK reports A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+C\+A\+N\+\_\+\+N\+O\+T\+\_\+\+O\+P\+EN. Call timing\+: You can call this method either before or after joining a channel. Related callbacks\+: A successful method call triggers the {\ttfamily on\+Audio\+Mixing\+State\+Changed} ({\ttfamily A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG}) callback. When the audio mixing file playback finishes, the S\+DK triggers the {\ttfamily on\+Audio\+Mixing\+State\+Changed} ({\ttfamily A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+ED}) callback on the local client.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item If you call this method to play short sound effect files, you may encounter playback failure. Agora recommends using {\ttfamily play\+Effect} instead to play such files.
\item If you need to call this method multiple times, ensure that the time interval between calling this method is more than 500 ms.
\item On Android, there are following considerations\+:
\begin{DoxyItemize}
\item To use this method, ensure that the Android device is v4.\+2 or later, and the A\+PI version is v16 or later.
\item If you need to play an online music file, Agora does not recommend using the redirected U\+RL address. Some Android devices may fail to open a redirected U\+RL address.
\item If you call this method on an emulator, ensure that the music file is in the {\ttfamily /sdcard/} directory and the format is M\+P3.
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em file\+Path} & The file path. The S\+DK supports U\+R\+Ls and absolute path of local files. The absolute path needs to be accurate to the file name and extension. Supported audio formats include M\+P3, A\+AC, M4A, M\+P4, W\+AV, and 3GP. See {\ttfamily Supported Audio Formats}. Attention\+: If you have preloaded an audio effect into memory by calling {\ttfamily preload\+Effect}, ensure that the value of this parameter is the same as that of {\ttfamily file\+Path} in {\ttfamily preload\+Effect}. \\
\hline
{\em loopback} & Whether to only play music files on the local client\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Only play music files on the local client so that only the local user can hear the music.
\item {\ttfamily false}\+: Publish music files to remote clients so that both the local user and remote users can hear the music. 
\end{DoxyItemize}\\
\hline
{\em cycle} & The number of times the music file plays.
\begin{DoxyItemize}
\item $>$0\+: The number of times for playback. For example, 1 represents playing 1 time.
\item -\/1\+: Play the audio file in an infinite loop.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid.
\item -\/3\+: The S\+DK is not ready.
\begin{DoxyItemize}
\item The audio module is disabled.
\item The program is not complete.
\item The initialization of {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} fails. Reinitialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}}. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a88a90b9433ec193f9821738ba55e6ec3}\label{classagora_1_1rtc_1_1_i_rtc_engine_a88a90b9433ec193f9821738ba55e6ec3}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startAudioMixing@{startAudioMixing}}
\index{startAudioMixing@{startAudioMixing}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startAudioMixing()}{startAudioMixing()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Audio\+Mixing (\begin{DoxyParamCaption}\item[{const char $\ast$}]{file\+Path,  }\item[{bool}]{loopback,  }\item[{int}]{cycle,  }\item[{int}]{start\+Pos }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts playing the music file. 

Starts playing and mixing the music file.

This method mixes the specified local audio file with the audio stream from the microphone. You can choose whether the other user can hear the local audio playback and specify the number of playback loops. This method also supports online music playback.

After calling this method successfully, the S\+DK triggers the

\mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler_ae2e257d7bbf120b970b600b9b3731a07}{on\+Audio\+Mixing\+State\+Changed}} (P\+L\+AY) callback on the local client. When the audio mixing file playback finishes after calling this method, the S\+DK triggers the \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler_ae2e257d7bbf120b970b600b9b3731a07}{on\+Audio\+Mixing\+State\+Changed}} (S\+T\+O\+P\+P\+ED) callback on the local client.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Call this method after joining a channel, otherwise issues may occur.
\item If the local audio mixing file does not exist, or if the S\+DK does not support the file format or cannot access the music file U\+RL, the S\+DK returns \#\+W\+A\+R\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+O\+P\+E\+N\+\_\+\+E\+R\+R\+OR (701).
\item If you want to play an online music file, ensure that the time interval between calling this method is more than 100 ms, or the {\ttfamily A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+E\+R\+R\+O\+R\+\_\+\+T\+O\+O\+\_\+\+F\+R\+E\+Q\+U\+E\+N\+T\+\_\+\+C\+A\+L\+L(702)} error code occurs.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em file\+Path} & Pointer to the absolute path (including the suffixes of the filename) of the local or online audio file to mix, for example, c\+:/music/au dio.\+mp4. Supported audio formats\+: 3GP, A\+SF, A\+D\+TS, A\+VI, M\+P3, M\+P4, M\+P\+E\+G-\/4, S\+A\+MI, and W\+A\+VE. \\
\hline
{\em loopback} & Sets which user can hear the audio mixing\+:
\begin{DoxyItemize}
\item true\+: Only the local user can hear the audio mixing.
\item false\+: Both users can hear the audio mixing.
\end{DoxyItemize}\\
\hline
{\em cycle} & Sets the number of playback loops\+:
\begin{DoxyItemize}
\item Positive integer\+: Number of playback loops.
\item {\ttfamily -\/1}\+: Infinite playback loops.
\end{DoxyItemize}\\
\hline
{\em start\+Pos} & The playback position (ms) of the music file.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\end{DoxyItemize}
\end{DoxyReturn}
For the audio file formats supported by this method, see {\ttfamily What formats of audio files does the Agora R\+TC S\+DK support}. If the local music file does not exist, the S\+DK does not support the file format, or the the S\+DK cannot access the music file U\+RL, the S\+DK reports A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+C\+A\+N\+\_\+\+N\+O\+T\+\_\+\+O\+P\+EN. Call timing\+: You can call this method either before or after joining a channel. Related callbacks\+: A successful method call triggers the {\ttfamily on\+Audio\+Mixing\+State\+Changed} ({\ttfamily A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG}) callback. When the audio mixing file playback finishes, the S\+DK triggers the {\ttfamily on\+Audio\+Mixing\+State\+Changed} ({\ttfamily A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+ED}) callback on the local client.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item If you call this method to play short sound effect files, you may encounter playback failure. Agora recommends using {\ttfamily play\+Effect} instead to play such files.
\item If you need to call this method multiple times, ensure that the time interval between calling this method is more than 500 ms.
\item On Android, there are following considerations\+:
\begin{DoxyItemize}
\item To use this method, ensure that the Android device is v4.\+2 or later, and the A\+PI version is v16 or later.
\item If you need to play an online music file, Agora does not recommend using the redirected U\+RL address. Some Android devices may fail to open a redirected U\+RL address.
\item If you call this method on an emulator, ensure that the music file is in the {\ttfamily /sdcard/} directory and the format is M\+P3.
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em file\+Path} & File path\+:
\begin{DoxyItemize}
\item Android\+: The file path, which needs to be accurate to the file name and suffix. Agora supports U\+RL addresses, absolute paths, or file paths that start with {\ttfamily /assets/}. You might encounter permission issues if you use an absolute path to access a local file, so Agora recommends using a U\+RI address instead. For example{\ttfamily \+: content\+://com.android.\+providers.\+media.\+documents/document/audio\%3A14441}
\item Windows\+: The absolute path or U\+RL address (including the suffixes of the filename) of the audio effect file. For example{\ttfamily \+: C\+:\textbackslash{}music\textbackslash{}audio.\+mp4}. 
\end{DoxyItemize}\\
\hline
{\em loopback} & Whether to only play music files on the local client\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Only play music files on the local client so that only the local user can hear the music.
\item {\ttfamily false}\+: Publish music files to remote clients so that both the local user and remote users can hear the music. 
\end{DoxyItemize}\\
\hline
{\em cycle} & The number of times the music file plays.
\begin{DoxyItemize}
\item $>$0\+: The number of times for playback. For example, 1 represents playing 1 time.
\item -\/1\+: Play the audio file in an infinite loop. 
\end{DoxyItemize}\\
\hline
{\em start\+Pos} & The playback position (ms) of the music file.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid.
\item -\/3\+: The S\+DK is not ready.
\begin{DoxyItemize}
\item The audio module is disabled.
\item The program is not complete.
\item The initialization of {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} fails. Reinitialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}}. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2b90cbf4142c913b3efa795482713b08}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2b90cbf4142c913b3efa795482713b08}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopAudioMixing@{stopAudioMixing}}
\index{stopAudioMixing@{stopAudioMixing}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopAudioMixing()}{stopAudioMixing()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Audio\+Mixing (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops playing the music file. 

After calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a88a90b9433ec193f9821738ba55e6ec3}{start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)}}} to play a music file, you can call this method to stop the playing. If you only need to pause the playback, call {\ttfamily pause\+Audio\+Mixing}. Call timing\+: Call this method after joining a channel.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab86885c38e7ee7a4b37d5bbacafcaa24}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab86885c38e7ee7a4b37d5bbacafcaa24}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!pauseAudioMixing@{pauseAudioMixing}}
\index{pauseAudioMixing@{pauseAudioMixing}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{pauseAudioMixing()}{pauseAudioMixing()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::pause\+Audio\+Mixing (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Pauses playing and mixing the music file. 

After calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a88a90b9433ec193f9821738ba55e6ec3}{start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)}}} to play a music file, you can call this method to pause the playing. If you need to stop the playback, call {\ttfamily stop\+Audio\+Mixing}. Call timing\+: Call this method after joining a channel.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a5a9606ad7ca4995e0d37fcf1642fe401}\label{classagora_1_1rtc_1_1_i_rtc_engine_a5a9606ad7ca4995e0d37fcf1642fe401}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!resumeAudioMixing@{resumeAudioMixing}}
\index{resumeAudioMixing@{resumeAudioMixing}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{resumeAudioMixing()}{resumeAudioMixing()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::resume\+Audio\+Mixing (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Resumes playing and mixing the music file. 

After calling {\ttfamily pause\+Audio\+Mixing} to pause the playback, you can call this method to resume the playback. Call timing\+: Call this method after joining a channel.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a21e4aa7b76079be0f91f19acd5e9c42b}\label{classagora_1_1rtc_1_1_i_rtc_engine_a21e4aa7b76079be0f91f19acd5e9c42b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!selectAudioTrack@{selectAudioTrack}}
\index{selectAudioTrack@{selectAudioTrack}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{selectAudioTrack()}{selectAudioTrack()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::select\+Audio\+Track (\begin{DoxyParamCaption}\item[{int}]{index }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Selects the audio track used during playback. 

After getting the track index of the audio file, you can call this method to specify any track to play. For example, if different tracks of a multi-\/track file store songs in different languages, you can call this method to set the playback language.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item For the supported formats of audio files, see {\ttfamily \href{https://docs.agora.io/en/help/general-product-inquiry/audio_format}{\texttt{ https\+://docs.\+agora.\+io/en/help/general-\/product-\/inquiry/audio\+\_\+format}}\#extended-\/audio-\/file-\/formats}.
\item You need to call this method after calling {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em index} & The audio track you want to specify. The value should be greater than 0 and less than that of returned by {\ttfamily get\+Audio\+Track\+Count}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7d365b13d852a46192c663440c598304}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7d365b13d852a46192c663440c598304}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getAudioTrackCount@{getAudioTrackCount}}
\index{getAudioTrackCount@{getAudioTrackCount}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getAudioTrackCount()}{getAudioTrackCount()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Audio\+Track\+Count (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the index of audio tracks of the current music file. 

\begin{DoxyNote}{Note}
You need to call this method after calling {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item The S\+DK returns the index of the audio tracks if the method call succeeds.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a544aee96b789ac5a57d26b61b7e1a5fa}\label{classagora_1_1rtc_1_1_i_rtc_engine_a544aee96b789ac5a57d26b61b7e1a5fa}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustAudioMixingVolume@{adjustAudioMixingVolume}}
\index{adjustAudioMixingVolume@{adjustAudioMixingVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustAudioMixingVolume()}{adjustAudioMixingVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+Audio\+Mixing\+Volume (\begin{DoxyParamCaption}\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the volume during audio mixing. 

This method adjusts the audio mixing volume on both the local client and remote clients. Call timing\+: Call this method after {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)}.

\begin{DoxyNote}{Note}
This method does not affect the volume of the audio file set in the {\ttfamily play\+Effect} method.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em volume} & Audio mixing volume. The value ranges between 0 and 100. The default value is 100, which means the original volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a9fafbaaf39578810ec9c11360fc7f027}\label{classagora_1_1rtc_1_1_i_rtc_engine_a9fafbaaf39578810ec9c11360fc7f027}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustAudioMixingPublishVolume@{adjustAudioMixingPublishVolume}}
\index{adjustAudioMixingPublishVolume@{adjustAudioMixingPublishVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustAudioMixingPublishVolume()}{adjustAudioMixingPublishVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+Audio\+Mixing\+Publish\+Volume (\begin{DoxyParamCaption}\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the volume of audio mixing for publishing. 

This method adjusts the volume of audio mixing for publishing (sending to other users). Call timing\+: Call this method after calling {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.


\begin{DoxyParams}{Parameters}
{\em volume} & The volume of audio mixing for local playback. The value ranges between 0 and 100 (default). 100 represents the original volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa65e55a9a331cfd32b36d8847a9631a4}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa65e55a9a331cfd32b36d8847a9631a4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getAudioMixingPublishVolume@{getAudioMixingPublishVolume}}
\index{getAudioMixingPublishVolume@{getAudioMixingPublishVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getAudioMixingPublishVolume()}{getAudioMixingPublishVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Audio\+Mixing\+Publish\+Volume (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Retrieves the audio mixing volume for publishing. 

This method helps troubleshoot audio volume‑related issues.

\begin{DoxyNote}{Note}
You need to call this method after calling {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item ≥ 0\+: The audio mixing volume, if this method call succeeds. The value range is \mbox{[}0,100\mbox{]}.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8677c3f3160927d25d9814a88ab06da6}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8677c3f3160927d25d9814a88ab06da6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustAudioMixingPlayoutVolume@{adjustAudioMixingPlayoutVolume}}
\index{adjustAudioMixingPlayoutVolume@{adjustAudioMixingPlayoutVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustAudioMixingPlayoutVolume()}{adjustAudioMixingPlayoutVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+Audio\+Mixing\+Playout\+Volume (\begin{DoxyParamCaption}\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the volume of audio mixing for local playback. 

Call timing\+: You need to call this method after calling {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.


\begin{DoxyParams}{Parameters}
{\em volume} & The volume of audio mixing for local playback. The value ranges between 0 and 100 (default). 100 represents the original volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aed9dda5a7b2683776f41f6ba0e1f281c}\label{classagora_1_1rtc_1_1_i_rtc_engine_aed9dda5a7b2683776f41f6ba0e1f281c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getAudioMixingPlayoutVolume@{getAudioMixingPlayoutVolume}}
\index{getAudioMixingPlayoutVolume@{getAudioMixingPlayoutVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getAudioMixingPlayoutVolume()}{getAudioMixingPlayoutVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Audio\+Mixing\+Playout\+Volume (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Retrieves the audio mixing volume for local playback. 

You can call this method to get the local playback volume of the mixed audio file, which helps in troubleshooting volume‑related issues. Call timing\+: Call this method after {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item ≥ 0\+: The audio mixing volume, if this method call succeeds. The value range is \mbox{[}0,100\mbox{]}.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6a87b6b9135a6f45095dcf6aa62295cb}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6a87b6b9135a6f45095dcf6aa62295cb}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getAudioMixingDuration@{getAudioMixingDuration}}
\index{getAudioMixingDuration@{getAudioMixingDuration}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getAudioMixingDuration()}{getAudioMixingDuration()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Audio\+Mixing\+Duration (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Retrieves the duration (ms) of the music file. 

Retrieves the total duration (ms) of the audio. Call timing\+: Call this method after {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item ≥ 0\+: The audio mixing duration, if this method call succeeds.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aae54b86e9e6a7c0ed955b96f011855cb}\label{classagora_1_1rtc_1_1_i_rtc_engine_aae54b86e9e6a7c0ed955b96f011855cb}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getAudioMixingCurrentPosition@{getAudioMixingCurrentPosition}}
\index{getAudioMixingCurrentPosition@{getAudioMixingCurrentPosition}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getAudioMixingCurrentPosition()}{getAudioMixingCurrentPosition()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Audio\+Mixing\+Current\+Position (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Retrieves the playback position (ms) of the music file. 

Retrieves the playback position (ms) of the audio.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You need to call this method after calling {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.
\item If you need to call {\ttfamily get\+Audio\+Mixing\+Current\+Position} multiple times, ensure that the time interval between calling this method is more than 500 ms.
\end{DoxyItemize}
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item ≥ 0\+: The current playback position (ms) of the audio mixing, if this method call succeeds. 0 represents that the current music file does not start playing.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6c69e2229c438fd587b8f81df34214ad}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6c69e2229c438fd587b8f81df34214ad}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioMixingPosition@{setAudioMixingPosition}}
\index{setAudioMixingPosition@{setAudioMixingPosition}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioMixingPosition()}{setAudioMixingPosition()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Mixing\+Position (\begin{DoxyParamCaption}\item[{int}]{pos }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the audio mixing position. 

Call this method to set the playback position of the music file to a different starting position (the default plays from the beginning). Call timing\+: Call this method after {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.


\begin{DoxyParams}{Parameters}
{\em pos} & Integer. The playback position (ms).\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a4e7f7adc91ae46996f19c975357370e7}\label{classagora_1_1rtc_1_1_i_rtc_engine_a4e7f7adc91ae46996f19c975357370e7}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioMixingDualMonoMode@{setAudioMixingDualMonoMode}}
\index{setAudioMixingDualMonoMode@{setAudioMixingDualMonoMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioMixingDualMonoMode()}{setAudioMixingDualMonoMode()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Mixing\+Dual\+Mono\+Mode (\begin{DoxyParamCaption}\item[{media\+::\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+D\+U\+A\+L\+\_\+\+M\+O\+N\+O\+\_\+\+M\+O\+DE}]{mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the channel mode of the current audio file. 

In a stereo music file, the left and right channels can store different audio data. According to your needs, you can set the channel mode to original mode, left channel mode, right channel mode, or mixed channel mode. Applicable scenarios\+: For example, in the K\+TV scenario, the left channel of the music file stores the musical accompaniment, and the right channel stores the original singer\textquotesingle{}s vocals. You can set according to actual needs\+:
\begin{DoxyItemize}
\item If you only want to hear the accompaniment, use this method to set the audio file\textquotesingle{}s channel mode to left channel mode.
\item If you need to hear both the accompaniment and the original vocals simultaneously, call this method to set the channel mode to mixed mode. Call timing\+: Call this method after {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
This method only applies to stereo audio files.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em mode} & The channel mode. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+D\+U\+A\+L\+\_\+\+M\+O\+N\+O\+\_\+\+M\+O\+DE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a26b117f7e097801b03522f7da9257425}\label{classagora_1_1rtc_1_1_i_rtc_engine_a26b117f7e097801b03522f7da9257425}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioMixingPitch@{setAudioMixingPitch}}
\index{setAudioMixingPitch@{setAudioMixingPitch}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioMixingPitch()}{setAudioMixingPitch()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Mixing\+Pitch (\begin{DoxyParamCaption}\item[{int}]{pitch }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the pitch of the local music file. 

When a local music file is mixed with a local human voice, call this method to set the pitch of the local music file only. Call timing\+: You need to call this method after calling {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} and receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} {\ttfamily (A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG)} callback.


\begin{DoxyParams}{Parameters}
{\em pitch} & Sets the pitch of the local music file by the chromatic scale. The default value is 0, which means keeping the original pitch. The value ranges from -\/12 to 12, and the pitch value between consecutive values is a chromatic value. The greater the absolute value of this parameter, the higher or lower the pitch of the local music file.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a1850045b8ced9a43118b660f808fed9e}\label{classagora_1_1rtc_1_1_i_rtc_engine_a1850045b8ced9a43118b660f808fed9e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioMixingPlaybackSpeed@{setAudioMixingPlaybackSpeed}}
\index{setAudioMixingPlaybackSpeed@{setAudioMixingPlaybackSpeed}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioMixingPlaybackSpeed()}{setAudioMixingPlaybackSpeed()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Mixing\+Playback\+Speed (\begin{DoxyParamCaption}\item[{int}]{speed }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the playback speed of the current audio file. 

Ensure you call this method after calling {\ttfamily start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)} receiving the {\ttfamily on\+Audio\+Mixing\+State\+Changed} callback reporting the state as {\ttfamily A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG}.


\begin{DoxyParams}{Parameters}
{\em speed} & The playback speed. Agora recommends that you set this to a value between 50 and 400, defined as follows\+:
\begin{DoxyItemize}
\item 50\+: Half the original speed.
\item 100\+: The original speed.
\item 400\+: 4 times the original speed.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a0e9787c57db5b5e8fcc53ef5bb6d24c7}\label{classagora_1_1rtc_1_1_i_rtc_engine_a0e9787c57db5b5e8fcc53ef5bb6d24c7}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getEffectsVolume@{getEffectsVolume}}
\index{getEffectsVolume@{getEffectsVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getEffectsVolume()}{getEffectsVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Effects\+Volume (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Retrieves the volume of the audio effects. 

The volume is an integer ranging from 0 to 100. The default value is 100, which means the original volume.

\begin{DoxyNote}{Note}
Call this method after {\ttfamily play\+Effect}.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item Volume of the audio effects, if this method call succeeds.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_add9a7fd856700acd288d47ff3c7da19d}\label{classagora_1_1rtc_1_1_i_rtc_engine_add9a7fd856700acd288d47ff3c7da19d}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setEffectsVolume@{setEffectsVolume}}
\index{setEffectsVolume@{setEffectsVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setEffectsVolume()}{setEffectsVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Effects\+Volume (\begin{DoxyParamCaption}\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the volume of the audio effects. 

Call timing\+: Call this method after {\ttfamily play\+Effect}.


\begin{DoxyParams}{Parameters}
{\em volume} & The playback volume. The value range is \mbox{[}0, 100\mbox{]}. The default value is 100, which represents the original volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a075dd8a712ecd5f610004ca1bc089d4b}\label{classagora_1_1rtc_1_1_i_rtc_engine_a075dd8a712ecd5f610004ca1bc089d4b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!preloadEffect@{preloadEffect}}
\index{preloadEffect@{preloadEffect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{preloadEffect()}{preloadEffect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::preload\+Effect (\begin{DoxyParamCaption}\item[{int}]{sound\+Id,  }\item[{const char $\ast$}]{file\+Path,  }\item[{int}]{start\+Pos = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Preloads a specified audio effect file into the memory. 

Ensure the size of all preloaded files does not exceed the limit. For the audio file formats supported by this method, see {\ttfamily What formats of audio files does the Agora R\+TC S\+DK support}. Call timing\+: Agora recommends that you call this method before joining a channel.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item If preload\+Effect is called before play\+Effect is executed, the file resource will not be closed after play\+Effect. The next time play\+Effect is executed, it will directly seek to play at the beginning.
\item If preload\+Effect is not called before play\+Effect is executed, the resource will be destroyed after play\+Effect. The next time play\+Effect is executed, it will try to reopen the file and play it from the beginning.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The audio effect ID. The ID of each audio effect file is unique. \\
\hline
{\em file\+Path} & File path\+:
\begin{DoxyItemize}
\item Android\+: The file path, which needs to be accurate to the file name and suffix. Agora supports U\+RL addresses, absolute paths, or file paths that start with {\ttfamily /assets/}. You might encounter permission issues if you use an absolute path to access a local file, so Agora recommends using a U\+RI address instead. For example\+: {\ttfamily content\+://com.android.\+providers.\+media.\+documents/document/audio\%3A14441}
\item Windows\+: The absolute path or U\+RL address (including the suffixes of the filename) of the audio effect file. For example\+: {\ttfamily C\+:\textbackslash{}music\textbackslash{}audio.\+mp4}.
\item i\+OS or mac\+OS\+: The absolute path or U\+RL address (including the suffixes of the filename) of the audio effect file. For example\+: {\ttfamily /var/mobile/\+Containers/\+Data/audio.mp4}. 
\end{DoxyItemize}\\
\hline
{\em start\+Pos} & The playback position (ms) of the audio effect file.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a49de4c18c3fbac4a5e905cd0e0243557}\label{classagora_1_1rtc_1_1_i_rtc_engine_a49de4c18c3fbac4a5e905cd0e0243557}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!playEffect@{playEffect}}
\index{playEffect@{playEffect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{playEffect()}{playEffect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::play\+Effect (\begin{DoxyParamCaption}\item[{int}]{sound\+Id,  }\item[{const char $\ast$}]{file\+Path,  }\item[{int}]{loop\+Count,  }\item[{double}]{pitch,  }\item[{double}]{pan,  }\item[{int}]{gain,  }\item[{bool}]{publish = {\ttfamily false},  }\item[{int}]{start\+Pos = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Plays the specified local or online audio effect file. 

To play multiple audio effect files at the same time, call this method multiple times with different {\ttfamily sound\+Id} and {\ttfamily file\+Path}. To achieve the optimal user experience, Agora recommends that you do not playing more than three audio files at the same time. Call timing\+: You can call this method either before or after joining a channel. Related callbacks\+: After the playback of an audio effect file completes, the S\+DK triggers the {\ttfamily on\+Audio\+Effect\+Finished} callback.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item If you need to play an online audio effect file, Agora recommends that you cache the online audio effect file to your local device, call {\ttfamily preload\+Effect} to preload the file into memory, and then call this method to play the audio effect. Otherwise, you might encounter playback failures or no sound during playback due to loading timeouts or failures.
\item If preload\+Effect is called before play\+Effect is executed, the file resource will not be closed after play\+Effect. The next time play\+Effect is executed, it will directly seek to play at the beginning.
\item If preload\+Effect is not called before play\+Effect is executed, the resource will be destroyed after play\+Effect. The next time play\+Effect is executed, it will try to reopen the file and play it from the beginning.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The audio effect ID. The ID of each audio effect file is unique.\+Attention\+: If you have preloaded an audio effect into memory by calling {\ttfamily preload\+Effect}, ensure that the value of this parameter is the same as that of {\ttfamily sound\+Id} in {\ttfamily preload\+Effect}. \\
\hline
{\em file\+Path} & The file path. The S\+DK supports U\+R\+Ls and absolute path of local files. The absolute path needs to be accurate to the file name and extension. Supported audio formats include M\+P3, A\+AC, M4A, M\+P4, W\+AV, and 3GP. See {\ttfamily Supported Audio Formats}. Attention\+: If you have preloaded an audio effect into memory by calling {\ttfamily preload\+Effect}, ensure that the value of this parameter is the same as that of {\ttfamily file\+Path} in {\ttfamily preload\+Effect}. \\
\hline
{\em loop\+Count} & The number of times the audio effect loops.
\begin{DoxyItemize}
\item ≥ 0\+: The number of playback times. For example, 1 means looping one time, which means playing the audio effect two times in total.
\item -\/1\+: Play the audio file in an infinite loop. 
\end{DoxyItemize}\\
\hline
{\em pitch} & The pitch of the audio effect. The value range is 0.\+5 to 2.\+0. The default value is 1.\+0, which means the original pitch. The lower the value, the lower the pitch. \\
\hline
{\em pan} & The spatial position of the audio effect. The value ranges between -\/1.\+0 and 1.\+0\+:
\begin{DoxyItemize}
\item -\/1.\+0\+: The audio effect is heard on the left of the user.
\item 0.\+0\+: The audio effect is heard in front of the user.
\item 1.\+0\+: The audio effect is heard on the right of the user. 
\end{DoxyItemize}\\
\hline
{\em gain} & The volume of the audio effect. The value range is 0.\+0 to 100.\+0. The default value is 100.\+0, which means the original volume. The smaller the value, the lower the volume. \\
\hline
{\em publish} & Whether to publish the audio effect to the remote users\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Publish the audio effect to the remote users. Both the local user and remote users can hear the audio effect.
\item {\ttfamily false}\+: Do not publish the audio effect to the remote users. Only the local user can hear the audio effect. 
\end{DoxyItemize}\\
\hline
{\em start\+Pos} & The playback position (ms) of the audio effect file.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aba9b070620c7e7659841dd6f94331941}\label{classagora_1_1rtc_1_1_i_rtc_engine_aba9b070620c7e7659841dd6f94331941}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!playAllEffects@{playAllEffects}}
\index{playAllEffects@{playAllEffects}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{playAllEffects()}{playAllEffects()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::play\+All\+Effects (\begin{DoxyParamCaption}\item[{int}]{loop\+Count,  }\item[{double}]{pitch,  }\item[{double}]{pan,  }\item[{int}]{gain,  }\item[{bool}]{publish = {\ttfamily false} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Plays all audio effect files. 

After calling {\ttfamily preload\+Effect} multiple times to preload multiple audio effects into the memory, you can call this method to play all the specified audio effects for all users in the channel.


\begin{DoxyParams}{Parameters}
{\em loop\+Count} & The number of times the audio effect loops\+:
\begin{DoxyItemize}
\item -\/1\+: Play the audio effect files in an indefinite loop until you call {\ttfamily stop\+Effect} or {\ttfamily stop\+All\+Effects}.
\item 0\+: Play the audio effect once.
\item 1\+: Play the audio effect twice. 
\end{DoxyItemize}\\
\hline
{\em pitch} & The pitch of the audio effect. The value ranges between 0.\+5 and 2.\+0. The default value is 1.\+0 (original pitch). The lower the value, the lower the pitch. \\
\hline
{\em pan} & The spatial position of the audio effect. The value ranges between -\/1.\+0 and 1.\+0\+:
\begin{DoxyItemize}
\item -\/1.\+0\+: The audio effect shows on the left.
\item 0\+: The audio effect shows ahead.
\item 1.\+0\+: The audio effect shows on the right. 
\end{DoxyItemize}\\
\hline
{\em gain} & The volume of the audio effect. The value range is \mbox{[}0, 100\mbox{]}. The default value is 100 (original volume). The smaller the value, the lower the volume. \\
\hline
{\em publish} & Whether to publish the audio effect to the remote users\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Publish the audio effect to the remote users. Both the local user and remote users can hear the audio effect.
\item {\ttfamily false}\+: (Default) Do not publish the audio effect to the remote users. Only the local user can hear the audio effect.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab53220e4d12755dc17410531d2b2eebb}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab53220e4d12755dc17410531d2b2eebb}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getVolumeOfEffect@{getVolumeOfEffect}}
\index{getVolumeOfEffect@{getVolumeOfEffect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getVolumeOfEffect()}{getVolumeOfEffect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Volume\+Of\+Effect (\begin{DoxyParamCaption}\item[{int}]{sound\+Id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the volume of a specified audio effect file. 


\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The ID of the audio effect file.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item ≥ 0\+: Returns the volume of the specified audio effect, if the method call is successful. The value ranges between 0 and 100. 100 represents the original volume.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a08287428f277b7bf24d51a86ef61799b}\label{classagora_1_1rtc_1_1_i_rtc_engine_a08287428f277b7bf24d51a86ef61799b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVolumeOfEffect@{setVolumeOfEffect}}
\index{setVolumeOfEffect@{setVolumeOfEffect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVolumeOfEffect()}{setVolumeOfEffect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Volume\+Of\+Effect (\begin{DoxyParamCaption}\item[{int}]{sound\+Id,  }\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the volume of a specified audio effect file. 

Call timing\+: Call this method after {\ttfamily play\+Effect}.


\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The ID of the audio effect. The unique ID of each audio effect file. \\
\hline
{\em volume} & The playback volume. The value range is \mbox{[}0, 100\mbox{]}. The default value is 100, which represents the original volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3c820db172c7fb43da58d81b7916d174}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3c820db172c7fb43da58d81b7916d174}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!pauseEffect@{pauseEffect}}
\index{pauseEffect@{pauseEffect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{pauseEffect()}{pauseEffect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::pause\+Effect (\begin{DoxyParamCaption}\item[{int}]{sound\+Id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Pauses a specified audio effect file. 


\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The audio effect ID. The ID of each audio effect file is unique.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad731a94d9db9e2c3390e1443b379095f}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad731a94d9db9e2c3390e1443b379095f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!pauseAllEffects@{pauseAllEffects}}
\index{pauseAllEffects@{pauseAllEffects}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{pauseAllEffects()}{pauseAllEffects()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::pause\+All\+Effects (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Pauses all audio effects. 

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6489955af474172afe4f4b44e4edb38a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6489955af474172afe4f4b44e4edb38a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!resumeEffect@{resumeEffect}}
\index{resumeEffect@{resumeEffect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{resumeEffect()}{resumeEffect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::resume\+Effect (\begin{DoxyParamCaption}\item[{int}]{sound\+Id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Resumes playing a specified audio effect. 


\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The audio effect ID. The ID of each audio effect file is unique.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2fc1b5996df964f8e12ce579e0eb5f98}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2fc1b5996df964f8e12ce579e0eb5f98}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!resumeAllEffects@{resumeAllEffects}}
\index{resumeAllEffects@{resumeAllEffects}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{resumeAllEffects()}{resumeAllEffects()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::resume\+All\+Effects (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Resumes playing all audio effect files. 

After you call {\ttfamily pause\+All\+Effects} to pause the playback, you can call this method to resume the playback. Call timing\+: Call this method after {\ttfamily pause\+All\+Effects}.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad74eb7c7799b8762bff2b1e7e7bba8b9}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad74eb7c7799b8762bff2b1e7e7bba8b9}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopEffect@{stopEffect}}
\index{stopEffect@{stopEffect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopEffect()}{stopEffect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Effect (\begin{DoxyParamCaption}\item[{int}]{sound\+Id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops playing a specified audio effect. 

When you no longer need to play the audio effect, you can call this method to stop the playback. If you only need to pause the playback, call {\ttfamily pause\+Effect}. Call timing\+: Call this method after {\ttfamily play\+Effect}.


\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The ID of the audio effect. Each audio effect has a unique ID.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a888ecfec4fda81831988898420d60e49}\label{classagora_1_1rtc_1_1_i_rtc_engine_a888ecfec4fda81831988898420d60e49}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopAllEffects@{stopAllEffects}}
\index{stopAllEffects@{stopAllEffects}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopAllEffects()}{stopAllEffects()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+All\+Effects (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops playing all audio effects. 

When you no longer need to play the audio effect, you can call this method to stop the playback. If you only need to pause the playback, call {\ttfamily pause\+All\+Effects}. Call timing\+: Call this method after {\ttfamily play\+Effect}.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa560240d5994be0c1a7853e96077e5f9}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa560240d5994be0c1a7853e96077e5f9}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!unloadEffect@{unloadEffect}}
\index{unloadEffect@{unloadEffect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{unloadEffect()}{unloadEffect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::unload\+Effect (\begin{DoxyParamCaption}\item[{int}]{sound\+Id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Releases a specified preloaded audio effect from the memory. 

After loading the audio effect file into memory using {\ttfamily preload\+Effect}, if you need to release the audio effect file, call this method. Call timing\+: You can call this method either before or after joining a channel.


\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The ID of the audio effect. Each audio effect has a unique ID.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8d94ddc41717887206a4502c42797919}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8d94ddc41717887206a4502c42797919}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!unloadAllEffects@{unloadAllEffects}}
\index{unloadAllEffects@{unloadAllEffects}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{unloadAllEffects()}{unloadAllEffects()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::unload\+All\+Effects (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Releases a specified preloaded audio effect from the memory. 

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a4d2a31c0016d1da9106222edb6c395fd}\label{classagora_1_1rtc_1_1_i_rtc_engine_a4d2a31c0016d1da9106222edb6c395fd}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getEffectDuration@{getEffectDuration}}
\index{getEffectDuration@{getEffectDuration}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getEffectDuration()}{getEffectDuration()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Effect\+Duration (\begin{DoxyParamCaption}\item[{const char $\ast$}]{file\+Path }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Retrieves the duration of the audio effect file. 

\begin{DoxyNote}{Note}
Call this method after joining a channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em file\+Path} & File path\+:
\begin{DoxyItemize}
\item Android\+: The file path, which needs to be accurate to the file name and suffix. Agora supports U\+RL addresses, absolute paths, or file paths that start with {\ttfamily /assets/}. You might encounter permission issues if you use an absolute path to access a local file, so Agora recommends using a U\+RI address instead. For example\+: {\ttfamily content\+://com.android.\+providers.\+media.\+documents/document/audio\%3A14441}
\item Windows\+: The absolute path or U\+RL address (including the suffixes of the filename) of the audio effect file. For example\+: {\ttfamily C\+:\textbackslash{}music\textbackslash{}audio.\+mp4}.
\item i\+OS or mac\+OS\+: The absolute path or U\+RL address (including the suffixes of the filename) of the audio effect file. For example\+: {\ttfamily /var/mobile/\+Containers/\+Data/audio.mp4}.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item The total duration (ms) of the specified audio effect file, if the method call succeeds.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_acc753bf864b6c84d97c2d6778234c36e}\label{classagora_1_1rtc_1_1_i_rtc_engine_acc753bf864b6c84d97c2d6778234c36e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setEffectPosition@{setEffectPosition}}
\index{setEffectPosition@{setEffectPosition}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setEffectPosition()}{setEffectPosition()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Effect\+Position (\begin{DoxyParamCaption}\item[{int}]{sound\+Id,  }\item[{int}]{pos }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the playback position of an audio effect file. 

After a successful setting, the local audio effect file starts playing at the specified position.

\begin{DoxyNote}{Note}
Call this method after {\ttfamily play\+Effect}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The audio effect ID. The ID of each audio effect file is unique. \\
\hline
{\em pos} & The playback position (ms) of the audio effect file.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_abe60e8ce475a3fef96245ffc47e95e50}\label{classagora_1_1rtc_1_1_i_rtc_engine_abe60e8ce475a3fef96245ffc47e95e50}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getEffectCurrentPosition@{getEffectCurrentPosition}}
\index{getEffectCurrentPosition@{getEffectCurrentPosition}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getEffectCurrentPosition()}{getEffectCurrentPosition()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Effect\+Current\+Position (\begin{DoxyParamCaption}\item[{int}]{sound\+Id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Retrieves the playback position of the audio effect file. 

\begin{DoxyNote}{Note}
Call this method after {\ttfamily play\+Effect}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em sound\+Id} & The audio effect ID. The ID of each audio effect file is unique.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item The playback position (ms) of the specified audio effect file, if the method call succeeds.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac3f53f474760a834fef050937c4cf7fa}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac3f53f474760a834fef050937c4cf7fa}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableSoundPositionIndication@{enableSoundPositionIndication}}
\index{enableSoundPositionIndication@{enableSoundPositionIndication}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableSoundPositionIndication()}{enableSoundPositionIndication()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Sound\+Position\+Indication (\begin{DoxyParamCaption}\item[{bool}]{enabled }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables or disables stereo panning for remote users. 

Ensure that you call this method before joining a channel to enable stereo panning for remote users so that the local user can track the position of a remote user by calling {\ttfamily set\+Remote\+Voice\+Position}.


\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable stereo panning for remote users\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable stereo panning.
\item {\ttfamily false}\+: Disable stereo panning.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac5c3755a1cca201b2a8066af07a653f6}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac5c3755a1cca201b2a8066af07a653f6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRemoteVoicePosition@{setRemoteVoicePosition}}
\index{setRemoteVoicePosition@{setRemoteVoicePosition}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRemoteVoicePosition()}{setRemoteVoicePosition()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Remote\+Voice\+Position (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{double}]{pan,  }\item[{double}]{gain }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the 2D position (the position on the horizontal plane) of the remote user\textquotesingle{}s voice. 

This method sets the 2D position and volume of a remote user, so that the local user can easily hear and identify the remote user\textquotesingle{}s position. When the local user calls this method to set the voice position of a remote user, the voice difference between the left and right channels allows the local user to track the real-\/time position of the remote user, creating a sense of space. This method applies to massive multiplayer online games, such as Battle Royale games.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item For this method to work, enable stereo panning for remote users by calling the {\ttfamily enable\+Sound\+Position\+Indication} method before joining a channel.
\item For the best voice positioning, Agora recommends using a wired headset.
\item Call this method after joining a channel.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & The user ID of the remote user. \\
\hline
{\em pan} & The voice position of the remote user. The value ranges from -\/1.\+0 to 1.\+0\+:
\begin{DoxyItemize}
\item 0.\+0\+: (Default) The remote voice comes from the front.
\item -\/1.\+0\+: The remote voice comes from the left.
\item 1.\+0\+: The remote voice comes from the right. 
\end{DoxyItemize}\\
\hline
{\em gain} & The volume of the remote user. The value ranges from 0.\+0 to 100.\+0. The default value is 100.\+0 (the original volume of the remote user). The smaller the value, the lower the volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac710640d68fa42f3130d1aaf3b8d3c4c}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac710640d68fa42f3130d1aaf3b8d3c4c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableSpatialAudio@{enableSpatialAudio}}
\index{enableSpatialAudio@{enableSpatialAudio}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableSpatialAudio()}{enableSpatialAudio()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Spatial\+Audio (\begin{DoxyParamCaption}\item[{bool}]{enabled }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables or disables the spatial audio effect. 

After enabling the spatial audio effect, you can call {\ttfamily set\+Remote\+User\+Spatial\+Audio\+Params} to set the spatial audio effect parameters of the remote user.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel.
\item This method relies on the spatial audio dynamic library {\ttfamily libagora\+\_\+spatial\+\_\+audio\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable the spatial audio effect\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable the spatial audio effect.
\item {\ttfamily false}\+: Disable the spatial audio effect.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a582150010c3e33a6acc23731c659f28e}\label{classagora_1_1rtc_1_1_i_rtc_engine_a582150010c3e33a6acc23731c659f28e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRemoteUserSpatialAudioParams@{setRemoteUserSpatialAudioParams}}
\index{setRemoteUserSpatialAudioParams@{setRemoteUserSpatialAudioParams}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRemoteUserSpatialAudioParams()}{setRemoteUserSpatialAudioParams()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Remote\+User\+Spatial\+Audio\+Params (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{const \mbox{\hyperlink{structagora_1_1_spatial_audio_params}{agora\+::\+Spatial\+Audio\+Params}} \&}]{params }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the spatial audio effect parameters of the remote user. 

Call this method after {\ttfamily enable\+Spatial\+Audio}. After successfully setting the spatial audio effect parameters of the remote user, the local user can hear the remote user with a sense of space.


\begin{DoxyParams}{Parameters}
{\em uid} & The user ID. This parameter must be the same as the user ID passed in when the user joined the channel. \\
\hline
{\em params} & The spatial audio parameters. See {\ttfamily \mbox{\hyperlink{structagora_1_1_spatial_audio_params}{Spatial\+Audio\+Params}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a577b68f53ed63771da80ec8901ed93e5}\label{classagora_1_1rtc_1_1_i_rtc_engine_a577b68f53ed63771da80ec8901ed93e5}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVoiceBeautifierPreset@{setVoiceBeautifierPreset}}
\index{setVoiceBeautifierPreset@{setVoiceBeautifierPreset}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVoiceBeautifierPreset()}{setVoiceBeautifierPreset()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Voice\+Beautifier\+Preset (\begin{DoxyParamCaption}\item[{V\+O\+I\+C\+E\+\_\+\+B\+E\+A\+U\+T\+I\+F\+I\+E\+R\+\_\+\+P\+R\+E\+S\+ET}]{preset }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets a preset voice beautifier effect. 

Call this method to set a preset voice beautifier effect for the local user who sends an audio stream. After setting a voice beautifier effect, all users in the channel can hear the effect. You can set different voice beautifier effects for different scenarios. Call timing\+: This method can be called either before or after joining the channel. To achieve better vocal effects, it is recommended that you call the following A\+P\+Is before calling this method\+:
\begin{DoxyItemize}
\item Call {\ttfamily set\+Audio\+Scenario} to set the audio scenario to high-\/quality audio scenario, namely {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG} (3).
\item Call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to set the {\ttfamily profile} parameter to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY} (4) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+S\+T\+E\+R\+EO} (5).
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Do not set the {\ttfamily profile} parameter in {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+S\+P\+E\+E\+C\+H\+\_\+\+S\+T\+A\+N\+D\+A\+RD} (1) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+I\+OT} (6), or the method does not take effect.
\item This method has the best effect on human voice processing, and Agora does not recommend calling this method to process audio data containing music.
\item After calling {\ttfamily set\+Voice\+Beautifier\+Preset}, Agora does not recommend calling the following methods, otherwise the effect set by {\ttfamily set\+Voice\+Beautifier\+Preset} will be overwritten\+:
\begin{DoxyItemize}
\item {\ttfamily set\+Audio\+Effect\+Preset}
\item {\ttfamily set\+Audio\+Effect\+Parameters}
\item {\ttfamily set\+Local\+Voice\+Pitch}
\item {\ttfamily set\+Local\+Voice\+Equalization}
\item {\ttfamily set\+Local\+Voice\+Reverb}
\item {\ttfamily set\+Voice\+Beautifier\+Parameters}
\item {\ttfamily set\+Voice\+Conversion\+Preset}
\end{DoxyItemize}
\item This method relies on the voice beautifier dynamic library {\ttfamily libagora\+\_\+audio\+\_\+beauty\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em preset} & The preset voice beautifier effect options\+: {\ttfamily V\+O\+I\+C\+E\+\_\+\+B\+E\+A\+U\+T\+I\+F\+I\+E\+R\+\_\+\+P\+R\+E\+S\+ET}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6111d2648909601c976b0190fe6de798}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6111d2648909601c976b0190fe6de798}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioEffectPreset@{setAudioEffectPreset}}
\index{setAudioEffectPreset@{setAudioEffectPreset}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioEffectPreset()}{setAudioEffectPreset()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Effect\+Preset (\begin{DoxyParamCaption}\item[{A\+U\+D\+I\+O\+\_\+\+E\+F\+F\+E\+C\+T\+\_\+\+P\+R\+E\+S\+ET}]{preset }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets an S\+DK preset audio effect. 

Call this method to set an S\+DK preset audio effect for the local user who sends an audio stream. This audio effect does not change the gender characteristics of the original voice. After setting an audio effect, all users in the channel can hear the effect. Call timing\+: This method can be called either before or after joining the channel. To achieve better vocal effects, it is recommended that you call the following A\+P\+Is before calling this method\+:
\begin{DoxyItemize}
\item Call {\ttfamily set\+Audio\+Scenario} to set the audio scenario to high-\/quality audio scenario, namely {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG} (3).
\item Call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to set the {\ttfamily profile} parameter to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY} (4) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+S\+T\+E\+R\+EO} (5).
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Do not set the {\ttfamily profile} parameter in {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+S\+P\+E\+E\+C\+H\+\_\+\+S\+T\+A\+N\+D\+A\+RD} (1) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+I\+OT} (6), or the method does not take effect.
\item If you call {\ttfamily set\+Audio\+Effect\+Preset} and set enumerators except for {\ttfamily R\+O\+O\+M\+\_\+\+A\+C\+O\+U\+S\+T\+I\+C\+S\+\_\+3\+D\+\_\+\+V\+O\+I\+CE} or {\ttfamily P\+I\+T\+C\+H\+\_\+\+C\+O\+R\+R\+E\+C\+T\+I\+ON}, do not call {\ttfamily set\+Audio\+Effect\+Parameters}; otherwise, {\ttfamily set\+Audio\+Effect\+Preset} is overridden.
\item After calling {\ttfamily set\+Audio\+Effect\+Preset}, Agora does not recommend you to call the following methods, otherwise the effect set by {\ttfamily set\+Audio\+Effect\+Preset} will be overwritten\+:
\begin{DoxyItemize}
\item {\ttfamily set\+Voice\+Beautifier\+Preset}
\item {\ttfamily set\+Local\+Voice\+Pitch}
\item {\ttfamily set\+Local\+Voice\+Equalization}
\item {\ttfamily set\+Local\+Voice\+Reverb}
\item {\ttfamily set\+Voice\+Beautifier\+Parameters}
\item {\ttfamily set\+Voice\+Conversion\+Preset}
\end{DoxyItemize}
\item This method relies on the voice beautifier dynamic library {\ttfamily libagora\+\_\+audio\+\_\+beauty\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em preset} & The options for S\+DK preset audio effects. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+E\+F\+F\+E\+C\+T\+\_\+\+P\+R\+E\+S\+ET}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aee9553948bf2c4e2b79a00cddce41499}\label{classagora_1_1rtc_1_1_i_rtc_engine_aee9553948bf2c4e2b79a00cddce41499}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVoiceConversionPreset@{setVoiceConversionPreset}}
\index{setVoiceConversionPreset@{setVoiceConversionPreset}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVoiceConversionPreset()}{setVoiceConversionPreset()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Voice\+Conversion\+Preset (\begin{DoxyParamCaption}\item[{V\+O\+I\+C\+E\+\_\+\+C\+O\+N\+V\+E\+R\+S\+I\+O\+N\+\_\+\+P\+R\+E\+S\+ET}]{preset }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets a preset voice beautifier effect. 

Call this method to set a preset voice changing effect for the local user who publishes an audio stream in a channel. After setting the voice changing effect, all users in the channel can hear the effect. You can set different voice changing effects for the user depending on different scenarios. Call timing\+: This method can be called either before or after joining the channel. To achieve better vocal effects, it is recommended that you call the following A\+P\+Is before calling this method\+:
\begin{DoxyItemize}
\item Call {\ttfamily set\+Audio\+Scenario} to set the audio scenario to high-\/quality audio scenario, namely {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG} (3).
\item Call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to set the {\ttfamily profile} parameter to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY} (4) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+S\+T\+E\+R\+EO} (5).
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Do not set the {\ttfamily profile} parameter in {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+S\+P\+E\+E\+C\+H\+\_\+\+S\+T\+A\+N\+D\+A\+RD} (1) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+I\+OT} (6), or the method does not take effect.
\item This method has the best effect on human voice processing, and Agora does not recommend calling this method to process audio data containing music.
\item After calling {\ttfamily set\+Voice\+Conversion\+Preset}, Agora does not recommend you to call the following methods, otherwise the effect set by {\ttfamily set\+Voice\+Conversion\+Preset} will be overwritten\+:
\begin{DoxyItemize}
\item {\ttfamily set\+Audio\+Effect\+Preset}
\item {\ttfamily set\+Audio\+Effect\+Parameters}
\item {\ttfamily set\+Voice\+Beautifier\+Preset}
\item {\ttfamily set\+Voice\+Beautifier\+Parameters}
\item {\ttfamily set\+Local\+Voice\+Pitch}
\item {\ttfamily set\+Local\+Voice\+Formant}
\item {\ttfamily set\+Local\+Voice\+Equalization}
\item {\ttfamily set\+Local\+Voice\+Reverb}
\end{DoxyItemize}
\item This method relies on the voice beautifier dynamic library {\ttfamily libagora\+\_\+audio\+\_\+beauty\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em preset} & The options for the preset voice beautifier effects\+: {\ttfamily V\+O\+I\+C\+E\+\_\+\+C\+O\+N\+V\+E\+R\+S\+I\+O\+N\+\_\+\+P\+R\+E\+S\+ET}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a9e5a3c34818abd26b0d0a9434f7ce4ca}\label{classagora_1_1rtc_1_1_i_rtc_engine_a9e5a3c34818abd26b0d0a9434f7ce4ca}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAudioEffectParameters@{setAudioEffectParameters}}
\index{setAudioEffectParameters@{setAudioEffectParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAudioEffectParameters()}{setAudioEffectParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Audio\+Effect\+Parameters (\begin{DoxyParamCaption}\item[{A\+U\+D\+I\+O\+\_\+\+E\+F\+F\+E\+C\+T\+\_\+\+P\+R\+E\+S\+ET}]{preset,  }\item[{int}]{param1,  }\item[{int}]{param2 }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets parameters for S\+DK preset audio effects. 

Call this method to set the following parameters for the local user who sends an audio stream\+:
\begin{DoxyItemize}
\item 3D voice effect\+: Sets the cycle period of the 3D voice effect.
\item Pitch correction effect\+: Sets the basic mode and tonic pitch of the pitch correction effect. Different songs have different modes and tonic pitches. Agora recommends bounding this method with interface elements to enable users to adjust the pitch correction interactively. After setting the audio parameters, all users in the channel can hear the effect. To achieve better vocal effects, it is recommended that you call the following A\+P\+Is before calling this method\+:
\item Call {\ttfamily set\+Audio\+Scenario} to set the audio scenario to high-\/quality audio scenario, namely {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG} (3).
\item Call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to set the {\ttfamily profile} parameter to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY} (4) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+S\+T\+E\+R\+EO} (5).
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel.
\item Do not set the {\ttfamily profile} parameter in {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+S\+P\+E\+E\+C\+H\+\_\+\+S\+T\+A\+N\+D\+A\+RD} (1) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+I\+OT} (6), or the method does not take effect.
\item This method has the best effect on human voice processing, and Agora does not recommend calling this method to process audio data containing music.
\item After calling {\ttfamily set\+Audio\+Effect\+Parameters}, Agora does not recommend you to call the following methods, otherwise the effect set by {\ttfamily set\+Audio\+Effect\+Parameters} will be overwritten\+:
\begin{DoxyItemize}
\item {\ttfamily set\+Audio\+Effect\+Preset}
\item {\ttfamily set\+Voice\+Beautifier\+Preset}
\item {\ttfamily set\+Local\+Voice\+Pitch}
\item {\ttfamily set\+Local\+Voice\+Equalization}
\item {\ttfamily set\+Local\+Voice\+Reverb}
\item {\ttfamily set\+Voice\+Beautifier\+Parameters}
\item {\ttfamily set\+Voice\+Conversion\+Preset}
\end{DoxyItemize}
\item This method relies on the voice beautifier dynamic library {\ttfamily libagora\+\_\+audio\+\_\+beauty\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em preset} & The options for S\+DK preset audio effects\+:
\begin{DoxyItemize}
\item {\ttfamily R\+O\+O\+M\+\_\+\+A\+C\+O\+U\+S\+T\+I\+C\+S\+\_\+3\+D\+\_\+\+V\+O\+I\+CE}, 3D voice effect\+:
\begin{DoxyItemize}
\item You need to set the {\ttfamily profile} parameter in {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+S\+T\+A\+N\+D\+A\+R\+D\+\_\+\+S\+T\+E\+R\+EO} (3) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+S\+T\+E\+R\+EO} (5) before setting this enumerator; otherwise, the enumerator setting does not take effect.
\item If the 3D voice effect is enabled, users need to use stereo audio playback devices to hear the anticipated voice effect.
\end{DoxyItemize}
\item {\ttfamily P\+I\+T\+C\+H\+\_\+\+C\+O\+R\+R\+E\+C\+T\+I\+ON}, Pitch correction effect\+: 
\end{DoxyItemize}\\
\hline
{\em param1} & -\/ If you set {\ttfamily preset} to {\ttfamily R\+O\+O\+M\+\_\+\+A\+C\+O\+U\+S\+T\+I\+C\+S\+\_\+3\+D\+\_\+\+V\+O\+I\+CE}, {\ttfamily param1} sets the cycle period of the 3D voice effect. The value range is \mbox{[}1,60\mbox{]} and the unit is seconds. The default value is 10, indicating that the voice moves around you every 10 seconds.
\begin{DoxyItemize}
\item If you set {\ttfamily preset} to {\ttfamily P\+I\+T\+C\+H\+\_\+\+C\+O\+R\+R\+E\+C\+T\+I\+ON}, {\ttfamily param1} indicates the basic mode of the pitch correction effect\+:
\begin{DoxyItemize}
\item {\ttfamily 1}\+: (Default) Natural major scale.
\item {\ttfamily 2}\+: Natural minor scale.
\item {\ttfamily 3}\+: Japanese pentatonic scale. 
\end{DoxyItemize}
\end{DoxyItemize}\\
\hline
{\em param2} & -\/ If you set {\ttfamily preset} to {\ttfamily R\+O\+O\+M\+\_\+\+A\+C\+O\+U\+S\+T\+I\+C\+S\+\_\+3\+D\+\_\+\+V\+O\+I\+CE} , you need to set {\ttfamily param2} to {\ttfamily 0}.
\begin{DoxyItemize}
\item If you set {\ttfamily preset} to {\ttfamily P\+I\+T\+C\+H\+\_\+\+C\+O\+R\+R\+E\+C\+T\+I\+ON}, {\ttfamily param2} indicates the tonic pitch of the pitch correction effect\+:
\begin{DoxyItemize}
\item {\ttfamily 1}\+: A
\item {\ttfamily 2}\+: A\#
\item {\ttfamily 3}\+: B
\item {\ttfamily 4}\+: (Default) C
\item {\ttfamily 5}\+: C\#
\item {\ttfamily 6}\+: D
\item {\ttfamily 7}\+: D\#
\item {\ttfamily 8}\+: E
\item {\ttfamily 9}\+: F
\item {\ttfamily 10}\+: F\#
\item {\ttfamily 11}\+: G
\item {\ttfamily 12}\+: G\#
\end{DoxyItemize}
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_afe1e3302f3d1f670bc5cdaa870fe95e8}\label{classagora_1_1rtc_1_1_i_rtc_engine_afe1e3302f3d1f670bc5cdaa870fe95e8}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVoiceBeautifierParameters@{setVoiceBeautifierParameters}}
\index{setVoiceBeautifierParameters@{setVoiceBeautifierParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVoiceBeautifierParameters()}{setVoiceBeautifierParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Voice\+Beautifier\+Parameters (\begin{DoxyParamCaption}\item[{V\+O\+I\+C\+E\+\_\+\+B\+E\+A\+U\+T\+I\+F\+I\+E\+R\+\_\+\+P\+R\+E\+S\+ET}]{preset,  }\item[{int}]{param1,  }\item[{int}]{param2 }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets parameters for the preset voice beautifier effects. 

Call this method to set a gender characteristic and a reverberation effect for the singing beautifier effect. This method sets parameters for the local user who sends an audio stream. After setting the audio parameters, all users in the channel can hear the effect. To achieve better vocal effects, it is recommended that you call the following A\+P\+Is before calling this method\+:
\begin{DoxyItemize}
\item Call {\ttfamily set\+Audio\+Scenario} to set the audio scenario to high-\/quality audio scenario, namely {\ttfamily A\+U\+D\+I\+O\+\_\+\+S\+C\+E\+N\+A\+R\+I\+O\+\_\+\+G\+A\+M\+E\+\_\+\+S\+T\+R\+E\+A\+M\+I\+NG} (3).
\item Call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to set the {\ttfamily profile} parameter to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+TY} (4) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+M\+U\+S\+I\+C\+\_\+\+H\+I\+G\+H\+\_\+\+Q\+U\+A\+L\+I\+T\+Y\+\_\+\+S\+T\+E\+R\+EO} (5).
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You can call this method either before or after joining a channel.
\item Do not set the {\ttfamily profile} parameter in {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_afe8ac8023a1ef976fc983213308b80f3}{set\+Audio\+Profile(\+A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+P\+E profile)}}} to {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+S\+P\+E\+E\+C\+H\+\_\+\+S\+T\+A\+N\+D\+A\+RD} (1) or {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+I\+OT} (6), or the method does not take effect.
\item This method has the best effect on human voice processing, and Agora does not recommend calling this method to process audio data containing music.
\item After calling {\ttfamily set\+Voice\+Beautifier\+Parameters}, Agora does not recommend calling the following methods, otherwise the effect set by {\ttfamily set\+Voice\+Beautifier\+Parameters} will be overwritten\+:
\begin{DoxyItemize}
\item {\ttfamily set\+Audio\+Effect\+Preset}
\item {\ttfamily set\+Audio\+Effect\+Parameters}
\item {\ttfamily set\+Voice\+Beautifier\+Preset}
\item {\ttfamily set\+Local\+Voice\+Pitch}
\item {\ttfamily set\+Local\+Voice\+Equalization}
\item {\ttfamily set\+Local\+Voice\+Reverb}
\item {\ttfamily set\+Voice\+Conversion\+Preset}
\end{DoxyItemize}
\item This method relies on the voice beautifier dynamic library {\ttfamily libagora\+\_\+audio\+\_\+beauty\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled normally.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em preset} & The option for the preset audio effect\+:
\begin{DoxyItemize}
\item {\ttfamily S\+I\+N\+G\+I\+N\+G\+\_\+\+B\+E\+A\+U\+T\+I\+F\+I\+ER}\+: The singing beautifier effect. 
\end{DoxyItemize}\\
\hline
{\em param1} & The gender characteristics options for the singing voice\+:
\begin{DoxyItemize}
\item {\ttfamily 1}\+: A male-\/sounding voice.
\item {\ttfamily 2}\+: A female-\/sounding voice. 
\end{DoxyItemize}\\
\hline
{\em param2} & The reverberation effect options for the singing voice\+:
\begin{DoxyItemize}
\item {\ttfamily 1}\+: The reverberation effect sounds like singing in a small room.
\item {\ttfamily 2}\+: The reverberation effect sounds like singing in a large room.
\item {\ttfamily 3}\+: The reverberation effect sounds like singing in a hall.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a49e0ab572adf34b1b6be97f564ee5f20}\label{classagora_1_1rtc_1_1_i_rtc_engine_a49e0ab572adf34b1b6be97f564ee5f20}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setVoiceConversionParameters@{setVoiceConversionParameters}}
\index{setVoiceConversionParameters@{setVoiceConversionParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setVoiceConversionParameters()}{setVoiceConversionParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Voice\+Conversion\+Parameters (\begin{DoxyParamCaption}\item[{V\+O\+I\+C\+E\+\_\+\+C\+O\+N\+V\+E\+R\+S\+I\+O\+N\+\_\+\+P\+R\+E\+S\+ET}]{preset,  }\item[{int}]{param1,  }\item[{int}]{param2 }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Set parameters for S\+DK preset voice conversion.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item reserved interface
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em preset} & The options for S\+DK preset audio effects. See \#\+V\+O\+I\+C\+E\+\_\+\+C\+O\+N\+V\+E\+R\+S\+I\+O\+N\+\_\+\+P\+R\+E\+S\+ET. \\
\hline
{\em param1} & reserved. \\
\hline
{\em param2} & reserved. \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a43616f919e0906279dff5648830ce31a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a43616f919e0906279dff5648830ce31a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalVoicePitch@{setLocalVoicePitch}}
\index{setLocalVoicePitch@{setLocalVoicePitch}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalVoicePitch()}{setLocalVoicePitch()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Voice\+Pitch (\begin{DoxyParamCaption}\item[{double}]{pitch }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Changes the voice pitch of the local speaker. 

Call timing\+: This method can be called either before or after joining the channel.


\begin{DoxyParams}{Parameters}
{\em pitch} & The local voice pitch. The value range is \mbox{[}0.\+5,2.\+0\mbox{]}. The lower the value, the lower the pitch. The default value is 1.\+0 (no change to the pitch).\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a539a3345c38cc5d1d26edda69cf0661c}\label{classagora_1_1rtc_1_1_i_rtc_engine_a539a3345c38cc5d1d26edda69cf0661c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalVoiceFormant@{setLocalVoiceFormant}}
\index{setLocalVoiceFormant@{setLocalVoiceFormant}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalVoiceFormant()}{setLocalVoiceFormant()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Voice\+Formant (\begin{DoxyParamCaption}\item[{double}]{formant\+Ratio }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the formant ratio to change the timbre of human voice. 

Formant ratio affects the timbre of voice. The smaller the value, the deeper the sound will be, and the larger, the sharper. After you set the formant ratio, all users in the channel can hear the changed voice. If you want to change the timbre and pitch of voice at the same time, Agora recommends using this method together with {\ttfamily set\+Local\+Voice\+Pitch}. Applicable scenarios\+: You can call this method to set the formant ratio of local audio to change the timbre of human voice. Call timing\+: This method can be called either before or after joining the channel.


\begin{DoxyParams}{Parameters}
{\em formant\+Ratio} & The formant ratio. The value range is \mbox{[}-\/1.\+0, 1.\+0\mbox{]}. The default value is 0.\+0, which means do not change the timbre of the voice.\+Note\+: Agora recommends setting this value within the range of \mbox{[}-\/0.\+4, 0.\+6\mbox{]}. Otherwise, the voice may be seriously distorted.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8c75994eb06ab26a1704715ec76e0189}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8c75994eb06ab26a1704715ec76e0189}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalVoiceEqualization@{setLocalVoiceEqualization}}
\index{setLocalVoiceEqualization@{setLocalVoiceEqualization}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalVoiceEqualization()}{setLocalVoiceEqualization()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Voice\+Equalization (\begin{DoxyParamCaption}\item[{A\+U\+D\+I\+O\+\_\+\+E\+Q\+U\+A\+L\+I\+Z\+A\+T\+I\+O\+N\+\_\+\+B\+A\+N\+D\+\_\+\+F\+R\+E\+Q\+U\+E\+N\+CY}]{band\+Frequency,  }\item[{int}]{band\+Gain }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the local voice equalization effect. 

Call timing\+: This method can be called either before or after joining the channel.


\begin{DoxyParams}{Parameters}
{\em band\+Frequency} & The band frequency. The value ranges between 0 and 9; representing the respective 10-\/band center frequencies of the voice effects, including 31, 62, 125, 250, 500, 1k, 2k, 4k, 8k, and 16k Hz. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+E\+Q\+U\+A\+L\+I\+Z\+A\+T\+I\+O\+N\+\_\+\+B\+A\+N\+D\+\_\+\+F\+R\+E\+Q\+U\+E\+N\+CY}. \\
\hline
{\em band\+Gain} & The gain of each band in dB. The value ranges between -\/15 and 15. The default value is 0.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a4d1d1309f97f3c430a1aa2d060bb7316}\label{classagora_1_1rtc_1_1_i_rtc_engine_a4d1d1309f97f3c430a1aa2d060bb7316}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalVoiceReverb@{setLocalVoiceReverb}}
\index{setLocalVoiceReverb@{setLocalVoiceReverb}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalVoiceReverb()}{setLocalVoiceReverb()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Voice\+Reverb (\begin{DoxyParamCaption}\item[{A\+U\+D\+I\+O\+\_\+\+R\+E\+V\+E\+R\+B\+\_\+\+T\+Y\+PE}]{reverb\+Key,  }\item[{int}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the local voice reverberation. 

The S\+DK provides an easier-\/to-\/use method, {\ttfamily set\+Audio\+Effect\+Preset}, to directly implement preset reverb effects for such as pop, R\&B, and K\+TV.

\begin{DoxyNote}{Note}
You can call this method either before or after joining a channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em reverb\+Key} & The reverberation key. Agora provides five reverberation keys, see {\ttfamily A\+U\+D\+I\+O\+\_\+\+R\+E\+V\+E\+R\+B\+\_\+\+T\+Y\+PE}. \\
\hline
{\em value} & The value of the reverberation key.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3ca3d18cd35b00276d7ab4550805d943}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3ca3d18cd35b00276d7ab4550805d943}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setHeadphoneEQPreset@{setHeadphoneEQPreset}}
\index{setHeadphoneEQPreset@{setHeadphoneEQPreset}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setHeadphoneEQPreset()}{setHeadphoneEQPreset()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Headphone\+E\+Q\+Preset (\begin{DoxyParamCaption}\item[{H\+E\+A\+D\+P\+H\+O\+N\+E\+\_\+\+E\+Q\+U\+A\+L\+I\+Z\+E\+R\+\_\+\+P\+R\+E\+S\+ET}]{preset }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the preset headphone equalization effect. 

This method is mainly used in spatial audio effect scenarios. You can select the preset headphone equalizer to listen to the audio to achieve the expected audio experience.

\begin{DoxyNote}{Note}
If the headphones you use already have a good equalization effect, you may not get a significant improvement when you call this method, and could even diminish the experience.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em preset} & The preset headphone equalization effect. See {\ttfamily H\+E\+A\+D\+P\+H\+O\+N\+E\+\_\+\+E\+Q\+U\+A\+L\+I\+Z\+E\+R\+\_\+\+P\+R\+E\+S\+ET}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason). 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a4938f94da646d1426aa64f7da7aa7791}\label{classagora_1_1rtc_1_1_i_rtc_engine_a4938f94da646d1426aa64f7da7aa7791}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setHeadphoneEQParameters@{setHeadphoneEQParameters}}
\index{setHeadphoneEQParameters@{setHeadphoneEQParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setHeadphoneEQParameters()}{setHeadphoneEQParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Headphone\+E\+Q\+Parameters (\begin{DoxyParamCaption}\item[{int}]{low\+Gain,  }\item[{int}]{high\+Gain }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the low-\/ and high-\/frequency parameters of the headphone equalizer. 

In a spatial audio effect scenario, if the preset headphone equalization effect is not achieved after calling the {\ttfamily set\+Headphone\+E\+Q\+Preset} method, you can further adjust the headphone equalization effect by calling this method.


\begin{DoxyParams}{Parameters}
{\em low\+Gain} & The low-\/frequency parameters of the headphone equalizer. The value range is \mbox{[}-\/10,10\mbox{]}. The larger the value, the deeper the sound. \\
\hline
{\em high\+Gain} & The high-\/frequency parameters of the headphone equalizer. The value range is \mbox{[}-\/10,10\mbox{]}. The larger the value, the sharper the sound.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason). 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a9dde13a03a2ba63d4ed310a704ce4d9a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a9dde13a03a2ba63d4ed310a704ce4d9a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableVoiceAITuner@{enableVoiceAITuner}}
\index{enableVoiceAITuner@{enableVoiceAITuner}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableVoiceAITuner()}{enableVoiceAITuner()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Voice\+A\+I\+Tuner (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{V\+O\+I\+C\+E\+\_\+\+A\+I\+\_\+\+T\+U\+N\+E\+R\+\_\+\+T\+Y\+PE}]{type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables or disables the voice AI tuner. 

The voice AI tuner supports enhancing sound quality and adjusting tone style. Applicable scenarios\+: Social entertainment scenes including online K\+TV, online podcast and live streaming in showrooms, where high sound quality is required. Call timing\+: This method can be called either before or after joining the channel.


\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable the voice AI tuner\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enables the voice AI tuner.
\item {\ttfamily false}\+: (Default) Disable the voice AI tuner. 
\end{DoxyItemize}\\
\hline
{\em type} & Voice AI tuner sound types, see {\ttfamily V\+O\+I\+C\+E\+\_\+\+A\+I\+\_\+\+T\+U\+N\+E\+R\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae5a8ef2082a0ac196ecc128ee408def3}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae5a8ef2082a0ac196ecc128ee408def3}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLogFile@{setLogFile}}
\index{setLogFile@{setLogFile}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLogFile()}{setLogFile()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Log\+File (\begin{DoxyParamCaption}\item[{const char $\ast$}]{file\+Path }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the log file. 

Specifies an S\+DK output log file. The log file records all log data for the S\+D\+K’s operation. Call timing\+: This method needs to be called immediately after {\ttfamily initialize}, otherwise the output log may be incomplete.

\begin{DoxyNote}{Note}
Ensure that the directory for the log file exists and is writable.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em file\+Path} & The complete path of the log files. These log files are encoded in U\+T\+F-\/8.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_acfc056b4c693d134bece8e7c0f05e69f}\label{classagora_1_1rtc_1_1_i_rtc_engine_acfc056b4c693d134bece8e7c0f05e69f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLogFilter@{setLogFilter}}
\index{setLogFilter@{setLogFilter}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLogFilter()}{setLogFilter()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Log\+Filter (\begin{DoxyParamCaption}\item[{unsigned int}]{filter }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the log output level of the S\+DK. 

This method sets the output log level of the S\+DK. You can use one or a combination of the log filter levels. The log level follows the sequence of {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+O\+FF}, {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+C\+R\+I\+T\+I\+C\+AL}, {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+E\+R\+R\+OR}, {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+W\+A\+RN}, {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+I\+N\+FO}, and {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+D\+E\+B\+UG}. Choose a level to see the logs preceding that level. If, for example, you set the log level to {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+W\+A\+RN}, you see the logs within levels {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+C\+R\+I\+T\+I\+C\+AL}, {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+E\+R\+R\+OR} and {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+W\+A\+RN}.


\begin{DoxyParams}{Parameters}
{\em filter} & The output log level of the S\+DK. See {\ttfamily L\+O\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_af24a402778204b60effc6b3879391c10}\label{classagora_1_1rtc_1_1_i_rtc_engine_af24a402778204b60effc6b3879391c10}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLogLevel@{setLogLevel}}
\index{setLogLevel@{setLogLevel}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLogLevel()}{setLogLevel()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Log\+Level (\begin{DoxyParamCaption}\item[{commons\+::\+L\+O\+G\+\_\+\+L\+E\+V\+EL}]{level }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the output log level of the S\+DK. 

Choose a level to see the logs preceding that level.


\begin{DoxyParams}{Parameters}
{\em level} & The log level. See {\ttfamily L\+O\+G\+\_\+\+L\+E\+V\+EL}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a1fa35cd4f874109a26895a95096a873f}\label{classagora_1_1rtc_1_1_i_rtc_engine_a1fa35cd4f874109a26895a95096a873f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLogFileSize@{setLogFileSize}}
\index{setLogFileSize@{setLogFileSize}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLogFileSize()}{setLogFileSize()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Log\+File\+Size (\begin{DoxyParamCaption}\item[{unsigned int}]{file\+Size\+In\+K\+Bytes }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the log file size. 

By default, the S\+DK generates five S\+DK log files and five A\+PI call log files with the following rules\+:
\begin{DoxyItemize}
\item The S\+DK log files are\+: {\ttfamily agorasdk.\+log}, {\ttfamily agorasdk.\+1.\+log}, {\ttfamily agorasdk.\+2.\+log}, {\ttfamily agorasdk.\+3.\+log}, and {\ttfamily agorasdk.\+4.\+log}.
\item The A\+PI call log files are\+: {\ttfamily agoraapi.\+log}, {\ttfamily agoraapi.\+1.\+log}, {\ttfamily agoraapi.\+2.\+log}, {\ttfamily agoraapi.\+3.\+log}, and {\ttfamily agoraapi.\+4.\+log}.
\item The default size of each S\+DK log file and A\+PI log file is 2,048 KB. These log files are encoded in U\+T\+F-\/8.
\item The S\+DK writes the latest logs in {\ttfamily agorasdk.\+log} or {\ttfamily agoraapi.\+log}.
\item When {\ttfamily agorasdk.\+log} is full, the S\+DK processes the log files in the following order\+:1. Delete the {\ttfamily agorasdk.\+4.\+log} file (if any).
\end{DoxyItemize}
\begin{DoxyEnumerate}
\item Rename {\ttfamily agorasdk.\+3.\+log} to {\ttfamily agorasdk.\+4.\+log}.
\item Rename {\ttfamily agorasdk.\+2.\+log} to {\ttfamily agorasdk.\+3.\+log}.
\item Rename {\ttfamily agorasdk.\+1.\+log} to {\ttfamily agorasdk.\+2.\+log}.
\item Create a new {\ttfamily agorasdk.\+log} file.
\end{DoxyEnumerate}
\begin{DoxyItemize}
\item The overwrite rules for the {\ttfamily agoraapi.\+log} file are the same as for {\ttfamily agorasdk.\+log}.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
This method is used to set the size of the {\ttfamily agorasdk.\+log} file only and does not effect the {\ttfamily agoraapi.\+log file}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em file\+Size\+In\+K\+Bytes} & The size (KB) of an {\ttfamily agorasdk.\+log} file. The value range is \mbox{[}128,20480\mbox{]}. The default value is 2,048 KB. If you set {\ttfamily file\+Size\+In\+K\+Byte} smaller than 128 KB, the S\+DK automatically adjusts it to 128 KB; if you set {\ttfamily file\+Size\+In\+K\+Byte} greater than 20,480 KB, the S\+DK automatically adjusts it to 20,480 KB.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a327761f03992c054589ce6ae3effd9c6}\label{classagora_1_1rtc_1_1_i_rtc_engine_a327761f03992c054589ce6ae3effd9c6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!uploadLogFile@{uploadLogFile}}
\index{uploadLogFile@{uploadLogFile}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{uploadLogFile()}{uploadLogFile()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::upload\+Log\+File (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1util_1_1_copyable_auto_ptr}{agora\+::util\+::\+A\+String}} \&}]{request\+Id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Upload current log file immediately to server. only use this when an error occurs block before log file upload success or timeout.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6c08c30ca9b36d84ac42282a4b2bfef3}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6c08c30ca9b36d84ac42282a4b2bfef3}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!writeLog@{writeLog}}
\index{writeLog@{writeLog}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{writeLog()}{writeLog()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::write\+Log (\begin{DoxyParamCaption}\item[{commons\+::\+L\+O\+G\+\_\+\+L\+E\+V\+EL}]{level,  }\item[{const char $\ast$}]{fmt,  }\item[{}]{... }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}


\begin{DoxyItemize}
\item Write the log to S\+DK . @technical preview
\end{DoxyItemize}

You can Write the log to S\+DK log files of the specified level.


\begin{DoxyParams}{Parameters}
{\em level} & The log level\+:
\begin{DoxyItemize}
\item {\ttfamily L\+O\+G\+\_\+\+L\+E\+V\+E\+L\+\_\+\+N\+O\+NE (0x0000)}\+: Do not output any log file.
\item {\ttfamily L\+O\+G\+\_\+\+L\+E\+V\+E\+L\+\_\+\+I\+N\+FO (0x0001)}\+: (Recommended) Output log files of the I\+N\+FO level.
\item {\ttfamily L\+O\+G\+\_\+\+L\+E\+V\+E\+L\+\_\+\+W\+A\+RN (0x0002)}\+: Output log files of the W\+A\+RN level.
\item {\ttfamily L\+O\+G\+\_\+\+L\+E\+V\+E\+L\+\_\+\+E\+R\+R\+OR (0x0004)}\+: Output log files of the E\+R\+R\+OR level.
\item {\ttfamily L\+O\+G\+\_\+\+L\+E\+V\+E\+L\+\_\+\+F\+A\+T\+AL (0x0008)}\+: Output log files of the F\+A\+T\+AL level.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad4b4ce6d5fda065b2c1d6aaff8f9884c}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad4b4ce6d5fda065b2c1d6aaff8f9884c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalRenderMode@{setLocalRenderMode}}
\index{setLocalRenderMode@{setLocalRenderMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalRenderMode()}{setLocalRenderMode()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Render\+Mode (\begin{DoxyParamCaption}\item[{media\+::base\+::\+R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{render\+Mode,  }\item[{V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{mirror\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Updates the display mode of the local video view. 

After initializing the local video view, you can call this method to update its rendering and mirror modes. It affects only the video view that the local user sees and does not impact the publishing of the local video. Call timing\+: -\/ Ensure that you have called the {\ttfamily setup\+Local\+Video} method to initialize the local video view before calling this method.
\begin{DoxyItemize}
\item During a call, you can call this method as many times as necessary to update the display mode of the local video view.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
This method only takes effect on the primary camera {\ttfamily (P\+R\+I\+M\+A\+R\+Y\+\_\+\+C\+A\+M\+E\+R\+A\+\_\+\+S\+O\+U\+R\+CE)}. In scenarios involving custom video capture or the use of alternative video sources, you need to use {\ttfamily setup\+Local\+Video} instead of this method.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em render\+Mode} & The local video display mode. See {\ttfamily R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em mirror\+Mode} & The mirror mode of the local video view. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}. Attention\+: If you use a front camera, the S\+DK enables the mirror mode by default; if you use a rear camera, the S\+DK disables the mirror mode by default.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2aae3548ceb92aa929aafb61383a3dd6}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2aae3548ceb92aa929aafb61383a3dd6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRemoteRenderMode@{setRemoteRenderMode}}
\index{setRemoteRenderMode@{setRemoteRenderMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRemoteRenderMode()}{setRemoteRenderMode()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Remote\+Render\+Mode (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{media\+::base\+::\+R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{render\+Mode,  }\item[{V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{mirror\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Updates the display mode of the video view of a remote user. 

After initializing the video view of a remote user, you can call this method to update its rendering and mirror modes. This method affects only the video view that the local user sees.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Call this method after initializing the remote view by calling the {\ttfamily setup\+Remote\+Video} method.
\item During a call, you can call this method as many times as necessary to update the display mode of the video view of a remote user.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & The user ID of the remote user. \\
\hline
{\em render\+Mode} & The rendering mode of the remote user view. For details, see {\ttfamily R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em mirror\+Mode} & The mirror mode of the remote user view. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae1cc7218265d05caa22764091754ebb4}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae1cc7218265d05caa22764091754ebb4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalRenderTargetFps@{setLocalRenderTargetFps}}
\index{setLocalRenderTargetFps@{setLocalRenderTargetFps}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalRenderTargetFps()}{setLocalRenderTargetFps()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Render\+Target\+Fps (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{source\+Type,  }\item[{int}]{target\+Fps }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the maximum frame rate for rendering local video. 

Applicable scenarios\+: In scenarios where the requirements for video rendering frame rate are not high (such as screen sharing or online education), you can call this method to set the maximum frame rate for local video rendering. The S\+DK will attempt to keep the actual frame rate of local rendering close to this value, which helps to reduce C\+PU consumption and improving system performance. Call timing\+: You can call this method either before or after joining a channel.


\begin{DoxyParams}{Parameters}
{\em source\+Type} & The type of the video source. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em target\+Fps} & The capture frame rate (fps) of the local video. Sopported values are\+: 1, 7, 10, 15, 24, 30, 60.\+C\+A\+U\+T\+I\+ON\+: Set this parameter to a value lower than the actual video frame rate; otherwise, the settings do not take effect.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a732c9de0735852709030383c731c1042}\label{classagora_1_1rtc_1_1_i_rtc_engine_a732c9de0735852709030383c731c1042}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRemoteRenderTargetFps@{setRemoteRenderTargetFps}}
\index{setRemoteRenderTargetFps@{setRemoteRenderTargetFps}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRemoteRenderTargetFps()}{setRemoteRenderTargetFps()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Remote\+Render\+Target\+Fps (\begin{DoxyParamCaption}\item[{int}]{target\+Fps }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the maximum frame rate for rendering remote video. 

Applicable scenarios\+: In scenarios where the video rendering frame rate is not critical (e.\+g., screen sharing, online education) or when the remote users are using mid-\/to-\/low-\/end devices, you can call this method to set the maximum frame rate for video rendering on the remote client. The S\+DK will attempt to render the actual frame rate as close as possible to this value, which helps to reduce C\+PU consumption and improve system performance. Call timing\+: You can call this method either before or after joining a channel.


\begin{DoxyParams}{Parameters}
{\em target\+Fps} & The capture frame rate (fps) of the local video. Sopported values are\+: 1, 7, 10, 15, 24, 30, 60.\+C\+A\+U\+T\+I\+ON\+: Set this parameter to a value lower than the actual video frame rate; otherwise, the settings do not take effect.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a87f5a5382b0dd7b54f30fc2f0ac83c4a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a87f5a5382b0dd7b54f30fc2f0ac83c4a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalRenderMode@{setLocalRenderMode}}
\index{setLocalRenderMode@{setLocalRenderMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalRenderMode()}{setLocalRenderMode()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Render\+Mode (\begin{DoxyParamCaption}\item[{media\+::base\+::\+R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{render\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Updates the display mode of the local video view.

After initializing the local video view, you can call this method to update its rendering mode. It affects only the video view that the local user sees, not the published local video stream.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Ensure that you have called \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a744003a9c0230684e985e42d14361f28}{setup\+Local\+Video}} to initialize the local video view before this method.
\item During a call, you can call this method as many times as necessary to update the local video view.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em render\+Mode} & Sets the local display mode. See \#\+R\+E\+N\+D\+E\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8f088ba753de27002bef49ede9d5ffbc}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8f088ba753de27002bef49ede9d5ffbc}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalVideoMirrorMode@{setLocalVideoMirrorMode}}
\index{setLocalVideoMirrorMode@{setLocalVideoMirrorMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalVideoMirrorMode()}{setLocalVideoMirrorMode()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Video\+Mirror\+Mode (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{mirror\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the local video mirror mode. 


\begin{DoxyParams}{Parameters}
{\em mirror\+Mode} & The local video mirror mode. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+M\+I\+R\+R\+O\+R\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3f67e39e02e64ffe4197ba243e71a2cf}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3f67e39e02e64ffe4197ba243e71a2cf}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableDualStreamMode@{enableDualStreamMode}}
\index{enableDualStreamMode@{enableDualStreamMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableDualStreamMode()}{enableDualStreamMode()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Dual\+Stream\+Mode (\begin{DoxyParamCaption}\item[{bool}]{enabled }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables or disables dual-\/stream mode on the sender side. 

Dual streams are a pairing of a high-\/quality video stream and a low-\/quality video stream\+:
\begin{DoxyItemize}
\item High-\/quality video stream\+: High bitrate, high resolution.
\item Low-\/quality video stream\+: Low bitrate, low resolution. After you enable dual-\/stream mode, you can call {\ttfamily set\+Remote\+Video\+Stream\+Type} to choose to receive either the high-\/quality video stream or the low-\/quality video stream on the subscriber side.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method is applicable to all types of streams from the sender, including but not limited to video streams collected from cameras, screen sharing streams, and custom-\/collected video streams.
\item If you need to enable dual video streams in a multi-\/channel scenario, you can call the {\ttfamily enable\+Dual\+Stream\+Mode\+Ex} method.
\item You can call this method either before or after joining a channel.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable dual-\/stream mode\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable dual-\/stream mode.
\item {\ttfamily false}\+: (Default) Disable dual-\/stream mode.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a9db761169fa8d804d7fb8ea29484121c}\label{classagora_1_1rtc_1_1_i_rtc_engine_a9db761169fa8d804d7fb8ea29484121c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableDualStreamMode@{enableDualStreamMode}}
\index{enableDualStreamMode@{enableDualStreamMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableDualStreamMode()}{enableDualStreamMode()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Dual\+Stream\+Mode (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}} \&}]{stream\+Config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the dual-\/stream mode on the sender side and the low-\/quality video stream. 

You can call this method to enable or disable the dual-\/stream mode on the publisher side. Dual streams are a pairing of a high-\/quality video stream and a low-\/quality video stream\+:
\begin{DoxyItemize}
\item High-\/quality video stream\+: High bitrate, high resolution.
\item Low-\/quality video stream\+: Low bitrate, low resolution. After you enable dual-\/stream mode, you can call {\ttfamily set\+Remote\+Video\+Stream\+Type} to choose to receive either the high-\/quality video stream or the low-\/quality video stream on the subscriber side.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method is applicable to all types of streams from the sender, including but not limited to video streams collected from cameras, screen sharing streams, and custom-\/collected video streams.
\item If you need to enable dual video streams in a multi-\/channel scenario, you can call the {\ttfamily enable\+Dual\+Stream\+Mode\+Ex} method.
\item You can call this method either before or after joining a channel.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable dual-\/stream mode\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable dual-\/stream mode.
\item {\ttfamily false}\+: (Default) Disable dual-\/stream mode. 
\end{DoxyItemize}\\
\hline
{\em stream\+Config} & The configuration of the low-\/quality video stream. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}}}.Note\+: When setting {\ttfamily mode} to {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM}, setting {\ttfamily stream\+Config} will not take effect.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2c0cc7b801522f781bfd0eda3557f854}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2c0cc7b801522f781bfd0eda3557f854}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setDualStreamMode@{setDualStreamMode}}
\index{setDualStreamMode@{setDualStreamMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setDualStreamMode()}{setDualStreamMode()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Dual\+Stream\+Mode (\begin{DoxyParamCaption}\item[{S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE}]{mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the dual-\/stream mode on the sender side. 

The S\+DK defaults to enabling low-\/quality video stream adaptive mode ( {\ttfamily A\+U\+T\+O\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} ) on the sender side, which means the sender does not actively send low-\/quality video stream. The receiving end with the role of the {\bfseries{host}} can initiate a low-\/quality video stream request by calling {\ttfamily set\+Remote\+Video\+Stream\+Type}, and upon receiving the request, the sending end automatically starts sending low-\/quality stream.
\begin{DoxyItemize}
\item If you want to modify this behavior, you can call this method and set {\ttfamily mode} to {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} (never send low-\/quality video streams) or {\ttfamily E\+N\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} (always send low-\/quality video streams).
\item If you want to restore the default behavior after making changes, you can call this method again with {\ttfamily mode} set to {\ttfamily A\+U\+T\+O\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM}.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
The difference and connection between this method and {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3f67e39e02e64ffe4197ba243e71a2cf}{enable\+Dual\+Stream\+Mode(bool enabled)}}} is as follows\+:
\begin{DoxyItemize}
\item When calling this method and setting {\ttfamily mode} to {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM}, it has the same effect as {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3f67e39e02e64ffe4197ba243e71a2cf}{enable\+Dual\+Stream\+Mode(bool enabled)}}} {\ttfamily (false)}.
\item When calling this method and setting {\ttfamily mode} to {\ttfamily E\+N\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM}, it has the same effect as {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a3f67e39e02e64ffe4197ba243e71a2cf}{enable\+Dual\+Stream\+Mode(bool enabled)}}} {\ttfamily (true)}.
\item Both methods can be called before and after joining a channel. If both methods are used, the settings in the method called later takes precedence.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em mode} & The mode in which the video stream is sent. See {\ttfamily S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3902458a9581bbc36168518cfd10d19a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3902458a9581bbc36168518cfd10d19a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setSimulcastConfig@{setSimulcastConfig}}
\index{setSimulcastConfig@{setSimulcastConfig}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setSimulcastConfig()}{setSimulcastConfig()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Simulcast\+Config (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_config}{Simulcast\+Config}} \&}]{simulcast\+Config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the simulcast video stream configuration. 

\begin{DoxySince}{Since}
v4.\+6.\+0
\end{DoxySince}
You can call this method to set video streams with different resolutions for the same video source. The subscribers can call {\ttfamily set\+Remote\+Video\+Stream\+Type} to select which stream layer to receive. The broadcaster can publish up to four layers of video streams\+: one main stream (highest resolution) and three additional streams of different quality levels.


\begin{DoxyParams}{Parameters}
{\em simulcast\+Config} & This configuration includes seven layers, from S\+T\+R\+E\+A\+M\+\_\+\+L\+A\+Y\+E\+R\+\_\+1 to S\+T\+R\+E\+A\+M\+\_\+\+L\+OW, with a maximum of three layers enabled simultaneously. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_config}{Simulcast\+Config}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a33c7eebc75e9a5bbde3904467657eb54}\label{classagora_1_1rtc_1_1_i_rtc_engine_a33c7eebc75e9a5bbde3904467657eb54}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setDualStreamMode@{setDualStreamMode}}
\index{setDualStreamMode@{setDualStreamMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setDualStreamMode()}{setDualStreamMode()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Dual\+Stream\+Mode (\begin{DoxyParamCaption}\item[{S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE}]{mode,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}} \&}]{stream\+Config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets dual-\/stream mode configuration on the sender side. 

The S\+DK defaults to enabling low-\/quality video stream adaptive mode ( {\ttfamily A\+U\+T\+O\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} ) on the sender side, which means the sender does not actively send low-\/quality video stream. The receiving end with the role of the {\bfseries{host}} can initiate a low-\/quality video stream request by calling {\ttfamily set\+Remote\+Video\+Stream\+Type}, and upon receiving the request, the sending end automatically starts sending low-\/quality stream.
\begin{DoxyItemize}
\item If you want to modify this behavior, you can call this method and set {\ttfamily mode} to {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} (never send low-\/quality video streams) or {\ttfamily E\+N\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM} (always send low-\/quality video streams).
\item If you want to restore the default behavior after making changes, you can call this method again with {\ttfamily mode} set to {\ttfamily A\+U\+T\+O\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM}. The difference between this method and {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a2c0cc7b801522f781bfd0eda3557f854}{set\+Dual\+Stream\+Mode(\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+D\+E mode)}}} is that this method can also configure the low-\/quality video stream, and the S\+DK sends the stream according to the configuration in {\ttfamily stream\+Config}.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
The difference and connection between this method and {\ttfamily enable\+Dual\+Stream\+Mode(bool enabled, const \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}}\& stream\+Config)} is as follows\+:
\begin{DoxyItemize}
\item When calling this method and setting {\ttfamily mode} to {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM}, it has the same effect as calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9db761169fa8d804d7fb8ea29484121c}{enable\+Dual\+Stream\+Mode(bool enabled, const Simulcast\+Stream\+Config\& stream\+Config)}}} and setting {\ttfamily enabled} to {\ttfamily false}.
\item When calling this method and setting {\ttfamily mode} to {\ttfamily E\+N\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM}, it has the same effect as calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a9db761169fa8d804d7fb8ea29484121c}{enable\+Dual\+Stream\+Mode(bool enabled, const Simulcast\+Stream\+Config\& stream\+Config)}}} and setting {\ttfamily enabled} to {\ttfamily true}.
\item Both methods can be called before and after joining a channel. If both methods are used, the settings in the method called later takes precedence.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em mode} & The mode in which the video stream is sent. See {\ttfamily S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+M\+O\+DE}. \\
\hline
{\em stream\+Config} & The configuration of the low-\/quality video stream. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_simulcast_stream_config}{Simulcast\+Stream\+Config}}}.Note\+: When setting {\ttfamily mode} to {\ttfamily D\+I\+S\+A\+B\+L\+E\+\_\+\+S\+I\+M\+U\+L\+C\+A\+S\+T\+\_\+\+S\+T\+R\+E\+AM}, setting {\ttfamily stream\+Config} will not take effect.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a14e8afb96a2586a2eec56dec5c5abe45}\label{classagora_1_1rtc_1_1_i_rtc_engine_a14e8afb96a2586a2eec56dec5c5abe45}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableCustomAudioLocalPlayback@{enableCustomAudioLocalPlayback}}
\index{enableCustomAudioLocalPlayback@{enableCustomAudioLocalPlayback}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableCustomAudioLocalPlayback()}{enableCustomAudioLocalPlayback()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Custom\+Audio\+Local\+Playback (\begin{DoxyParamCaption}\item[{track\+\_\+id\+\_\+t}]{track\+Id,  }\item[{bool}]{enabled }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets whether to enable the local playback of external audio source. 

After calling this method to enable the local playback of external audio source, if you need to stop local playback, you can call this method again and set {\ttfamily enabled} to {\ttfamily false}. You can call {\ttfamily adjust\+Custom\+Audio\+Playout\+Volume} to adjust the local playback volume of the custom audio track.

\begin{DoxyNote}{Note}
Ensure you have called the {\ttfamily create\+Custom\+Audio\+Track} method to create a custom audio track before calling this method.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em track\+Id} & The audio track ID. Set this parameter to the custom audio track ID returned in {\ttfamily create\+Custom\+Audio\+Track}. \\
\hline
{\em enabled} & Whether to play the external audio source\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Play the external audio source.
\item {\ttfamily false}\+: (Default) Do not play the external source.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2c4717760b5fbf1bb8c1a3c16ca67fe5}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2c4717760b5fbf1bb8c1a3c16ca67fe5}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRecordingAudioFrameParameters@{setRecordingAudioFrameParameters}}
\index{setRecordingAudioFrameParameters@{setRecordingAudioFrameParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRecordingAudioFrameParameters()}{setRecordingAudioFrameParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Recording\+Audio\+Frame\+Parameters (\begin{DoxyParamCaption}\item[{int}]{sample\+Rate,  }\item[{int}]{channel,  }\item[{R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{mode,  }\item[{int}]{samples\+Per\+Call }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the format of the captured raw audio data. 

The S\+DK calculates the sampling interval based on the {\ttfamily samples\+Per\+Call}, {\ttfamily sample\+Rate} and {\ttfamily channel} parameters set in this method.\+Sample interval (sec) = {\ttfamily sample\+Per\+Call} /( {\ttfamily sample\+Rate} × {\ttfamily channel} ). Ensure that the sample interval ≥ 0.\+01 (s). The S\+DK triggers the {\ttfamily on\+Record\+Audio\+Frame} callback according to the sampling interval. Call timing\+: Call this method before joining a channel.


\begin{DoxyParams}{Parameters}
{\em sample\+Rate} & The sample rate returned in the callback, which can be set as 8000, 16000, 32000, 44100, or 48000 Hz. \\
\hline
{\em channel} & The number of audio channels. You can set the value as 1 or 2.
\begin{DoxyItemize}
\item 1\+: Mono.
\item 2\+: Stereo. 
\end{DoxyItemize}\\
\hline
{\em mode} & The use mode of the audio frame. See {\ttfamily R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em samples\+Per\+Call} & The number of data samples, such as 1024 for the Media Push.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa5f2f6eb3db5acaaf8c40818d90694f1}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa5f2f6eb3db5acaaf8c40818d90694f1}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setPlaybackAudioFrameParameters@{setPlaybackAudioFrameParameters}}
\index{setPlaybackAudioFrameParameters@{setPlaybackAudioFrameParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setPlaybackAudioFrameParameters()}{setPlaybackAudioFrameParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Playback\+Audio\+Frame\+Parameters (\begin{DoxyParamCaption}\item[{int}]{sample\+Rate,  }\item[{int}]{channel,  }\item[{R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{mode,  }\item[{int}]{samples\+Per\+Call }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the format of the raw audio playback data. 

The S\+DK calculates the sampling interval based on the {\ttfamily samples\+Per\+Call}, {\ttfamily sample\+Rate} and {\ttfamily channel} parameters set in this method.\+Sample interval (sec) = {\ttfamily sample\+Per\+Call} /( {\ttfamily sample\+Rate} × {\ttfamily channel} ). Ensure that the sample interval ≥ 0.\+01 (s). The S\+DK triggers the {\ttfamily on\+Playback\+Audio\+Frame} callback according to the sampling interval. Call timing\+: Call this method before joining a channel.


\begin{DoxyParams}{Parameters}
{\em sample\+Rate} & The sample rate returned in the callback, which can be set as 8000, 16000, 24000, 32000, 44100, or 48000 Hz. \\
\hline
{\em channel} & The number of audio channels. You can set the value as 1 or 2.
\begin{DoxyItemize}
\item 1\+: Mono.
\item 2\+: Stereo. 
\end{DoxyItemize}\\
\hline
{\em mode} & The use mode of the audio frame. See {\ttfamily R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em samples\+Per\+Call} & The number of data samples, such as 1024 for the Media Push.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_af94beec91b7fcf0b20414b75b65580ff}\label{classagora_1_1rtc_1_1_i_rtc_engine_af94beec91b7fcf0b20414b75b65580ff}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setMixedAudioFrameParameters@{setMixedAudioFrameParameters}}
\index{setMixedAudioFrameParameters@{setMixedAudioFrameParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setMixedAudioFrameParameters()}{setMixedAudioFrameParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Mixed\+Audio\+Frame\+Parameters (\begin{DoxyParamCaption}\item[{int}]{sample\+Rate,  }\item[{int}]{channel,  }\item[{int}]{samples\+Per\+Call }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the format of the raw audio data after mixing for audio capture and playback. 

The S\+DK calculates the sampling interval based on the {\ttfamily samples\+Per\+Call}, {\ttfamily sample\+Rate} and {\ttfamily channel} parameters set in this method.\+Sample interval (sec) = {\ttfamily sample\+Per\+Call} /( {\ttfamily sample\+Rate} × {\ttfamily channel} ). Ensure that the sample interval ≥ 0.\+01 (s). The S\+DK triggers the {\ttfamily on\+Mixed\+Audio\+Frame} callback according to the sampling interval. Call timing\+: Call this method before joining a channel.


\begin{DoxyParams}{Parameters}
{\em sample\+Rate} & The sample rate returned in the callback, which can be set as 8000, 16000, 32000, 44100, or 48000 Hz. \\
\hline
{\em channel} & The number of audio channels. You can set the value as 1 or 2.
\begin{DoxyItemize}
\item 1\+: Mono.
\item 2\+: Stereo. 
\end{DoxyItemize}\\
\hline
{\em samples\+Per\+Call} & The number of data samples, such as 1024 for the Media Push.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a384f37f6a46ed650ca86e144aee9e5b9}\label{classagora_1_1rtc_1_1_i_rtc_engine_a384f37f6a46ed650ca86e144aee9e5b9}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setEarMonitoringAudioFrameParameters@{setEarMonitoringAudioFrameParameters}}
\index{setEarMonitoringAudioFrameParameters@{setEarMonitoringAudioFrameParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setEarMonitoringAudioFrameParameters()}{setEarMonitoringAudioFrameParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Ear\+Monitoring\+Audio\+Frame\+Parameters (\begin{DoxyParamCaption}\item[{int}]{sample\+Rate,  }\item[{int}]{channel,  }\item[{R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}]{mode,  }\item[{int}]{samples\+Per\+Call }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the format of the in-\/ear monitoring raw audio data. 

This method is used to set the in-\/ear monitoring audio data format reported by the {\ttfamily on\+Ear\+Monitoring\+Audio\+Frame} callback.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Before calling this method, you need to call {\ttfamily enable\+In\+Ear\+Monitoring}, and set {\ttfamily include\+Audio\+Filters} to {\ttfamily E\+A\+R\+\_\+\+M\+O\+N\+I\+T\+O\+R\+I\+N\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+B\+U\+I\+L\+T\+\_\+\+I\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+I\+L\+T\+E\+RS} or {\ttfamily E\+A\+R\+\_\+\+M\+O\+N\+I\+T\+O\+R\+I\+N\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+N\+O\+I\+S\+E\+\_\+\+S\+U\+P\+P\+R\+E\+S\+S\+I\+ON}.
\item The S\+DK calculates the sampling interval based on the {\ttfamily samples\+Per\+Call}, {\ttfamily sample\+Rate} and {\ttfamily channel} parameters set in this method.\+Sample interval (sec) = {\ttfamily sample\+Per\+Call} /( {\ttfamily sample\+Rate} × {\ttfamily channel} ). Ensure that the sample interval ≥ 0.\+01 (s). The S\+DK triggers the {\ttfamily on\+Ear\+Monitoring\+Audio\+Frame} callback according to the sampling interval.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em sample\+Rate} & The sample rate of the audio data reported in the {\ttfamily on\+Ear\+Monitoring\+Audio\+Frame} callback, which can be set as 8,000, 16,000, 32,000, 44,100, or 48,000 Hz. \\
\hline
{\em channel} & The number of audio channels reported in the {\ttfamily on\+Ear\+Monitoring\+Audio\+Frame} callback.
\begin{DoxyItemize}
\item 1\+: Mono.
\item 2\+: Stereo. 
\end{DoxyItemize}\\
\hline
{\em mode} & The use mode of the audio frame. See {\ttfamily R\+A\+W\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+R\+A\+M\+E\+\_\+\+O\+P\+\_\+\+M\+O\+D\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em samples\+Per\+Call} & The number of data samples reported in the {\ttfamily on\+Ear\+Monitoring\+Audio\+Frame} callback, such as 1,024 for the Media Push.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_af6acd5694dad022464f21dcc5d0002fc}\label{classagora_1_1rtc_1_1_i_rtc_engine_af6acd5694dad022464f21dcc5d0002fc}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setPlaybackAudioFrameBeforeMixingParameters@{setPlaybackAudioFrameBeforeMixingParameters}}
\index{setPlaybackAudioFrameBeforeMixingParameters@{setPlaybackAudioFrameBeforeMixingParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setPlaybackAudioFrameBeforeMixingParameters()}{setPlaybackAudioFrameBeforeMixingParameters()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Playback\+Audio\+Frame\+Before\+Mixing\+Parameters (\begin{DoxyParamCaption}\item[{int}]{sample\+Rate,  }\item[{int}]{channel }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the format of the raw audio playback data before mixing. 

The S\+DK triggers the {\ttfamily on\+Playback\+Audio\+Frame\+Before\+Mixing} callback according to the sampling interval. Call timing\+: Call this method before joining a channel.


\begin{DoxyParams}{Parameters}
{\em sample\+Rate} & The sample rate returned in the callback, which can be set as 8000, 16000, 32000, 44100, or 48000 Hz. \\
\hline
{\em channel} & The number of audio channels. You can set the value as 1 or 2.
\begin{DoxyItemize}
\item 1\+: Mono.
\item 2\+: Stereo.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a9244809c9f2fbe1f0fe85b3c8ea030a1}\label{classagora_1_1rtc_1_1_i_rtc_engine_a9244809c9f2fbe1f0fe85b3c8ea030a1}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setPlaybackAudioFrameBeforeMixingParameters@{setPlaybackAudioFrameBeforeMixingParameters}}
\index{setPlaybackAudioFrameBeforeMixingParameters@{setPlaybackAudioFrameBeforeMixingParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setPlaybackAudioFrameBeforeMixingParameters()}{setPlaybackAudioFrameBeforeMixingParameters()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Playback\+Audio\+Frame\+Before\+Mixing\+Parameters (\begin{DoxyParamCaption}\item[{int}]{sample\+Rate,  }\item[{int}]{channel,  }\item[{int}]{samples\+Per\+Call }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the format of audio data in the {\ttfamily on\+Playback\+Audio\+Frame\+Before\+Mixing} callback. 

Used to set the sample rate, number of channels, and number of samples per callback for the audio data returned in the {\ttfamily on\+Playback\+Audio\+Frame\+Before\+Mixing} callback.


\begin{DoxyParams}{Parameters}
{\em sample\+Rate} & Set the sample rate returned in the {\ttfamily on\+Playback\+Audio\+Frame\+Before\+Mixing} callback. It can be set as the following values\+: 8000、16000、32000、44100 or 48000. \\
\hline
{\em channel} & Set the number of channels for the audio data returned in the {\ttfamily on\+Playback\+Audio\+Frame\+Before\+Mixing} callback. It can be set to\+:
\begin{DoxyItemize}
\item 1\+: Mono.
\item 2\+: Stereo. 
\end{DoxyItemize}\\
\hline
{\em samples\+Per\+Call} & Set the sample rate of the audio data returned in the {\ttfamily on\+Playback\+Audio\+Frame\+Before\+Mixing} callback. In the R\+T\+MP streaming scenario, it is recommended to set it to 1024.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a719e9cf665fdd4fe4dfef84dd51828e2}\label{classagora_1_1rtc_1_1_i_rtc_engine_a719e9cf665fdd4fe4dfef84dd51828e2}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableAudioSpectrumMonitor@{enableAudioSpectrumMonitor}}
\index{enableAudioSpectrumMonitor@{enableAudioSpectrumMonitor}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableAudioSpectrumMonitor()}{enableAudioSpectrumMonitor()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Audio\+Spectrum\+Monitor (\begin{DoxyParamCaption}\item[{int}]{interval\+In\+MS = {\ttfamily 100} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Turns on audio spectrum monitoring. 

If you want to obtain the audio spectrum data of local or remote users, you can register the audio spectrum observer and enable audio spectrum monitoring.

\begin{DoxyNote}{Note}
You can call this method either before or after joining a channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em interval\+In\+MS} & The interval (in milliseconds) at which the S\+DK triggers the {\ttfamily on\+Local\+Audio\+Spectrum} and {\ttfamily on\+Remote\+Audio\+Spectrum} callbacks. The default value is 100. Do not set this parameter to a value less than 10, otherwise calling this method would fail.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: Invalid parameters. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab00fdf2439e00078f8993cf6f3e38b88}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab00fdf2439e00078f8993cf6f3e38b88}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!disableAudioSpectrumMonitor@{disableAudioSpectrumMonitor}}
\index{disableAudioSpectrumMonitor@{disableAudioSpectrumMonitor}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{disableAudioSpectrumMonitor()}{disableAudioSpectrumMonitor()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::disable\+Audio\+Spectrum\+Monitor (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Disables audio spectrum monitoring. 

After calling {\ttfamily enable\+Audio\+Spectrum\+Monitor}, if you want to disable audio spectrum monitoring, you can call this method.

\begin{DoxyNote}{Note}
You can call this method either before or after joining a channel.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a257451a0a792e2d2588154e216c429f6}\label{classagora_1_1rtc_1_1_i_rtc_engine_a257451a0a792e2d2588154e216c429f6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!registerAudioSpectrumObserver@{registerAudioSpectrumObserver}}
\index{registerAudioSpectrumObserver@{registerAudioSpectrumObserver}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{registerAudioSpectrumObserver()}{registerAudioSpectrumObserver()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::register\+Audio\+Spectrum\+Observer (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1media_1_1_i_audio_spectrum_observer}{agora\+::media\+::\+I\+Audio\+Spectrum\+Observer}} $\ast$}]{observer }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Registers an audio spectrum observer. 

After successfully registering the audio spectrum observer and calling {\ttfamily enable\+Audio\+Spectrum\+Monitor} to enable the audio spectrum monitoring, the S\+DK reports the callback that you implement in the {\ttfamily I\+Audio\+Spectrum\+Observer} class according to the time interval you set.

\begin{DoxyNote}{Note}
You can call this method either before or after joining a channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em observer} & The audio spectrum observer. See {\ttfamily I\+Audio\+Spectrum\+Observer}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6d6690527d2fcff60d1c2e8e8a74b7f0}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6d6690527d2fcff60d1c2e8e8a74b7f0}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!unregisterAudioSpectrumObserver@{unregisterAudioSpectrumObserver}}
\index{unregisterAudioSpectrumObserver@{unregisterAudioSpectrumObserver}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{unregisterAudioSpectrumObserver()}{unregisterAudioSpectrumObserver()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::unregister\+Audio\+Spectrum\+Observer (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1media_1_1_i_audio_spectrum_observer}{agora\+::media\+::\+I\+Audio\+Spectrum\+Observer}} $\ast$}]{observer }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Unregisters the audio spectrum observer. 

After calling {\ttfamily register\+Audio\+Spectrum\+Observer}, if you want to disable audio spectrum monitoring, you can call this method.

\begin{DoxyNote}{Note}
You can call this method either before or after joining a channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em observer} & The audio spectrum observer. See {\ttfamily I\+Audio\+Spectrum\+Observer}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_acf94e9e0122f09d0450475d7c5809036}\label{classagora_1_1rtc_1_1_i_rtc_engine_acf94e9e0122f09d0450475d7c5809036}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustRecordingSignalVolume@{adjustRecordingSignalVolume}}
\index{adjustRecordingSignalVolume@{adjustRecordingSignalVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustRecordingSignalVolume()}{adjustRecordingSignalVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+Recording\+Signal\+Volume (\begin{DoxyParamCaption}\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the capturing signal volume. 

If you only need to mute the audio signal, Agora recommends that you use {\ttfamily mute\+Recording\+Signal} instead. Call timing\+: This method can be called either before or after joining the channel.


\begin{DoxyParams}{Parameters}
{\em volume} & The volume of the user. The value range is \mbox{[}0,400\mbox{]}.
\begin{DoxyItemize}
\item 0\+: Mute.
\item 100\+: (Default) The original volume.
\item 400\+: Four times the original volume (amplifying the audio signals by four times).
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3d0ebedd137aa0dcc8e8978854c26682}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3d0ebedd137aa0dcc8e8978854c26682}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!muteRecordingSignal@{muteRecordingSignal}}
\index{muteRecordingSignal@{muteRecordingSignal}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{muteRecordingSignal()}{muteRecordingSignal()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::mute\+Recording\+Signal (\begin{DoxyParamCaption}\item[{bool}]{mute }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Whether to mute the recording signal. 

If you have already called {\ttfamily adjust\+Recording\+Signal\+Volume} to adjust the recording signal volume, when you call this method and set it to {\ttfamily true}, the S\+DK behaves as follows\+:1. Records the adjusted volume.
\begin{DoxyEnumerate}
\item Mutes the recording signal. When you call this method again and set it to {\ttfamily false}, the recording signal volume will be restored to the volume recorded by the S\+DK before muting. Call timing\+: This method can be called either before or after joining the channel.
\end{DoxyEnumerate}


\begin{DoxyParams}{Parameters}
{\em mute} & -\/ {\ttfamily true}\+: Mute the recording signal.
\begin{DoxyItemize}
\item {\ttfamily false}\+: (Default) Do not mute the recording signal.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a98919705c8b2346811f91f9ce5e97a79}\label{classagora_1_1rtc_1_1_i_rtc_engine_a98919705c8b2346811f91f9ce5e97a79}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustPlaybackSignalVolume@{adjustPlaybackSignalVolume}}
\index{adjustPlaybackSignalVolume@{adjustPlaybackSignalVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustPlaybackSignalVolume()}{adjustPlaybackSignalVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+Playback\+Signal\+Volume (\begin{DoxyParamCaption}\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the playback signal volume of all remote users. 

This method is used to adjust the signal volume of all remote users mixed and played locally. If you need to adjust the signal volume of a specified remote user played locally, it is recommended that you call {\ttfamily adjust\+User\+Playback\+Signal\+Volume} instead. Call timing\+: This method can be called either before or after joining the channel.


\begin{DoxyParams}{Parameters}
{\em volume} & The volume of the user. The value range is \mbox{[}0,400\mbox{]}.
\begin{DoxyItemize}
\item 0\+: Mute.
\item 100\+: (Default) The original volume.
\item 400\+: Four times the original volume (amplifying the audio signals by four times).
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_abf7aed322b8f0979cf9313ad99b85775}\label{classagora_1_1rtc_1_1_i_rtc_engine_abf7aed322b8f0979cf9313ad99b85775}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustUserPlaybackSignalVolume@{adjustUserPlaybackSignalVolume}}
\index{adjustUserPlaybackSignalVolume@{adjustUserPlaybackSignalVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustUserPlaybackSignalVolume()}{adjustUserPlaybackSignalVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+User\+Playback\+Signal\+Volume (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the playback signal volume of a specified remote user. 

You can call this method to adjust the playback volume of a specified remote user. To adjust the playback volume of different remote users, call the method as many times, once for each remote user. Call timing\+: Call this method after joining a channel.


\begin{DoxyParams}{Parameters}
{\em uid} & The user ID of the remote user. \\
\hline
{\em volume} & The volume of the user. The value range is \mbox{[}0,400\mbox{]}.
\begin{DoxyItemize}
\item 0\+: Mute.
\item 100\+: (Default) The original volume.
\item 400\+: Four times the original volume (amplifying the audio signals by four times).
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_afd251e3f353a31d470ff9e60c3c3c5de}\label{classagora_1_1rtc_1_1_i_rtc_engine_afd251e3f353a31d470ff9e60c3c3c5de}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setRemoteSubscribeFallbackOption@{setRemoteSubscribeFallbackOption}}
\index{setRemoteSubscribeFallbackOption@{setRemoteSubscribeFallbackOption}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setRemoteSubscribeFallbackOption()}{setRemoteSubscribeFallbackOption()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Remote\+Subscribe\+Fallback\+Option (\begin{DoxyParamCaption}\item[{S\+T\+R\+E\+A\+M\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+T\+I\+O\+NS}]{option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the fallback option for the subscribed video stream based on the network conditions. 

An unstable network affects the audio and video quality in a video call or interactive live video streaming. If {\ttfamily option} is set as {\ttfamily S\+T\+R\+E\+A\+M\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+L\+OW} or {\ttfamily S\+T\+R\+E\+A\+M\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+O\+N\+LY}, the S\+DK automatically switches the video from a high-\/quality stream to a low-\/quality stream or disables the video when the downlink network conditions cannot support both audio and video to guarantee the quality of the audio. Meanwhile, the S\+DK continuously monitors network quality and resumes subscribing to audio and video streams when the network quality improves. When the subscribed video stream falls back to an audio-\/only stream, or recovers from an audio-\/only stream to an audio-\/video stream, the S\+DK triggers the {\ttfamily on\+Remote\+Subscribe\+Fallback\+To\+Audio\+Only} callback.


\begin{DoxyParams}{Parameters}
{\em option} & Fallback options for the subscribed stream. See {\ttfamily S\+T\+R\+E\+A\+M\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+T\+I\+O\+NS}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6d91b4c3234f741d1210db9d0c6a96ba}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6d91b4c3234f741d1210db9d0c6a96ba}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setHighPriorityUserList@{setHighPriorityUserList}}
\index{setHighPriorityUserList@{setHighPriorityUserList}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setHighPriorityUserList()}{setHighPriorityUserList()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+High\+Priority\+User\+List (\begin{DoxyParamCaption}\item[{uid\+\_\+t $\ast$}]{uid\+List,  }\item[{int}]{uid\+Num,  }\item[{S\+T\+R\+E\+A\+M\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+T\+I\+O\+NS}]{option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Sets the high priority user list and their fallback level in weak network condition. \begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method can be called before and after joining a channel.
\item If a subscriber is set to high priority, this stream only fallback to lower stream after all normal priority users fallback to their fallback level on weak network condition if needed.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid\+List} & The high priority user list. \\
\hline
{\em uid\+Num} & The size of uid\+List. \\
\hline
{\em option} & The fallback level of high priority users.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
int
\begin{DoxyItemize}
\item 0 \+: Success.
\item $<$0 \+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac6fc97b54f53ebc5cc28049a04d51170}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac6fc97b54f53ebc5cc28049a04d51170}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableExtension@{enableExtension}}
\index{enableExtension@{enableExtension}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableExtension()}{enableExtension()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Extension (\begin{DoxyParamCaption}\item[{const char $\ast$}]{provider,  }\item[{const char $\ast$}]{extension,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_extension_info}{Extension\+Info}} \&}]{extension\+Info,  }\item[{bool}]{enable = {\ttfamily true} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Enable/\+Disable an extension. By calling this function, you can dynamically enable/disable the extension without changing the pipeline. For example, enabling/disabling Extension\+\_\+A means the data will be adapted/bypassed by Extension\+\_\+A.

N\+O\+TE\+: For compatibility reasons, if you haven\textquotesingle{}t call register\+Extension, enable\+Extension will automatically register the specified extension. We suggest you call register\+Extension explicitly.


\begin{DoxyParams}{Parameters}
{\em provider} & The name of the extension provider, e.\+g. agora.\+io. \\
\hline
{\em extension} & The name of the extension, e.\+g. agora.\+beauty. \\
\hline
{\em extension\+Info} & The information for extension. \\
\hline
{\em enable} & Whether to enable the extension\+:
\begin{DoxyItemize}
\item true\+: (Default) Enable the extension.
\item false\+: Disable the extension.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_afd6dc645147e9d4021dfa7ff673f2b3d}\label{classagora_1_1rtc_1_1_i_rtc_engine_afd6dc645147e9d4021dfa7ff673f2b3d}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setExtensionProperty@{setExtensionProperty}}
\index{setExtensionProperty@{setExtensionProperty}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setExtensionProperty()}{setExtensionProperty()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Extension\+Property (\begin{DoxyParamCaption}\item[{const char $\ast$}]{provider,  }\item[{const char $\ast$}]{extension,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_extension_info}{Extension\+Info}} \&}]{extension\+Info,  }\item[{const char $\ast$}]{key,  }\item[{const char $\ast$}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Sets the properties of an extension.


\begin{DoxyParams}{Parameters}
{\em provider} & The name of the extension provider, e.\+g. agora.\+io. \\
\hline
{\em extension} & The name of the extension, e.\+g. agora.\+beauty. \\
\hline
{\em extension\+Info} & The information for extension. \\
\hline
{\em key} & The key of the extension. \\
\hline
{\em value} & The J\+S\+ON formatted value of the extension key.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa43c2767b29faee996d99e6d785d13f7}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa43c2767b29faee996d99e6d785d13f7}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getExtensionProperty@{getExtensionProperty}}
\index{getExtensionProperty@{getExtensionProperty}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getExtensionProperty()}{getExtensionProperty()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Extension\+Property (\begin{DoxyParamCaption}\item[{const char $\ast$}]{provider,  }\item[{const char $\ast$}]{extension,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_extension_info}{Extension\+Info}} \&}]{extension\+Info,  }\item[{const char $\ast$}]{key,  }\item[{char $\ast$}]{value,  }\item[{int}]{buf\+\_\+len }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Gets the properties of an extension.


\begin{DoxyParams}{Parameters}
{\em provider} & The name of the extension provider, e.\+g. agora.\+io. \\
\hline
{\em extension} & The name of the extension, e.\+g. agora.\+beauty. \\
\hline
{\em extension\+Info} & The information for extension. \\
\hline
{\em key} & The key of the extension. \\
\hline
{\em value} & The value of the extension key. \\
\hline
{\em buf\+\_\+len} & Maximum length of the J\+S\+ON string indicating the extension property.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a86e2db9244c0edc395168a1ab6708102}\label{classagora_1_1rtc_1_1_i_rtc_engine_a86e2db9244c0edc395168a1ab6708102}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableLoopbackRecording@{enableLoopbackRecording}}
\index{enableLoopbackRecording@{enableLoopbackRecording}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableLoopbackRecording()}{enableLoopbackRecording()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Loopback\+Recording (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const char $\ast$}]{device\+Name = {\ttfamily NULL} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables loopback audio capturing. 

If you enable loopback audio capturing, the output of the sound card is mixed into the audio stream sent to the other end.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method applies to the mac\+OS and Windows only.
\item You can call this method either before or after joining a channel.
\item If you call the {\ttfamily disable\+Audio} method to disable the audio module, audio capturing will be disabled as well. If you need to enable audio capturing, call the {\ttfamily enable\+Audio} method to enable the audio module and then call the {\ttfamily enable\+Loopback\+Recording} method.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Sets whether to enable loopback audio capturing.
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable sound card capturing. You can find the name of the virtual sound card in your system\textquotesingle{}s$\ast$$\ast$\+Audio Devices $>$ Output$\ast$$\ast$.
\item {\ttfamily false}\+: Disable sound card capturing. The name of the virtual sound card will not be shown in your system\textquotesingle{}s {\bfseries{Audio Devices $>$ Output}}. 
\end{DoxyItemize}\\
\hline
{\em device\+Name} & -\/ mac\+OS\+: The device name of the virtual sound card. The default value is set to N\+U\+LL, which means using Agora\+A\+LD for loopback audio capturing.
\begin{DoxyItemize}
\item Windows\+: The device name of the sound card. The default is set to N\+U\+LL, which means the S\+DK uses the sound card of your device for loopback audio capturing.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a95cdc3a285845cb35d56f470a0b488fb}\label{classagora_1_1rtc_1_1_i_rtc_engine_a95cdc3a285845cb35d56f470a0b488fb}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustLoopbackSignalVolume@{adjustLoopbackSignalVolume}}
\index{adjustLoopbackSignalVolume@{adjustLoopbackSignalVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustLoopbackSignalVolume()}{adjustLoopbackSignalVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+Loopback\+Signal\+Volume (\begin{DoxyParamCaption}\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the volume of the signal captured by the sound card. 

After calling {\ttfamily enable\+Loopback\+Recording} to enable loopback audio capturing, you can call this method to adjust the volume of the signal captured by the sound card.


\begin{DoxyParams}{Parameters}
{\em volume} & Audio mixing volume. The value ranges between 0 and 100. The default value is 100, which means the original volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac94bc111056036c08e259c84696bb9bd}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac94bc111056036c08e259c84696bb9bd}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getLoopbackRecordingVolume@{getLoopbackRecordingVolume}}
\index{getLoopbackRecordingVolume@{getLoopbackRecordingVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getLoopbackRecordingVolume()}{getLoopbackRecordingVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Loopback\+Recording\+Volume (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Retrieves the audio volume for recording loopback. \begin{DoxyNote}{Note}
Call this method when you are in a channel. 
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item {$\ge$} 0\+: The audio volume for loopback, if this method call succeeds. The value range is \mbox{[}0,100\mbox{]}.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab4650e81f9f5496f63d472b548e03aaa}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab4650e81f9f5496f63d472b548e03aaa}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableInEarMonitoring@{enableInEarMonitoring}}
\index{enableInEarMonitoring@{enableInEarMonitoring}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableInEarMonitoring()}{enableInEarMonitoring()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+In\+Ear\+Monitoring (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{int}]{include\+Audio\+Filters }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables in-\/ear monitoring. 

This method enables or disables in-\/ear monitoring. Call timing\+: This method can be called either before or after joining the channel.

\begin{DoxyNote}{Note}
Users must use earphones (wired or Bluetooth) to hear the in-\/ear monitoring effect.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Enables or disables in-\/ear monitoring.
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enables in-\/ear monitoring.
\item {\ttfamily false}\+: (Default) Disables in-\/ear monitoring. 
\end{DoxyItemize}\\
\hline
{\em include\+Audio\+Filters} & The audio filter types of in-\/ear monitoring. See {\ttfamily E\+A\+R\+\_\+\+M\+O\+N\+I\+T\+O\+R\+I\+N\+G\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/ 8\+: Make sure the current audio routing is Bluetooth or headset. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a407fdc268519a4a23a102afec44bf2e6}\label{classagora_1_1rtc_1_1_i_rtc_engine_a407fdc268519a4a23a102afec44bf2e6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setInEarMonitoringVolume@{setInEarMonitoringVolume}}
\index{setInEarMonitoringVolume@{setInEarMonitoringVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setInEarMonitoringVolume()}{setInEarMonitoringVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+In\+Ear\+Monitoring\+Volume (\begin{DoxyParamCaption}\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the volume of the in-\/ear monitor. 

Call timing\+: This method can be called either before or after joining the channel.


\begin{DoxyParams}{Parameters}
{\em volume} & The volume of the user. The value range is \mbox{[}0,400\mbox{]}.
\begin{DoxyItemize}
\item 0\+: Mute.
\item 100\+: (Default) The original volume.
\item 400\+: Four times the original volume (amplifying the audio signals by four times).
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: Invalid parameter settings, such as in-\/ear monitoring volume exceeding the valid range ($<$ 0 or $>$ 400). 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a518b9d2f480aa83c4e58cc9992f4cbd0}\label{classagora_1_1rtc_1_1_i_rtc_engine_a518b9d2f480aa83c4e58cc9992f4cbd0}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setExtensionProviderProperty@{setExtensionProviderProperty}}
\index{setExtensionProviderProperty@{setExtensionProviderProperty}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setExtensionProviderProperty()}{setExtensionProviderProperty()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Extension\+Provider\+Property (\begin{DoxyParamCaption}\item[{const char $\ast$}]{provider,  }\item[{const char $\ast$}]{key,  }\item[{const char $\ast$}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the properties of the extension provider. 

You can call this method to set the attributes of the extension provider and initialize the relevant parameters according to the type of the provider. Call timing\+: Call this method before {\ttfamily enable\+Extension} and after {\ttfamily register\+Extension}.

\begin{DoxyNote}{Note}
If you want to set the properties of the extension provider for multiple extensions, you need to call this method multiple times.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em provider} & The name of the extension provider. \\
\hline
{\em key} & The key of the extension. \\
\hline
{\em value} & The value of the extension key.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aaff3d6b73766da76f3a8e8173a901409}\label{classagora_1_1rtc_1_1_i_rtc_engine_aaff3d6b73766da76f3a8e8173a901409}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!registerExtension@{registerExtension}}
\index{registerExtension@{registerExtension}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{registerExtension()}{registerExtension()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::register\+Extension (\begin{DoxyParamCaption}\item[{const char $\ast$}]{provider,  }\item[{const char $\ast$}]{extension,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:UNKNOWN\+\_\+MEDIA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Registers an extension. 

For extensions external to the S\+DK (such as those from Extensions Marketplace and S\+DK Extensions), you need to load them before calling this method. Extensions internal to the S\+DK (those included in the full S\+DK package) are automatically loaded and registered after the initialization of {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}}. Call timing\+: -\/ Agora recommends you call this method after the initialization of {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} and before joining a channel.
\begin{DoxyItemize}
\item For video extensions (such as the image enhancement extension), you need to call this method after enabling the video module by calling {\ttfamily enable\+Video} or {\ttfamily enable\+Local\+Video}.
\item Before calling this method, you need to call {\ttfamily load\+Extension\+Provider} to load the extension first.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item If you want to register multiple extensions, you need to call this method multiple times.
\item The data processing order of different extensions in the S\+DK is determined by the order in which the extensions are registered. That is, the extension that is registered first will process the data first.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em provider} & The name of the extension provider. \\
\hline
{\em extension} & The name of the extension. \\
\hline
{\em type} & Source type of the extension. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/3\+: The extension library is not loaded. Agora recommends that you check the storage location or the name of the dynamic library. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6c4e1fabb81aef573de88a215a19da9b}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6c4e1fabb81aef573de88a215a19da9b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableExtension@{enableExtension}}
\index{enableExtension@{enableExtension}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableExtension()}{enableExtension()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Extension (\begin{DoxyParamCaption}\item[{const char $\ast$}]{provider,  }\item[{const char $\ast$}]{extension,  }\item[{bool}]{enable = {\ttfamily true},  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:UNKNOWN\+\_\+MEDIA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables or disables extensions. 

Call timing\+: Agora recommends that you call this method after joining a channel. Related callbacks\+: When this method is successfully called within the channel, it triggers {\ttfamily on\+Extension\+Started\+With\+Context} or {\ttfamily on\+Extension\+Stopped\+With\+Context}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item If you want to enable multiple extensions, you need to call this method multiple times.
\item After a successful call of this method, you cannot load other extensions.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em provider} & The name of the extension provider. \\
\hline
{\em extension} & The name of the extension. \\
\hline
{\em enable} & Whether to enable the extension\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable the extension.
\item {\ttfamily false}\+: Disable the extension. 
\end{DoxyItemize}\\
\hline
{\em type} & Source type of the extension. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/3\+: The extension library is not loaded. Agora recommends that you check the storage location or the name of the dynamic library. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa268792b9208cf687afff31c106166f9}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa268792b9208cf687afff31c106166f9}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setExtensionProperty@{setExtensionProperty}}
\index{setExtensionProperty@{setExtensionProperty}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setExtensionProperty()}{setExtensionProperty()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Extension\+Property (\begin{DoxyParamCaption}\item[{const char $\ast$}]{provider,  }\item[{const char $\ast$}]{extension,  }\item[{const char $\ast$}]{key,  }\item[{const char $\ast$}]{value,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:UNKNOWN\+\_\+MEDIA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the properties of the extension. 

After enabling the extension, you can call this method to set the properties of the extension. Call timing\+: Call this mehtod after calling {\ttfamily enable\+Extension}. Related callbacks\+: After calling this method, it may trigger the {\ttfamily on\+Extension\+Event\+With\+Context} callback, and the specific triggering logic is related to the extension itself.

\begin{DoxyNote}{Note}
If you want to set properties for multiple extensions, you need to call this method multiple times.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em provider} & The name of the extension provider. \\
\hline
{\em extension} & The name of the extension. \\
\hline
{\em key} & The key of the extension. \\
\hline
{\em value} & The value of the extension key. \\
\hline
{\em type} & Source type of the extension. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a18ecaaccf0c6ddb32f05a443c0d8c98c}\label{classagora_1_1rtc_1_1_i_rtc_engine_a18ecaaccf0c6ddb32f05a443c0d8c98c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getExtensionProperty@{getExtensionProperty}}
\index{getExtensionProperty@{getExtensionProperty}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getExtensionProperty()}{getExtensionProperty()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Extension\+Property (\begin{DoxyParamCaption}\item[{const char $\ast$}]{provider,  }\item[{const char $\ast$}]{extension,  }\item[{const char $\ast$}]{key,  }\item[{char $\ast$}]{value,  }\item[{int}]{buf\+\_\+len,  }\item[{agora\+::media\+::\+M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type = {\ttfamily agora\+:\+:media\+:\+:UNKNOWN\+\_\+MEDIA\+\_\+SOURCE} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets detailed information on the extensions. 

Call timing\+: This method can be called either before or after joining the channel.


\begin{DoxyParams}{Parameters}
{\em provider} & An output parameter. The name of the extension provider. \\
\hline
{\em extension} & An output parameter. The name of the extension. \\
\hline
{\em key} & An output parameter. The key of the extension. \\
\hline
{\em value} & An output parameter. The value of the extension key. \\
\hline
{\em type} & Source type of the extension. See {\ttfamily M\+E\+D\+I\+A\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em buf\+\_\+len} & Maximum length of the J\+S\+ON string indicating the extension property. The maximum value is 512 bytes.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aaa9b17c5a938b8331dba774f37f94e65}\label{classagora_1_1rtc_1_1_i_rtc_engine_aaa9b17c5a938b8331dba774f37f94e65}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setCameraCapturerConfiguration@{setCameraCapturerConfiguration}}
\index{setCameraCapturerConfiguration@{setCameraCapturerConfiguration}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setCameraCapturerConfiguration()}{setCameraCapturerConfiguration()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Camera\+Capturer\+Configuration (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_camera_capturer_configuration}{Camera\+Capturer\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the camera capture configuration. 

Call timing\+: Call this method before enabling local camera capture, such as before calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad0673c4d00d24983098fb3421bd59e01}{start\+Preview(\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+P\+E source\+Type)}}} and {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)}.

\begin{DoxyNote}{Note}
To adjust the camera focal length configuration, It is recommended to call {\ttfamily query\+Camera\+Focal\+Length\+Capability} first to check the device\textquotesingle{}s focal length capabilities, and then configure based on the query results. Due to limitations on some Android devices, even if you set the focal length type according to the results returned in {\ttfamily query\+Camera\+Focal\+Length\+Capability}, the settings may not take effect.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & The camera capture configuration. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_camera_capturer_configuration}{Camera\+Capturer\+Configuration}}}.Attention\+: In this method, you do not need to set the {\ttfamily device\+Id} parameter.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a94236ec10e44896d3a133d411d0b8958}\label{classagora_1_1rtc_1_1_i_rtc_engine_a94236ec10e44896d3a133d411d0b8958}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!createCustomVideoTrack@{createCustomVideoTrack}}
\index{createCustomVideoTrack@{createCustomVideoTrack}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{createCustomVideoTrack()}{createCustomVideoTrack()}}
{\footnotesize\ttfamily virtual video\+\_\+track\+\_\+id\+\_\+t agora\+::rtc\+::\+I\+Rtc\+Engine\+::create\+Custom\+Video\+Track (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Creates a custom video track. 

To publish a custom video source, see the following steps\+:1. Call this method to create a video track and get the video track ID.
\begin{DoxyEnumerate}
\item Call {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} to join the channel. In {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}, set {\ttfamily custom\+Video\+Track\+Id} to the video track ID that you want to publish, and set {\ttfamily publish\+Custom\+Video\+Track} to {\ttfamily true}.
\item Call {\ttfamily push\+Video\+Frame} and specify {\ttfamily video\+Track\+Id} as the video track ID set in step 2. You can then publish the corresponding custom video source in the channel.
\end{DoxyEnumerate}

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item If the method call is successful, the video track ID is returned as the unique identifier of the video track.
\item If the method call fails, 0xffffffff is returned. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad89333616fea3ae501b77000624b95a1}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad89333616fea3ae501b77000624b95a1}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!createCustomEncodedVideoTrack@{createCustomEncodedVideoTrack}}
\index{createCustomEncodedVideoTrack@{createCustomEncodedVideoTrack}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{createCustomEncodedVideoTrack()}{createCustomEncodedVideoTrack()}}
{\footnotesize\ttfamily virtual video\+\_\+track\+\_\+id\+\_\+t agora\+::rtc\+::\+I\+Rtc\+Engine\+::create\+Custom\+Encoded\+Video\+Track (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_sender_options}{Sender\+Options}} \&}]{sender\+\_\+option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Get an custom encoded video track id created by internal,which could used to publish or preview

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item $>$ 0\+: the useable video track id.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a5adc6cc95c913646b2a993ed21729440}\label{classagora_1_1rtc_1_1_i_rtc_engine_a5adc6cc95c913646b2a993ed21729440}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!destroyCustomVideoTrack@{destroyCustomVideoTrack}}
\index{destroyCustomVideoTrack@{destroyCustomVideoTrack}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{destroyCustomVideoTrack()}{destroyCustomVideoTrack()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::destroy\+Custom\+Video\+Track (\begin{DoxyParamCaption}\item[{video\+\_\+track\+\_\+id\+\_\+t}]{video\+\_\+track\+\_\+id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Destroys the specified video track. 


\begin{DoxyParams}{Parameters}
{\em video\+\_\+track\+\_\+id} & The video track ID returned by calling the {\ttfamily create\+Custom\+Video\+Track} method.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a84e88acc42701119a7a5d997e3142f5b}\label{classagora_1_1rtc_1_1_i_rtc_engine_a84e88acc42701119a7a5d997e3142f5b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!destroyCustomEncodedVideoTrack@{destroyCustomEncodedVideoTrack}}
\index{destroyCustomEncodedVideoTrack@{destroyCustomEncodedVideoTrack}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{destroyCustomEncodedVideoTrack()}{destroyCustomEncodedVideoTrack()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::destroy\+Custom\+Encoded\+Video\+Track (\begin{DoxyParamCaption}\item[{video\+\_\+track\+\_\+id\+\_\+t}]{video\+\_\+track\+\_\+id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

destroy a created custom encoded video track id


\begin{DoxyParams}{Parameters}
{\em video\+\_\+track\+\_\+id} & The video track id which was created by create\+Custom\+Encoded\+Video\+Track \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_af67688d89526926718edb26938d65541}\label{classagora_1_1rtc_1_1_i_rtc_engine_af67688d89526926718edb26938d65541}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getCallId@{getCallId}}
\index{getCallId@{getCallId}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getCallId()}{getCallId()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Call\+Id (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1util_1_1_copyable_auto_ptr}{agora\+::util\+::\+A\+String}} \&}]{call\+Id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Retrieves the call ID. 

When a user joins a channel on a client, a {\ttfamily call\+Id} is generated to identify the call from the client. You can call this method to get {\ttfamily call\+Id}, and pass it in when calling methods such as {\ttfamily rate} and {\ttfamily complain}. Call timing\+: Call this method after joining a channel.


\begin{DoxyParams}{Parameters}
{\em call\+Id} & Output parameter, the current call ID.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a748c30a6339ec9798daa0d1b21585411}\label{classagora_1_1rtc_1_1_i_rtc_engine_a748c30a6339ec9798daa0d1b21585411}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!rate@{rate}}
\index{rate@{rate}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{rate()}{rate()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::rate (\begin{DoxyParamCaption}\item[{const char $\ast$}]{call\+Id,  }\item[{int}]{rating,  }\item[{const char $\ast$}]{description }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Allows a user to rate a call after the call ends. 

\begin{DoxyNote}{Note}
Ensure that you call this method after leaving a channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em call\+Id} & The current call ID. You can get the call ID by calling {\ttfamily get\+Call\+Id}. \\
\hline
{\em rating} & The value is between 1 (the lowest score) and 5 (the highest score). \\
\hline
{\em description} & (\mbox{\hyperlink{classagora_1_1_optional}{Optional}}) A description of the call. The string length should be less than 800 bytes.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab8031b21d72c846e9d501fbe6ca10678}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab8031b21d72c846e9d501fbe6ca10678}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!complain@{complain}}
\index{complain@{complain}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{complain()}{complain()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::complain (\begin{DoxyParamCaption}\item[{const char $\ast$}]{call\+Id,  }\item[{const char $\ast$}]{description }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Allows a user to complain about the call quality after a call ends. 

This method allows users to complain about the quality of the call. Call this method after the user leaves the channel.


\begin{DoxyParams}{Parameters}
{\em call\+Id} & The current call ID. You can get the call ID by calling {\ttfamily get\+Call\+Id}. \\
\hline
{\em description} & (\mbox{\hyperlink{classagora_1_1_optional}{Optional}}) A description of the call. The string length should be less than 800 bytes.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid.
\item -\/7\+: The method is called before {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} is initialized. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_acfc4de5d9454cad1dfd1d154e180d78c}\label{classagora_1_1rtc_1_1_i_rtc_engine_acfc4de5d9454cad1dfd1d154e180d78c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startRtmpStreamWithoutTranscoding@{startRtmpStreamWithoutTranscoding}}
\index{startRtmpStreamWithoutTranscoding@{startRtmpStreamWithoutTranscoding}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startRtmpStreamWithoutTranscoding()}{startRtmpStreamWithoutTranscoding()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Rtmp\+Stream\+Without\+Transcoding (\begin{DoxyParamCaption}\item[{const char $\ast$}]{url }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts pushing media streams to a C\+DN without transcoding. 

Agora recommends that you use the server-\/side Media Push function. For details, see {\ttfamily Use R\+E\+S\+Tful A\+PI}. You can call this method to push an audio or video stream to the specified C\+DN address. This method can push media streams to only one C\+DN address at a time, so if you need to push streams to multiple addresses, call this method multiple times. After you call this method, the S\+DK triggers the {\ttfamily on\+Rtmp\+Streaming\+State\+Changed} callback on the local client to report the state of the streaming.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Call this method after joining a channel.
\item Only hosts in the L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG profile can call this method.
\item If you want to retry pushing streams after a failed push, make sure to call {\ttfamily stop\+Rtmp\+Stream} first, then call this method to retry pushing streams; otherwise, the S\+DK returns the same error code as the last failed push.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em url} & The address of Media Push. The format is R\+T\+MP or R\+T\+M\+PS. The character length cannot exceed 1024 bytes. Special characters such as Chinese characters are not supported.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The U\+RL or configuration of transcoding is invalid; check your U\+RL and transcoding configurations.
\item -\/7\+: The S\+DK is not initialized before calling this method.
\item -\/19\+: The Media Push U\+RL is already in use; use another U\+RL instead. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a0f91aa3af0a7c9a8428966028b5a010c}\label{classagora_1_1rtc_1_1_i_rtc_engine_a0f91aa3af0a7c9a8428966028b5a010c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startRtmpStreamWithTranscoding@{startRtmpStreamWithTranscoding}}
\index{startRtmpStreamWithTranscoding@{startRtmpStreamWithTranscoding}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startRtmpStreamWithTranscoding()}{startRtmpStreamWithTranscoding()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Rtmp\+Stream\+With\+Transcoding (\begin{DoxyParamCaption}\item[{const char $\ast$}]{url,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_live_transcoding}{Live\+Transcoding}} \&}]{transcoding }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts Media Push and sets the transcoding configuration. 

Agora recommends that you use the server-\/side Media Push function. For details, see {\ttfamily Use R\+E\+S\+Tful A\+PI}. You can call this method to push a live audio-\/and-\/video stream to the specified C\+DN address and set the transcoding configuration. This method can push media streams to only one C\+DN address at a time, so if you need to push streams to multiple addresses, call this method multiple times. Under one Agora project, the maximum number of concurrent tasks to push media streams is 200 by default. If you need a higher quota, contact {\ttfamily technical support}. After you call this method, the S\+DK triggers the {\ttfamily on\+Rtmp\+Streaming\+State\+Changed} callback on the local client to report the state of the streaming.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Call this method after joining a channel.
\item Only hosts in the L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG profile can call this method.
\item If you want to retry pushing streams after a failed push, make sure to call {\ttfamily stop\+Rtmp\+Stream} first, then call this method to retry pushing streams; otherwise, the S\+DK returns the same error code as the last failed push.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em url} & The address of Media Push. The format is R\+T\+MP or R\+T\+M\+PS. The character length cannot exceed 1024 bytes. Special characters such as Chinese characters are not supported. \\
\hline
{\em transcoding} & The transcoding configuration for Media Push. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_live_transcoding}{Live\+Transcoding}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The U\+RL or configuration of transcoding is invalid; check your U\+RL and transcoding configurations.
\item -\/7\+: The S\+DK is not initialized before calling this method.
\item -\/19\+: The Media Push U\+RL is already in use; use another U\+RL instead. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8689685218a15a34a376944555340261}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8689685218a15a34a376944555340261}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!updateRtmpTranscoding@{updateRtmpTranscoding}}
\index{updateRtmpTranscoding@{updateRtmpTranscoding}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{updateRtmpTranscoding()}{updateRtmpTranscoding()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::update\+Rtmp\+Transcoding (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_live_transcoding}{Live\+Transcoding}} \&}]{transcoding }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Updates the transcoding configuration. 

Agora recommends that you use the server-\/side Media Push function. For details, see {\ttfamily Use R\+E\+S\+Tful A\+PI}. After you start pushing media streams to C\+DN with transcoding, you can dynamically update the transcoding configuration according to the scenario. The S\+DK triggers the {\ttfamily on\+Transcoding\+Updated} callback after the transcoding configuration is updated.


\begin{DoxyParams}{Parameters}
{\em transcoding} & The transcoding configuration for Media Push. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_live_transcoding}{Live\+Transcoding}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3eea37dd1b80a9246816903b965716ca}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3eea37dd1b80a9246816903b965716ca}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startLocalVideoTranscoder@{startLocalVideoTranscoder}}
\index{startLocalVideoTranscoder@{startLocalVideoTranscoder}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startLocalVideoTranscoder()}{startLocalVideoTranscoder()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Local\+Video\+Transcoder (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_transcoder_configuration}{Local\+Transcoder\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts the local video mixing. 

After calling this method, you can merge multiple video streams into one video stream locally. For example, you can merge the video streams captured by the camera, screen sharing, media player, remote video, video files, images, etc. into one video stream, and then publish the mixed video stream to the channel. Applicable scenarios\+: You can enable the local video mixing function in scenarios such as remote conferences, live streaming, and online education, which allows users to view and manage multiple videos more conveniently, and supports portrait-\/in-\/picture effect and other functions. The following is a typical use case for implementing the portrait-\/in-\/picture effect\+:1. Call {\ttfamily enable\+Virtual\+Background}, and set the custom background image to {\ttfamily B\+A\+C\+K\+G\+R\+O\+U\+N\+D\+\_\+\+N\+O\+NE}, that is, separate the portrait and the background in the video captured by the camera.
\begin{DoxyEnumerate}
\item Call {\ttfamily start\+Screen\+Capture(V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type, const \mbox{\hyperlink{structagora_1_1rtc_1_1_screen_capture_configuration}{Screen\+Capture\+Configuration}}\& config)} to start capturing the screen sharing video stream.
\item Call this method and set the video source for capturing portraits as one of the video sources participating in the local video mixing, picture-\/in-\/picture of the portrait can be achived in the mixed video. Call timing\+: -\/ If you need to mix the locally collected video streams, you need to call this method after {\ttfamily start\+Camera\+Capture} or {\ttfamily start\+Screen\+Capture(V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE source\+Type, const \mbox{\hyperlink{structagora_1_1rtc_1_1_screen_capture_configuration}{Screen\+Capture\+Configuration}}\& config)}.
\end{DoxyEnumerate}
\begin{DoxyItemize}
\item If you want to publish the mixed video stream to the channel, you need to set {\ttfamily publish\+Transcoded\+Video\+Track} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} to {\ttfamily true} when calling {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} or {\ttfamily update\+Channel\+Media\+Options}. Related callbacks\+: When you fail to call this method, the S\+DK triggers the {\ttfamily on\+Local\+Video\+Transcoder\+Error} callback to report the reason.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Local video mixing requires more C\+PU resources. Therefore, Agora recommends enabling this function on devices with higher performance.
\item If you need to mix locally captured video streams, the S\+DK supports the following capture combinations\+:
\begin{DoxyItemize}
\item On the Windows platform, it supports up to 4 video streams captured by cameras + 4 screen sharing streams.
\item On the mac\+OS platform, it supports up to 4 video streams captured by cameras + 1 screen sharing stream.
\item On Android and i\+OS platforms, it supports video streams captured by up to 2 cameras (the device itself needs to support dual cameras or supports external cameras) + 1 screen sharing stream.
\end{DoxyItemize}
\item When configuring the local video mixing, it is necessary to ensure that the layer number of the video stream capturing the portrait is greater than the layer number of the screen sharing stream. Otherwise, the portrait will be covered by the screen sharing and will not be displayed in the final mixed video stream.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & Configuration of the local video mixing, see {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_local_transcoder_configuration}{Local\+Transcoder\+Configuration}}}.Attention\+:
\begin{DoxyItemize}
\item The maximum resolution of each video stream participating in the local video mixing is 4096 ×
\end{DoxyItemize}
\begin{DoxyEnumerate}
\item If this limit is exceeded, video mixing does not take effect.
\end{DoxyEnumerate}
\begin{DoxyItemize}
\item The maximum resolution of the mixed video stream is 4096 × 2160.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7057d7b1b8b5bca1b622fe10c4e29950}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7057d7b1b8b5bca1b622fe10c4e29950}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!updateLocalTranscoderConfiguration@{updateLocalTranscoderConfiguration}}
\index{updateLocalTranscoderConfiguration@{updateLocalTranscoderConfiguration}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{updateLocalTranscoderConfiguration()}{updateLocalTranscoderConfiguration()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::update\+Local\+Transcoder\+Configuration (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_transcoder_configuration}{Local\+Transcoder\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Updates the local video mixing configuration. 

After calling {\ttfamily start\+Local\+Video\+Transcoder}, call this method if you want to update the local video mixing configuration.

\begin{DoxyNote}{Note}
If you want to update the video source type used for local video mixing, such as adding a second camera or screen to capture video, you need to call this method after {\ttfamily start\+Camera\+Capture} or {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad984f3f62e584e8909a0491aac41c4e8}{start\+Screen\+Capture(\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+P\+E source\+Type, const Screen\+Capture\+Configuration\& config)}}}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & Configuration of the local video mixing, see {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_local_transcoder_configuration}{Local\+Transcoder\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab9807b2e5fb708d01066759af02cc630}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab9807b2e5fb708d01066759af02cc630}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopRtmpStream@{stopRtmpStream}}
\index{stopRtmpStream@{stopRtmpStream}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopRtmpStream()}{stopRtmpStream()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Rtmp\+Stream (\begin{DoxyParamCaption}\item[{const char $\ast$}]{url }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops pushing media streams to a C\+DN. 

Agora recommends that you use the server-\/side Media Push function. For details, see {\ttfamily Use R\+E\+S\+Tful A\+PI}. You can call this method to stop the live stream on the specified C\+DN address. This method can stop pushing media streams to only one C\+DN address at a time, so if you need to stop pushing streams to multiple addresses, call this method multiple times. After you call this method, the S\+DK triggers the {\ttfamily on\+Rtmp\+Streaming\+State\+Changed} callback on the local client to report the state of the streaming.


\begin{DoxyParams}{Parameters}
{\em url} & The address of Media Push. The format is R\+T\+MP or R\+T\+M\+PS. The character length cannot exceed 1024 bytes. Special characters such as Chinese characters are not supported.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a417bb1e2c3564a4c349357cdba1bb11b}\label{classagora_1_1rtc_1_1_i_rtc_engine_a417bb1e2c3564a4c349357cdba1bb11b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopLocalVideoTranscoder@{stopLocalVideoTranscoder}}
\index{stopLocalVideoTranscoder@{stopLocalVideoTranscoder}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopLocalVideoTranscoder()}{stopLocalVideoTranscoder()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Local\+Video\+Transcoder (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops the local video mixing. 

After calling {\ttfamily start\+Local\+Video\+Transcoder}, call this method if you want to stop the local video mixing.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a3b43b690a4137b0172cd09f70b079a4b}\label{classagora_1_1rtc_1_1_i_rtc_engine_a3b43b690a4137b0172cd09f70b079a4b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startLocalAudioMixer@{startLocalAudioMixer}}
\index{startLocalAudioMixer@{startLocalAudioMixer}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startLocalAudioMixer()}{startLocalAudioMixer()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Local\+Audio\+Mixer (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_audio_mixer_configuration}{Local\+Audio\+Mixer\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts local audio mixing. 

This method supports merging multiple audio streams into one audio stream locally. For example, merging the audio streams captured from the local microphone, and that from the media player, the sound card, and the remote users into one audio stream, and then publish the merged audio stream to the channel.
\begin{DoxyItemize}
\item If you want to mix the locally captured audio streams, you can set publish\+Mixed\+Audio\+Track in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} to {\ttfamily true}, and then publish the mixed audio stream to the channel.
\item If you want to mix the remote audio stream, ensure that the remote audio stream has been published in the channel and you have subcribed to the audio stream that you need to mix. Applicable scenarios\+: You can enable this function in the following scenarios\+:
\item By utilizing the local video mixing feature, the associated audio streams of the mixed video streams can be simultaneously captured and published.
\item In live streaming scenarios, users can receive audio streams within the channel, mix multiple audio streams locally, and then forward the mixed audio stream to other channels.
\item In online classes, teachers can mix the audio from interactions with students locally and then forward the mixed audio stream to other channels. Call timing\+: You can call this method either before or after joining a channel.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
To ensure audio quality, it is recommended that the number of audio streams to be mixed does not exceed 10.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & The configurations for mixing the lcoal audio. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_local_audio_mixer_configuration}{Local\+Audio\+Mixer\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a24e94ea7f4ec5f5830608d05965eacf4}\label{classagora_1_1rtc_1_1_i_rtc_engine_a24e94ea7f4ec5f5830608d05965eacf4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!updateLocalAudioMixerConfiguration@{updateLocalAudioMixerConfiguration}}
\index{updateLocalAudioMixerConfiguration@{updateLocalAudioMixerConfiguration}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{updateLocalAudioMixerConfiguration()}{updateLocalAudioMixerConfiguration()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::update\+Local\+Audio\+Mixer\+Configuration (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_audio_mixer_configuration}{Local\+Audio\+Mixer\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Updates the configurations for mixing audio streams locally. 

After calling {\ttfamily start\+Local\+Audio\+Mixer}, call this method if you want to update the local audio mixing configuration. Call timing\+: Call this method after {\ttfamily start\+Local\+Audio\+Mixer}.

\begin{DoxyNote}{Note}
To ensure audio quality, it is recommended that the number of audio streams to be mixed does not exceed 10.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & The configurations for mixing the lcoal audio. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_local_audio_mixer_configuration}{Local\+Audio\+Mixer\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_afde87fec9cd23387436b5a918975a454}\label{classagora_1_1rtc_1_1_i_rtc_engine_afde87fec9cd23387436b5a918975a454}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopLocalAudioMixer@{stopLocalAudioMixer}}
\index{stopLocalAudioMixer@{stopLocalAudioMixer}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopLocalAudioMixer()}{stopLocalAudioMixer()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Local\+Audio\+Mixer (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops the local audio mixing. 

After calling {\ttfamily start\+Local\+Audio\+Mixer}, call this method if you want to stop the local audio mixing. Call timing\+: Call this method after {\ttfamily start\+Local\+Audio\+Mixer}.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad01a4f17cfec60596b5cae7bb59b2394}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad01a4f17cfec60596b5cae7bb59b2394}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startCameraCapture@{startCameraCapture}}
\index{startCameraCapture@{startCameraCapture}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startCameraCapture()}{startCameraCapture()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Camera\+Capture (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{source\+Type,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_camera_capturer_configuration}{Camera\+Capturer\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts camera capture. 

You can call this method to start capturing video from one or more cameras by specifying {\ttfamily source\+Type}.

\begin{DoxyNote}{Note}
On the i\+OS platform, if you want to enable multi-\/camera capture, you need to call {\ttfamily enable\+Multi\+Camera} and set {\ttfamily enabled} to {\ttfamily true} before calling this method.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em source\+Type} & The type of the video source. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}. Note\+:
\begin{DoxyItemize}
\item On i\+OS devices, you can capture video from up to 2 cameras, provided the device has multiple cameras or supports external cameras.
\item On Android devices, you can capture video from up to 4 cameras, provided the device has multiple cameras or supports external cameras.
\item On the desktop platforms, you can capture video from up to 4 cameras. 
\end{DoxyItemize}\\
\hline
{\em config} & The configuration of the video capture. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_camera_capturer_configuration}{Camera\+Capturer\+Configuration}}}. Note\+: On the i\+OS platform, this parameter has no practical function. Use the {\ttfamily config} parameter in {\ttfamily enable\+Multi\+Camera} instead to set the video capture configuration.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a28bd9fd55b81d3790c8f6792f10ff739}\label{classagora_1_1rtc_1_1_i_rtc_engine_a28bd9fd55b81d3790c8f6792f10ff739}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopCameraCapture@{stopCameraCapture}}
\index{stopCameraCapture@{stopCameraCapture}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopCameraCapture()}{stopCameraCapture()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Camera\+Capture (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{source\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops camera capture. 

After calling {\ttfamily start\+Camera\+Capture} to start capturing video through one or more cameras, you can call this method and set the {\ttfamily source\+Type} parameter to stop the capture from the specified cameras.

\begin{DoxyNote}{Note}
If you are using the local video mixing function, calling this method can cause the local video mixing to be interrupted. On the i\+OS platform, if you want to disable multi-\/camera capture, you need to call {\ttfamily enable\+Multi\+Camera} after calling this method and set {\ttfamily enabled} to {\ttfamily false}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em source\+Type} & The type of the video source. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab035f52a3b59ac873e08f792d9e76620}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab035f52a3b59ac873e08f792d9e76620}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setCameraDeviceOrientation@{setCameraDeviceOrientation}}
\index{setCameraDeviceOrientation@{setCameraDeviceOrientation}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setCameraDeviceOrientation()}{setCameraDeviceOrientation()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Camera\+Device\+Orientation (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type,  }\item[{V\+I\+D\+E\+O\+\_\+\+O\+R\+I\+E\+N\+T\+A\+T\+I\+ON}]{orientation }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the rotation angle of the captured video. 

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method applies to Windows only.
\item You must call this method after {\ttfamily enable\+Video}. The setting result will take effect after the camera is successfully turned on, that is, after the S\+DK triggers the {\ttfamily on\+Local\+Video\+State\+Changed} callback and returns the local video state as {\ttfamily L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+C\+A\+P\+T\+U\+R\+I\+NG} (1).
\item When the video capture device does not have the gravity sensing function, you can call this method to manually adjust the rotation angle of the captured video.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em type} & The video source type. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}. \\
\hline
{\em orientation} & The clockwise rotation angle. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+O\+R\+I\+E\+N\+T\+A\+T\+I\+ON}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae05a33fd4fb688bb24dbbb5162100528}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae05a33fd4fb688bb24dbbb5162100528}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setScreenCaptureOrientation@{setScreenCaptureOrientation}}
\index{setScreenCaptureOrientation@{setScreenCaptureOrientation}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setScreenCaptureOrientation()}{setScreenCaptureOrientation()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Screen\+Capture\+Orientation (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{type,  }\item[{V\+I\+D\+E\+O\+\_\+\+O\+R\+I\+E\+N\+T\+A\+T\+I\+ON}]{orientation }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Sets the rotation angle of the video captured by the screen.

When the screen capture device does not have the gravity sensing function, you can call this method to manually adjust the rotation angle of the captured video.


\begin{DoxyParams}{Parameters}
{\em type} & The video source type. See \#\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE. \\
\hline
{\em orientation} & The clockwise rotation angle. See \#\+V\+I\+D\+E\+O\+\_\+\+O\+R\+I\+E\+N\+T\+A\+T\+I\+ON. \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad984f3f62e584e8909a0491aac41c4e8}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad984f3f62e584e8909a0491aac41c4e8}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startScreenCapture@{startScreenCapture}}
\index{startScreenCapture@{startScreenCapture}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startScreenCapture()}{startScreenCapture()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Screen\+Capture (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{source\+Type,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_screen_capture_configuration}{Screen\+Capture\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts screen capture from the specified video source. 

Applicable scenarios\+: In the screen sharing scenario, you need to call this method to start capturing the screen video stream. The S\+DK supports a series of methods for screen capturing, with the following distinctions between them. Please choose according to the actual scenario\+:
\begin{DoxyItemize}
\item {\ttfamily start\+Screen\+Capture(const Screen\+Capture\+Parameters2\& capture\+Params)} / {\ttfamily start\+Screen\+Capture\+By\+Display\+Id} / {\ttfamily start\+Screen\+Capture\+By\+Window\+Id}\+: Only supports capturing a single screen or window, suitable for scenarios where only a single screen is shared.
\item {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad984f3f62e584e8909a0491aac41c4e8}{start\+Screen\+Capture(\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+P\+E source\+Type, const Screen\+Capture\+Configuration\& config)}}}\+: Supports specifying multiple video sources to capture multiple screen sharing streams, used for local video mixing or multi-\/channel scenarios. Call timing\+: You can call this method either before or after joining the channel, with the following differences\+:
\item Call this method first and then call {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} to join channel and set {\ttfamily publish\+Screen\+Capture\+Video} to {\ttfamily true} to start screen sharing.
\item Call this method after joining a channel, then call {\ttfamily update\+Channel\+Media\+Options} and set {\ttfamily publish\+Screen\+Capture\+Video} to {\ttfamily true} to start screen sharing.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item If you start screen capture by calling this method, you need to call {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a93e3f9ae0e115a54d2af79d1b96dda7d}{stop\+Screen\+Capture(\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+P\+E source\+Type)}}} to stop screen capture.
\item On the Windows platform, it supports up to four screen capture video streams.
\item On the mac\+OS platform, it supports only one screen capture video stream. This method applies to the mac\+OS and Windows only.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em source\+Type} & The type of the video source. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.Attention\+: On the mac\+OS platform, this parameter can only be set to V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+S\+C\+R\+E\+EN (2). \\
\hline
{\em config} & The configuration of the captured screen. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_screen_capture_configuration}{Screen\+Capture\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a93e3f9ae0e115a54d2af79d1b96dda7d}\label{classagora_1_1rtc_1_1_i_rtc_engine_a93e3f9ae0e115a54d2af79d1b96dda7d}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopScreenCapture@{stopScreenCapture}}
\index{stopScreenCapture@{stopScreenCapture}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopScreenCapture()}{stopScreenCapture()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Screen\+Capture (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}]{source\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops screen capture from the specified video source. 

Applicable scenarios\+: If you start screen capture from one or more screens by calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad984f3f62e584e8909a0491aac41c4e8}{start\+Screen\+Capture(\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+P\+E source\+Type, const Screen\+Capture\+Configuration\& config)}}}, you need to call this method to stop screen capture, specifying the screen through the {\ttfamily source\+Type} parameter. Call timing\+: You can call this method either before or after joining a channel.

\begin{DoxyNote}{Note}
This method applies to the mac\+OS and Windows only.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em source\+Type} & The type of the video source. See {\ttfamily V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a512b149d4dc249c04f9e30bd31767362}\label{classagora_1_1rtc_1_1_i_rtc_engine_a512b149d4dc249c04f9e30bd31767362}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getConnectionState@{getConnectionState}}
\index{getConnectionState@{getConnectionState}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getConnectionState()}{getConnectionState()}}
{\footnotesize\ttfamily virtual C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+T\+Y\+PE agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Connection\+State (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the current connection state of the S\+DK. 

Call timing\+: This method can be called either before or after joining the channel.

\begin{DoxyReturn}{Returns}
The current connection state. See {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+T\+Y\+PE}. 
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a95b53a32d598c3d98a51c24f7f9af4b4}\label{classagora_1_1rtc_1_1_i_rtc_engine_a95b53a32d598c3d98a51c24f7f9af4b4}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!registerPacketObserver@{registerPacketObserver}}
\index{registerPacketObserver@{registerPacketObserver}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{registerPacketObserver()}{registerPacketObserver()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::register\+Packet\+Observer (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1rtc_1_1_i_packet_observer}{I\+Packet\+Observer}} $\ast$}]{observer }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Registers a packet observer. 

Call this method registers a packet observer. When the Agora S\+DK triggers {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_packet_observer}{I\+Packet\+Observer}}} callbacks registered by for voice or video packet transmission, you can call this method to process the packets, such as encryption and decryption.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item The size of the packet sent to the network after processing should not exceed 1200 bytes, otherwise, the S\+DK may fail to send the packet.
\item Ensure that both receivers and senders call this method; otherwise, you may meet undefined behaviors such as no voice and black screen.
\item When you use the Media Push or recording functions, Agora doesn\textquotesingle{}t recommend calling this method.
\item Call this method before joining a channel.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em observer} & {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_packet_observer}{I\+Packet\+Observer}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ad5ea5f0dfd8117f38d9c4b12fe01fece}\label{classagora_1_1rtc_1_1_i_rtc_engine_ad5ea5f0dfd8117f38d9c4b12fe01fece}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableEncryption@{enableEncryption}}
\index{enableEncryption@{enableEncryption}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableEncryption()}{enableEncryption()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Encryption (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_encryption_config}{Encryption\+Config}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables or disables the built-\/in encryption. 

After the user leaves the channel, the S\+DK automatically disables the built-\/in encryption. To enable the built-\/in encryption, call this method before the user joins the channel again. Applicable scenarios\+: Scenarios with higher security requirements. Call timing\+: Call this method before joining a channel.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item All users within the same channel must set the same encryption configurations when calling this method.
\item If you enable the built-\/in encryption, you cannot use the Media Push function.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable built-\/in encryption\+:
\begin{DoxyItemize}
\item true\+: Enable the built-\/in encryption.
\item false\+: (Default) Disable the built-\/in encryption. 
\end{DoxyItemize}\\
\hline
{\em config} & Built-\/in encryption configurations. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_encryption_config}{Encryption\+Config}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: An invalid parameter is used. Set the parameter with a valid value.
\item -\/4\+: The built-\/in encryption mode is incorrect or the S\+DK fails to load the external encryption library. Check the enumeration or reload the external encryption library.
\item -\/7\+: The S\+DK is not initialized. Initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} instance before calling this method. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a5a3f0168ca6e2e298e4677e9a8b9550a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a5a3f0168ca6e2e298e4677e9a8b9550a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!createDataStream@{createDataStream}}
\index{createDataStream@{createDataStream}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{createDataStream()}{createDataStream()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::create\+Data\+Stream (\begin{DoxyParamCaption}\item[{int $\ast$}]{stream\+Id,  }\item[{bool}]{reliable,  }\item[{bool}]{ordered }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Creates a data stream. 

You can call this method to create a data stream and improve the reliability and ordering of data transmission. Call timing\+: You can call this method either before or after joining a channel. Related callbacks\+: After setting {\ttfamily reliable} to {\ttfamily true}, if the recipient does not receive the data within five seconds, the S\+DK triggers the {\ttfamily on\+Stream\+Message\+Error} callback and returns an error code.

\begin{DoxyNote}{Note}
Each user can create up to five data streams during the lifecycle of {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}}. The data stream will be destroyed when leaving the channel, and the data stream needs to be recreated if needed. If you need a more comprehensive solution for low-\/latency, high-\/concurrency, and scalable real-\/time messaging and status synchronization, it is recommended to use {\ttfamily Signaling}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em stream\+Id} & An output parameter; the ID of the data stream created. \\
\hline
{\em reliable} & Sets whether the recipients are guaranteed to receive the data stream within five seconds\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: The recipients receive the data from the sender within five seconds. If the recipient does not receive the data within five seconds, the S\+DK triggers the {\ttfamily on\+Stream\+Message\+Error} callback and returns an error code.
\item {\ttfamily false}\+: There is no guarantee that the recipients receive the data stream within five seconds and no error message is reported for any delay or missing data stream. Attention\+: Please ensure that {\ttfamily reliable} and {\ttfamily ordered} are either both set to{\ttfamily true} or both set to {\ttfamily false}. 
\end{DoxyItemize}\\
\hline
{\em ordered} & Sets whether the recipients receive the data stream in the sent order\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: The recipients receive the data in the sent order.
\item {\ttfamily false}\+: The recipients do not receive the data in the sent order.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: The data stream is successfully created.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_acf920f7dc761e2d7b7e28006c74238b7}\label{classagora_1_1rtc_1_1_i_rtc_engine_acf920f7dc761e2d7b7e28006c74238b7}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!createDataStream@{createDataStream}}
\index{createDataStream@{createDataStream}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{createDataStream()}{createDataStream()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::create\+Data\+Stream (\begin{DoxyParamCaption}\item[{int $\ast$}]{stream\+Id,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_data_stream_config}{Data\+Stream\+Config}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Creates a data stream. 

Compared to {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a5a3f0168ca6e2e298e4677e9a8b9550a}{create\+Data\+Stream(int$\ast$ stream\+Id, bool reliable, bool ordered)}}}, this method does not guarantee the reliability of data transmission. If a data packet is not received five seconds after it was sent, the S\+DK directly discards the data. Call timing\+: You can call this method either before or after joining a channel.

\begin{DoxyNote}{Note}
Each user can create up to five data streams during the lifecycle of {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}}. The data stream will be destroyed when leaving the channel, and the data stream needs to be recreated if needed. If you need a more comprehensive solution for low-\/latency, high-\/concurrency, and scalable real-\/time messaging and status synchronization, it is recommended to use {\ttfamily Signaling}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em stream\+Id} & An output parameter; the ID of the data stream created. \\
\hline
{\em config} & The configurations for the data stream. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_data_stream_config}{Data\+Stream\+Config}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: The data stream is successfully created.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7006214f7ca3c08d83cc0a4ebcb9febc}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7006214f7ca3c08d83cc0a4ebcb9febc}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!sendStreamMessage@{sendStreamMessage}}
\index{sendStreamMessage@{sendStreamMessage}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{sendStreamMessage()}{sendStreamMessage()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::send\+Stream\+Message (\begin{DoxyParamCaption}\item[{int}]{stream\+Id,  }\item[{const char $\ast$}]{data,  }\item[{size\+\_\+t}]{length }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sends data stream messages. 

After calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acf920f7dc761e2d7b7e28006c74238b7}{create\+Data\+Stream(int$\ast$ stream\+Id, const Data\+Stream\+Config\& config)}}}, you can call this method to send data stream messages to all users in the channel. The S\+DK has the following restrictions on this method\+:
\begin{DoxyItemize}
\item Each client within the channel can have up to 5 data channels simultaneously, with a total shared packet bitrate limit of 30 K\+B/s for all data channels.
\item Each data channel can send up to 60 packets per second, with each packet being a maximum of 1 KB. A successful method call triggers the {\ttfamily on\+Stream\+Message} callback on the remote client, from which the remote user gets the stream message. A failed method call triggers the {\ttfamily on\+Stream\+Message\+Error} callback on the remote client.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
If you need a more comprehensive solution for low-\/latency, high-\/concurrency, and scalable real-\/time messaging and status synchronization, it is recommended to use {\ttfamily Signaling}.
\begin{DoxyItemize}
\item This method needs to be called after {\ttfamily create\+Data\+Stream(int$\ast$ stream\+Id, const \mbox{\hyperlink{structagora_1_1rtc_1_1_data_stream_config}{Data\+Stream\+Config}}\& config)} and joining the channel.
\item This method applies to broadcasters only.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em stream\+Id} & The data stream ID. You can get the data stream ID by calling {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_acf920f7dc761e2d7b7e28006c74238b7}{create\+Data\+Stream(int$\ast$ stream\+Id, const Data\+Stream\+Config\& config)}}}\\
\hline
{\em data} & The message to be sent. \\
\hline
{\em length} & The length of the data.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_abec7a493c27c4c0474dac59a23808879}\label{classagora_1_1rtc_1_1_i_rtc_engine_abec7a493c27c4c0474dac59a23808879}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!sendRdtMessage@{sendRdtMessage}}
\index{sendRdtMessage@{sendRdtMessage}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{sendRdtMessage()}{sendRdtMessage()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::send\+Rdt\+Message (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{Rdt\+Stream\+Type}]{type,  }\item[{const char $\ast$}]{data,  }\item[{size\+\_\+t}]{length }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Send Reliable message to remote uid in channel. 

@technical preview


\begin{DoxyParams}{Parameters}
{\em uid} & remote user id. \\
\hline
{\em type} & Reliable Data Transmission tunnel message type. See Rdt\+Stream\+Type \\
\hline
{\em data} & The pointer to the sent data. \\
\hline
{\em length} & The length of the sent data. \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8eac7c2de06ec8b37b187d4e66ef68fe}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8eac7c2de06ec8b37b187d4e66ef68fe}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!sendMediaControlMessage@{sendMediaControlMessage}}
\index{sendMediaControlMessage@{sendMediaControlMessage}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{sendMediaControlMessage()}{sendMediaControlMessage()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::send\+Media\+Control\+Message (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{const char $\ast$}]{data,  }\item[{size\+\_\+t}]{length }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Send media control message. 

@technical preview


\begin{DoxyParams}{Parameters}
{\em uid} & Remote user id. In particular, if the uid is set to 0, it means broadcasting the message to the entire channel. \\
\hline
{\em data} & The pointer to the sent data. \\
\hline
{\em length} & The length of the sent data, max 1024. \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a4caf3477d91c3aa0ea8b178948cad8d5}\label{classagora_1_1rtc_1_1_i_rtc_engine_a4caf3477d91c3aa0ea8b178948cad8d5}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!addVideoWatermark@{addVideoWatermark}}
\index{addVideoWatermark@{addVideoWatermark}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{addVideoWatermark()}{addVideoWatermark()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::add\+Video\+Watermark (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_image}{Rtc\+Image}} \&}]{watermark }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adds a watermark image to the local video. 

This method adds a P\+NG watermark image to the local video stream in a live streaming session. Once the watermark image is added, all the users in the channel (C\+DN audience included) and the video capturing device can see and capture it. If you only want to add a watermark to the C\+DN live streaming, see {\ttfamily start\+Rtmp\+Stream\+With\+Transcoding}.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item The U\+RL descriptions are different for the local video and C\+DN live streaming\+: In a local video stream, U\+RL refers to the absolute path of the added watermark image file in the local video stream. In a C\+DN live stream, U\+RL refers to the U\+RL address of the added watermark image in the C\+DN live streaming.
\item The source file of the watermark image must be in the P\+NG file format. If the width and height of the P\+NG file differ from your settings in this method, the P\+NG file will be cropped to conform to your settings.
\item The Agora S\+DK supports adding only one watermark image onto a local video or C\+DN live stream. The newly added watermark image replaces the previous one.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em watermark} & The watermark image to be added to the local live streaming\+: {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_image}{Rtc\+Image}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a36e51346ec3bd5a7370d7c70d58d9394}\label{classagora_1_1rtc_1_1_i_rtc_engine_a36e51346ec3bd5a7370d7c70d58d9394}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!addVideoWatermark@{addVideoWatermark}}
\index{addVideoWatermark@{addVideoWatermark}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{addVideoWatermark()}{addVideoWatermark()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::add\+Video\+Watermark (\begin{DoxyParamCaption}\item[{const char $\ast$}]{watermark\+Url,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_watermark_options}{Watermark\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adds a watermark image to the local video. 

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000046}{Deprecated}}]Use add\+Video\+Watermark\+Ex(const \mbox{\hyperlink{structagora_1_1rtc_1_1_watermark_config}{Watermark\+Config}}\& config, const \mbox{\hyperlink{structagora_1_1rtc_1_1_rtc_connection}{Rtc\+Connection}}\& connection) instead.\end{DoxyRefDesc}


This method adds a P\+NG watermark image to the local video in the live streaming. Once the watermark image is added, all the audience in the channel (C\+DN audience included), and the capturing device can see and capture it. The Agora S\+DK supports adding only one watermark image onto a live video stream. The newly added watermark image replaces the previous one. The watermark coordinates are dependent on the settings in the {\ttfamily set\+Video\+Encoder\+Configuration} method\+:
\begin{DoxyItemize}
\item If the orientation mode of the encoding video ( {\ttfamily O\+R\+I\+E\+N\+T\+A\+T\+I\+O\+N\+\_\+\+M\+O\+DE} ) is fixed landscape mode or the adaptive landscape mode, the watermark uses the landscape orientation.
\item If the orientation mode of the encoding video ( {\ttfamily O\+R\+I\+E\+N\+T\+A\+T\+I\+O\+N\+\_\+\+M\+O\+DE} ) is fixed portrait mode or the adaptive portrait mode, the watermark uses the portrait orientation.
\item When setting the watermark position, the region must be less than the dimensions set in the {\ttfamily set\+Video\+Encoder\+Configuration} method; otherwise, the watermark image will be cropped. You can control the visibility of the watermark during preview by setting the {\ttfamily visible\+In\+Preview} parameter when calling this method. However, whether it ultimately takes effect also depends on the position parameter you set when calling {\ttfamily setup\+Local\+Video} (the {\ttfamily position} of the video frame in the video link). Refer to the table below for details.$\vert$ Observation position $\vert$ visible\+In\+Preview value $\vert$ Watermark visibility $\vert$ $\vert$ -\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/--- $\vert$ -\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/--- $\vert$ -\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/--- $\vert$ $\vert$ (Default) {\ttfamily P\+O\+S\+I\+T\+I\+O\+N\+\_\+\+P\+O\+S\+T\+\_\+\+C\+A\+P\+T\+U\+R\+ER} $\vert$ {\ttfamily true} $\vert$ Yes $\vert$ $\vert$ $\vert$ {\ttfamily false} $\vert$ No $\vert$ $\vert$ {\ttfamily P\+O\+S\+I\+T\+I\+O\+N\+\_\+\+P\+R\+E\+\_\+\+E\+N\+C\+O\+D\+ER} $\vert$ {\ttfamily true} $\vert$ Yes $\vert$ $\vert$ $\vert$ {\ttfamily false} $\vert$ Yes $\vert$
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Ensure that calling this method after {\ttfamily enable\+Video}.
\item If you only want to add a watermark to the media push, you can call this method or the {\ttfamily start\+Rtmp\+Stream\+With\+Transcoding} method.
\item This method supports adding a watermark image in the P\+NG file format only. Supported pixel formats of the P\+NG image are R\+G\+BA, R\+GB, Palette, Gray, and Alpha\+\_\+gray.
\item If the dimensions of the P\+NG image differ from your settings in this method, the image will be cropped or zoomed to conform to your settings.
\item If you have enabled the mirror mode for the local video, the watermark on the local video is also mirrored. To avoid mirroring the watermark, Agora recommends that you do not use the mirror and watermark functions for the local video at the same time. You can implement the watermark function in your application layer.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em watermark\+Url} & The local file path of the watermark image to be added. This method supports adding a watermark image from the local absolute or relative file path. \\
\hline
{\em options} & The options of the watermark image to be added. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_watermark_options}{Watermark\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a5cde5446ecdd10c5ee5c8926517d414d}\label{classagora_1_1rtc_1_1_i_rtc_engine_a5cde5446ecdd10c5ee5c8926517d414d}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!addVideoWatermark@{addVideoWatermark}}
\index{addVideoWatermark@{addVideoWatermark}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{addVideoWatermark()}{addVideoWatermark()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::add\+Video\+Watermark (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_watermark_config}{Watermark\+Config}} \&}]{configs }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adds a watermark image to the local video. 

\begin{DoxySince}{Since}
4.\+6.\+0
\end{DoxySince}
You can use this method to overlay a watermark image on the local video stream, and configure the watermark\textquotesingle{}s position, size, and visibility in the preview using {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_watermark_config}{Watermark\+Config}}}.


\begin{DoxyParams}{Parameters}
{\em configs} & Watermark configuration. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_watermark_config}{Watermark\+Config}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac9404c8b56e3fa20b94cbe5dcd489e5e}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac9404c8b56e3fa20b94cbe5dcd489e5e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!removeVideoWatermark@{removeVideoWatermark}}
\index{removeVideoWatermark@{removeVideoWatermark}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{removeVideoWatermark()}{removeVideoWatermark()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::remove\+Video\+Watermark (\begin{DoxyParamCaption}\item[{const char $\ast$}]{id }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Removes the watermark image from the local video. 

\begin{DoxySince}{Since}
4.\+6.\+0
\end{DoxySince}
This method removes a previously added watermark image from the local video stream using the specified unique ID.


\begin{DoxyParams}{Parameters}
{\em id} & The ID of the watermark to be removed. This value should match the ID used when the watermark was added.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aea42a1ea8b83bc807f68526945f40ec6}\label{classagora_1_1rtc_1_1_i_rtc_engine_aea42a1ea8b83bc807f68526945f40ec6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!clearVideoWatermarks@{clearVideoWatermarks}}
\index{clearVideoWatermarks@{clearVideoWatermarks}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{clearVideoWatermarks()}{clearVideoWatermarks()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::clear\+Video\+Watermarks (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Removes the watermark image from the video stream. 

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7729c859bb2ae7f565ab7a57cf7b6158}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7729c859bb2ae7f565ab7a57cf7b6158}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!pauseAudio@{pauseAudio}}
\index{pauseAudio@{pauseAudio}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{pauseAudio()}{pauseAudio()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::pause\+Audio (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000047}{Deprecated}}]Use \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a1929f01411e983ed776275fe8e8ad45e}{disable\+Audio()}} instead.\end{DoxyRefDesc}


Disables the audio function in the channel.

\begin{DoxyReturn}{Returns}
int
\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a566a23231286f5286fdb137966093e9f}\label{classagora_1_1rtc_1_1_i_rtc_engine_a566a23231286f5286fdb137966093e9f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!resumeAudio@{resumeAudio}}
\index{resumeAudio@{resumeAudio}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{resumeAudio()}{resumeAudio()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::resume\+Audio (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000048}{Deprecated}}]Use \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a996401c7ba33c6ec59527c5d109f548f}{enable\+Audio()}} instead.\end{DoxyRefDesc}


Resumes the audio function in the channel.

\begin{DoxyReturn}{Returns}
int
\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a5ac70d12ca9b204410c02a9cc1159606}\label{classagora_1_1rtc_1_1_i_rtc_engine_a5ac70d12ca9b204410c02a9cc1159606}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableWebSdkInteroperability@{enableWebSdkInteroperability}}
\index{enableWebSdkInteroperability@{enableWebSdkInteroperability}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableWebSdkInteroperability()}{enableWebSdkInteroperability()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Web\+Sdk\+Interoperability (\begin{DoxyParamCaption}\item[{bool}]{enabled }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables interoperability with the Agora Web S\+DK (applicable only in the live streaming. 

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000049}{Deprecated}}]The Agora NG S\+DK enables the interoperablity with the Web S\+DK. scenarios).\end{DoxyRefDesc}


You can call this method to enable or disable interoperability with the Agora Web S\+DK. If a channel has Web S\+DK users, ensure that you call this method, or the video of the Native user will be a black screen for the Web user. This method is only applicable in live streaming scenarios, and interoperability is enabled by default in communication scenarios.


\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable interoperability\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable interoperability.
\item {\ttfamily false}\+: (Default) Disable interoperability.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_afb6b404d722dd664a39af3919e085213}\label{classagora_1_1rtc_1_1_i_rtc_engine_afb6b404d722dd664a39af3919e085213}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!sendCustomReportMessage@{sendCustomReportMessage}}
\index{sendCustomReportMessage@{sendCustomReportMessage}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{sendCustomReportMessage()}{sendCustomReportMessage()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::send\+Custom\+Report\+Message (\begin{DoxyParamCaption}\item[{const char $\ast$}]{id,  }\item[{const char $\ast$}]{category,  }\item[{const char $\ast$}]{event,  }\item[{const char $\ast$}]{label,  }\item[{int}]{value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Reports customized messages. 

Agora supports reporting and analyzing customized messages. This function is in the beta stage with a free trial. The ability provided in its beta test version is reporting a maximum of 10 message pieces within 6 seconds, with each message piece not exceeding 256 bytes and each string not exceeding 100 bytes. To try out this function, contact {\ttfamily support@agora.\+io} and discuss the format of customized messages with us. \mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a84dbf06de1d769b63200d7ec0289cca0}\label{classagora_1_1rtc_1_1_i_rtc_engine_a84dbf06de1d769b63200d7ec0289cca0}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!registerMediaMetadataObserver@{registerMediaMetadataObserver}}
\index{registerMediaMetadataObserver@{registerMediaMetadataObserver}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{registerMediaMetadataObserver()}{registerMediaMetadataObserver()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::register\+Media\+Metadata\+Observer (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer}{I\+Metadata\+Observer}} $\ast$}]{observer,  }\item[{\mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer_a50ad8779d161456fc709d947b8c7c544}{I\+Metadata\+Observer\+::\+M\+E\+T\+A\+D\+A\+T\+A\+\_\+\+T\+Y\+PE}}}]{type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Registers the metadata observer. 

You need to implement the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer}{I\+Metadata\+Observer}}} class and specify the metadata type in this method. This method enables you to add synchronized metadata in the video stream for more diversified live interactive streaming, such as sending shopping links, digital coupons, and online quizzes. A successful call of this method triggers the {\ttfamily get\+Max\+Metadata\+Size} callback. \begin{DoxyNote}{Note}
If your receiving-\/side logic requires metadata to stay synchronized with the current decoded frame, and you send external video frames to the S\+DK while also implementing the video frame observer, prefer attaching metadata to {\ttfamily push\+Video\+Frame} and reading it back from {\ttfamily on\+Render\+Video\+Frame}, instead of relying on this observer callback.

Call this method before {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em observer} & The metadata observer. See {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer}{I\+Metadata\+Observer}}}. \\
\hline
{\em type} & The metadata type. The S\+DK currently only supports {\ttfamily V\+I\+D\+E\+O\+\_\+\+M\+E\+T\+A\+D\+A\+TA}. See {\ttfamily M\+E\+T\+A\+D\+A\+T\+A\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ace712f59f6fb50d3f9c5f89cffb5e49e}\label{classagora_1_1rtc_1_1_i_rtc_engine_ace712f59f6fb50d3f9c5f89cffb5e49e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!unregisterMediaMetadataObserver@{unregisterMediaMetadataObserver}}
\index{unregisterMediaMetadataObserver@{unregisterMediaMetadataObserver}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{unregisterMediaMetadataObserver()}{unregisterMediaMetadataObserver()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::unregister\+Media\+Metadata\+Observer (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer}{I\+Metadata\+Observer}} $\ast$}]{observer,  }\item[{\mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer_a50ad8779d161456fc709d947b8c7c544}{I\+Metadata\+Observer\+::\+M\+E\+T\+A\+D\+A\+T\+A\+\_\+\+T\+Y\+PE}}}]{type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Unregisters the specified metadata observer. 


\begin{DoxyParams}{Parameters}
{\em observer} & The metadata observer. See {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_metadata_observer}{I\+Metadata\+Observer}}}. \\
\hline
{\em type} & The metadata type. The S\+DK currently only supports {\ttfamily V\+I\+D\+E\+O\+\_\+\+M\+E\+T\+A\+D\+A\+TA}. See {\ttfamily M\+E\+T\+A\+D\+A\+T\+A\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_af1e558f8fe811ca501f3c04234053a03}\label{classagora_1_1rtc_1_1_i_rtc_engine_af1e558f8fe811ca501f3c04234053a03}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startAudioFrameDump@{startAudioFrameDump}}
\index{startAudioFrameDump@{startAudioFrameDump}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startAudioFrameDump()}{startAudioFrameDump()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Audio\+Frame\+Dump (\begin{DoxyParamCaption}\item[{const char $\ast$}]{channel\+\_\+id,  }\item[{uid\+\_\+t}]{uid,  }\item[{const char $\ast$}]{location,  }\item[{const char $\ast$}]{uuid,  }\item[{const char $\ast$}]{passwd,  }\item[{long}]{duration\+\_\+ms,  }\item[{bool}]{auto\+\_\+upload }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Start audio frame dump.

\mbox{\hyperlink{classagora_1_1_optional}{Optional}} {\ttfamily location} is\+: \char`\"{}pre\+\_\+apm\+\_\+proc\char`\"{}, \char`\"{}apm\char`\"{}, \char`\"{}pre\+\_\+send\+\_\+proc\char`\"{}, \char`\"{}filter\char`\"{}, \char`\"{}enc\char`\"{}, \char`\"{}tx\+\_\+mixer\char`\"{}, \char`\"{}at\+\_\+record\char`\"{}, \char`\"{}atw\+\_\+record\char`\"{} for audio sending. \char`\"{}dec\char`\"{}, \char`\"{}mixed\char`\"{}, \char`\"{}play\char`\"{}, \char`\"{}rx\+\_\+mixer\char`\"{}, \char`\"{}playback\+\_\+mixer\char`\"{}, \char`\"{}pcm\+\_\+source\+\_\+playback\+\_\+mixer\char`\"{}, \char`\"{}pre\+\_\+play\+\_\+proc\char`\"{}, \char`\"{}at\+\_\+playout\char`\"{}, \char`\"{}atw\+\_\+playout\char`\"{} for audio receiving. \mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a273c143c4df3e74b9aea29d4027b2e9c}\label{classagora_1_1rtc_1_1_i_rtc_engine_a273c143c4df3e74b9aea29d4027b2e9c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopAudioFrameDump@{stopAudioFrameDump}}
\index{stopAudioFrameDump@{stopAudioFrameDump}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopAudioFrameDump()}{stopAudioFrameDump()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Audio\+Frame\+Dump (\begin{DoxyParamCaption}\item[{const char $\ast$}]{channel\+\_\+id,  }\item[{uid\+\_\+t}]{uid,  }\item[{const char $\ast$}]{location }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Stops the audio frame dump. \mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2a447c3a89480e5bca78af01d3188710}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2a447c3a89480e5bca78af01d3188710}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAINSMode@{setAINSMode}}
\index{setAINSMode@{setAINSMode}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAINSMode()}{setAINSMode()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+A\+I\+N\+S\+Mode (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{A\+U\+D\+I\+O\+\_\+\+A\+I\+N\+S\+\_\+\+M\+O\+DE}]{mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets whether to enable the AI ​​noise suppression function and set the noise suppression mode. 

You can call this method to enable AI noise suppression function. Once enabled, the S\+DK automatically detects and reduces stationary and non-\/stationary noise from your audio on the premise of ensuring the quality of human voice. Stationary noise refers to noise signal with constant average statistical properties and negligibly small fluctuations of level within the period of observation. Common sources of stationary noises are\+:
\begin{DoxyItemize}
\item Television;
\item Air conditioner;
\item Machinery, etc. Non-\/stationary noise refers to noise signal with huge fluctuations of level within the period of observation; common sources of non-\/stationary noises are\+:
\item Thunder;
\item Explosion;
\item Cracking, etc. Applicable scenarios\+: In scenarios such as co-\/streaming, online education and video meeting, this function can detect and reduce background noises to improve experience. Call timing\+: You can call this method either before or after joining a channel.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method relies on the AI noise suppression dynamic library {\ttfamily libagora\+\_\+ai\+\_\+noise\+\_\+suppression\+\_\+extension.\+dll}. If the dynamic library is deleted, the function cannot be enabled.
\item Agora does not recommend enabling this function on devices running Android 6.\+0 and below.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enable the AI noise suppression function\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enable the AI noise suppression.
\item {\ttfamily false}\+: (Default) Disable the AI noise suppression. 
\end{DoxyItemize}\\
\hline
{\em mode} & The AI noise suppression modes. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+A\+I\+N\+S\+\_\+\+M\+O\+DE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a0d44b74ced4005ee86353c13186f870d}\label{classagora_1_1rtc_1_1_i_rtc_engine_a0d44b74ced4005ee86353c13186f870d}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!registerLocalUserAccount@{registerLocalUserAccount}}
\index{registerLocalUserAccount@{registerLocalUserAccount}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{registerLocalUserAccount()}{registerLocalUserAccount()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::register\+Local\+User\+Account (\begin{DoxyParamCaption}\item[{const char $\ast$}]{app\+Id,  }\item[{const char $\ast$}]{user\+Account }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Registers a user account. 

Once registered, the user account can be used to identify the local user when the user joins the channel. After the registration is successful, the user account can identify the identity of the local user, and the user can use it to join the channel. This method is optional. If you want to join a channel using a user account, you can choose one of the following methods\+:
\begin{DoxyItemize}
\item Call the {\ttfamily register\+Local\+User\+Account} method to register a user account, and then call the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a14f8c308c6c57c55653552b939a8527a}{join\+Channel\+With\+User\+Account(const char$\ast$ token, const char$\ast$ channel\+Id, const char$\ast$ user\+Account)}}} or {\ttfamily join\+Channel\+With\+User\+Account(const char$\ast$ token, const char$\ast$ channel\+Id, const char$\ast$ user\+Account, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} method to join a channel, which can shorten the time it takes to enter the channel.
\item Call the {\ttfamily join\+Channel\+With\+User\+Account(const char$\ast$ token, const char$\ast$ channel\+Id, const char$\ast$ user\+Account)} or {\ttfamily join\+Channel\+With\+User\+Account(const char$\ast$ token, const char$\ast$ channel\+Id, const char$\ast$ user\+Account, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} method to join a channel. Related callbacks\+: After successfully calling this method, the {\ttfamily on\+Local\+User\+Registered} callback will be triggered on the local client to report the local user\textquotesingle{}s U\+ID and user account.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Starting from v4.\+6.\+0, the S\+DK will no longer automatically map Int U\+ID to the String {\ttfamily user\+Account} used when registering a User Account. If you want to join a channel with the original String {\ttfamily user\+Account} used during registration, call the {\ttfamily join\+Channel\+With\+User\+Account(const char$\ast$ token, const char$\ast$ channel\+Id, const char$\ast$ user\+Account, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} method to join the channel, instead of calling {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} and pass in the Int U\+ID obtained through this method
\item Ensure that the {\ttfamily user\+Account} is unique in the channel.
\item To ensure smooth communication, use the same parameter type to identify the user. For example, if a user joins the channel with a U\+ID, then ensure all the other users use the U\+ID too. The same applies to the user account. If a user joins the channel with the Agora Web S\+DK, ensure that the ID of the user is set to the same parameter type.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em app\+Id} & The App ID of your project on Agora Console. \\
\hline
{\em user\+Account} & The user account. This parameter is used to identify the user in the channel for real-\/time audio and video engagement. You need to set and manage user accounts yourself and ensure that each user account in the same channel is unique. The maximum length of this parameter is 255 bytes. Ensure that you set this parameter and do not set it as N\+U\+LL. Supported characters are as follow(89 in total)\+:
\begin{DoxyItemize}
\item The 26 lowercase English letters\+: a to z.
\item The 26 uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item Space
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{}
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a14f8c308c6c57c55653552b939a8527a}\label{classagora_1_1rtc_1_1_i_rtc_engine_a14f8c308c6c57c55653552b939a8527a}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!joinChannelWithUserAccount@{joinChannelWithUserAccount}}
\index{joinChannelWithUserAccount@{joinChannelWithUserAccount}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{joinChannelWithUserAccount()}{joinChannelWithUserAccount()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::join\+Channel\+With\+User\+Account (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token,  }\item[{const char $\ast$}]{channel\+Id,  }\item[{const char $\ast$}]{user\+Account }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Joins a channel with a User Account and Token. 

Before calling this method, if you have not called {\ttfamily register\+Local\+User\+Account} to register a user account, when you call this method to join a channel, the S\+DK automatically creates a user account for you. Calling the {\ttfamily register\+Local\+User\+Account} method to register a user account, and then calling this method to join a channel can shorten the time it takes to enter the channel. Once a user joins the channel, the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and billings. To stop subscribing to a specified stream or all remote streams, call the corresponding {\ttfamily mute} methods. Call timing\+: Call this method after {\ttfamily initialize}. Related callbacks\+: After the user successfully joins the channel, the S\+DK triggers the following callbacks\+:
\begin{DoxyItemize}
\item The local client\+: {\ttfamily on\+Local\+User\+Registered}, {\ttfamily on\+Join\+Channel\+Success} and {\ttfamily on\+Connection\+State\+Changed} callbacks.
\item The remote client\+: The {\ttfamily on\+User\+Joined} and {\ttfamily on\+User\+Info\+Updated} callbacks if a user joins the channel in the C\+O\+M\+M\+U\+N\+I\+C\+A\+T\+I\+ON profile, or if a host joins the channel in the L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG profile.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method only supports users joining one channel at a time.
\item Users with different App I\+Ds cannot call each other.
\item Before joining a channel, ensure that the App ID you use to generate a token is the same as that you pass in the {\ttfamily initialize} method; otherwise, you may fail to join the channel with the token. To ensure smooth communication, use the same parameter type to identify the user. For example, if a user joins the channel with a U\+ID, then ensure all the other users use the U\+ID too. The same applies to the user account. If a user joins the channel with the Agora Web S\+DK, ensure that the ID of the user is set to the same parameter type.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em token} & The token generated on your server for authentication. See .Note\+:
\begin{DoxyItemize}
\item (Recommended) If your project has enabled the security mode (using A\+PP ID and Token for authentication), this parameter is required.
\item If you have only enabled the testing mode (using A\+PP ID for authentication), this parameter is optional. You will automatically exit the channel 24 hours after successfully joining in.
\item If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don\textquotesingle{}t need to apply for a new token every time joining a channel. See {\ttfamily Secure authentication with tokens}. 
\end{DoxyItemize}\\
\hline
{\em channel\+Id} & The channel name. This parameter signifies the channel in which users engage in real-\/time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total)\+:
\begin{DoxyItemize}
\item All lowercase English letters\+: a to z.
\item All uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em user\+Account} & The user account. This parameter is used to identify the user in the channel for real-\/time audio and video engagement. You need to set and manage user accounts yourself and ensure that each user account in the same channel is unique. The maximum length of this parameter is 255 bytes. Ensure that you set this parameter and do not set it as N\+U\+LL. Supported characters are as follows(89 in total)\+:
\begin{DoxyItemize}
\item The 26 lowercase English letters\+: a to z.
\item The 26 uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item Space
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{}
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid. For example, the token is invalid, the {\ttfamily uid} parameter is not set to an integer, or the value of a member in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} is invalid. You need to pass in a valid parameter and join the channel again.
\item -\/3\+: Fails to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object. You need to reinitialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item -\/8\+: The internal state of the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object is wrong. The typical cause is that after calling {\ttfamily start\+Echo\+Test} to start a call loop test, you call this method to join the channel without calling {\ttfamily stop\+Echo\+Test} to stop the test. You need to call {\ttfamily stop\+Echo\+Test} before calling this method.
\item -\/17\+: The request to join the channel is rejected. The typical cause is that the user is already in the channel. Agora recommends that you use the {\ttfamily on\+Connection\+State\+Changed} callback to see whether the user is in the channel. Do not call this method to join the channel unless you receive the {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+ED} (1) state.
\item -\/102\+: The channel name is invalid. You need to pass in a valid channel name in {\ttfamily channel\+Id} to rejoin the channel.
\item -\/121\+: The user ID is invalid. You need to pass in a valid user ID in {\ttfamily uid} to rejoin the channel. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac503f610f1d6bdfa1def75a94646b489}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac503f610f1d6bdfa1def75a94646b489}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!joinChannelWithUserAccount@{joinChannelWithUserAccount}}
\index{joinChannelWithUserAccount@{joinChannelWithUserAccount}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{joinChannelWithUserAccount()}{joinChannelWithUserAccount()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::join\+Channel\+With\+User\+Account (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token,  }\item[{const char $\ast$}]{channel\+Id,  }\item[{const char $\ast$}]{user\+Account,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Join a channel using a user account and token, and set the media options. 

Before calling this method, if you have not called {\ttfamily register\+Local\+User\+Account} to register a user account, when you call this method to join a channel, the S\+DK automatically creates a user account for you. Calling the {\ttfamily register\+Local\+User\+Account} method to register a user account, and then calling this method to join a channel can shorten the time it takes to enter the channel. Compared to {\ttfamily join\+Channel\+With\+User\+Account(const char$\ast$ token, const char$\ast$ channel\+Id, const char$\ast$ user\+Account)}, this method has the {\ttfamily options} parameter which is used to set media options, such as whether to publish audio and video streams within a channel. By default, the user subscribes to the audio and video streams of all the other users in the channel, giving rise to usage and {\bfseries{billings}}. To stop subscribing to other streams, set the {\ttfamily options} parameter or call the corresponding {\ttfamily mute} methods. Call timing\+: Call this method after {\ttfamily initialize}. Related callbacks\+: After the user successfully joins the channel, the S\+DK triggers the following callbacks\+:
\begin{DoxyItemize}
\item The local client\+: {\ttfamily on\+Local\+User\+Registered}, {\ttfamily on\+Join\+Channel\+Success} and {\ttfamily on\+Connection\+State\+Changed} callbacks.
\item The remote client\+: The {\ttfamily on\+User\+Joined} and {\ttfamily on\+User\+Info\+Updated} callbacks if a user joins the channel in the C\+O\+M\+M\+U\+N\+I\+C\+A\+T\+I\+ON profile, or if a host joins the channel in the L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG profile.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method only supports users joining one channel at a time.
\item Users with different App I\+Ds cannot call each other.
\item Before joining a channel, ensure that the App ID you use to generate a token is the same as that you pass in the {\ttfamily initialize} method; otherwise, you may fail to join the channel with the token. To ensure smooth communication, use the same parameter type to identify the user. For example, if a user joins the channel with a U\+ID, then ensure all the other users use the U\+ID too. The same applies to the user account. If a user joins the channel with the Agora Web S\+DK, ensure that the ID of the user is set to the same parameter type.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em token} & The token generated on your server for authentication. See .Note\+:
\begin{DoxyItemize}
\item (Recommended) If your project has enabled the security mode (using A\+PP ID and Token for authentication), this parameter is required.
\item If you have only enabled the testing mode (using A\+PP ID for authentication), this parameter is optional. You will automatically exit the channel 24 hours after successfully joining in.
\item If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don\textquotesingle{}t need to apply for a new token every time joining a channel. See {\ttfamily Secure authentication with tokens}. 
\end{DoxyItemize}\\
\hline
{\em channel\+Id} & The channel name. This parameter signifies the channel in which users engage in real-\/time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total)\+:
\begin{DoxyItemize}
\item All lowercase English letters\+: a to z.
\item All uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em user\+Account} & The user account. This parameter is used to identify the user in the channel for real-\/time audio and video engagement. You need to set and manage user accounts yourself and ensure that each user account in the same channel is unique. The maximum length of this parameter is 255 bytes. Ensure that you set this parameter and do not set it as N\+U\+LL. Supported characters are as follows(89 in total)\+:
\begin{DoxyItemize}
\item The 26 lowercase English letters\+: a to z.
\item The 26 uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item Space
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em options} & The channel media options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid. For example, the token is invalid, the {\ttfamily uid} parameter is not set to an integer, or the value of a member in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} is invalid. You need to pass in a valid parameter and join the channel again.
\item -\/3\+: Fails to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object. You need to reinitialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item -\/8\+: The internal state of the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object is wrong. The typical cause is that after calling {\ttfamily start\+Echo\+Test} to start a call loop test, you call this method to join the channel without calling {\ttfamily stop\+Echo\+Test} to stop the test. You need to call {\ttfamily stop\+Echo\+Test} before calling this method.
\item -\/17\+: The request to join the channel is rejected. The typical cause is that the user is already in the channel. Agora recommends that you use the {\ttfamily on\+Connection\+State\+Changed} callback to see whether the user is in the channel. Do not call this method to join the channel unless you receive the {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+ED} (1) state.
\item -\/102\+: The channel name is invalid. You need to pass in a valid channel name in {\ttfamily channel\+Id} to rejoin the channel.
\item -\/121\+: The user ID is invalid. You need to pass in a valid user ID in {\ttfamily uid} to rejoin the channel. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a124148443b2438da668fb683e96a9f41}\label{classagora_1_1rtc_1_1_i_rtc_engine_a124148443b2438da668fb683e96a9f41}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!joinChannelWithUserAccountEx@{joinChannelWithUserAccountEx}}
\index{joinChannelWithUserAccountEx@{joinChannelWithUserAccountEx}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{joinChannelWithUserAccountEx()}{joinChannelWithUserAccountEx()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::join\+Channel\+With\+User\+Account\+Ex (\begin{DoxyParamCaption}\item[{const char $\ast$}]{token,  }\item[{const char $\ast$}]{channel\+Id,  }\item[{const char $\ast$}]{user\+Account,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}} \&}]{options,  }\item[{\mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler}{I\+Rtc\+Engine\+Event\+Handler}} $\ast$}]{event\+Handler }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Join a channel using a user account and token, and set the media options. 

Before calling this method, if you have not called {\ttfamily register\+Local\+User\+Account} to register a user account, when you call this method to join a channel, the S\+DK automatically creates a user account for you. Calling the {\ttfamily register\+Local\+User\+Account} method to register a user account, and then calling this method to join a channel can shorten the time it takes to enter the channel. Once a user joins the channel, the user subscribes to the audio and video streams of all the other users in the channel by default, giving rise to usage and {\bfseries{billings}}. If you want to stop subscribing to the media stream of other users, you can set the {\ttfamily options} parameter or call the corresponding {\ttfamily mute} method. Call timing\+: Call this method after {\ttfamily initialize}. Related callbacks\+: After the user successfully joins the channel, the S\+DK triggers the following callbacks\+:
\begin{DoxyItemize}
\item The local client\+: {\ttfamily on\+Local\+User\+Registered}, {\ttfamily on\+Join\+Channel\+Success} and {\ttfamily on\+Connection\+State\+Changed} callbacks.
\item The remote client\+: The {\ttfamily on\+User\+Joined} and {\ttfamily on\+User\+Info\+Updated} callbacks if a user joins the channel in the C\+O\+M\+M\+U\+N\+I\+C\+A\+T\+I\+ON profile, or if a host joins the channel in the L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG profile.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item This method only supports users joining one channel at a time.
\item Users with different App I\+Ds cannot call each other.
\item Before joining a channel, ensure that the App ID you use to generate a token is the same as that you pass in the {\ttfamily initialize} method; otherwise, you may fail to join the channel with the token. To ensure smooth communication, use the same parameter type to identify the user. For example, if a user joins the channel with a U\+ID, then ensure all the other users use the U\+ID too. The same applies to the user account. If a user joins the channel with the Agora Web S\+DK, ensure that the ID of the user is set to the same parameter type.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em token} & The token generated on your server for authentication. See .Note\+:
\begin{DoxyItemize}
\item (Recommended) If your project has enabled the security mode (using A\+PP ID and Token for authentication), this parameter is required.
\item If you have only enabled the testing mode (using A\+PP ID for authentication), this parameter is optional. You will automatically exit the channel 24 hours after successfully joining in.
\item If you need to join different channels at the same time or switch between channels, Agora recommends using a wildcard token so that you don\textquotesingle{}t need to apply for a new token every time joining a channel. See {\ttfamily Secure authentication with tokens}. 
\end{DoxyItemize}\\
\hline
{\em channel\+Id} & The channel name. This parameter signifies the channel in which users engage in real-\/time audio and video interaction. Under the premise of the same App ID, users who fill in the same channel ID enter the same channel for audio and video interaction. The string length must be less than 64 bytes. Supported characters (89 characters in total)\+:
\begin{DoxyItemize}
\item All lowercase English letters\+: a to z.
\item All uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em user\+Account} & The user account. This parameter is used to identify the user in the channel for real-\/time audio and video engagement. You need to set and manage user accounts yourself and ensure that each user account in the same channel is unique. The maximum length of this parameter is 255 bytes. Ensure that you set this parameter and do not set it as N\+U\+LL. Supported characters are as follows(89 in total)\+:
\begin{DoxyItemize}
\item The 26 lowercase English letters\+: a to z.
\item The 26 uppercase English letters\+: A to Z.
\item All numeric characters\+: 0 to 9.
\item Space
\item \char`\"{}!\char`\"{}, \char`\"{}\#\char`\"{}, \char`\"{}\$\char`\"{}, \char`\"{}\%\char`\"{}, \char`\"{}\&\char`\"{}, \char`\"{}(\char`\"{}, \char`\"{})\char`\"{}, \char`\"{}+\char`\"{}, \char`\"{}-\/\char`\"{}, \char`\"{}\+:\char`\"{}, \char`\"{};\char`\"{}, \char`\"{}$<$\char`\"{}, \char`\"{}=\char`\"{}, \char`\"{}.\char`\"{}, \char`\"{}$>$\char`\"{}, \char`\"{}?\char`\"{}, \char`\"{}@\char`\"{}, \char`\"{}\mbox{[}\char`\"{}, \char`\"{}\mbox{]}\char`\"{}, \char`\"{}$^\wedge$\char`\"{}, \char`\"{}\+\_\+\char`\"{}, \char`\"{}\{\char`\"{}, \char`\"{}\}\char`\"{}, \char`\"{}$\vert$\char`\"{}, \char`\"{}$\sim$\char`\"{}, \char`\"{},\char`\"{} 
\end{DoxyItemize}\\
\hline
{\em options} & The channel media options. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}. \\
\hline
{\em event\+Handler} & The callback class of {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ex}{I\+Rtc\+Engine\+Ex}}}. See {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_event_handler}{I\+Rtc\+Engine\+Event\+Handler}}}. You can get the callback events of multiple channels through the {\ttfamily event\+Handler} object passed in this parameter.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid. For example, the token is invalid, the {\ttfamily uid} parameter is not set to an integer, or the value of a member in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} is invalid. You need to pass in a valid parameter and join the channel again.
\item -\/3\+: Fails to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object. You need to reinitialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object.
\item -\/7\+: The {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object has not been initialized. You need to initialize the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object before calling this method.
\item -\/8\+: The internal state of the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object is wrong. The typical cause is that after calling {\ttfamily start\+Echo\+Test} to start a call loop test, you call this method to join the channel without calling {\ttfamily stop\+Echo\+Test} to stop the test. You need to call {\ttfamily stop\+Echo\+Test} before calling this method.
\item -\/17\+: The request to join the channel is rejected. The typical cause is that the user is already in the channel. Agora recommends that you use the {\ttfamily on\+Connection\+State\+Changed} callback to see whether the user is in the channel. Do not call this method to join the channel unless you receive the {\ttfamily C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+ED} (1) state.
\item -\/102\+: The channel name is invalid. You need to pass in a valid channel name in {\ttfamily channel\+Id} to rejoin the channel.
\item -\/121\+: The user ID is invalid. You need to pass in a valid user ID in {\ttfamily uid} to rejoin the channel. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_acba378be5f666f84c64713197587dc43}\label{classagora_1_1rtc_1_1_i_rtc_engine_acba378be5f666f84c64713197587dc43}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getUserInfoByUserAccount@{getUserInfoByUserAccount}}
\index{getUserInfoByUserAccount@{getUserInfoByUserAccount}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getUserInfoByUserAccount()}{getUserInfoByUserAccount()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+User\+Info\+By\+User\+Account (\begin{DoxyParamCaption}\item[{const char $\ast$}]{user\+Account,  }\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{rtc\+::\+User\+Info}} $\ast$}]{user\+Info }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the user information by passing in the user account. 

After a remote user joins the channel, the S\+DK gets the U\+ID and user account of the remote user, caches them in a mapping table object, and triggers the {\ttfamily on\+User\+Info\+Updated} callback on the local client. After receiving the callback, you can call this method and pass in the user account to get the U\+ID of the remote user from the {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{User\+Info}}} object. Call timing\+: Call this method after receiving the {\ttfamily on\+User\+Info\+Updated} callback. Related callbacks\+: {\ttfamily on\+User\+Info\+Updated}


\begin{DoxyParams}{Parameters}
{\em user\+Account} & The user account. \\
\hline
{\em user\+Info} & Input and output parameter. The {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{User\+Info}}} object that identifies the user information.
\begin{DoxyItemize}
\item Input value\+: A {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{User\+Info}}} object.
\item Output\+: A {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{User\+Info}}} object that contains both the user account and U\+ID.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a7a34efc30c42f0c200aacd6a6f1dc386}\label{classagora_1_1rtc_1_1_i_rtc_engine_a7a34efc30c42f0c200aacd6a6f1dc386}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getUserInfoByUid@{getUserInfoByUid}}
\index{getUserInfoByUid@{getUserInfoByUid}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getUserInfoByUid()}{getUserInfoByUid()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+User\+Info\+By\+Uid (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{rtc\+::\+User\+Info}} $\ast$}]{user\+Info }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the user information by passing in the user ID. 

After a remote user joins the channel, the S\+DK gets the U\+ID and user account of the remote user, caches them in a mapping table object, and triggers the {\ttfamily on\+User\+Info\+Updated} callback on the local client. After receiving the callback, you can call this method and passi in the U\+I\+D.\+to get the user account of the specified user from the {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{User\+Info}}} object. Call timing\+: Call this method after receiving the {\ttfamily on\+User\+Info\+Updated} callback. Related callbacks\+: {\ttfamily on\+User\+Info\+Updated}


\begin{DoxyParams}{Parameters}
{\em uid} & The user ID. \\
\hline
{\em user\+Info} & Input and output parameter. The {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{User\+Info}}} object that identifies the user information.
\begin{DoxyItemize}
\item Input value\+: A {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{User\+Info}}} object.
\item Output\+: A {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_user_info}{User\+Info}}} object that contains both the user account and U\+ID.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_acba3bb84e41b87472ad9936bde372552}\label{classagora_1_1rtc_1_1_i_rtc_engine_acba3bb84e41b87472ad9936bde372552}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startOrUpdateChannelMediaRelay@{startOrUpdateChannelMediaRelay}}
\index{startOrUpdateChannelMediaRelay@{startOrUpdateChannelMediaRelay}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startOrUpdateChannelMediaRelay()}{startOrUpdateChannelMediaRelay()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Or\+Update\+Channel\+Media\+Relay (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_relay_configuration}{Channel\+Media\+Relay\+Configuration}} \&}]{configuration }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts relaying media streams across channels or updates channels for media relay. 

\begin{DoxySince}{Since}
v4.\+2.\+0
\end{DoxySince}
The first successful call to this method starts relaying media streams from the source channel to the destination channels. To relay the media stream to other channels, or exit one of the current media relays, you can call this method again to update the destination channels. This feature supports relaying media streams to a maximum of six destination channels. After a successful method call, the S\+DK triggers the {\ttfamily on\+Channel\+Media\+Relay\+State\+Changed} callback, and this callback returns the state of the media stream relay. Common states are as follows\+:
\begin{DoxyItemize}
\item If the {\ttfamily on\+Channel\+Media\+Relay\+State\+Changed} callback returns {\ttfamily R\+E\+L\+A\+Y\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+U\+N\+N\+I\+NG} (2) and {\ttfamily R\+E\+L\+A\+Y\+\_\+\+OK} (0), it means that the S\+DK starts relaying media streams from the source channel to the destination channel.
\item If the {\ttfamily on\+Channel\+Media\+Relay\+State\+Changed} callback returns {\ttfamily R\+E\+L\+A\+Y\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+U\+RE} (3), an exception occurs during the media stream relay.
\end{DoxyItemize}

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Call this method after joining the channel.
\item This method takes effect only when you are a host in a live streaming channel.
\item The relaying media streams across channels function needs to be enabled by contacting {\ttfamily technical support}.
\item Agora does not support string user accounts in this A\+PI.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em configuration} & The configuration of the media stream relay. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_relay_configuration}{Channel\+Media\+Relay\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/1\+: A general error occurs (no specified reason).
\item -\/2\+: The parameter is invalid.
\item -\/8\+: Internal state error. Probably because the user is not a broadcaster. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab4a1c52a83a08f7dacab6de36f4681b8}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab4a1c52a83a08f7dacab6de36f4681b8}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopChannelMediaRelay@{stopChannelMediaRelay}}
\index{stopChannelMediaRelay@{stopChannelMediaRelay}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopChannelMediaRelay()}{stopChannelMediaRelay()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Channel\+Media\+Relay (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops the media stream relay. Once the relay stops, the host quits all the target channels. 

After a successful method call, the S\+DK triggers the {\ttfamily on\+Channel\+Media\+Relay\+State\+Changed} callback. If the callback reports {\ttfamily R\+E\+L\+A\+Y\+\_\+\+S\+T\+A\+T\+E\+\_\+\+I\+D\+LE} (0) and {\ttfamily R\+E\+L\+A\+Y\+\_\+\+OK} (0), the host successfully stops the relay.

\begin{DoxyNote}{Note}
If the method call fails, the S\+DK triggers the {\ttfamily on\+Channel\+Media\+Relay\+State\+Changed} callback with the {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+O\+\_\+\+R\+E\+S\+P\+O\+N\+SE} (2) or {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+L\+O\+ST} (8) status code. You can call the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_ad5c2ef631e3e4076f6aec96ed1152262}{leave\+Channel(const Leave\+Channel\+Options\& options)}}} method to leave the channel, and the media stream relay automatically stops.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/5\+: The method call was rejected. There is no ongoing channel media relay. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6761e2f090290567d1f592841c40d96c}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6761e2f090290567d1f592841c40d96c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!pauseAllChannelMediaRelay@{pauseAllChannelMediaRelay}}
\index{pauseAllChannelMediaRelay@{pauseAllChannelMediaRelay}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{pauseAllChannelMediaRelay()}{pauseAllChannelMediaRelay()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::pause\+All\+Channel\+Media\+Relay (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Pauses the media stream relay to all target channels. 

After the cross-\/channel media stream relay starts, you can call this method to pause relaying media streams to all target channels; after the pause, if you want to resume the relay, call {\ttfamily resume\+All\+Channel\+Media\+Relay}.

\begin{DoxyNote}{Note}
Call this method after {\ttfamily start\+Or\+Update\+Channel\+Media\+Relay}.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/5\+: The method call was rejected. There is no ongoing channel media relay. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a92a74b5b3752d285dfdb769607220e70}\label{classagora_1_1rtc_1_1_i_rtc_engine_a92a74b5b3752d285dfdb769607220e70}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!resumeAllChannelMediaRelay@{resumeAllChannelMediaRelay}}
\index{resumeAllChannelMediaRelay@{resumeAllChannelMediaRelay}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{resumeAllChannelMediaRelay()}{resumeAllChannelMediaRelay()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::resume\+All\+Channel\+Media\+Relay (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Resumes the media stream relay to all target channels. 

After calling the {\ttfamily pause\+All\+Channel\+Media\+Relay} method, you can call this method to resume relaying media streams to all destination channels.

\begin{DoxyNote}{Note}
Call this method after {\ttfamily pause\+All\+Channel\+Media\+Relay}.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/5\+: The method call was rejected. There is no paused channel media relay. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aab97152512979f2a3b23b7e2d725d43c}\label{classagora_1_1rtc_1_1_i_rtc_engine_aab97152512979f2a3b23b7e2d725d43c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setDirectCdnStreamingAudioConfiguration@{setDirectCdnStreamingAudioConfiguration}}
\index{setDirectCdnStreamingAudioConfiguration@{setDirectCdnStreamingAudioConfiguration}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setDirectCdnStreamingAudioConfiguration()}{setDirectCdnStreamingAudioConfiguration()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Direct\+Cdn\+Streaming\+Audio\+Configuration (\begin{DoxyParamCaption}\item[{A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE}]{profile }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the audio profile of the audio streams directly pushed to the C\+DN by the host. 

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000050}{Deprecated}}]v4.\+6.\+0.\end{DoxyRefDesc}


When you set the {\ttfamily publish\+Microphone\+Track} or {\ttfamily publish\+Custom\+Audio\+Track} in the {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}}} as {\ttfamily true} to capture audios, you can call this method to set the audio profile.


\begin{DoxyParams}{Parameters}
{\em profile} & The audio profile, including the sampling rate, bitrate, encoding mode, and the number of channels. See {\ttfamily A\+U\+D\+I\+O\+\_\+\+P\+R\+O\+F\+I\+L\+E\+\_\+\+T\+Y\+PE}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6c69261e800f7e7c691bdc439b97d077}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6c69261e800f7e7c691bdc439b97d077}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setDirectCdnStreamingVideoConfiguration@{setDirectCdnStreamingVideoConfiguration}}
\index{setDirectCdnStreamingVideoConfiguration@{setDirectCdnStreamingVideoConfiguration}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setDirectCdnStreamingVideoConfiguration()}{setDirectCdnStreamingVideoConfiguration()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Direct\+Cdn\+Streaming\+Video\+Configuration (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_video_encoder_configuration}{Video\+Encoder\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets the video profile of the media streams directly pushed to the C\+DN by the host. 

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000051}{Deprecated}}]v4.\+6.\+0.\end{DoxyRefDesc}


This method only affects video streams captured by cameras or screens, or from custom video capture sources. That is, when you set {\ttfamily publish\+Camera\+Track} or {\ttfamily publish\+Custom\+Video\+Track} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}}} as {\ttfamily true} to capture videos, you can call this method to set the video profiles. If your local camera does not support the video resolution you set,the S\+DK automatically adjusts the video resolution to a value that is closest to your settings for capture, encoding or streaming, with the same aspect ratio as the resolution you set. You can get the actual resolution of the video streams through the {\ttfamily on\+Direct\+Cdn\+Streaming\+Stats} callback.


\begin{DoxyParams}{Parameters}
{\em config} & Video profile. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_video_encoder_configuration}{Video\+Encoder\+Configuration}}}.Note\+: During C\+DN live streaming, Agora only supports setting {\ttfamily O\+R\+I\+E\+N\+T\+A\+T\+I\+O\+N\+\_\+\+M\+O\+DE} as {\ttfamily O\+R\+I\+E\+N\+T\+A\+T\+I\+O\+N\+\_\+\+M\+O\+D\+E\+\_\+\+F\+I\+X\+E\+D\+\_\+\+L\+A\+N\+D\+S\+C\+A\+PE} or {\ttfamily O\+R\+I\+E\+N\+T\+A\+T\+I\+O\+N\+\_\+\+M\+O\+D\+E\+\_\+\+F\+I\+X\+E\+D\+\_\+\+P\+O\+R\+T\+R\+A\+IT}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a92946ac873b25e343da2f63b4d421ac6}\label{classagora_1_1rtc_1_1_i_rtc_engine_a92946ac873b25e343da2f63b4d421ac6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startDirectCdnStreaming@{startDirectCdnStreaming}}
\index{startDirectCdnStreaming@{startDirectCdnStreaming}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startDirectCdnStreaming()}{startDirectCdnStreaming()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Direct\+Cdn\+Streaming (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classagora_1_1rtc_1_1_i_direct_cdn_streaming_event_handler}{I\+Direct\+Cdn\+Streaming\+Event\+Handler}} $\ast$}]{event\+Handler,  }\item[{const char $\ast$}]{publish\+Url,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Starts pushing media streams to the C\+DN directly. 

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000052}{Deprecated}}]v4.\+6.\+0.\end{DoxyRefDesc}


Aogra does not support pushing media streams to one U\+RL repeatedly. {\bfseries{Media options}} Agora does not support setting the value of {\ttfamily publish\+Camera\+Track} and {\ttfamily publish\+Custom\+Video\+Track} as {\ttfamily true}, or the value of {\ttfamily publish\+Microphone\+Track} and {\ttfamily publish\+Custom\+Audio\+Track} as {\ttfamily true} at the same time. When choosing media setting options ( {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}}} ), you can refer to the following examples\+: If you want to push audio and video streams captured by the host from a custom source, the media setting options should be set as follows\+:
\begin{DoxyItemize}
\item {\ttfamily publish\+Custom\+Audio\+Track} is set as {\ttfamily true} and call the {\ttfamily push\+Audio\+Frame} method
\item {\ttfamily publish\+Custom\+Video\+Track} is set as {\ttfamily true} and call the {\ttfamily push\+Video\+Frame} method
\item {\ttfamily publish\+Camera\+Track} is set as {\ttfamily false} (the default value)
\item {\ttfamily publish\+Microphone\+Track} is set as {\ttfamily false} (the default value) As of v4.\+2.\+0, Agora S\+DK supports audio-\/only live streaming. You can set {\ttfamily publish\+Custom\+Audio\+Track} or {\ttfamily publish\+Microphone\+Track} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}}} as {\ttfamily true} and call {\ttfamily push\+Audio\+Frame} to push audio streams.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
Agora only supports pushing one audio and video streams or one audio streams to C\+DN.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em event\+Handler} & See {\ttfamily on\+Direct\+Cdn\+Streaming\+State\+Changed} and {\ttfamily on\+Direct\+Cdn\+Streaming\+Stats}. \\
\hline
{\em publish\+Url} & The C\+DN live streaming U\+RL. \\
\hline
{\em options} & The media setting options for the host. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a1f179ea962004b38b31a43716162bb75}\label{classagora_1_1rtc_1_1_i_rtc_engine_a1f179ea962004b38b31a43716162bb75}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopDirectCdnStreaming@{stopDirectCdnStreaming}}
\index{stopDirectCdnStreaming@{stopDirectCdnStreaming}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopDirectCdnStreaming()}{stopDirectCdnStreaming()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Direct\+Cdn\+Streaming (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Stops pushing media streams to the C\+DN directly. 

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000053}{Deprecated}}]v4.\+6.\+0.\end{DoxyRefDesc}


\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aaff02b17e9cc532b9ac907059d7926c0}\label{classagora_1_1rtc_1_1_i_rtc_engine_aaff02b17e9cc532b9ac907059d7926c0}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!updateDirectCdnStreamingMediaOptions@{updateDirectCdnStreamingMediaOptions}}
\index{updateDirectCdnStreamingMediaOptions@{updateDirectCdnStreamingMediaOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{updateDirectCdnStreamingMediaOptions()}{updateDirectCdnStreamingMediaOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::update\+Direct\+Cdn\+Streaming\+Media\+Options (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}

Change the media source during the pushing

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000054}{Deprecated}}]v4.\+6.\+0.\end{DoxyRefDesc}


\begin{DoxyNote}{Note}
This method is temporarily not supported.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em options} & The direct cdn streaming media options\+: \mbox{\hyperlink{structagora_1_1rtc_1_1_direct_cdn_streaming_media_options}{Direct\+Cdn\+Streaming\+Media\+Options}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a2899990fedbf999432466b3f8ddaea1f}\label{classagora_1_1rtc_1_1_i_rtc_engine_a2899990fedbf999432466b3f8ddaea1f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startRhythmPlayer@{startRhythmPlayer}}
\index{startRhythmPlayer@{startRhythmPlayer}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startRhythmPlayer()}{startRhythmPlayer()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Rhythm\+Player (\begin{DoxyParamCaption}\item[{const char $\ast$}]{sound1,  }\item[{const char $\ast$}]{sound2,  }\item[{const Agora\+Rhythm\+Player\+Config \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables the virtual metronome. 


\begin{DoxyItemize}
\item After enabling the virtual metronome, the S\+DK plays the specified audio effect file from the beginning, and controls the playback duration of each file according to {\ttfamily beats\+Per\+Minute} you set in {\ttfamily Agora\+Rhythm\+Player\+Config}. For example, if you set {\ttfamily beats\+Per\+Minute} as {\ttfamily 60}, the S\+DK plays one beat every second. If the file duration exceeds the beat duration, the S\+DK only plays the audio within the beat duration.
\item By default, the sound of the virtual metronome is published in the channel. If you want the sound to be heard by the remote users, you can set {\ttfamily publish\+Rhythm\+Player\+Track} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} as {\ttfamily true}. Applicable scenarios\+: In music education, physical education and other scenarios, teachers usually need to use a metronome so that students can practice with the correct beat. The meter is composed of a downbeat and upbeats. The first beat of each measure is called a downbeat, and the rest are called upbeats. Call timing\+: This method can be called either before or after joining the channel. Related callbacks\+: After successfully calling this method, the S\+DK triggers the {\ttfamily on\+Rhythm\+Player\+State\+Changed} callback locally to report the status of the virtual metronome.
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em sound1} & The absolute path or U\+RL address (including the filename extensions) of the file for the downbeat. For example, {\ttfamily C\+:\textbackslash{}music\textbackslash{}audio.\+mp4}. For the audio file formats supported by this method, see {\ttfamily What formats of audio files does the Agora R\+TC S\+DK support}. \\
\hline
{\em sound2} & The absolute path or U\+RL address (including the filename extensions) of the file for the upbeats. For example, {\ttfamily C\+:\textbackslash{}music\textbackslash{}audio.\+mp4}. For the audio file formats supported by this method, see {\ttfamily What formats of audio files does the Agora R\+TC S\+DK support}. \\
\hline
{\em config} & The metronome configuration. See {\ttfamily Agora\+Rhythm\+Player\+Config}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/22\+: Cannot find audio effect files. Please set the correct paths for {\ttfamily sound1} and {\ttfamily sound2}. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab20b4c61b34a95b3f5e08dd2da48779e}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab20b4c61b34a95b3f5e08dd2da48779e}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!stopRhythmPlayer@{stopRhythmPlayer}}
\index{stopRhythmPlayer@{stopRhythmPlayer}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{stopRhythmPlayer()}{stopRhythmPlayer()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::stop\+Rhythm\+Player (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Disables the virtual metronome. 

After calling {\ttfamily start\+Rhythm\+Player}, you can call this method to disable the virtual metronome.

\begin{DoxyNote}{Note}
This method is for Android and i\+OS only.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab79a8bc476bcc23c81862576bd058d99}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab79a8bc476bcc23c81862576bd058d99}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!configRhythmPlayer@{configRhythmPlayer}}
\index{configRhythmPlayer@{configRhythmPlayer}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{configRhythmPlayer()}{configRhythmPlayer()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::config\+Rhythm\+Player (\begin{DoxyParamCaption}\item[{const Agora\+Rhythm\+Player\+Config \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Configures the virtual metronome. 


\begin{DoxyItemize}
\item After calling {\ttfamily start\+Rhythm\+Player}, you can call this method to reconfigure the virtual metronome.
\item After enabling the virtual metronome, the S\+DK plays the specified audio effect file from the beginning, and controls the playback duration of each file according to {\ttfamily beats\+Per\+Minute} you set in {\ttfamily Agora\+Rhythm\+Player\+Config}. For example, if you set {\ttfamily beats\+Per\+Minute} as {\ttfamily 60}, the S\+DK plays one beat every second. If the file duration exceeds the beat duration, the S\+DK only plays the audio within the beat duration.
\item By default, the sound of the virtual metronome is published in the channel. If you want the sound to be heard by the remote users, you can set {\ttfamily publish\+Rhythm\+Player\+Track} in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}} as {\ttfamily true}. Call timing\+: This method can be called either before or after joining the channel. Related callbacks\+: After successfully calling this method, the S\+DK triggers the {\ttfamily on\+Rhythm\+Player\+State\+Changed} callback locally to report the status of the virtual metronome.
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em config} & The metronome configuration. See {\ttfamily Agora\+Rhythm\+Player\+Config}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a5a751731d775a65b67c52a9e4f167844}\label{classagora_1_1rtc_1_1_i_rtc_engine_a5a751731d775a65b67c52a9e4f167844}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!takeSnapshot@{takeSnapshot}}
\index{takeSnapshot@{takeSnapshot}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{takeSnapshot()}{takeSnapshot()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::take\+Snapshot (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{const char $\ast$}]{file\+Path }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Takes a snapshot of a video stream. 

This method takes a snapshot of a video stream from the specified user, generates a J\+PG image, and saves it to the specified path. Call timing\+: Call this method after joining a channel. Related callbacks\+: After a successful call of this method, the S\+DK triggers the {\ttfamily on\+Snapshot\+Taken} callback to report whether the snapshot is successfully taken, as well as the details for that snapshot.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item The method is asynchronous, and the S\+DK has not taken the snapshot when the method call returns.
\item When used for local video snapshots, this method takes a snapshot for the video streams specified in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.
\item If the user\textquotesingle{}s video has been preprocessed, for example, watermarked or beautified, the resulting snapshot includes the pre-\/processing effect.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & The user ID. Set uid as 0 if you want to take a snapshot of the local user\textquotesingle{}s video. \\
\hline
{\em file\+Path} & The local path (including filename extensions) of the snapshot. For example\+:
\begin{DoxyItemize}
\item Windows\+: {\ttfamily C\+:\textbackslash{}Users\textbackslash{}$<$user\+\_\+name$>$\textbackslash{}App\+Data\textbackslash{}Local\textbackslash{}Agora\textbackslash{}$<$process\+\_\+name$>$\textbackslash{}example.\+jpg}
\item i\+OS\+: {\ttfamily /\+App Sandbox/\+Library/\+Caches/example.\+jpg}
\item mac\+OS\+: {\ttfamily ～/\+Library/\+Logs/example.jpg}
\item Android\+: {\ttfamily /storage/emulated/0/\+Android/data/$<$package name$>$/files/example.jpg} Attention\+: Ensure that the path you specify exists and is writable.
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa2f627ab6af61861628c04066453e8df}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa2f627ab6af61861628c04066453e8df}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!takeSnapshot@{takeSnapshot}}
\index{takeSnapshot@{takeSnapshot}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{takeSnapshot()}{takeSnapshot()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::take\+Snapshot (\begin{DoxyParamCaption}\item[{uid\+\_\+t}]{uid,  }\item[{const \mbox{\hyperlink{structagora_1_1media_1_1_snapshot_config}{media\+::\+Snapshot\+Config}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Takes a screenshot of the video at the specified observation point. 

This method takes a snapshot of a video stream from the specified user, generates a J\+PG image, and saves it to the specified path. Call timing\+: Call this method after joining a channel. Related callbacks\+: After a successful call of this method, the S\+DK triggers the {\ttfamily on\+Snapshot\+Taken} callback to report whether the snapshot is successfully taken, as well as the details for that snapshot.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item The method is asynchronous, and the S\+DK has not taken the snapshot when the method call returns.
\item When used for local video snapshots, this method takes a snapshot for the video streams specified in {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}}.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & The user ID. Set uid as 0 if you want to take a snapshot of the local user\textquotesingle{}s video. \\
\hline
{\em config} & The configuration of the snaptshot. See {\ttfamily Snapshot\+Config}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac0caaeeaaffaebc35cd2312d05f85b93}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac0caaeeaaffaebc35cd2312d05f85b93}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableContentInspect@{enableContentInspect}}
\index{enableContentInspect@{enableContentInspect}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableContentInspect()}{enableContentInspect()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Content\+Inspect (\begin{DoxyParamCaption}\item[{bool}]{enabled,  }\item[{const \mbox{\hyperlink{structagora_1_1media_1_1_content_inspect_config}{media\+::\+Content\+Inspect\+Config}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables or disables video screenshot and upload. 

When video screenshot and upload function is enabled, the S\+DK takes screenshots and uploads videos sent by local users based on the type and frequency of the module you set in {\ttfamily Content\+Inspect\+Config}. After video screenshot and upload, the Agora server sends the callback notification to your app server in H\+T\+T\+PS requests and sends all screenshots to the third-\/party cloud storage service. Call timing\+: This method can be called either before or after joining the channel.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Before calling this method, make sure you have enabled video screenshot and upload on Agora console.
\item When the video moderation module is set to video moderation via Agora self-\/developed extension( {\ttfamily C\+O\+N\+T\+E\+N\+T\+\_\+\+I\+N\+S\+P\+E\+C\+T\+\_\+\+S\+U\+P\+E\+R\+V\+I\+S\+I\+ON} ), the video screenshot and upload dynamic library {\ttfamily libagora\+\_\+content\+\_\+inspect\+\_\+extension.\+dll} is required. Deleting this library disables the screenshot and upload feature.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em enabled} & Whether to enalbe video screenshot and upload\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Enables video screenshot and upload.
\item {\ttfamily false}\+: Disables video screenshot and upload. 
\end{DoxyItemize}\\
\hline
{\em config} & Screenshot and upload configuration. See {\ttfamily Content\+Inspect\+Config}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aad25371db340982772decfcf62aa2247}\label{classagora_1_1rtc_1_1_i_rtc_engine_aad25371db340982772decfcf62aa2247}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustCustomAudioPublishVolume@{adjustCustomAudioPublishVolume}}
\index{adjustCustomAudioPublishVolume@{adjustCustomAudioPublishVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustCustomAudioPublishVolume()}{adjustCustomAudioPublishVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+Custom\+Audio\+Publish\+Volume (\begin{DoxyParamCaption}\item[{track\+\_\+id\+\_\+t}]{track\+Id,  }\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the volume of the custom audio track played remotely. 

If you want to change the volume of the audio played remotely, you need to call this method again.

\begin{DoxyNote}{Note}
Ensure you have called the {\ttfamily create\+Custom\+Audio\+Track} method to create a custom audio track before calling this method.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em track\+Id} & The audio track ID. Set this parameter to the custom audio track ID returned in {\ttfamily create\+Custom\+Audio\+Track}. \\
\hline
{\em volume} & The volume of the audio source. The value can range from 0 to 100. 0 means mute; 100 means the original volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a6cbbb9eccfa51c5a62664050db67530f}\label{classagora_1_1rtc_1_1_i_rtc_engine_a6cbbb9eccfa51c5a62664050db67530f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!adjustCustomAudioPlayoutVolume@{adjustCustomAudioPlayoutVolume}}
\index{adjustCustomAudioPlayoutVolume@{adjustCustomAudioPlayoutVolume}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{adjustCustomAudioPlayoutVolume()}{adjustCustomAudioPlayoutVolume()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::adjust\+Custom\+Audio\+Playout\+Volume (\begin{DoxyParamCaption}\item[{track\+\_\+id\+\_\+t}]{track\+Id,  }\item[{int}]{volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Adjusts the volume of the custom audio track played locally. 

If you want to change the volume of the audio to be played locally, you need to call this method again.

\begin{DoxyNote}{Note}
Ensure you have called the {\ttfamily create\+Custom\+Audio\+Track} method to create a custom audio track before calling this method.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em track\+Id} & The audio track ID. Set this parameter to the custom audio track ID returned in {\ttfamily create\+Custom\+Audio\+Track}. \\
\hline
{\em volume} & The volume of the audio source. The value can range from 0 to 100. 0 means mute; 100 means the original volume.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aff1329c23bbcaff769101ae08f91b869}\label{classagora_1_1rtc_1_1_i_rtc_engine_aff1329c23bbcaff769101ae08f91b869}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setCloudProxy@{setCloudProxy}}
\index{setCloudProxy@{setCloudProxy}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setCloudProxy()}{setCloudProxy()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Cloud\+Proxy (\begin{DoxyParamCaption}\item[{C\+L\+O\+U\+D\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+T\+Y\+PE}]{proxy\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets up cloud proxy service. 

\begin{DoxySince}{Since}
v3.\+3.\+0
\end{DoxySince}
When users\textquotesingle{} network access is restricted by a firewall, configure the firewall to allow specific IP addresses and ports provided by Agora; then, call this method to enable the cloud {\ttfamily proxy\+Type} and set the cloud proxy type with the proxy\+Type parameter. After successfully connecting to the cloud proxy, the S\+DK triggers the {\ttfamily on\+Connection\+State\+Changed} ( C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+NG, C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+S\+E\+T\+T\+I\+N\+G\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+S\+E\+R\+V\+ER ) callback. To disable the cloud proxy that has been set, call the {\ttfamily set\+Cloud\+Proxy(\+N\+O\+N\+E\+\_\+\+P\+R\+O\+X\+Y)}. To change the cloud proxy type that has been set, call the {\ttfamily set\+Cloud\+Proxy} {\ttfamily (N\+O\+N\+E\+\_\+\+P\+R\+O\+XY)} first, and then call the {\ttfamily set\+Cloud\+Proxy} to set the {\ttfamily proxy\+Type} you want.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item Agora recommends that you call this method before joining a channel.
\item When a user is behind a firewall and uses the Force U\+DP cloud proxy, the services for Media Push and cohosting across channels are not available.
\item When you use the Force T\+CP cloud proxy, note that an error would occur when calling the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine_a88a90b9433ec193f9821738ba55e6ec3}{start\+Audio\+Mixing(const char$\ast$ file\+Path, bool loopback, int cycle, int start\+Pos)}}} method to play online music files in the H\+T\+TP protocol. The services for Media Push and cohosting across channels use the cloud proxy with the T\+CP protocol.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em proxy\+Type} & The type of the cloud proxy. See {\ttfamily C\+L\+O\+U\+D\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+T\+Y\+PE}. This parameter is mandatory. The S\+DK reports an error if you do not pass in a value.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/2\+: The parameter is invalid.
\item -\/7\+: The S\+DK is not initialized. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a00358b706ea747938165984198b16009}\label{classagora_1_1rtc_1_1_i_rtc_engine_a00358b706ea747938165984198b16009}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setLocalAccessPoint@{setLocalAccessPoint}}
\index{setLocalAccessPoint@{setLocalAccessPoint}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setLocalAccessPoint()}{setLocalAccessPoint()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Local\+Access\+Point (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_local_access_point_configuration}{Local\+Access\+Point\+Configuration}} \&}]{config }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Configures the connection to Agora\textquotesingle{}s Private Media Server access module. 

After successfully deploying the Agora Private Media Server and integrating the 4.\+x R\+TC S\+DK on intranet clients, you can call this method to specify the Local Access Point and assign the access module to the S\+DK. Call timing\+: This method must be called before joining a channel.

\begin{DoxyNote}{Note}
This method takes effect only after deploying the Agora Hybrid Cloud solution. You can {\ttfamily contact sales} to learn more and deploy the Agora Hybrid Cloud.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em config} & Local Access Point configuration. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_local_access_point_configuration}{Local\+Access\+Point\+Configuration}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. See {\ttfamily Error Codes} for details and resolution suggestions. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aa670b2c3dff1726603c3a1a90f1afe49}\label{classagora_1_1rtc_1_1_i_rtc_engine_aa670b2c3dff1726603c3a1a90f1afe49}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAdvancedAudioOptions@{setAdvancedAudioOptions}}
\index{setAdvancedAudioOptions@{setAdvancedAudioOptions}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAdvancedAudioOptions()}{setAdvancedAudioOptions()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Advanced\+Audio\+Options (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structagora_1_1rtc_1_1_advanced_audio_options}{Advanced\+Audio\+Options}} \&}]{options,  }\item[{int}]{source\+Type = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets audio advanced options. 

If you have advanced audio processing requirements, such as capturing and sending stereo audio, you can call this method to set advanced audio options.

\begin{DoxyNote}{Note}
Call this method after calling {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)}, {\ttfamily enable\+Audio} and {\ttfamily enable\+Local\+Audio}.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em options} & The advanced options for audio. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_advanced_audio_options}{Advanced\+Audio\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab8ffc1ea81220f8002e4520265ecc93c}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab8ffc1ea81220f8002e4520265ecc93c}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setAVSyncSource@{setAVSyncSource}}
\index{setAVSyncSource@{setAVSyncSource}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setAVSyncSource()}{setAVSyncSource()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+A\+V\+Sync\+Source (\begin{DoxyParamCaption}\item[{const char $\ast$}]{channel\+Id,  }\item[{uid\+\_\+t}]{uid }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets audio-\/video synchronization for the sender. 

A user may use two separate devices to send audio and video streams. To ensure audio and video are synchronized on the receiving end, you can call this method on the video sender and pass in the channel name and user ID of the audio sender. The S\+DK will use the timestamp of the audio stream as the reference to automatically adjust the video stream, ensuring audio-\/video synchronization even if the two sending devices are on different uplink networks (e.\+g., Wi-\/\+Fi and 4G).

\begin{DoxyNote}{Note}
Agora recommends that you call this method before joining a channel.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em channel\+Id} & The channel name of the audio sender. \\
\hline
{\em uid} & The user ID of the audio sender.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. See {\ttfamily Error Codes} for details and resolution suggestions. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a38dfb62675bf5d36d13aca09b08753f7}\label{classagora_1_1rtc_1_1_i_rtc_engine_a38dfb62675bf5d36d13aca09b08753f7}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableVideoImageSource@{enableVideoImageSource}}
\index{enableVideoImageSource@{enableVideoImageSource}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableVideoImageSource()}{enableVideoImageSource()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Video\+Image\+Source (\begin{DoxyParamCaption}\item[{bool}]{enable,  }\item[{const \mbox{\hyperlink{structagora_1_1rtc_1_1_image_track_options}{Image\+Track\+Options}} \&}]{options }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Sets whether to replace the current video feeds with images when publishing video streams. 

When publishing video streams, you can call this method to replace the current video feeds with custom images. Once you enable this function, you can select images to replace the video feeds through the {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_image_track_options}{Image\+Track\+Options}}} parameter. If you disable this function, the remote users see the video feeds that you publish. Call timing\+: Call this method after joining a channel.


\begin{DoxyParams}{Parameters}
{\em enable} & Whether to replace the current video feeds with custom images\+:
\begin{DoxyItemize}
\item {\ttfamily true}\+: Replace the current video feeds with custom images.
\item {\ttfamily false}\+: (Default) Do not replace the current video feeds with custom images. 
\end{DoxyItemize}\\
\hline
{\em options} & Image configurations. See {\ttfamily \mbox{\hyperlink{structagora_1_1rtc_1_1_image_track_options}{Image\+Track\+Options}}}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ac584ff03c6ac1f0b23d8bf4d43d99075}\label{classagora_1_1rtc_1_1_i_rtc_engine_ac584ff03c6ac1f0b23d8bf4d43d99075}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getCurrentMonotonicTimeInMs@{getCurrentMonotonicTimeInMs}}
\index{getCurrentMonotonicTimeInMs@{getCurrentMonotonicTimeInMs}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getCurrentMonotonicTimeInMs()}{getCurrentMonotonicTimeInMs()}}
{\footnotesize\ttfamily virtual int64\+\_\+t agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Current\+Monotonic\+Time\+In\+Ms (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the current Monotonic Time of the S\+DK. 

Monotonic Time refers to a monotonically increasing time series whose value increases over time. The unit is milliseconds. In custom video capture and custom audio capture scenarios, in order to ensure audio and video synchronization, Agora recommends that you call this method to obtain the current Monotonic Time of the S\+DK, and then pass this value into the timestamp parameter in the captured video frame ( {\ttfamily Video\+Frame} ) and audio frame ( {\ttfamily Audio\+Frame} ). Call timing\+: This method can be called either before or after joining the channel.

\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item ≥0\+: The method call is successful, and returns the current Monotonic Time of the S\+DK (in milliseconds).
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a89cd1b4d85e8eac5e7faf5a199f20884}\label{classagora_1_1rtc_1_1_i_rtc_engine_a89cd1b4d85e8eac5e7faf5a199f20884}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getNetworkType@{getNetworkType}}
\index{getNetworkType@{getNetworkType}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getNetworkType()}{getNetworkType()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Network\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the type of the local network connection. 

You can use this method to get the type of network in use at any stage.

\begin{DoxyNote}{Note}
You can call this method either before or after joining a channel.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item ≥ 0\+: The method call is successful, and the local network connection type is returned.
\begin{DoxyItemize}
\item 0\+: The S\+DK disconnects from the network.
\item 1\+: The network type is L\+AN.
\item 2\+: The network type is Wi-\/\+Fi (including hotspots).
\item 3\+: The network type is mobile 2G.
\item 4\+: The network type is mobile 3G.
\item 5\+: The network type is mobile 4G.
\item 6\+: The network type is mobile 5G.
\end{DoxyItemize}
\item $<$ 0\+: The method call failed with an error code.
\begin{DoxyItemize}
\item -\/1\+: The network type is unknown. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae3eb20847152978256482faeefcafb7b}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae3eb20847152978256482faeefcafb7b}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!setParameters@{setParameters}}
\index{setParameters@{setParameters}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{setParameters()}{setParameters()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::set\+Parameters (\begin{DoxyParamCaption}\item[{const char $\ast$}]{parameters }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Provides technical preview functionalities or special customizations by configuring the S\+DK with J\+S\+ON options. 

Contact {\ttfamily technical support} to get the J\+S\+ON configuration method.


\begin{DoxyParams}{Parameters}
{\em parameters} & Pointer to the set parameters in a J\+S\+ON string.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a48313e38de920085528b0017cfc91672}\label{classagora_1_1rtc_1_1_i_rtc_engine_a48313e38de920085528b0017cfc91672}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!startMediaRenderingTracing@{startMediaRenderingTracing}}
\index{startMediaRenderingTracing@{startMediaRenderingTracing}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{startMediaRenderingTracing()}{startMediaRenderingTracing()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::start\+Media\+Rendering\+Tracing (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables tracing the video frame rendering process. 

\begin{DoxySince}{Since}
v4.\+1.\+1
\end{DoxySince}
The S\+DK starts tracing the rendering status of the video frames in the channel from the moment this method is successfully called and reports information about the event through the {\ttfamily on\+Video\+Rendering\+Tracing\+Result} callback. Applicable scenarios\+: Agora recommends that you use this method in conjunction with the UI settings (such as buttons and sliders) in your app to improve the user experience. For example, call this method when the user clicks the Join Channel button, and then get the time spent during the video frame rendering process through the {\ttfamily on\+Video\+Rendering\+Tracing\+Result} callback, so as to optimize the indicators accordingly.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item If you have not called this method, the S\+DK tracks the rendering events of the video frames from the moment you call {\ttfamily join\+Channel(const char$\ast$ token, const char$\ast$ channel\+Id, uid\+\_\+t uid, const \mbox{\hyperlink{structagora_1_1rtc_1_1_channel_media_options}{Channel\+Media\+Options}}\& options)} to join the channel. You can call this method at an appropriate time according to the actual application scenario to set the starting position for tracking video rendering events.
\item After the local user leaves the current channel, the S\+DK automatically tracks the video rendering events from the moment you join a channel.
\end{DoxyItemize}
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/7\+: The method is called before {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} is initialized. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ab47250a1a4e0e3eb82916ea75017dd4f}\label{classagora_1_1rtc_1_1_i_rtc_engine_ab47250a1a4e0e3eb82916ea75017dd4f}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!enableInstantMediaRendering@{enableInstantMediaRendering}}
\index{enableInstantMediaRendering@{enableInstantMediaRendering}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{enableInstantMediaRendering()}{enableInstantMediaRendering()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::enable\+Instant\+Media\+Rendering (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Enables audio and video frame instant rendering. 

\begin{DoxySince}{Since}
v4.\+1.\+1
\end{DoxySince}
After successfully calling this method, the S\+DK enables the instant frame rendering mode, which can speed up the first frame rendering after the user joins the channel. Applicable scenarios\+: Agora recommends that you enable this mode for the audience in a live streaming scenario. Call timing\+: Call this method before joining a channel.

\begin{DoxyNote}{Note}
Both the host and audience member need to call this method in order to experience instant rendering of audio and video frames. Once the method is successfully called, you can only cancel instant rendering by calling {\ttfamily release} to destroy the {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} object.
\end{DoxyNote}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: Success.
\item $<$ 0\+: Failure.
\begin{DoxyItemize}
\item -\/7\+: The method is called before {\ttfamily \mbox{\hyperlink{classagora_1_1rtc_1_1_i_rtc_engine}{I\+Rtc\+Engine}}} is initialized. 
\end{DoxyItemize}
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_ae5109a2a8ca8a3106961ee783d6c0cf6}\label{classagora_1_1rtc_1_1_i_rtc_engine_ae5109a2a8ca8a3106961ee783d6c0cf6}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!getNtpWallTimeInMs@{getNtpWallTimeInMs}}
\index{getNtpWallTimeInMs@{getNtpWallTimeInMs}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{getNtpWallTimeInMs()}{getNtpWallTimeInMs()}}
{\footnotesize\ttfamily virtual uint64\+\_\+t agora\+::rtc\+::\+I\+Rtc\+Engine\+::get\+Ntp\+Wall\+Time\+In\+Ms (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Gets the current N\+TP (Network Time Protocol) time. 

In the real-\/time chorus scenario, especially when the downlink connections are inconsistent due to network issues among multiple receiving ends, you can call this method to obtain the current N\+TP time as the reference time, in order to align the lyrics and music of multiple receiving ends and achieve chorus synchronization.

\begin{DoxyReturn}{Returns}
The Unix timestamp (ms) of the current N\+TP time. 
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a90aef5ccd7a6002b407925c14ab11131}\label{classagora_1_1rtc_1_1_i_rtc_engine_a90aef5ccd7a6002b407925c14ab11131}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!isFeatureAvailableOnDevice@{isFeatureAvailableOnDevice}}
\index{isFeatureAvailableOnDevice@{isFeatureAvailableOnDevice}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{isFeatureAvailableOnDevice()}{isFeatureAvailableOnDevice()}}
{\footnotesize\ttfamily virtual bool agora\+::rtc\+::\+I\+Rtc\+Engine\+::is\+Feature\+Available\+On\+Device (\begin{DoxyParamCaption}\item[{Feature\+Type}]{type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Checks whether the device supports the specified advanced feature. 

\begin{DoxySince}{Since}
v4.\+3.\+0
\end{DoxySince}
Checks whether the capabilities of the current device meet the requirements for advanced features such as virtual background and image enhancement. Applicable scenarios\+: Before using advanced features, you can check whether the current device supports these features based on the call result. This helps to avoid performance degradation or unavailable features when enabling advanced features on low-\/end devices. Based on the return value of this method, you can decide whether to display or enable the corresponding feature button, or notify the user when the device\textquotesingle{}s capabilities are insufficient.


\begin{DoxyParams}{Parameters}
{\em type} & The type of the advanced feature, see {\ttfamily Feature\+Type}.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item {\ttfamily true}\+: The current device supports the specified feature.
\item {\ttfamily false}\+: The current device does not support the specified feature. 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_aebe07c328e87d4f374b06a437e2bacde}\label{classagora_1_1rtc_1_1_i_rtc_engine_aebe07c328e87d4f374b06a437e2bacde}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!sendAudioMetadata@{sendAudioMetadata}}
\index{sendAudioMetadata@{sendAudioMetadata}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{sendAudioMetadata()}{sendAudioMetadata()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::send\+Audio\+Metadata (\begin{DoxyParamCaption}\item[{const char $\ast$}]{metadata,  }\item[{size\+\_\+t}]{length }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



send audio metadata 

\begin{DoxySince}{Since}
v4.\+3.\+1 
\end{DoxySince}

\begin{DoxyParams}{Parameters}
{\em metadata} & The pointer of metadata \\
\hline
{\em length} & Size of metadata \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: success
\item $<$0\+: failure @technical preview 
\end{DoxyItemize}
\end{DoxyReturn}
\mbox{\Hypertarget{classagora_1_1rtc_1_1_i_rtc_engine_a8ba17007e0e12805eba89378d4c0b0cb}\label{classagora_1_1rtc_1_1_i_rtc_engine_a8ba17007e0e12805eba89378d4c0b0cb}} 
\index{agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}!queryHDRCapability@{queryHDRCapability}}
\index{queryHDRCapability@{queryHDRCapability}!agora::rtc::IRtcEngine@{agora::rtc::IRtcEngine}}
\doxysubsubsection{\texorpdfstring{queryHDRCapability()}{queryHDRCapability()}}
{\footnotesize\ttfamily virtual int agora\+::rtc\+::\+I\+Rtc\+Engine\+::query\+H\+D\+R\+Capability (\begin{DoxyParamCaption}\item[{V\+I\+D\+E\+O\+\_\+\+M\+O\+D\+U\+L\+E\+\_\+\+T\+Y\+PE}]{video\+Module,  }\item[{H\+D\+R\+\_\+\+C\+A\+P\+A\+B\+I\+L\+I\+TY \&}]{capability }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}



Queries the H\+DR capability of the video module. 

\begin{DoxySince}{Since}
v4.\+6.\+0 
\end{DoxySince}

\begin{DoxyParams}{Parameters}
{\em video\+Module} & The video module. See V\+I\+D\+E\+O\+\_\+\+M\+O\+D\+U\+L\+E\+\_\+\+T\+Y\+PE \\
\hline
{\em capability} & H\+DR capability of video module. See H\+D\+R\+\_\+\+C\+A\+P\+A\+B\+I\+L\+I\+TY \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}

\begin{DoxyItemize}
\item 0\+: success
\item $<$0\+: failure @technical preview 
\end{DoxyItemize}
\end{DoxyReturn}
