-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathmap.json
More file actions
1 lines (1 loc) · 340 KB
/
map.json
File metadata and controls
1 lines (1 loc) · 340 KB
1
{"/NTgCalls/Advanced Methods/Add Incoming Video.xml": "<page>\n <h1>Add Incoming Video</h1>\n <config id=\"ADD_INCOMING_VIDEO_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"9-13\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n endpoint = ...\n ssrc_groups = ...\n\n await app.add_incoming_video(\n -1001185324811,\n endpoint,\n ssrc_groups,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>add_incoming_video</sb></ref>() <shi>-> int</shi>\n </category-title>\n <subtext>\n <config id=\"ADD_INCOMING_VIDEO_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>endpoint</sb></ref>: <shi>str</shi></category-title>\n <config id=\"ENDPOINT_DESC\"/>\n <category-title><ref><sb>ssrc_groups</sb></ref>: <shi>list</shi>[<docs-ref link=\"/NTgCalls/Available Types/SsrcGroup\">ntgcalls.SsrcGroup</docs-ref>]</category-title>\n <config id=\"SSRC_GROUPS_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/Get Connection Mode.xml": "<page>\n <h1>Get Connection Mode</h1>\n <config id=\"GET_CONNECTION_MODE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"6-8\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n mode = await app.get_connection_mode(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>get_connection_mode</sb></ref>() <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Enums/ConnectionMode\">ntgcalls.ConnectionMode</docs-ref>\n </category-title>\n <subtext>\n <config id=\"GET_CONNECTION_MODE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/Get State.xml": "<page>\n <h1>Get State</h1>\n <config id=\"GET_STATE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n state = app.get_state(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\"><sb>get_state</sb></ref>() <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Types/MediaState\">ntgcalls.MediaState</docs-ref>\n </category-title>\n <subtext>\n <config id=\"GET_STATE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/Remove Incoming Video.xml": "<page>\n <h1>Remove Incoming Video</h1>\n <config id=\"REMOVE_INCOMING_VIDEO_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"8-11\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n endpoint = ...\n\n await app.remove_incoming_video(\n -1001185324811,\n endpoint,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>remove_incoming_video</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"REMOVE_INCOMING_VIDEO_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>endpoint</sb></ref>: <shi>str</shi></category-title>\n <config id=\"ENDPOINT_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/Send Broadcast Part.xml": "<page>\n <h1>Send Broadcast Part</h1>\n <config id=\"SEND_BROADCAST_PART_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"9-16\">\n from ntgcalls import NTgCalls\n from ntgcalls import MediaSegmentStatus\n ...\n\n app = NTgCalls()\n ...\n frame_data = ...\n\n await app.send_broadcast_part(\n -1001185324811,\n 1234567,\n 1,\n MediaSegmentStatus.SUCCESS,\n False,\n frame_data,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>send_broadcast_part</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_BROADCAST_PART_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>segment_id</sb></ref>: <shi>int</shi></category-title>\n <config id=\"BROADCAST_SEGMENT_ID_DESC\"/>\n <category-title><ref><sb>part_id</sb></ref>: <shi>int</shi></category-title>\n <config id=\"BROADCAST_PART_ID_DESC\"/>\n <category-title><ref><sb>status</sb></ref>: <docs-ref link=\"/NTgCalls/Available Enums/MediaSegmentStatus\">MediaSegmentStatus</docs-ref></category-title>\n <subtext><config id=\"MEDIA_SEGMENT_STATUS_DESC\"/></subtext>\n <category-title><ref><sb>quality_update</sb></ref>: <shi>bool</shi> </category-title>\n <config id=\"QUALITY_UPDATE_DESC\"/>\n <category-title><ref><sb>frame</sb></ref>: <shi>bytes</shi></category-title>\n <subtext><config id=\"FRAME_DATA_DESC\" /></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n <config id=\"BROADCAST_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/Send Broadcast Timestamp.xml": "<page>\n <h1>Send Broadcast Timestamp</h1>\n <config id=\"SEND_BROADCAST_TIMESTAMP_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"6-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n await app.send_broadcast_timestamp(\n -1001185324811,\n 1700000000,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>send_broadcast_timestamp</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_BROADCAST_TIMESTAMP_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>timestamp</sb></ref>: <shi>int</shi></category-title>\n <config id=\"BROADCAST_TIMESTAMP_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n <config id=\"BROADCAST_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/Send External Frame.xml": "<page>\n <h1>Send External Frame</h1>\n <config id=\"SEND_EXTERNAL_FRAME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"11-21\">\n from ntgcalls import NTgCalls\n from ntgcalls import StreamDevice\n from ntgcalls import FrameData\n from datetime import datetime\n ...\n\n app = NTgCalls()\n ...\n pcm16_le_data = ...\n\n await app.send_external_frame(\n -1001185324811,\n StreamDevice.MICROPHONE,\n pcm16_le_data,\n FrameData(\n int(datetime.now().timestamp()),\n 0,\n 0,\n 0,\n )\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>send_external_frame</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_EXTERNAL_FRAME_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>device</sb></ref>: <docs-ref link=\"/NTgCalls/Available Enums/StreamDevice\">ntgcalls.StreamDevice</docs-ref></category-title>\n <config id=\"DEVICE_DESC\"/>\n <category-title><ref><sb>frame</sb></ref>: <shi>bytes</shi></category-title>\n <config id=\"FRAME_BUFFER_DESC\"/>\n <category-title><ref><sb>frame_data</sb></ref>: <docs-ref link=\"/NTgCalls/Available Types/FrameData\">ntgcalls.FrameData</docs-ref></category-title>\n <subtext><config id=\"FRAME_DATA_DESC\"/></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/Send Signaling Data.xml": "<page>\n <h1>Send Signaling Data</h1>\n <config id=\"SEND_SIGNALING_DATA_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-10\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.send_signaling_data(\n -1001185324811,\n \"data\",\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>send_signaling_data</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_SIGNALING_DATA_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>data</sb></ref>: <shi>bytes</shi></category-title>\n <subtext><config id=\"SIGNALING_DATA_DESC\"/></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_add_incoming_video.xml": "<page>\n <h1>ntg_add_incoming_video</h1>\n <config id=\"ADD_INCOMING_VIDEO_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"14\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n char* endpoint = ...; // Obtain the endpoint of the incoming video\n ntg_ssrc_group_struct* ssrcGroups = ...; // Obtain the SSRC groups of the incoming video\n int size = ...; // Obtain the size of the SSRC groups array\n uint32_t ssrc_buffer;\n // Initialize the async struct\n ntg_async_struct future;\n ntg_add_incoming_video(ptr, chatID, endpoint, ssrcGroups, &ssrc_buffer, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_add_incoming_video</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"ADD_INCOMING_VIDEO_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><shi language=\"c\">char*</shi> <ref><sb>endpoint</sb></ref></category-title>\n <config id=\"ENDPOINT_DESC\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Types/ntg_ssrc_group_struct\">ntg_ssrc_group_struct</docs-ref><shi>*</shi> <ref><sb>ssrcGroups</sb></ref></category-title>\n <config id=\"SSRC_GROUPS_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>size</sb></ref></category-title>\n <subtext><text>The size of the SSRC groups array.</text></subtext>\n <category-title><shi language=\"c\">uint32_t*</shi> <ref><sb>buffer</sb></ref></category-title>\n <subtext><text>The buffer to store the SSRC of the incoming video.</text></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_calls.xml": "<page>\n <h1>ntg_calls</h1>\n <text>\n This function returns a list of <code>ntg_call_struct</code> instances,\n each containing information about an active group call associated with the channel or group.\n You should provide a buffer as an array of <code>ntg_call_struct</code>\n elements with a size matching the value returned by <code>ntg_calls_count</code>.\n The function populates this list with data for active group calls and returns the number of group calls retrieved.\n </text>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int size;\n ntg_call_struct* buffer;\n // Initialize the async struct\n ntg_async_struct future;\n int result = ntg_calls(ptr, &buffer, &size, &future);\n // Wait for the async operation to complete\n for (int i = 0; i < result; i++) {\n printf(\"Group Call %d:\\n\", i + 1);\n printf(\" Chat ID: %lld\\n\", buffer[i].chatId);\n printf(\" Status: %d\\n\", buffer[i].status);\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_calls</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"LIST_CALLS_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_call_struct\">ntg_call_struct</docs-ref><shi language=\"c\">**</shi> <ref><sb>buffer</sb></ref></category-title>\n <subtext><text>The pointer to a buffer that will hold the retrieved group call information.</text></subtext>\n\n <category-title><shi language=\"c\">int*</shi> <ref><sb>size</sb></ref></category-title>\n <subtext><text>A pointer to an integer that will be set to the number of calls retrieved.</text></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_C_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_cpu_usage.xml": "<page>\n <h1>ntg_cpu_usage</h1>\n <config id=\"CPU_USAGE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n double buffer;\n // Initialize the async struct\n ntg_async_struct future;\n int64_t usage = ntg_cpu_usage(ptr, &buffer, &future);\n // Wait for the async operation to complete and use\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_cpu_usage</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CPU_USAGE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">double</shi><shi language=\"c\">*</shi> <ref><sb>cpuUsage</sb></ref></category-title>\n <subtext><config id=\"CPU_USAGE_DESC3\"/></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_enable_g_lib_loop.xml": "<page>\n <h1>ntg_enable_g_lib_loop</h1>\n <config id=\"ENABLE_GLIB_LOOP_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"cpp\" mark=\"6\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n ...\n ntg_enable_g_lib_loop(true);\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_enable_g_lib_loop</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"ENABLE_GLIB_LOOP_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><shi>bool</shi> <ref><sb>enable</sb></ref></category-title>\n <config id=\"ENABLE_OR_DISABLE_GLIB_DESC\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_get_connection_mode.xml": "<page>\n <h1>ntg_get_connection_mode</h1>\n <config id=\"GET_CONNECTION_MODE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_connection_mode_enum buffer;\n ntg_async_struct future;\n ntg_get_connection_mode(ptr, chatID, &buffer, &future);\n ...\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_get_connection_mode</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"GET_CONNECTION_MODE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_connection_mode_enum\">ntg_connection_mode_enum</docs-ref><shi>*</shi> <ref><sb>connectionMode</sb></ref></category-title>\n <subtext><config id=\"CONNECTION_MODE_DESC\"/></subtext>\n\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_get_media_devices.xml": "<page>\n <h1>ntg_get_media_devices</h1>\n <config id=\"GET_MEDIA_DEVICES_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"9\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n ...\n ntg_media_devices_struct devices;\n // Initialize the async struct\n ntg_async_struct future;\n ntg_get_media_devices(&devices, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_get_media_devices</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"GET_MEDIA_DEVICES_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Types/ntg_media_devices_struct\">ntg_media_devices_struct</docs-ref><shi>*</shi> <ref><sb>buffer</sb></ref></category-title>\n <config id=\"MEDIA_DEVICES_DESC\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_get_protocol.xml": "<page>\n <h1>ntg_get_protocol</h1>\n <config id=\"GET_PROTOCOL_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"9\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_protocol_struct buffer;\n ntg_get_protocol(ptr, chatID, &buffer);\n ...\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_get_protocol</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"GET_PROTOCOL_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_protocol_struct\">ntg_protocol_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>protocol</sb></ref></category-title>\n <subtext><config id=\"PROTOCOL_DESC\"/></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_get_state.xml": "<page>\n <h1>ntg_get_state</h1>\n <config id=\"GET_STATE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_media_state_struct buffer;\n // Initialize the async struct\n ntg_async_struct future;\n ntg_get_state(ptr, chatID, &buffer, &future);\n // Wait for the async operation to complete and use\n // the buffer for EditGroupCallParticipant\n ...\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_get_state</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"GET_STATE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_media_state_struct\">ntg_media_state_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>mediaState</sb></ref></category-title>\n <subtext><config id=\"MEDIA_STATE_DESC\"/></subtext>\n\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_remove_incoming_video.xml": "<page>\n <h1>ntg_remove_incoming_video</h1>\n <config id=\"REMOVE_INCOMING_VIDEO_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n char* endpoint = ...; // Obtain the endpoint of the incoming video\n // Initialize the async struct\n ntg_async_struct future;\n ntg_remove_incoming_video(ptr, chatID, endpoint, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_remove_incoming_video</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"REMOVE_INCOMING_VIDEO_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><shi language=\"c\">char*</shi> <ref><sb>endpoint</sb></ref></category-title>\n <config id=\"ENDPOINT_DESC\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_send_broadcast_part.xml": "<page>\n <h1>ntg_send_broadcast_part</h1>\n <config id=\"SEND_BROADCAST_PART_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"15\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n int64_t segmentId = ...; // Obtain the segment ID\n int32_t partId = ...; // Obtain the part ID\n bool qualityUpdate = ...; // Obtain the quality update flag\n uint8_t* frame = ...; // Obtain the frame data\n int size = ...; // Obtain the size of the frame data\n // Initialize the async struct\n ntg_async_struct future;\n ntg_send_broadcast_part(ptr, chatID, segmentId, partId, NTG_MEDIA_SEGMENT_SUCCESS, qualityUpdate, frame, size, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_send_broadcast_part</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_BROADCAST_PART_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><shi language=\"c\">int64_t</shi> <ref><sb>segment_id</sb></ref></category-title>\n <config id=\"BROADCAST_SEGMENT_ID_DESC\"/>\n <category-title><shi language=\"c\">int32_t</shi> <ref><sb>part_id</sb></ref></category-title>\n <config id=\"BROADCAST_PART_ID_DESC\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_media_segment_status_enum\">ntg_media_segment_status_enum</docs-ref> <ref><sb>status</sb></ref></category-title>\n <subtext><config id=\"MEDIA_SEGMENT_STATUS_DESC\"/></subtext>\n <category-title><shi language=\"cpp\">bool</shi> <ref><sb>quality_update</sb></ref></category-title>\n <config id=\"QUALITY_UPDATE_DESC\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>frame</sb></ref></category-title>\n <subtext><config id=\"FRAME_DATA_DESC\" /></subtext>\n <category-title><shi language=\"c\">int</shi> <ref><sb>size</sb></ref></category-title>\n <subtext><text>The size of the frame data.</text></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"BROADCAST_EXCEPTIONS_C\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_send_broadcast_timestamp.xml": "<page>\n <h1>ntg_send_broadcast_timestamp</h1>\n <config id=\"SEND_BROADCAST_TIMESTAMP_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n int64_t timestamp = ...; // Obtain the timestamp\n // Initialize the async struct\n ntg_async_struct future;\n ntg_send_broadcast_timestamp(ptr, chatID, timestamp, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_send_broadcast_timestamp</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_BROADCAST_TIMESTAMP_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><shi language=\"c\">int64_t</shi> <ref><sb>timestamp</sb></ref></category-title>\n <config id=\"BROADCAST_TIMESTAMP_DESC\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"BROADCAST_EXCEPTIONS_C\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_send_external_frame.xml": "<page>\n <h1>ntg_send_external_frame</h1>\n <config id=\"SEND_EXTERNAL_FRAME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"18\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n uint8_t* pcm16_le_data = ...; // Obtain the PCM16 LE data\n int size = ...; // Obtain the size of the PCM16 LE data\n ntg_frame_data frame_data = {\n .timestamp = ..., // Obtain the timestamp\n .flags = 0,\n .rotation = 0,\n .layer = 0,\n };\n // Initialize the async struct\n ntg_async_struct future;\n ntg_send_external_frame(ptr, chatID, NTG_STREAM_DEVICE_MICROPHONE, pcm16_le_data, size, &frame_data, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_send_external_frame</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_EXTERNAL_FRAME_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_stream_device_enum\">ntg_stream_device_enum</docs-ref> <ref><sb>device</sb></ref></category-title>\n <config id=\"DEVICE_DESC\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>frame</sb></ref></category-title>\n <config id=\"FRAME_BUFFER_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>size</sb></ref></category-title>\n <subtext><text>The size of the PCM16 LE data.</text></subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Types/ntg_frame_data_struct\">ntg_frame_data_struct</docs-ref><shi>*</shi> <ref><sb>frame_data</sb></ref></category-title>\n <subtext><config id=\"FRAME_DATA_DESC\"/></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_send_signaling_data.xml": "<page>\n <h1>ntg_send_signaling_data</h1>\n <config id=\"SEND_SIGNALING_DATA_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"12\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n uint8_t* buffer = ...; // Obtain the signaling data\n int size = ...; // Obtain the size of the signaling data\n // Initialize the async struct\n ntg_async_struct future;\n ntg_send_signaling_data(ptr, chatID, buffer, size, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_send_signaling_data</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_SIGNALING_DATA_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><shi language=\"c\">uint8_t</shi><shi language=\"c\">*</shi> <ref><sb>data</sb></ref></category-title>\n <subtext><config id=\"SIGNALING_DATA_DESC\"/></subtext>\n <category-title><shi language=\"c\">int</shi> <ref><sb>size</sb></ref></category-title>\n <subtext><text>Size of the data</text></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Available Enums/ConnectionKind.xml": "<page>\n <h1>ConnectionKind</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>ConnectionKind</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CONNECTION_KIND_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NORMAL</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"CONNECTION_KIND_NORMAL_DESC\"/>\n <category-title><ref><sb>PRESENTATION</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"CONNECTION_KIND_PRESENTATION_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ConnectionMode.xml": "<page>\n <h1>ConnectionMode</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>ConnectionMode</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CONNECTION_MODE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>RTC</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"CONNECTION_MODE_RTC_DESC\"/>\n <category-title><ref><sb>STREAM</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"CONNECTION_MODE_STREAM_DESC\"/>\n <category-title><ref><sb>RTMP</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"CONNECTION_MODE_RTMP_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ConnectionState.xml": "<page>\n <h1>ConnectionState</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>ConnectionState</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CONNECTION_STATE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>CONNECTING</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"NTG_STATE_CONNECTING_DESC\"/>\n <category-title><ref><sb>CONNECTED</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"NTG_STATE_CONNECTED_DESC\"/>\n <category-title><ref><sb>FAILED</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"NTG_STATE_FAILED_DESC\"/>\n <category-title><ref><sb>TIMEOUT</sb></ref> <shi>=</shi> 3</category-title>\n <config id=\"NTG_STATE_TIMEOUT_DESC\"/>\n <category-title><ref><sb>CLOSED</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"NTG_STATE_CLOSED_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/MediaSegmentQuality.xml": "<page>\n <h1>MediaSegmentQuality</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>MediaSegmentQuality</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_SEGMENT_QUALITY_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NONE</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"MEDIA_SEGMENT_QUALITY_NONE_DESC\"/>\n <category-title><ref><sb>THUMBNAIL</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MEDIA_SEGMENT_QUALITY_THUMBNAIL_DESC\"/>\n <category-title><ref><sb>MEDIUM</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MEDIA_SEGMENT_QUALITY_MEDIUM_DESC\"/>\n <category-title><ref><sb>FULL</sb></ref> <shi>=</shi> 3</category-title>\n <config id=\"MEDIA_SEGMENT_QUALITY_FULL_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/MediaSegmentStatus.xml": "<page>\n <h1>MediaSegmentStatus</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>MediaSegmentStatus</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_SEGMENT_STATUS_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NOT_READY</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"MEDIA_SEGMENT_STATUS_NOT_READY_DESC\"/>\n <category-title><ref><sb>RESYNC_NEEDED</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MEDIA_SEGMENT_STATUS_RESYNC_NEEDED_DESC\"/>\n <category-title><ref><sb>SUCCESS</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MEDIA_SEGMENT_STATUS_SUCCESS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/MediaSource.xml": "<page>\n <h1>MediaSource</h1>\n <alert type=\"warning\">\n <text>This enum replaces the deprecated <code>InputMode</code> enum.</text>\n </alert>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>MediaSource</sb></ref>\n </category-title>\n <subtext>\n <config id=\"INPUT_MODE_DESC2\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>FILE</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MODE_FILE_DESC\"/>\n\n <category-title><ref><sb>SHELL</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MODE_SHELL_DESC\"/>\n\n <category-title><ref><sb>FFMPEG</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"MODE_FFMPEG_DESC\"/>\n\n <category-title><ref><sb>DEVICE</sb></ref> <shi>=</shi> 8</category-title>\n <config id=\"MODE_DEVICE_DESC\"/>\n\n <category-title><ref><sb>DESKTOP</sb></ref> <shi>=</shi> 16</category-title>\n <config id=\"MODE_DESKTOP_DESC\"/>\n\n <category-title><ref><sb>EXTERNAL</sb></ref> <shi>=</shi> 32</category-title>\n <config id=\"MODE_EXTERNAL_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/StreamDevice.xml": "<page>\n <h1>StreamDevice</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>StreamDevice</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_DEVICE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>MICROPHONE</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"STREAM_DEVICE_MICROPHONE_DESC\"/>\n\n <category-title><ref><sb>SPEAKER</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"STREAM_DEVICE_SPEAKER_DESC\"/>\n\n <category-title><ref><sb>CAMERA</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"STREAM_DEVICE_CAMERA_DESC\"/>\n\n <category-title><ref><sb>SCREEN</sb></ref> <shi>=</shi> 3</category-title>\n <config id=\"STREAM_DEVICE_SCREEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/StreamMode.xml": "<page>\n <h1>StreamMode</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>StreamMode</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_MODE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>CAPTURE</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"MODE_CAPTURE_DESC\"/>\n\n <category-title><ref><sb>PLAYBACK</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MODE_PLAYBACK_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/StreamStatus.xml": "<page>\n <h1>StreamStatus</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>StreamStatus</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_STATUS_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>PLAYING</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"STATUS_PLAYING_DESC\"/>\n\n <category-title><ref><sb>PAUSED</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"STATUS_PAUSED_DESC\"/>\n\n <category-title><ref><sb>IDLING</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"STATUS_IDLING_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/StreamType.xml": "<page>\n <h1>StreamType</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>StreamType</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_TYPE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>AUDIO</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"TYPE_AUDIO_DESC\"/>\n\n <category-title><ref><sb>VIDEO</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"TYPE_VIDEO_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_connection_kind_enum.xml": "<page>\n <h1>ntg_connection_kind_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_connection_kind_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CONNECTION_KIND_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_KIND_NORMAL</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"CONNECTION_KIND_NORMAL_DESC\"/>\n <category-title><ref><sb>NTG_KIND_PRESENTATION</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"CONNECTION_KIND_PRESENTATION_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_connection_mode_enum.xml": "<page>\n <h1>ntg_connection_mode_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_connection_mode_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CONNECTION_MODE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_CONNECTION_MODE_RTC</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"CONNECTION_MODE_RTC_DESC\"/>\n <category-title><ref><sb>NTG_CONNECTION_MODE_STREAM</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"CONNECTION_MODE_STREAM_DESC\"/>\n <category-title><ref><sb>NTG_CONNECTION_MODE_RTMP</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"CONNECTION_MODE_RTMP_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_connection_state_enum.xml": "<page>\n <h1>ntg_connection_state_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_connection_state_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CONNECTION_STATE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_STATE_CONNECTING</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"NTG_STATE_CONNECTING_DESC\"/>\n\n <category-title><ref><sb>NTG_STATE_CONNECTED</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"NTG_STATE_CONNECTED_DESC\"/>\n\n <category-title><ref><sb>NTG_STATE_FAILED</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"NTG_STATE_FAILED_DESC\"/>\n\n <category-title><ref><sb>NTG_STATE_TIMEOUT</sb></ref> <shi>=</shi> 3</category-title>\n <config id=\"NTG_STATE_TIMEOUT_DESC\"/>\n\n <category-title><ref><sb>NTG_STATE_CLOSED</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"NTG_STATE_CLOSED_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_log_level_enum.xml": "<page>\n <h1>ntg_log_level_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_log_level_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"LOG_LEVEL_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_LOG_DEBUG</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"NTG_LOG_DEBUG_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_INFO</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"LOG_LEVEL_INFO_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_WARNING</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"LOG_LEVEL_WARNING_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_ERROR</sb></ref> <shi>=</shi> 8</category-title>\n <config id=\"LOG_LEVEL_ERROR_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_UNKNOWN</sb></ref> <shi>=</shi> -1</category-title>\n <config id=\"LOG_LEVEL_UNKNOWN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_log_source_enum.xml": "<page>\n <h1>ntg_log_source_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_log_source_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"LOG_SOURCE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_LOG_WEBRTC</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"NTG_LOG_WEBRTC_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_SELF</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"NTG_LOG_SELF_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_media_segment_quality_enum.xml": "<page>\n <h1>ntg_media_segment_quality_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_media_segment_quality_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_SEGMENT_QUALITY_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_MEDIA_SEGMENT_QUALITY_NONE</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"MEDIA_SEGMENT_QUALITY_NONE_DESC\"/>\n <category-title><ref><sb>NTG_MEDIA_SEGMENT_QUALITY_THUMBNAIL</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MEDIA_SEGMENT_QUALITY_THUMBNAIL_DESC\"/>\n <category-title><ref><sb>NTG_MEDIA_SEGMENT_QUALITY_MEDIUM</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MEDIA_SEGMENT_QUALITY_MEDIUM_DESC\"/>\n <category-title><ref><sb>NTG_MEDIA_SEGMENT_QUALITY_FULL</sb></ref> <shi>=</shi> 3</category-title>\n <config id=\"MEDIA_SEGMENT_QUALITY_FULL_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_media_segment_status_enum.xml": "<page>\n <h1>ntg_media_segment_status_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_media_segment_status_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_SEGMENT_STATUS_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_MEDIA_SEGMENT_NOT_READY</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"MEDIA_SEGMENT_STATUS_NOT_READY_DESC\"/>\n <category-title><ref><sb>NTG_MEDIA_SEGMENT_RESYNC_NEEDED</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MEDIA_SEGMENT_STATUS_RESYNC_NEEDED_DESC\"/>\n <category-title><ref><sb>NTG_MEDIA_SEGMENT_SUCCESS</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MEDIA_SEGMENT_STATUS_SUCCESS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_media_source_enum.xml": "<page>\n <h1>ntg_media_source_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_media_source_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"INPUT_MODE_DESC2\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_FILE</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MODE_FILE_DESC\"/>\n\n <category-title><ref><sb>NTG_SHELL</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MODE_SHELL_DESC\"/>\n\n <category-title><ref><sb>NTG_FFMPEG</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"MODE_FFMPEG_DESC\"/>\n\n <category-title><ref><sb>NTG_DEVICE</sb></ref> <shi>=</shi> 8</category-title>\n <config id=\"MODE_DEVICE_DESC\"/>\n\n <category-title><ref><sb>NTG_DESKTOP</sb></ref> <shi>=</shi> 16</category-title>\n <config id=\"MODE_DESKTOP_DESC\"/>\n\n <category-title><ref><sb>NTG_EXTERNAL</sb></ref> <shi>=</shi> 32</category-title>\n <config id=\"MODE_EXTERNAL_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_stream_device_enum.xml": "<page>\n <h1>ntg_stream_device_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_stream_device_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_DEVICE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_STREAM_MICROPHONE</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"STREAM_DEVICE_MICROPHONE_DESC\"/>\n\n <category-title><ref><sb>NTG_STREAM_SPEAKER</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"STREAM_DEVICE_SPEAKER_DESC\"/>\n\n <category-title><ref><sb>NTG_STREAM_CAMERA</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"STREAM_DEVICE_CAMERA_DESC\"/>\n\n <category-title><ref><sb>NTG_STREAM_SCREEN</sb></ref> <shi>=</shi> 3</category-title>\n <config id=\"STREAM_DEVICE_SCREEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_stream_mode_enum.xml": "<page>\n <h1>ntg_stream_mode_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_stream_mode_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_MODE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_STREAM_CAPTURE</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"MODE_CAPTURE_DESC\"/>\n\n <category-title><ref><sb>NTG_STREAM_PLAYBACK</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MODE_PLAYBACK_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_stream_status_enum.xml": "<page>\n <h1>ntg_stream_status_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_stream_status_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_STATUS_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_PLAYING</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"STATUS_PLAYING_DESC\"/>\n\n <category-title><ref><sb>NTG_PAUSED</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"STATUS_PAUSED_DESC\"/>\n\n <category-title><ref><sb>NTG_IDLING</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"STATUS_IDLING_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_stream_type_enum.xml": "<page>\n <h1>ntg_stream_type_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_stream_type_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_TYPE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_STREAM_AUDIO</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"TYPE_AUDIO_DESC\"/>\n\n <category-title><ref><sb>NTG_STREAM_VIDEO</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"TYPE_VIDEO_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_audio_description_struct.xml": "<page>\n <h1>ntg_audio_description_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_audio_description_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUDIO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_MEDIA_SOURCE\"/>\n <config id=\"ARG_C_INPUT_MEDIA\"/>\n\n <category-title><shi language=\"c\">uint32_t</shi> <ref>sampleRate</ref></category-title>\n <config id=\"AUDIO_SAMPLE_DESC\"/>\n\n <category-title><shi language=\"c\">uint8_t</shi> <ref>channelCount</ref></category-title>\n <config id=\"AUDIO_CHAN_DESC\"/>\n\n <category-title><shi language=\"c++\">bool</shi> <ref>keepOpen</ref></category-title>\n <config id=\"KEEP_OPEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_auth_params_struct.xml": "<page>\n <h1>ntg_auth_params_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_auth_params_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUTH_PARAMS_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref>g_a_or_b</ref></category-title>\n <config id=\"G_A_OR_B_DESC\"/>\n\n <category-title><shi language=\"c\">int</shi> <ref>sizeGAB</ref></category-title>\n <subtext><text>Size of the parameter for key exchange</text></subtext>\n\n <category-title><shi language=\"c\">int64_t</shi> <ref>key_fingerprint</ref></category-title>\n <config id=\"KEY_FINGERPRINT_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_call_info_struct.xml": "<page>\n <h1>ntg_call_info_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_call_info_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CALL_INFO_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">int64_t</shi> <sb><ref>chatID</ref></sb></category-title>\n <config id=\"CHAT_ID_DESC\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Types/ntg_stream_status_enum\">ntg_stream_status_enum</docs-ref> <ref>playback</ref></category-title>\n <config id=\"PLAYBACK_DESC\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Types/ntg_stream_status_enum\">ntg_stream_status_enum</docs-ref> <ref>capture</ref></category-title>\n <config id=\"CAPTURE_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_device_info_struct.xml": "<page>\n <h1>ntg_device_info_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_device_info_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"DEVICE_INFO_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">char*</shi> <sb><ref>name</ref></sb></category-title>\n <config id=\"DEVICE_NAME_DESC\"/>\n\n <category-title><shi language=\"c\">char*</shi> <sb><ref>metadata</ref></sb></category-title>\n <config id=\"DEVICE_METADATA_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_dh_config_struct.xml": "<page>\n <h1>ntg_dh_config_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_dh_config_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"DH_CONFIG_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">int32_t</shi> <ref>g</ref></category-title>\n <config id=\"G_DESC\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref>p</ref></category-title>\n <config id=\"P_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>sizeP</ref></category-title>\n <subtext><text>Size of the parameter for key exchange</text></subtext>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref>random</ref></category-title>\n <config id=\"R_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>sizeRandom</ref></category-title>\n <subtext><text>Size of the random number</text></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_frame_data_struct.xml": "<page>\n <h1>ntg_frame_data_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_frame_data_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"FRAME_DATA_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><shi language=\"c\">int64_t</shi> <sb><ref>absolute_capture_timestamp_ms</ref></sb></category-title>\n <config id=\"FRAME_DATA_ABSOLUTE_CAPTURE_TIMESTAMP_MS_DESC\"/>\n\n <category-title><shi language=\"c\">uint16_t</shi> <sb><ref>rotation</ref></sb></category-title>\n <config id=\"FRAME_DATA_ROTATION_DESC\"/>\n\n <category-title><shi language=\"c\">uint16_t</shi> <sb><ref>width</ref></sb></category-title>\n <config id=\"FRAME_DATA_WIDTH_DESC\"/>\n\n <category-title><shi language=\"c\">uint16_t</shi> <sb><ref>height</ref></sb></category-title>\n <config id=\"FRAME_DATA_HEIGHT_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_frame_struct.xml": "<page>\n <h1>ntg_frame_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_frame_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"FRAME_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">int64_t</shi> <sb><ref>ssrc</ref></sb></category-title>\n <config id=\"SSRC_DESC\"/>\n\n <category-title><shi language=\"c\">uint8_t*</shi> <sb><ref>data</ref></sb></category-title>\n <config id=\"FRAME_BUFFER_DESC\"/>\n\n <category-title><shi language=\"c\">int</shi> <sb><ref>size</ref></sb></category-title>\n <subtext><text>Size of the frame buffer</text></subtext>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_frame_data_struct\">ntg_frame_data_struct</docs-ref> <ref>frame_data</ref></category-title>\n <subtext><config id=\"FRAME_DATA_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_log_message_struct.xml": "<page>\n <h1>ntg_log_message_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_log_message_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"LOG_MESSAGE_STRUCT_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_log_level_enum\">ntg_log_level_enum</docs-ref> <ref><sb>level</sb></ref></category-title>\n <subtext><config id=\"LOG_LEVEL_DESC\"/></subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_log_source_enum\">ntg_log_source_enum</docs-ref> <ref><sb>source</sb></ref></category-title>\n <subtext><config id=\"LOG_SOURCE_DESC\"/></subtext>\n <category-title><shi language=\"c\">char*</shi> <ref><sb>file</sb></ref></category-title>\n <subtext><config id=\"LOG_FILE_DESC\"/></subtext>\n <category-title><shi language=\"c\">uint32_t</shi> <ref><sb>line</sb></ref></category-title>\n <subtext><config id=\"LOG_LINE_DESC\"/></subtext>\n <category-title><shi language=\"c\">char*</shi> <ref><sb>message</sb></ref></category-title>\n <subtext><config id=\"LOG_MESSAGE_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_media_description_struct.xml": "<page>\n <h1>ntg_media_description_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_media_description_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_audio_description_struct\">ntg_audio_description_struct</docs-ref><shi language=\"c\">*</shi> <ref>microphone</ref></category-title>\n <config id=\"MICROPHONE_DESC\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_audio_description_struct\">ntg_audio_description_struct</docs-ref><shi language=\"c\">*</shi> <ref>speaker</ref></category-title>\n <config id=\"SPEAKER_DESC\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_video_description_struct\">ntg_video_description_struct</docs-ref><shi language=\"c\">*</shi> <ref>camera</ref></category-title>\n <config id=\"CAMERA_DESC\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_video_description_struct\">ntg_video_description_struct</docs-ref><shi language=\"c\">*</shi> <ref>screen</ref></category-title>\n <config id=\"SCREEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_media_devices_struct.xml": "<page>\n <h1>ntg_media_devices_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_media_devices_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_DEVICES_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_device_info_struct\">ntg_device_info_struct</docs-ref><shi language=\"c\">*</shi> <ref>microphone</ref></category-title>\n <config id=\"MICROPHONE_DEVICES_DESC\"/>\n\n <category-title><shi language=\"c\">int</shi> <ref>sizeMicrophone</ref></category-title>\n <subtext><text>Size of the microphone list</text></subtext>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_device_info_struct\">ntg_device_info_struct</docs-ref><shi language=\"c\">*</shi> <ref>speaker</ref></category-title>\n <config id=\"SPEAKER_DEVICES_DESC\"/>\n\n <category-title><shi language=\"c\">int</shi> <ref>sizeSpeaker</ref></category-title>\n <subtext><text>Size of the speaker list</text></subtext>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_device_info_struct\">ntg_device_info_struct</docs-ref><shi language=\"c\">*</shi> <ref>camera</ref></category-title>\n <config id=\"CAMERA_DEVICES_DESC\"/>\n\n <category-title><shi language=\"c\">int</shi> <ref>sizeCamera</ref></category-title>\n <subtext><text>Size of the camera list</text></subtext>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_device_info_struct\">ntg_device_info_struct</docs-ref><shi language=\"c\">*</shi> <ref>screen</ref></category-title>\n <config id=\"SCREEN_DEVICES_DESC\"/>\n\n <category-title><shi language=\"c\">int</shi> <ref>sizeScreen</ref></category-title>\n <subtext><text>Size of the screen list</text></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_media_state_struct.xml": "<page>\n <h1>ntg_media_state_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_media_state_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_STATE_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c++\">bool</shi> <ref>muted</ref></category-title>\n <config id=\"MEDIA_MUTED_DESC\"/>\n\n <category-title><shi language=\"c++\">bool</shi> <ref>videoPaused</ref></category-title>\n <config id=\"MEDIA_PAUSED_DESC\"/>\n\n <category-title><shi language=\"c++\">bool</shi> <ref>videoStopped</ref></category-title>\n <config id=\"MEDIA_STOPPED_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_network_info_struct.xml": "<page>\n <h1>ntg_network_info_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_network_info_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"NETWORK_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_connection_state_enum\">ntg_connection_state_enum</docs-ref> <ref>state</ref></category-title>\n <config id=\"CONNECTION_STATE_DESC2\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_connection_kind_enum\">ntg_connection_kind_enum</docs-ref> <ref>kind</ref></category-title>\n <subtext><config id=\"CONNECTION_KIND_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_protocol_struct.xml": "<page>\n <h1>ntg_protocol_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_protocol_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"PROTOCOL_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <category-title><shi language=\"c\">int32_t</shi> <ref>minLayer</ref></category-title>\n <config id=\"MIN_LAYER_DESC\"/>\n <category-title><shi language=\"c\">int32_t</shi> <ref>maxLayer</ref></category-title>\n <config id=\"MAX_LAYER_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>udpP2P</ref></category-title>\n <config id=\"UDP_P2P_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>udpReflector</ref></category-title>\n <config id=\"UDP_REFLECTOR_DESC\"/>\n <category-title><shi language=\"c\">char**</shi> <ref>libraryVersions</ref></category-title>\n <config id=\"LIBRARY_VERSIONS_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>libraryVersionsSize</ref></category-title>\n <subtext><text>Size of the libraryVersions array.</text></subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_remote_source_struct.xml": "<page>\n <h1>ntg_remote_source_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_remote_source_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"REMOTE_SOURCE_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">uint32_t</shi> <ref>ssrc</ref></category-title>\n <config id=\"SSRC_DESC\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_stream_status_enum\">ntg_stream_status_enum</docs-ref> <ref>state</ref></category-title>\n <config id=\"STREAM_STATUS_DESC2\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_stream_device_enum\">ntg_stream_device_enum</docs-ref> <ref>device</ref></category-title>\n <config id=\"STREAM_DEVICE_DESC2\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_rtc_server_struct.xml": "<page>\n <h1>ntg_rtc_server_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_rtc_server_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"RTC_SERVER_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">uint64_t</shi> <ref>id</ref></category-title>\n <config id=\"RTC_ID_DESC\"/>\n <category-title><shi language=\"c\">char*</shi> <ref>ipv4</ref></category-title>\n <config id=\"RTC_IPV4_DESC\"/>\n <category-title><shi language=\"c\">char*</shi> <ref>ipv6</ref></category-title>\n <config id=\"RTC_IPV6_DESC\"/>\n <category-title><shi language=\"c\">char*</shi> <ref>username</ref></category-title>\n <config id=\"RTC_USERNAME_DESC\"/>\n <category-title><shi language=\"c\">char*</shi> <ref>password</ref></category-title>\n <config id=\"RTC_PASSWORD_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>port</ref></category-title>\n <config id=\"RTC_PORT_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>turn</ref></category-title>\n <config id=\"RTC_TURN_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>stun</ref></category-title>\n <config id=\"RTC_STUN_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>tcp</ref></category-title>\n <config id=\"RTC_TCP_DESC\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref>peerTag</ref></category-title>\n <config id=\"RTC_PEER_TAG_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>sizePeerTag</ref></category-title>\n <subtext><text>Size of the peer tag</text></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_segment_part_request_struct.xml": "<page>\n <h1>ntg_segment_part_request_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_segment_part_request_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"SEGMENT_PART_REQUEST_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">int</shi> <ref>segmentId</ref></category-title>\n <config id=\"BROADCAST_SEGMENT_ID_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>partId</ref></category-title>\n <config id=\"BROADCAST_PART_ID_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>limit</ref></category-title>\n <config id=\"SEGMENT_PART_REQUEST_LIMIT_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>timestamp</ref></category-title>\n <config id=\"BROADCAST_TIMESTAMP_DESC\"/>\n <category-title><shi language=\"cpp\">bool</shi> <ref>qualityUpdate</ref></category-title>\n <config id=\"QUALITY_UPDATE_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>channelId</ref></category-title>\n <config id=\"BROADCAST_CHANNEL_ID_DESC\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_media_segment_quality_enum\">ntg_media_segment_quality_enum</docs-ref> <ref>quality</ref></category-title>\n <subtext><config id=\"MEDIA_SEGMENT_QUALITY_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_ssrc_group_struct.xml": "<page>\n <h1>ntg_ssrc_group_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_ssrc_group_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"SSRC_GROUP_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">char*</shi> <ref>semantics</ref></category-title>\n <config id=\"SSRC_GROUP_SEMANTICS_DESC\"/>\n\n <category-title><shi language=\"c\">int*</shi> <ref>ssrcs</ref></category-title>\n <config id=\"SSRC_GROUP_SSRCS_DESC\"/>\n\n <category-title><shi language=\"c\">int</shi> <ref>sizeSsrcs</ref></category-title>\n <subtext><text>Sizes of the ssrcs list</text></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_video_description_struct.xml": "<page>\n <h1>ntg_video_description_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_video_description_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"VIDEO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_MEDIA_SOURCE\"/>\n <config id=\"ARG_C_INPUT_MEDIA\"/>\n\n <category-title><shi language=\"c\">int16_t</shi> <ref>width</ref></category-title>\n <config id=\"VIDEO_WIDTH_DESC\"/>\n\n <category-title><shi language=\"c\">int16_t</shi> <ref>height</ref></category-title>\n <config id=\"VIDEO_HEIGHT_DESC\"/>\n\n <category-title><shi language=\"c\">uint8_t</shi> <ref>fps</ref></category-title>\n <config id=\"VIDEO_FPS_DESC\"/>\n\n <category-title><shi language=\"c++\">bool</shi> <ref>keepOpen</ref></category-title>\n <config id=\"KEEP_OPEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/AudioDescription.xml": "<page>\n <h1>AudioDescription</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>AudioDescription</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUDIO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_MEDIA_SOURCE\"/>\n\n <category-title><ref>sample_rate</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_SAMPLE_DESC\"/>\n\n <category-title><ref>channel_count</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_CHAN_DESC\"/>\n\n <config id=\"ARG_INPUT_MEDIA\"/>\n\n <category-title><ref>keep_open</ref>: <shi>bool</shi></category-title>\n <config id=\"KEEP_OPEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/AuthParams.xml": "<page>\n <h1>AuthParams</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>AuthParams</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUTH_PARAMS_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>g_a_or_b</ref> <shi>-> bytes</shi></category-title>\n <config id=\"G_A_OR_B_DESC\"/>\n <category-title><ref>key_fingerprint</ref> <shi>-> int</shi></category-title>\n <config id=\"KEY_FINGERPRINT_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/CallInfo.xml": "<page>\n <h1>MediaInfo</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>CallInfo</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CALL_INFO_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>playback</ref> <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Enums/StreamStatus\">ntgcalls.StreamStatus</docs-ref></category-title>\n <config id=\"PLAYBACK_DESC\"/>\n\n <category-title><ref>capture</ref> <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Enums/StreamStatus\">ntgcalls.StreamStatus</docs-ref></category-title>\n <config id=\"CAPTURE_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/DeviceInfo.xml": "<page>\n <h1>DeviceInfo</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>DeviceInfo</sb></ref>\n </category-title>\n <subtext>\n <config id=\"DEVICE_INFO_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>name</ref> <shi>-> str</shi></category-title>\n <config id=\"DEVICE_NAME_DESC\"/>\n\n <category-title><ref>metadata</ref> <shi>-> str</shi></category-title>\n <config id=\"DEVICE_METADATA_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/DhConfig.xml": "<page>\n <h1>DhConfig</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>DhConfig</sb></ref>\n </category-title>\n <subtext>\n <config id=\"DH_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>g</ref>: <shi>int</shi></category-title>\n <config id=\"G_DESC\"/>\n <category-title><ref>p</ref>: <shi>bytes</shi></category-title>\n <config id=\"P_DESC\"/>\n <category-title><ref>random</ref>: <shi>bytes</shi></category-title>\n <config id=\"R_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/Frame.xml": "<page>\n <h1>Frame</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>Frame</sb></ref>\n </category-title>\n <subtext>\n <config id=\"FRAME_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>ssrc</ref>: <shi>int</shi></category-title>\n <config id=\"SSRC_DESC\"/>\n\n <category-title><ref>data</ref>: <shi>bytes</shi></category-title>\n <config id=\"FRAME_BUFFER_DESC\"/>\n\n <category-title><ref>frame_data</ref>: <docs-ref link=\"/NTgCalls/Available Types/FrameData\">ntgcalls.FrameData</docs-ref></category-title>\n <subtext><config id=\"FRAME_DATA_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/FrameData.xml": "<page>\n <h1>FrameData</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>FrameData</sb></ref>\n </category-title>\n <subtext>\n <config id=\"FRAME_DATA_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>absolute_capture_timestamp_ms</ref>: <shi>int</shi></category-title>\n <config id=\"FRAME_DATA_ABSOLUTE_CAPTURE_TIMESTAMP_MS_DESC\"/>\n\n <category-title><ref>rotation</ref>: <shi>int</shi></category-title>\n <config id=\"FRAME_DATA_ROTATION_DESC\"/>\n\n <category-title><ref>width</ref>: <shi>int</shi></category-title>\n <config id=\"FRAME_DATA_WIDTH_DESC\"/>\n\n <category-title><ref>height</ref>: <shi>int</shi></category-title>\n <config id=\"FRAME_DATA_HEIGHT_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/MediaDescription.xml": "<page>\n <h1>MediaDescription</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>MediaDescription</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>microphone</ref>: <shi>Optional[</shi><docs-ref link=\"/NTgCalls/Available Types/AudioDescription\">ntgcalls.AudioDescription</docs-ref><shi>]</shi></category-title>\n <config id=\"MICROPHONE_DESC\"/>\n\n <category-title><ref>speaker</ref>: <shi>Optional[</shi><docs-ref link=\"/NTgCalls/Available Types/AudioDescription\">ntgcalls.AudioDescription</docs-ref><shi>]</shi></category-title>\n <config id=\"SPEAKER_DESC\"/>\n\n <category-title><ref>camera</ref>: <shi>Optional[</shi><docs-ref link=\"/NTgCalls/Available Types/VideoDescription\">ntgcalls.VideoDescription</docs-ref><shi>]</shi></category-title>\n <config id=\"CAMERA_DESC\"/>\n\n <category-title><ref>screen</ref>: <shi>Optional[</shi><docs-ref link=\"/NTgCalls/Available Types/VideoDescription\">ntgcalls.VideoDescription</docs-ref><shi>]</shi></category-title>\n <config id=\"SCREEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/MediaDevices.xml": "<page>\n <h1>Media Devices</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>MediaDevices</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_DEVICES_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>microphone</ref> <shi>-> list</shi>[<docs-ref link=\"/NTgCalls/Available Types/DeviceInfo\">ntgcalls.DeviceInfo</docs-ref>]</category-title>\n <config id=\"MICROPHONE_DEVICES_DESC\"/>\n\n <category-title><ref>speaker</ref> <shi>-> list</shi>[<docs-ref link=\"/NTgCalls/Available Types/DeviceInfo\">ntgcalls.DeviceInfo</docs-ref>]</category-title>\n <config id=\"SPEAKER_DEVICES_DESC\"/>\n\n <category-title><ref>camera</ref> <shi>-> list</shi>[<docs-ref link=\"/NTgCalls/Available Types/DeviceInfo\">ntgcalls.DeviceInfo</docs-ref>]</category-title>\n <config id=\"CAMERA_DEVICES_DESC\"/>\n\n <category-title><ref>screen</ref> <shi>-> list</shi>[<docs-ref link=\"/NTgCalls/Available Types/DeviceInfo\">ntgcalls.DeviceInfo</docs-ref>]</category-title>\n <config id=\"SCREEN_DEVICES_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/MediaState.xml": "<page>\n <h1>MediaState</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>MediaState</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_STATE_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref><sb>muted</sb></ref> <shi>-> bool</shi></category-title>\n <config id=\"MEDIA_MUTED_DESC\"/>\n\n <category-title><ref><sb>video_paused</sb></ref> <shi>-> bool</shi></category-title>\n <config id=\"MEDIA_PAUSED_DESC\"/>\n\n <category-title><ref><sb>video_stopped</sb></ref> <shi>-> bool</shi></category-title>\n <config id=\"MEDIA_STOPPED_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/NetworkInfo.xml": "<page>\n <h1>NetworkInfo</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>NetworkInfo</sb></ref>\n </category-title>\n <subtext>\n <config id=\"NETWORK_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>state</ref> <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Enums/ConnectionState\">ntgcalls.ConnectionState</docs-ref></category-title>\n <config id=\"CONNECTION_STATE_DESC2\"/>\n\n <category-title><ref>kind</ref> <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Enums/ConnectionKind\">ntgcalls.ConnectionKind</docs-ref></category-title>\n <subtext><config id=\"CONNECTION_KIND_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/Protocol.xml": "<page>\n <h1>Protocol</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\"><sb>Protocol</sb></ref>\n </category-title>\n <subtext>\n <config id=\"PROTOCOL_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>min_layer</ref> <shi>-> int</shi></category-title>\n <config id=\"MIN_LAYER_DESC\"/>\n <category-title><ref>max_layer</ref> <shi>-> int</shi></category-title>\n <config id=\"MAX_LAYER_DESC\"/>\n <category-title><ref>udp_p2p</ref> <shi>-> bool</shi></category-title>\n <config id=\"UDP_P2P_DESC\"/>\n <category-title><ref>udp_reflector</ref> <shi>-> bool</shi></category-title>\n <config id=\"UDP_REFLECTOR_DESC\"/>\n <category-title><ref>library_versions</ref> <shi>-> list</shi>[<shi>str</shi>]</category-title>\n <config id=\"LIBRARY_VERSIONS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/RTCServer.xml": "<page>\n <h1>RTCServer</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>RTCServer</sb></ref>\n </category-title>\n <subtext>\n <config id=\"RTC_SERVER_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>id</ref>: <shi>int</shi></category-title>\n <config id=\"RTC_ID_DESC\"/>\n <category-title><ref>ipv4</ref>: <shi>str</shi></category-title>\n <config id=\"RTC_IPV4_DESC\"/>\n <category-title><ref>ipv6</ref>: <shi>str</shi></category-title>\n <config id=\"RTC_IPV6_DESC\"/>\n <category-title><ref>username</ref>: Optional[<shi>str</shi>]</category-title>\n <config id=\"RTC_USERNAME_DESC\"/>\n <category-title><ref>password</ref>: Optional[<shi>str</shi>]</category-title>\n <config id=\"RTC_PASSWORD_DESC\"/>\n <category-title><ref>port</ref>: <shi>int</shi></category-title>\n <config id=\"RTC_PORT_DESC\"/>\n <category-title><ref>turn</ref>: <shi>bool</shi></category-title>\n <config id=\"RTC_TURN_DESC\"/>\n <category-title><ref>stun</ref>: <shi>bool</shi></category-title>\n <config id=\"RTC_STUN_DESC\"/>\n <category-title><ref>tcp</ref>: <shi>bool</shi></category-title>\n <config id=\"RTC_TCP_DESC\"/>\n <category-title><ref>peer_tag</ref>: Optional[<shi>bytes</shi>]</category-title>\n <config id=\"RTC_PEER_TAG_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/RemoteSource.xml": "<page>\n <h1>RemoteSource</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>RemoteSource</sb></ref>\n </category-title>\n <subtext>\n <config id=\"REMOTE_SOURCE_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>ssrc</ref> <shi>-> int</shi></category-title>\n <config id=\"SSRC_DESC\"/>\n\n <category-title><ref>state</ref> <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Enums/StreamStatus\">ntgcalls.StreamStatus</docs-ref></category-title>\n <config id=\"STREAM_STATUS_DESC2\"/>\n\n <category-title><ref>device</ref> <shi>-> </shi> <docs-ref link=\"/NTgCalls/Available Enums/StreamDevice\">ntgcalls.StreamDevice</docs-ref></category-title>\n <config id=\"STREAM_DEVICE_DESC2\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/SegmentPartRequest.xml": "<page>\n <h1>SegmentPartRequest</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>SegmentPartRequest</sb></ref>\n </category-title>\n <subtext>\n <config id=\"SEGMENT_PART_REQUEST_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>segment_id</ref>: <shi>int</shi></category-title>\n <config id=\"BROADCAST_SEGMENT_ID_DESC\"/>\n <category-title><ref>part_id</ref>: <shi>int</shi></category-title>\n <config id=\"BROADCAST_PART_ID_DESC\"/>\n <category-title><ref>limit</ref>: <shi>int</shi></category-title>\n <config id=\"SEGMENT_PART_REQUEST_LIMIT_DESC\"/>\n <category-title><ref>timestamp</ref>: <shi>int</shi></category-title>\n <config id=\"BROADCAST_TIMESTAMP_DESC\"/>\n <category-title><ref>quality_update</ref>: <shi>bool</shi></category-title>\n <config id=\"QUALITY_UPDATE_DESC\"/>\n <category-title><ref>channel_id</ref>: <shi>int</shi></category-title>\n <config id=\"BROADCAST_CHANNEL_ID_DESC\"/>\n <category-title><ref>quality</ref>: <docs-ref link=\"/NTgCalls/Available Enums/MediaSegmentQuality\">ntgcalls.MediaSegmentQuality</docs-ref></category-title>\n <subtext><config id=\"MEDIA_SEGMENT_QUALITY_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/SsrcGroup.xml": "<page>\n <h1>SsrcGroup</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>SsrcGroup</sb></ref>\n </category-title>\n <subtext>\n <config id=\"SSRC_GROUP_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>semantics</ref> <shi>-> str</shi></category-title>\n <config id=\"SSRC_GROUP_SEMANTICS_DESC\"/>\n\n <category-title><ref>ssrcs</ref> <shi>-> </shi> <shi>list</shi>[<shi>int</shi>]</category-title>\n <config id=\"SSRC_GROUP_SSRCS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/VideoDescription.xml": "<page>\n <h1>VideoDescription</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>VideoDescription</sb></ref>\n </category-title>\n <subtext>\n <config id=\"VIDEO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_MEDIA_SOURCE\"/>\n\n <config id=\"ARG_VIDEO_CONFIG\"/>\n\n <category-title><ref>fps</ref>: <shi>int</shi></category-title>\n <config id=\"VIDEO_FPS_DESC\"/>\n\n <config id=\"ARG_INPUT_MEDIA\"/>\n\n <category-title><ref>keep_open</ref>: <shi>bool</shi></category-title>\n <config id=\"KEEP_OPEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Connect P2P.xml": "<page>\n <p2p-banner/>\n <h1>Connect P2P</h1>\n <config id=\"CONNECT_P2P_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"9-14\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n rtc_servers = ... # Obtain the RTC servers\n dh_config = ... # Obtain the DH configuration\n versions = ... # Obtain the library versions\n p2p_allowed = ... # Obtain whether P2P is allowed\n await app.connect_p2p(\n -1001185324811,\n rtc_servers,\n versions,\n p2p_allowed\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title>\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>connect_p2p</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CONNECT_P2P_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>rtc_servers</sb></ref>: <shi>list</shi>[<docs-ref link=\"/NTgCalls/Available Types/RTCServer\">ntgcalls.RTCServer</docs-ref>]</category-title>\n <config id=\"RTC_SERVERS_DESC\"/>\n <category-title><ref><sb>versions</sb></ref>: <shi>list</shi>[<shi>str</shi>]</category-title>\n <config id=\"LIBRARY_VERSIONS_DESC\"/>\n <category-title><ref><sb>p2p_allowed</sb></ref>: <shi>bool</shi></category-title>\n <config id=\"P2P_ALLOWED_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"P2P_CONN_ERROR\"/>\n <config id=\"CRYPTO_ERROR\"/>\n <category-title>exception <ref>ntgcalls.<sb>SignalingError</sb></ref></category-title>\n <subtext><config id=\"SIGNALING_ERROR_DESC\"/></subtext>\n <category-title>exception <ref>ntgcalls.<sb>SignalingUnsupported</sb></ref></category-title>\n <subtext><config id=\"SIGNALING_UNSUPPORTED_DESC\"/></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Connect.xml": "<page>\n <h1>Connect</h1>\n <config id=\"CONNECT_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"8-11\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n tg_params = ...\n\n await app.connect(\n -1001185324811,\n tg_params,\n False,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>connect</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CONNECT_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref>params</ref>: <shi>str</shi></category-title>\n <config id=\"TG_PARAMS_DESC\"/>\n <category-title><ref>is_presentation</ref>: <shi>bool</shi></category-title>\n <config id=\"IS_PRESENTATION_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n <config id=\"TELEGRAM_EXCEPTION\"/>\n <config id=\"TRANSPORT_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Create Call.xml": "<page>\n <h1>Create Call</h1>\n <config id=\"CREATE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"6-17\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n\n params = await app.create_call(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>create_call</sb></ref>() <shi>-> str</shi>\n </category-title>\n <subtext>\n <config id=\"CREATE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <category-title>exception <ref>ntgcalls.<sb>ConnectionError</sb></ref></category-title>\n <subtext><text>You are attempting to init an already existent Group Call.</text></subtext>\n <config id=\"NTG_STREAM_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Create P2P Call.xml": "<page>\n <p2p-banner/>\n <h1>Create P2P Call</h1>\n <config id=\"CREATE_P2P_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"6-17\">\n from ntgcalls import NTgCalls\n ...\n app = NTgCalls()\n ...\n\n await app.create_p2p_call(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>create_p2p_call</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CREATE_P2P_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"P2P_CONN_ERROR\"/>\n <config id=\"NTG_STREAM_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Exchange Keys.xml": "<page>\n <p2p-banner/>\n <h1>Exchange Keys</h1>\n <config id=\"EXCHANGE_KEYS_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-11\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n g_a_or_b = ... # Obtain the parameter for key exchange\n fingerprint = ... # Obtain the fingerprint (Optional for outgoing calls)\n params = await app.exchange_keys(\n -1001185324811,\n g_a_or_b,\n fingerprint\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title>\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>exchange_keys</sb></ref>() <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Types/AuthParams\">ntgcalls.AuthParams</docs-ref>\n </category-title>\n <subtext>\n <config id=\"EXCHANGE_KEYS_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>g_a_or_b</sb></ref>: <shi>bytes</shi></category-title>\n <config id=\"G_A_OR_B_DESC\"/>\n <category-title><ref><sb>fingerprint</sb></ref>: <shi>int</shi></category-title>\n <config id=\"FINGERPRINT_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"P2P_CONN_ERROR\"/>\n <config id=\"CRYPTO_ERROR\"/>\n <category-title>exception <ref>ntgcalls.<sb>InvalidParams</sb></ref></category-title>\n <subtext><config id=\"MISSING_FINGERPRINT_DESC\"/></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Init Exchange.xml": "<page>\n <p2p-banner/>\n <h1>Init Exchange</h1>\n <config id=\"INIT_EXCHANGE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-11\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n dh_config = ... # Obtain the DH configuration\n g_a_hash = ... # Parameter for key exchange (Only when is incoming call)\n params = await app.init_exchange(\n -1001185324811,\n config,\n g_a_hash,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>init_exchange</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"INIT_EXCHANGE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>config</sb></ref>: <docs-ref link=\"/NTgCalls/Available Types/DhConfig\">ntgcalls.DhConfig</docs-ref></category-title>\n <subtext><config id=\"DH_CONFIG_DESC\"/></subtext>\n <category-title><ref><sb>g_a_hash</sb></ref>: <shi>Optional</shi>[<shi>bytes</shi>]</category-title>\n <config id=\"G_A_HASH_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n <category-title>exception <ref>ntgcalls.<sb>ConnectionError</sb></ref></category-title>\n <config id=\"CONNECTION_ALREADY_EXCHANGE_DESC\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Init Presentation.xml": "<page>\n <h1>Init Presentation</h1>\n <config id=\"INIT_PRESENTATION_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.init_presentation(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title>\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>init_presentation</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"INIT_PRESENTATION_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Skip Exchange.xml": "<page>\n <p2p-banner/>\n <h1>Skip Exchange</h1>\n <config id=\"SKIP_EXCHANGE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"6-10\">\n from ntgcalls import NTgCalls\n ...\n\n encryption_key = ... # Obtain the encryption key\n app = NTgCalls()\n await app.skip_exchange(\n -1001185324811,\n encryption_key,\n True,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>skip_exchange</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SKIP_EXCHANGE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>encryption_key</sb></ref>: <shi>bytes</shi></category-title>\n <config id=\"ENCRYPTION_KEY_DESC\"/>\n <category-title><ref><sb>is_outgoing</sb></ref>: <shi>bool</shi></category-title>\n <config id=\"IS_OUTGOING_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n <category-title>exception <ref>ntgcalls.<sb>ConnectionError</sb></ref></category-title>\n <config id=\"CONNECTION_ALREADY_ESTABLISHED_DESC\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Stop Presentation.xml": "<page>\n <h1>Stop Presentation</h1>\n <config id=\"STOP_PRESENTATION_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.stop_presentation(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>stop_presentation</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"STOP_PRESENTATION_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <category-title>exception <ref>ntgcalls.<sb>ConnectionError</sb></ref></category-title>\n <subtext><text>The presentation was not initialized.</text></subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Stop.xml": "<page>\n <h1>Stop</h1>\n <config id=\"STOP_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.stop(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>stop</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"STOP_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_connect.xml": "<page>\n <h1>ntg_connect</h1>\n <config id=\"CONNECT_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n char* params = ...; // Obtain connection parameters\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_connect(ptr, chatID, params, False, &future);\n // Wait for the async operation to complete\n ...\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_connect</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CONNECT_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><shi language=\"c\">char*</shi> <ref>params</ref></category-title>\n <config id=\"TG_PARAMS_DESC\"/>\n\n <category-title><shi>bool</shi> <ref>is_presentation</ref></category-title>\n <config id=\"IS_PRESENTATION_DESC\"/>\n\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"RTMP_STREAMING_UNSUPPORTED_C\"/>\n <config id=\"INVALID_TRANSPORT_C\"/>\n\n <category-title><ref><sb><shi language=\"c\">#NTG_CONNECTION_FAILED</shi></sb></ref> <shi>-302</shi></category-title>\n <subtext><text>The connection to WebRTC failed.</text></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_connect_p2p.xml": "<page>\n <p2p-banner/>\n <h1>ntg_connect_p2p</h1>\n <config id=\"CONNECT_P2P_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"15-24\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_rtc_server_struct* rtcServers = ...; // Obtain the RTC servers\n int rtcServersCount = ...; // Obtain the count of RTC servers\n char** libraryVersions = ...; // Obtain the library versions\n int libraryVersionCount = ...; // Obtain the count of library versions\n bool p2pAllowed = ...; // Obtain whether P2P is allowed\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_connect_p2p(\n ptr,\n chatID,\n rtcServers,\n rtcServersCount,\n libraryVersions,\n libraryVersionCount,\n p2pAllowed,\n &future\n );\n // Wait for the async operation to complete\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_connect_p2p</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CONNECT_P2P_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_rtc_server_struct\">ntg_rtc_server_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>servers</sb></ref></category-title>\n <config id=\"RTC_SERVERS_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>serversSize</sb></ref></category-title>\n <subtext><text>Count of list of endpoints</text></subtext>\n <category-title><shi language=\"c\">char**</shi> <ref><sb>versions</sb></ref></category-title>\n <config id=\"LIBRARY_VERSIONS_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>versionsSize</sb></ref></category-title>\n <subtext><text>Size of the versions array.</text></subtext>\n <category-title><shi>bool</shi> <ref><sb>p2pAllowed</sb></ref></category-title>\n <config id=\"P2P_ALLOWED_DESC\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"CONN_ALREADY_EXISTS_C\"/>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"CRYPTO_ERROR_C\"/>\n <category-title><ref><sb><shi language=\"c\">#NTG_SIGNALING_ERROR</shi></sb></ref> <shi>-104</shi></category-title>\n <subtext><config id=\"SIGNALING_ERROR_DESC\"/></subtext>\n <category-title><ref><sb><shi language=\"c\">#NTG_SIGNALING_UNSUPPORTED</shi></sb></ref> <shi>-105</shi></category-title>\n <subtext><config id=\"SIGNALING_UNSUPPORTED_DESC\"/></subtext>\n <config id=\"INVALID_TRANSPORT_C\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_create.xml": "<page>\n <h1>ntg_create</h1>\n <config id=\"CREATE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n char* buffer;\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_create(ptr, chatID, &buffer);\n // Wait for the async operation to complete and\n // use 'buffer' for JoinGroupCall\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_create</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CREATE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><shi language=\"c\">char**</shi> <sb><ref>buffer</ref></sb></category-title>\n <subtext>\n <text>\n A string pointer to a buffer to store the connection parameters retrieved from WebRTC.\n These parameters can be used for <a href=\"https://core.telegram.org/method/phone.joinGroupCall\">JoinGroupCall</a>.\n </text>\n </subtext>\n\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_C_EXCEPTIONS\"/>\n <config id=\"CONN_ALREADY_EXISTS_C\"/>\n <config id=\"STREAM_C_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_create_p2p.xml": "<page>\n <p2p-banner/>\n <h1>ntg_create_p2p</h1>\n <config id=\"CREATE_P2P_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10-14\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_create_p2p(\n ptr,\n chatID,\n &future\n );\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_create_p2p</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CREATE_P2P_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"CONN_ALREADY_EXISTS_C\"/>\n <config id=\"STREAM_C_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_exchange_keys.xml": "<page>\n <p2p-banner/>\n <h1>ntg_exchange_keys</h1>\n <config id=\"EXCHANGE_KEYS_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"14\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n uint8_t* g_a_or_b = ...; // Obtain the parameter for key exchange\n int sizeGAOrB = ...; // Obtain the size of the parameter for key exchange\n int64_t fingerprint = ...; // Obtain the fingerprint\n ntg_auth_params_struct buffer;\n // Initialize the async struct\n ntg_async_struct future;\n int result = ntg_exchange_keys(ptr, chatID, g_a_or_b, sizeGAOrB, fingerprint, &buffer, &future);\n // Wait for the async operation to complete\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_exchange_keys</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"EXCHANGE_KEYS_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>g_a_or_b</sb></ref></category-title>\n <config id=\"G_A_OR_B_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>sizeGAOrB</sb></ref></category-title>\n <subtext><text>Size of the parameter for key exchange</text></subtext>\n <category-title><shi language=\"c\">int64_t</shi> <ref><sb>fingerprint</sb></ref></category-title>\n <config id=\"FINGERPRINT_DESC\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_auth_params_struct\">ntg_auth_params_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>authParams</sb></ref></category-title>\n <subtext><config id=\"AUTH_PARAMS_DESC\"/></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"CONN_ALREADY_EXISTS_C\"/>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"CRYPTO_ERROR_C\"/>\n <category-title><ref><sb><shi language=\"c\">#NTG_MISSING_FINGERPRINT</shi></sb></ref> <shi>-103</shi></category-title>\n <subtext><config id=\"MISSING_FINGERPRINT_DESC\"/></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_init_exchange.xml": "<page>\n <p2p-banner/>\n <h1>ntg_init_exchange</h1>\n <config id=\"INIT_EXCHANGE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"14-23\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_dh_config_struct dhConfig = ...; // Obtain the DH configuration\n uint8_t* g_a_hash = ...; // Parameter for key exchange (Only when is incoming call)\n int sizeG_A_Hash = ...; // Size of the parameter for key exchange (Only when is incoming call)\n uint8_t* buffer[32];\n // Initialize the async struct\n ntg_async_struct future;\n int result = ntg_init_exchange(\n ptr,\n chatID,\n &dhConfig,\n g_a_hash,\n sizeG_A_Hash,\n buffer,\n sizeof(buffer),\n &future\n );\n // Wait for the async operation to complete\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_init_exchange</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"INIT_EXCHANGE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_dh_config_struct\">ntg_dh_config_struct</docs-ref><shi>*</shi> <ref><sb>dhConfig</sb></ref></category-title>\n <subtext><config id=\"DH_CONFIG_DESC\"/></subtext>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>g_a_hash</sb></ref></category-title>\n <config id=\"G_A_HASH_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>sizeGAHash</sb></ref></category-title>\n <subtext><text>Size of the parameter for key exchange (Only when is incoming call)</text></subtext>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>buffer</sb></ref></category-title>\n <subtext><text>Buffer to store the result</text></subtext>\n <category-title><shi language=\"c\">int</shi> <ref><sb>sizeBuffer</sb></ref></category-title>\n <subtext><text>Size of the buffer</text></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <category-title><ref><sb><shi language=\"c\">#NTG_ERROR_CONNECTION</shi></sb></ref> <shi>-302</shi></category-title>\n <config id=\"CONNECTION_ALREADY_EXCHANGE_DESC\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_init_presentation.xml": "<page>\n <h1>ntg_init_presentation</h1>\n <config id=\"INIT_PRESENTATION_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n // Initialize the async struct\n ntg_async_struct future;\n ntg_init_presentation(ptr, chatID, &future);\n // Wait for the async operation to complete\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_init_presentation</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"INIT_PRESENTATION_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n\n <category-title><ref><sb><shi language=\"c\">#NTG_ERROR_RTC_CONNECTION_NEEDED</shi></sb></ref> <shi>-306</shi></category-title>\n <subtext><text>WebRTC connection is required for this operation.</text></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_skip_exchange.xml": "<page>\n <h1>ntg_skip_exchange</h1>\n <config id=\"SKIP_EXCHANGE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"12\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n uint8_t* encryption_key = ... # Obtain the encryption key\n int size = ...; // Obtain the size of the encryption key\n // Initialize the async struct\n ntg_async_struct future;\n ntg_skip_exchange(ptr, chatID, encryption_key, size, False, &future);\n // Wait for the async operation to complete\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_skip_exchange</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SKIP_EXCHANGE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>encryption_key</sb></ref></category-title>\n <config id=\"ENCRYPTION_KEY_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>size</sb></ref></category-title>\n <subtext><text>Size of the encryption key</text></subtext>\n <category-title><shi>bool</shi> <ref><sb>is_outgoing</sb></ref></category-title>\n <config id=\"IS_OUTGOING_DESC\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <category-title><ref><sb><shi language=\"c\">#NTG_ERROR_CONNECTION</shi></sb></ref> <shi>-302</shi></category-title>\n <config id=\"CONNECTION_ALREADY_ESTABLISHED_DESC\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_stop.xml": "<page>\n <h1>ntg_stop</h1>\n <config id=\"STOP_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n char* params = ...; // Obtain connection parameters\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_stop(ptr, chatID);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_stop</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"STOP_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_stop_presentation.xml": "<page>\n <h1>ntg_stop_presentation</h1>\n <config id=\"STOP_PRESENTATION_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n // Initialize the async struct\n ntg_async_struct future;\n ntg_stop_presentation(ptr, chatID, &future);\n // Wait for the async operation to complete\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_stop_presentation</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"STOP_PRESENTATION_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Build Guide.xml": "<page>\n <h1>Introduction</h1>\n <text>\n Being a modern library, <b>NTgCalls</b> requires CMake 3.31+ to be built on your system,\n on Linux is required at least CLang 20+, libasound2 and libpulse-dev.\n We recommend using the latest versions of both CMake and CLang.\n </text>\n <alert type=\"important\">\n Before building NTgCalls, check for pre-compiled shared libs on <a href=\"https://github.com/pytgcalls/ntgcalls/releases\">GitHub Releases</a> or\n Python Bindings from <a href=\"https://pypi.org/project/ntgcalls/\">PyPI</a>.\n Building from source may be necessary if pre-compiled packages are not available.\n </alert>\n <separator/>\n <h1>Installing Prerequisites</h1>\n <text>\n Below, we will guide you through the step-by-step process of installing the prerequisites\n required to compile NTgCalls on your operating system.\n </text>\n <subtext>\n <h2>Linux</h2>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Update the system's package list:</b><br/>\n First, make sure you have an updated list of packages:\n </text>\n <syntax-highlight language=\"bash\">\n $ sudo apt update\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Build Essential, Clang 20 and etc:</b><br/>\n This section provides instructions on how to install four specific packages:\n build-essential, curl and Clang version 20. Use the following command:\n </text>\n <multisyntax id=\"os_requirements\">\n <tabs>\n <tab id=\"x86\">x86_64</tab>\n <tab id=\"arm\">ARM64</tab>\n </tabs>\n <syntax-highlight language=\"bash\" id=\"x86\">\n $ sudo apt install libx11-dev build-essential curl libasound2-dev libpulse-dev\n </syntax-highlight>\n <syntax-highlight language=\"bash\" id=\"arm\">\n $ sudo apt install libx11-dev build-essential curl libasound2-dev libpulse-dev\n $ curl -s https://apt.llvm.org/llvm.sh | sudo bash -s -- 20\n </syntax-highlight>\n </multisyntax>\n </item>\n </list>\n <h2>Windows</h2>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Install Microsoft Visual Studio 2022:</b><br/>\n Install Microsoft Visual Studio 2022 with the C++ workload. You can download it from the <a href=\"https://visualstudio.microsoft.com/downloads/\">official website</a>.\n </text>\n </item>\n <item>\n <text>\n <b>Download CMake Installer:</b><br/>\n Download the CMake installer for Windows from the <a href=\"https://cmake.org/download/\">official website</a>.\n </text>\n </item>\n <item>\n <text>\n <b>Run Installer:</b><br/>\n Run the downloaded CMake installer and follow the installation wizard instructions.\n Make sure to select the option to add CMake to the system PATH during installation.\n </text>\n </item>\n </list>\n <h2>macOS</h2>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Install Xcode Command Line Tools:</b><br/>\n If you don't have Xcode installed, you can install the Command Line Tools separately. Open a terminal and run the following command:\n </text>\n <subtext>\n <syntax-highlight language=\"bash\">\n $ xcode-select --install\n </syntax-highlight>\n </subtext>\n </item>\n <item>\n <text>\n <b>Install CMake:</b><br/>\n Open a terminal and run the following command to install CMake:\n </text>\n <subtext>\n <syntax-highlight language=\"bash\">\n $ brew install cmake\n </syntax-highlight>\n </subtext>\n </item>\n </list>\n </subtext>\n <separator/>\n <h1>Cloning and Building</h1>\n <text>\n In this section, you'll learn how to clone the NTgCalls repository and build the library from source.\n </text>\n <subtext>\n <h2>Cloning the Repo</h2>\n <text>\n To begin building NTgCalls from source, you need to clone the GitHub repository. Follow these steps to clone the repo:\n </text>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Change to the Directory Where You Want to Clone the Repo:</b><br/>\n Navigate to the directory where you want to store the NTgCalls source code. You can use the `cd` command to change directories.\n </text>\n <syntax-highlight language=\"bash\">\n $ cd /path/to/your/directory\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Clone the NTgCalls Repository:</b><br/>\n Use the following command to clone the NTgCalls GitHub repository:\n </text>\n <syntax-highlight language=\"bash\">\n $ git clone https://github.com/pytgcalls/ntgcalls.git --recursive\n </syntax-highlight>\n </item>\n </list>\n <h2>Compilation</h2>\n <text>\n Now that you have successfully installed all the required prerequisites for NTgCalls,\n it's time to build the library.\n Follow these steps to compile NTgCalls on your system.\n </text>\n <alert type=\"important\">\n It's essential to have Python 3.10+ installed on your server.\n </alert>\n <subtext>\n <h3>Building Shared Library</h3>\n <text>\n For developers looking to use NTgCalls with C and C++, we provide C Bindings.\n Follow these steps to compile NTgCalls with C Bindings in either Release or Debug mode:\n </text>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Change Directory:</b><br/>\n Navigate to the root directory of the NTgCalls project:\n </text>\n <syntax-highlight language=\"bash\">\n $ cd /path/to/ntgcalls\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Generate Library:</b><br/>\n Run the following command to generate the libraries:\n </text>\n <multisyntax id=\"build_type\">\n <tabs>\n <tab id=\"debug\">Debug</tab>\n <tab id=\"release\">Release</tab>\n </tabs>\n <syntax-highlight language=\"bash\" id=\"debug\">\n # Shared\n $ python3 setup.py build_lib --debug\n # Static\n $ python3 setup.py build_lib --debug --static\n </syntax-highlight>\n <syntax-highlight language=\"bash\" id=\"release\">\n # Shared\n $ python3 setup.py build_lib\n # Static\n $ python3 setup.py build_lib --static\n </syntax-highlight>\n </multisyntax>\n </item>\n </list>\n <br/>\n <h3>Building Python Bindings</h3>\n <text>\n NTgCalls offers Python Bindings, facilitating seamless integration with Python.\n Follow these steps to compile NTgCalls with Python Bindings:\n </text>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Change Directory:</b><br/>\n Navigate to the root directory of the NTgCalls project:\n </text>\n <syntax-highlight language=\"bash\">\n $ cd /path/to/ntgcalls\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Install Python Bindings:</b><br/>\n Run the following command to install the Python Bindings:\n </text>\n <syntax-highlight language=\"bash\">\n $ pip3 install . -U\n </syntax-highlight>\n </item>\n </list>\n <br/>\n <h3>Building Java for Android Bindings</h3>\n <text>\n NTgCalls offers Java for Android Bindings, facilitating seamless integration with Java for Android.\n Follow these steps to compile NTgCalls with Java for Android Bindings:\n </text>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Change Directory:</b><br/>\n Navigate to the root directory of the NTgCalls project:\n </text>\n <syntax-highlight language=\"bash\">\n $ cd /path/to/ntgcalls\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Generate .so libraries for the Android platform:</b><br/>\n Run the following command to generate the .so libraries for the Android platform:\n </text>\n <syntax-highlight language=\"bash\">\n $ python3 setup.py build_lib --android\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Enter in the Android directory:</b><br/>\n Navigate to the Android directory of the NTgCalls project:\n </text>\n <syntax-highlight language=\"bash\">\n $ cd android\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Build the Android project:</b><br/>\n Run the following command to build the Android project:\n </text>\n <syntax-highlight language=\"bash\">\n $ ./gradlew build assembleRelease\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Get the .aar file:</b><br/>\n Copy the generated .aar file to your desired directory:\n </text>\n <syntax-highlight language=\"bash\">\n $ cp build/outputs/aar/ntgcalls-release.aar /path/to/your/directory\n </syntax-highlight>\n </item>\n </list>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Callback Registration.xml": "<page>\n <h1>Callback Registration</h1>\n <text>\n Callbacks registration allows you to specify custom functions to be executed when specific\n events occur or conditions are met within your application.\n These events might include changes in call status, media state updates, or other critical moments in\n the NTgCalls library's operation.\n </text>\n <config id=\"NOTE_CALLBACK\"/>\n <separator/>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_stream_end</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_END_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">ntg_stream_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>The callback function to be executed when the stream ends.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myStreamEndCallback(uintptr_t ptr, int64_t chatID, ntg_stream_type_enum type, void *data) {\n // Your callback logic here\n }\n ...\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n ntg_on_stream_end(ptr, myStreamEndCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_upgrade</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_UPGRADE_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">ntg_upgrade_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>The callback function to be executed when the stream needs to update MTProto stream parameters.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myOnUpgradeCallback(uintptr_t ptr, int64_t chatID, ntg_media_state_struct mediaState, void *data) {\n // Your callback logic here\n }\n ...\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n ntg_on_upgrade(ptr, myOnUpgradeCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_connection_change</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_CONN_CHANGE_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">ntg_connection_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>The callback function to be executed when the connection state changes.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myOnConnectionChangeCallback(uintptr_t ptr, int64_t chatID, ntg_connection_state_enum state, void *data) {\n // Your callback logic here\n }\n ...\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n ntg_on_connection_change(ptr, myOnConnectionChangeCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_signaling_data</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_SIGNALING_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">ntg_signaling_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>The callback function to be executed when signaling data is received.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myOnSignalingDataCallback(uintptr_t ptr, int64_t chatID, const char *data, size_t size, void *customData) {\n // Your callback logic here\n }\n ...\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n ntg_on_signaling_data(ptr, myOnSignalingDataCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_frames</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_FRAMES_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">ntg_frames_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>Callback function to be executed when frames are received.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myOnFramesCallback(uintptr_t ptr, int64_t chatID, ntg_frame_struct *frames, size_t count, void *customData) {\n // Your callback logic here\n }\n ...\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n ntg_on_frames(ptr, myOnFramesCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_remote_source_callback</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_REMOTE_SOURCE_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">ntg_remote_source_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>Callback function to be executed when a remote source is added or removed.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myRemoteSourceCallback(uintptr_t ptr, int64_t chatID, ntg_remote_source_struct *source, void *customData) {\n // Your callback logic here\n }\n ...\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n ntg_remote_source_callback(ptr, myRemoteSourceCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_register_logger</sb></ref>()</category-title>\n <subtext>\n <config id=\"REGISTER_LOGGER_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><shi language=\"c\">ntg_log_message_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><config id=\"LOGGER_DESC\"/></subtext>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"9\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n void logger(ntg_log_message_struct* message) {\n printf(\"Log message: %s\\n\", message->message);\n }\n ...\n int main() {\n ntg_register_logger(logger);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_request_broadcast_part</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_REQUEST_BROADCAST_PART_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">ntg_broadcast_part_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>Callback function to be executed when a broadcast part is requested.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n void myRequestBroadcastPartCallback(uintptr_t ptr, int64_t chatID, ntg_segment_part_request_struct partRequest, void *customData) {\n // Your callback logic here\n }\n ...\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n ntg_on_request_broadcast_part(ptr, myRequestBroadcastPartCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_request_broadcast_timestamp</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_REQUEST_BROADCAST_TIME_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <category-title><shi language=\"c\">ntg_broadcast_timestamp_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>Callback function to be executed when the broadcast timestamp is requested.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n void myRequestBroadcastTimestampCallback(uintptr_t ptr, int64_t chatID, void *customData) {\n // Your callback logic here\n }\n ...\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n ntg_on_request_broadcast_timestamp(ptr, myRequestBroadcastTimestampCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n </category>\n</page>","/NTgCalls/Callbacks.xml": "<page>\n <h1>Callbacks</h1>\n <text>\n Callbacks allows you to define custom behavior or actions that should be triggered in response to specific\n events or conditions within your application.\n These events could include call-related occurrences, state changes, or other interactions with the NTgCalls library.\n </text>\n <config id=\"NOTE_CALLBACK\"/>\n <br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_stream_end</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_END_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, update: StreamType):\n print(chat_id, update)\n ...\n app.on_stream_end(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_upgrade</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_UPGRADE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, update: MediaState):\n print(chat_id, update)\n ...\n app.on_upgrade(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_connection_change</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_CONN_CHANGE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, state: ConnectionState):\n print(chat_id, state)\n ...\n app.on_connection_change(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_signaling</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_SIGNALING_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, payload: bytes):\n print(chat_id, payload)\n ...\n app.on_signaling(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_frames</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_FRAMES_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, mode: StreamMode, device: StreamDevice, frames: List[Frame]):\n print(chat_id, mode, device, frames)\n ...\n app.on_frames(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_remote_source_change</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_REMOTE_SOURCE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, source: RemoteSource):\n print(chat_id, source)\n ...\n app.on_remote_source_change(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_request_broadcast_part</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_REQUEST_BROADCAST_PART_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, request: SegmentPartRequest):\n print(chat_id, request)\n ...\n app.on_request_broadcast_part(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_request_broadcast_timestamp</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_REQUEST_BROADCAST_TIME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int):\n print(chat_id)\n ...\n app.on_request_broadcast_timestamp(handler)\n </syntax-highlight>\n </subtext>\n </category>\n</page>","/NTgCalls/Client.xml": "<page>\n <h1>NTgCalls Client</h1>\n <text>\n Welcome to the API Reference section, where you'll find comprehensive information about the NTgCalls API.\n This is your gateway to in-depth details about the main Client class, its methods, types,\n all of which play a crucial role in utilizing NTgCalls effectively.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"1-3\">\n from ntgcalls import NTgCalls\n\n app = NTgCalls()\n print(app.ping())\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>NTgCalls</sb></ref>\n </category-title>\n <subtext>\n <text>The NTgCalls Client is your primary interface for seamless interaction with Group Calls.</text>\n <br/>\n <category>\n <pg-title>STATIC METHODS</pg-title>\n <subtext>\n <category-title><ref><shi>async</shi> <sb>calls</sb></ref>() <shi>-> dict</shi>[<shi>int</shi>, <docs-ref link=\"/NTgCalls/Available Enums/StreamStatus\">ntgcalls.StreamStatus</docs-ref>]</category-title>\n <config id=\"LIST_CALLS_DESC\"/>\n\n <category-title><ref><shi>async</shi> <sb>cpu_usage</sb></ref>() <shi>-></shi> <shi>float</shi></category-title>\n <subtext><config id=\"CPU_USAGE_DESC\"/></subtext>\n\n <category-title><ref><sb>ping</sb></ref>() <shi>-></shi> <shi>str</shi></category-title>\n <subtext><text>Return \"pong\" message when calling this method</text></subtext>\n\n <category-title><ref><sb>get_protocol</sb></ref>() <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Types/Protocol\">ntgcalls.Protocol</docs-ref></category-title>\n <subtext><config id=\"GET_PROTOCOL_DESC\"/></subtext>\n\n <category-title><ref><sb>get_media_devices</sb></ref>() <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Types/MediaDevices\">ntgcalls.MediaDevices</docs-ref></category-title>\n <subtext><config id=\"GET_MEDIA_DEVICES_DESC\"/></subtext>\n\n <category-title><ref><sb>enable_glib_loop</sb></ref>()</category-title>\n <subtext>\n <config id=\"ENABLE_GLIB_LOOP_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>enable</ref>: <shi>bool</shi></category-title>\n <config id=\"ENABLE_OR_DISABLE_GLIB_DESC\"/>\n </subtext>\n </category>\n </subtext>\n </subtext>\n </category>\n </subtext>\n </category>\n</page>","/NTgCalls/Getting Started.xml": "<page>\n <h1>Getting Started</h1>\n <text>\n This section provides documentation for the NTgCalls C API, which allows you to use NTgCalls in various programming languages,\n including C, C++, Go, Rust, Deno, and more.\n Below, you will find detailed information about the initialization and cleanup functions.\n </text>\n <separator/>\n <h2>Initialization</h2>\n <text>\n To get started with NTgCalls in your application, you need to initialize the library using the <code>ntg_init</code> function.\n This function sets up the necessary resources and prepares NTgCalls for use.\n </text>\n <alert type=\"important\">\n Make sure to call <code>ntg_init</code> before using any other NTgCalls functions.\n </alert>\n <subtext>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"4\">\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n </subtext>\n\n <h2>Cleanup</h2>\n <text>\n To clean up and release the resources used by NTgCalls, you should call the <code>ntg_destroy</code> function.\n This function deallocates memory and performs necessary cleanup operations.\n </text>\n <alert type=\"warning\">\n Always call <code>ntg_destroy</code> when you are done using NTgCalls to prevent memory leaks and resource issues.\n </alert>\n <subtext>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"7\">\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ... // Your Code Here\n\n int result = ntg_destroy(uid);\n if (result != 0) {\n printf(\"NTgCalls cleanup failed.\\n\");\n return 1;\n }\n return 0;\n }\n </syntax-highlight>\n </subtext>\n\n <separator/>\n <h2>Library Version</h2>\n <text>\n You can retrieve the version of the NTgCalls library currently in use using the <code>ntg_get_version</code> function.\n This function returns a string containing the version number.\n </text>\n <subtext>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"6\">\n #include \"ntgcalls.h\"\n #include <stdio.h>\n\n int main() {\n char* version;\n ntg_get_version(&version);\n printf(\"NTgCalls Version: %s\\n\", version);\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <br/>\n <h3>Details</h3>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb>ntg_get_version</sb></ref>()\n </category-title>\n <subtext>\n <text>Retrieve library version</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><shi language=\"c\">char**</shi> <ref>buffer</ref></category-title>\n <subtext><text>A character buffer to store the version string.</text></subtext>\n </subtext>\n </category>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Quick Start.xml": "<page>\n <h1>Quick Start</h1>\n <text>\n Welcome to this section, which is primarily intended for developers who are moderately experienced or\n seeking to perform a porting in their language using C bindings. If you are new to Python development,\n we strongly recommend using <docs-ref link=\"/PyTgCalls\">Py-TgCalls</docs-ref>.\n However, if you fall into the aforementioned categories,\n you can find an example of usage with the various porting below.\n </text>\n <h2>Recommended Bots by the Community</h2>\n <text>\n Looking for real-world implementations? Below is a selection of bots actively maintained and recommended\n by the community, all using NTgCalls/Py-TgCalls under the hood. These can be a great source of inspiration or even\n a solid starting point for your own project.\n </text>\n <br/>\n <github-ref user=\"AshokShau\" reponame=\"TgMusicBot\"/>\n <h2>Community and Official Libraries</h2>\n <text>\n In the following section, we present a comprehensive catalog of libraries,\n thoughtfully crafted by the community and officially endorsed,\n all of which leverage the robust capabilities of NTgCalls.\n </text>\n <br/>\n <github-ref user=\"pytgcalls\" reponame=\"pytgcalls\"/>\n <github-ref user=\"roj1512\" reponame=\"ntgcalls_deno\"/>\n <github-ref user=\"YouKnow-sys\" reponame=\"ntgcalls-rs\"/>\n <h2>Enjoy the API</h2>\n <text>\n What we've just seen are simplified ports of NTgCalls. However, now let's delve deeper!\n In the upcoming pages, we'll explore NTgCalls in a step-by-step manner,\n covering how it functions, how to install it, and more.\n\n Are you feeling eager to continue?\n You can take a shortcut to the Call Methods\n section and return later to delve into more details.\n </text>\n</page>","/NTgCalls/Stream Methods/Mute.xml": "<page>\n <h1>Mute</h1>\n <config id=\"MUTE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.mute(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>mute</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <config id=\"MUTE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/Pause.xml": "<page>\n <h1>Pause</h1>\n <config id=\"PAUSE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.pause(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>pause</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <config id=\"PAUSE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/Resume.xml": "<page>\n <h1>Resume</h1>\n <config id=\"RESUME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.resume(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>resume</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <config id=\"RESUME_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/Set Stream Sources.xml": "<page>\n <h1>Set Stream Sources</h1>\n <alert type=\"warning\">\n <text>This method replaces the deprecated <code>change_stream</code> method.</text>\n </alert>\n <config id=\"CHANGE_STREAM_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"9-21\">\n from ntgcalls import NTgCalls\n from ntgcalls import StreamMode\n from ntgcalls import MediaDescription\n from ntgcalls import AudioDescription\n ...\n\n app = NTgCalls()\n\n await app.set_stream_sources(\n -1001185324811,\n StreamMode.CAPTURE,\n MediaDescription(\n AudioDescription(\n media_source=MediaSource.File,\n input=\"foxes.pcm\",\n sample_rate=96000,\n bits_per_sample=16,\n channel_count=2,\n ),\n )\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>set_stream_sources</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CHANGE_STREAM_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <config id=\"STREAM_MODE\"/>\n <config id=\"ARG_STREAM_PARAMS\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n <config id=\"NTG_STREAM_EXCEPTIONS\"/>\n <config id=\"RTMP_STREAMING_UNSUPPORTED\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/Time.xml": "<page>\n <h1>Time</h1>\n <config id=\"TIME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls(client)\n\n print(\n await app.time(\n -1001185324811,\n )\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>time</sb></ref>() <shi>-> int</shi>\n </category-title>\n <subtext>\n <config id=\"TIME_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n <config id=\"STREAM_MODE\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/UnMute.xml": "<page>\n <h1>UnMute</h1>\n <config id=\"UNMUTE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.unmute(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>unmute</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <config id=\"UNMUTE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_NOT_FOUND_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_mute.xml": "<page>\n <h1>ntg_mute</h1>\n <config id=\"MUTE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int errCode = ntg_mute(ptr, chatID, &future);\n // Wait for the async operation to complete\n if (future.errorCode == 0) {\n printf(\"Audio muted.\\n\");\n } else if (future.errorCode == 1) {\n printf(\"Audio was already muted.\\n\");\n } else {\n printf(\"Failed to mute audio (Error code: %d).\\n\", future.errorCode);\n return 1;\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_mute</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"MUTE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_pause.xml": "<page>\n <h1>ntg_pause</h1>\n <config id=\"PAUSE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int errCode = ntg_pause(ptr, chatID);\n // Wait for the async operation to complete\n if (future.errorCode == 0) {\n printf(\"Audio paused.\\n\");\n } else if (future.errorCode == 1) {\n printf(\"Audio was already paused.\\n\");\n } else {\n printf(\"Failed to pause audio (Error code: %d).\\n\", result);\n return 1;\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_pause</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"PAUSE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_resume.xml": "<page>\n <h1>ntg_resume</h1>\n <config id=\"RESUME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int errCode = ntg_resume(ptr, chatID, &future);\n // Wait for the async operation to complete\n if (future.errorCode == 0) {\n printf(\"Audio resumed.\\n\");\n } else if (future.errorCode == 1) {\n printf(\"Audio was already resumed.\\n\");\n } else {\n printf(\"Failed to resume audio (Error code: %d).\\n\", result);\n return 1;\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_resume</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"RESUME_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_set_stream_sources.xml": "<page>\n <h1>ntg_set_stream_sources</h1>\n <alert type=\"warning\">\n <text>This method replaces the deprecated <code>ntg_change_stream</code> method.</text>\n </alert>\n <config id=\"CHANGE_STREAM_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"13\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_media_description_struct desc = {\n // Fill in updated media description fields\n };\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_set_stream_sources(ptr, chatID, NTG_STREAM_CAPTURE, desc, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_set_stream_sources</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CHANGE_STREAM_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"NTG_STREAM_MODE\"/>\n <config id=\"ARG_MEDIA\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"STREAM_C_EXCEPTIONS\"/>\n <config id=\"RTMP_STREAMING_UNSUPPORTED_C\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_time.xml": "<page>\n <h1>ntg_time</h1>\n <config id=\"TIME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n int64_t time = 0;\n ntg_async_struct future;\n // Initialize the async struct\n int64_t result = ntg_time(ptr, chatID, NTG_STREAM_CAPTURE, &time, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_time</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"TIME_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"NTG_STREAM_MODE\"/>\n <category-title><shi language=\"c\">int64_t*</shi> <ref><sb>time</sb></ref></category-title>\n <subtext>The playback time in seconds.</subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_unmute.xml": "<page>\n <h1>ntg_unmute</h1>\n <config id=\"UNMUTE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uintptr_t ptr = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int errCode = ntg_unmute(ptr, chatID, &future);\n // Wait for the async operation to complete\n if (future.errorCode == 0) {\n printf(\"Audio unmuted.\\n\");\n } else if (future.errorCode == 1) {\n printf(\"Audio was already unmuted.\\n\");\n } else {\n printf(\"Failed to unmute audio (Error code: %d).\\n\", future.errorCode);\n return 1;\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_unmute</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"UNMUTE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_PTR\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Using Async.xml": "<page>\n <h1>Using Async</h1>\n <text>\n NTgCalls starting from version 1.2.0 supports asynchronous calls to function using <code>ntg_async_struct</code>,\n which contains <code>userData</code> that can be used to pass data between the caller and the callback,\n <code>promise</code> that is called when the operation is completed, and <code>error</code> that is set\n when an error occurs, but by default it is set to <shi language=\"c\">#NTG_ASYNC_NOT_READY</shi> (-4) until\n the operation is completed.\n </text>\n <separator/>\n <h2>Async Call in a Sync way</h2>\n <text>\n To make an async call in a sync way, you can use a mutex to wait for the operation to complete:\n </text>\n <syntax-highlight language=\"cpp\">\n #include <ntgcalls.h>\n #include <mutex>\n\n void onCallReady(void* data) {\n ((std::mutex*)data)->unlock();\n }\n\n void makeAsyncCall() {\n ntg_async_struct asyncData;\n std::mutex mtx;\n asyncData.userData = &mtx;\n asyncData.promise = onCallReady;\n mtx.lock();\n int error = ntg_pause(asyncData);\n if (error != 0) {\n // Handle error\n }\n mtx.lock();\n // Async operation completed\n if (asyncData.errorCode != 0) {\n // Handle Async error\n }\n }\n </syntax-highlight>\n <separator/>\n <h2>Async Call with custom data</h2>\n <text>\n You can pass custom data to the async call by using the <code>userData</code> field:\n </text>\n <syntax-highlight language=\"cpp\">\n #include <ntgcalls.h>\n #include <mutex>\n #include <iostream>\n\n struct CustomData {\n std::mutex* mtx;\n int64_t chatID;\n };\n\n void onCallReady(void* data) {\n CustomData* customData = (CustomData*)data;\n customData->mtx->unlock();\n std::cout << \"Chat ID: \" << customData->chatID << std::endl;\n }\n\n void makeAsyncCall() {\n ntg_async_struct asyncData;\n std::mutex mtx;\n CustomData data;\n data.mtx = &mtx;\n data.chatID = 1234567890;\n asyncData.userData = &data;\n asyncData.promise = onCallReady;\n mtx.lock();\n int error = ntg_pause(asyncData);\n if (error != 0) {\n // Handle error\n }\n mtx.lock();\n // Async operation completed\n if (asyncData.errorCode != 0) {\n // Handle Async error\n }\n }\n </syntax-highlight>\n</page>","/PyTgCalls/Advanced Methods/Change Volume Call.xml": "<page>\n <h1>Change Volume Call</h1>\n <alert type=\"warning\">\n This feature has some Telegram bugs; sometimes the volume is not applied on the Client side.\n </alert>\n <text>This method changes the userbot\u2019s output volume using MTProto APIs.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-13\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.change_volume_call(\n -1001185324811,\n 175,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>change_volume_call</sb></ref>()\n </category-title>\n <subtext>\n <text>Change the stream\u2019s volume.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n\n <category-title><ref>volume</ref>: <shi>int</shi></category-title>\n <subtext><text>New stream\u2019s volume</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_EXCEPTIONS\"/>\n <config id=\"UNSUPPORTED_METHOD_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Advanced Methods/Get Participants.xml": "<page>\n <h1>Get Participants</h1>\n <text>This method returns the list of a group call\u2019s participants using MTProto APIs.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.get_participants(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>get_participants</sb></ref>() <shi>-> list</shi>[<docs-ref link=\"/PyTgCalls/Advanced Types/GroupCallParticipant\">GroupCallParticipant</docs-ref>]\n </category-title>\n <subtext>\n <text>Get a list of participants from a group call</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"UNSUPPORTED_METHOD_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Advanced Methods/Send Frame.xml": "<page>\n <h1>Send Frame</h1>\n <text>This method allows sending an external frame to the group call or private call.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"11-18\">\n from pytgcalls import PyTgCalls\n from pytgcalls import Device\n from pytgcalls.types import Frame\n from datetime import datetime\n ...\n\n app = PyTgCalls()\n ...\n pcm16_le_data = ...\n\n app.send_frame(\n -1001185324811,\n Device.MICROPHONE,\n pcm16_le_data,\n Frame.Info(\n int(datetime.now().timestamp()),\n )\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>send_frame</sb></ref>()\n </category-title>\n <subtext>\n <text>Send an external frame to the group call or private call.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n <category-title><ref><sb>device</sb></ref>: <docs-ref link=\"/PyTgCalls/Available Enums/Device\">pytgcalls.Device</docs-ref></category-title>\n <config id=\"DEVICE_DESC\"/>\n <category-title><ref><sb>frame</sb></ref>: <shi>bytes</shi></category-title>\n <config id=\"FRAME_BUFFER_DESC\"/>\n <category-title><ref><sb>frame_data</sb></ref>: <docs-ref link=\"/PyTgCalls/Advanced Types/Frame Info\">pytgcalls.Frame.Info</docs-ref></category-title>\n <subtext><config id=\"FRAME_DATA_DESC\"/></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/Call.xml": "<page>\n <h1>Call</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>Call</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CALL_INFO_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref><sb>call_type</sb></ref> -> <docs-ref link=\"/PyTgCalls/Available Enums/Call Type\">Type</docs-ref></category-title>\n <subtext><text>The type of the call.</text></subtext>\n\n <category-title><ref><sb>playback</sb></ref> -> <docs-ref link=\"/PyTgCalls/Available Enums/Call Status\">Status</docs-ref></category-title>\n <config id=\"PLAYBACK_DESC\"/>\n\n <category-title><ref><sb>capture</sb></ref> -> <docs-ref link=\"/PyTgCalls/Available Enums/Call Status\">Status</docs-ref></category-title>\n <config id=\"CAPTURE_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/CallConfig.xml": "<page>\n <h1>CallConfig</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>CallConfig</sb></ref>\n </category-title>\n <subtext>\n <text>Configuration descriptor for a private call</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>timeout</ref>: <shi>int</shi></category-title>\n <subtext><text>Timeout for an answer from the user</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/ChatUpdate.xml": "<page>\n <h1>ChatUpdate</h1>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>ChatUpdate</sb></ref>\n </category-title>\n <subtext>\n <text>Represents a chat update.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <config id=\"RET_INT_ID\"/>\n <category-title><ref>status</ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Available Enums/ChatUpdate Status\">Status</docs-ref></category-title>\n <subtext><text>Status of the chat.</text></subtext>\n <category-title><ref>action</ref> <shi>-></shi> <shi>Any</shi></category-title>\n <subtext><text>Action of the chat.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/Frame Info.xml": "<page>\n <h1>Frame Info</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>Frame.Info</sb></ref>\n </category-title>\n <subtext>\n <text>Represents frame info.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>capture_time</ref> <shi>-> int</shi></category-title>\n <config id=\"FRAME_DATA_ABSOLUTE_CAPTURE_TIMESTAMP_MS_DESC\"/>\n\n <category-title><ref>width</ref> <shi>-> int</shi></category-title>\n <config id=\"FRAME_DATA_ROTATION_DESC\"/>\n\n <category-title><ref>height</ref> <shi>-> int</shi></category-title>\n <config id=\"FRAME_DATA_WIDTH_DESC\"/>\n\n <category-title><ref>rotation</ref> <shi>-> int</shi></category-title>\n <config id=\"FRAME_DATA_HEIGHT_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/Frame.xml": "<page>\n <h1>Frame</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>Frame</sb></ref>\n </category-title>\n <subtext>\n <config id=\"FRAME_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>ssrc</ref> <shi>-> int</shi></category-title>\n <config id=\"SSRC_DESC\"/>\n\n <category-title><ref>frame</ref> <shi>-> bytes</shi></category-title>\n <config id=\"FRAME_BUFFER_DESC\"/>\n\n <category-title><ref>info</ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Advanced Types/Frame Info\">Frame.Info</docs-ref></category-title>\n <subtext><config id=\"FRAME_DATA_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/GroupCallConfig.xml": "<page>\n <h1>GroupCallConfig</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>GroupCallConfig</sb></ref>\n </category-title>\n <subtext>\n <text>Configuration descriptor for a group call</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>invite_hash</ref>: Optional[<shi>str</shi>]</category-title>\n <subtext><text>Unique identifier for a group call invite in t.me link form</text></subtext>\n <category-title><ref>join_as</ref>: <config id=\"ARG_UNION_PEER\"/></category-title>\n <subtext><text>InputPeer to join as a channel or a profile</text></subtext>\n <category-title><ref>auto_start</ref>: <shi>bool</shi></category-title>\n <subtext><text>Start group call if not present, by default, is True</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/GroupCallParticipant.xml": "<page>\n <h1>GroupCallParticipant</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>GroupCallParticipant</sb></ref>\n </category-title>\n <subtext>\n <text>Info about a group call participant</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref><sb>user_id</sb></ref> <shi>-> int</shi></category-title>\n <subtext><text>Unique identifier of a participant.</text></subtext>\n\n <category-title><ref><sb>muted</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant is muted.</text></subtext>\n\n <category-title><ref><sb>muted_by_admin</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether an admin has muted the participant.</text></subtext>\n\n <category-title><ref><sb>video</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant is currently broadcasting a video stream.</text></subtext>\n\n <category-title><ref><sb>screen_sharing</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant is currently screen sharing.</text></subtext>\n\n\n <category-title><ref><sb>video_camera</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant is currently broadcasting a video camera.</text></subtext>\n\n <category-title><ref><sb>raised_hand</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant has raised the hand.</text></subtext>\n\n <category-title><ref><sb>volume</sb></ref> <shi>-> int</shi></category-title>\n <subtext><text>Volume level of the participant.</text></subtext>\n\n <category-title><ref><sb>source</sb></ref> <shi>-> int</shi></category-title>\n <subtext><text>Source ID of the participant's audio stream.</text></subtext>\n\n <category-title><ref><sb>video_info</sb></ref> <shi>-> Optional[</shi><docs-ref link=\"/PyTgCalls/Advanced Types/SourceInfo\">pytgcalls.SourceInfo</docs-ref><shi>]</shi></category-title>\n <subtext><text>Info about the video stream the participant is currently broadcasting.</text></subtext>\n\n <category-title><ref><sb>presentation_info</sb></ref> <shi>-> Optional[</shi><docs-ref link=\"/PyTgCalls/Advanced Types/SourceInfo\">pytgcalls.SourceInfo</docs-ref><shi>]</shi></category-title>\n <subtext><text>Info about the screen sharing stream the participant is currently broadcasting.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/SourceInfo.xml": "<page>\n <h1>SourceInfo</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>SourceInfo</sb></ref>\n </category-title>\n <subtext>\n <text>Info about a source in a group call.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref><sb>endpoint</sb></ref> <shi>-> str</shi></category-title>\n <subtext><text>Endpoint of the source.</text></subtext>\n <category-title><ref><sb>sources</sb></ref> <shi>-> list[</shi><docs-ref link=\"/NTgCalls/Available Types/SsrcGroup\">ntgcalls.SsrcGroup</docs-ref><shi>]</shi></category-title>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/StreamEnded.xml": "<page>\n <h1>StreamEnded</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>StreamEnded</sb></ref>\n </category-title>\n <subtext>\n <text>The audio stream or video stream has ended.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <config id=\"RET_INT_ID\"/>\n <category-title><ref>stream_type</ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Available Enums/StreamEnded Type\">StreamEnded.Type</docs-ref></category-title>\n <subtext><text>Get the type of the stream that has ended.</text></subtext>\n\n <category-title><ref>device</ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Available Enums/Device\">pytgcalls.Device</docs-ref></category-title>\n <subtext><text>Get the device that has ended the stream.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/StreamFrames.xml": "<page>\n <h1>StreamFrames</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>StreamFrames</sb></ref>\n </category-title>\n <subtext>\n <text>Represents stream frames.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>device</ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Available Enums/Device\">Device</docs-ref></category-title>\n <subtext><text>Kind of frames device.</text></subtext>\n\n <category-title><ref>direction</ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Available Enums/Direction\">Direction</docs-ref></category-title>\n <subtext><text>Direction of the frames.</text></subtext>\n\n <category-title><ref>frames</ref> <shi>-> list</shi>[<docs-ref link=\"/PyTgCalls/Advanced Types/Frame\">Frame</docs-ref>]</category-title>\n <subtext><text>List of frames.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/UpdatedGroupCallParticipant.xml": "<page>\n <h1>UpdatedGroupCallParticipant</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>UpdatedGroupCallParticipant</sb></ref>\n </category-title>\n <subtext>\n <text>A participant changed his status.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <config id=\"RET_INT_ID\"/>\n <category-title><ref><sb>action</sb></ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Available Enums/GroupCallParticipant Action\">pytgcalls.GroupCallParticipant.Action</docs-ref></category-title>\n <subtext><text>Current action of the participant.</text></subtext>\n <config id=\"ARG_PARTICIPANT\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/AudioQuality.xml": "<page>\n <h1>AudioQuality</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.<sb>AudioQuality</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration of audio quality settings for audio streams in telegram calls.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>STUDIO</sb></ref> <shi>=</shi> (96000, 2)</category-title>\n <subtext><text>Represents studio-quality audio with a bitrate of 96000 and 2 channels.</text></subtext>\n\n <category-title><ref><sb>HIGH</sb></ref> <shi>=</shi> (48000, 2)</category-title>\n <subtext><text>Represents high-quality audio with a bitrate of 48000 and 2 channels.</text></subtext>\n\n <category-title><ref><sb>MEDIUM</sb></ref> <shi>=</shi> (36000, 1)</category-title>\n <subtext><text>Represents medium-quality audio with a bitrate of 36000 and 1 channel.</text></subtext>\n\n <category-title><ref><sb>LOW</sb></ref> <shi>=</shi> (24000, 1)</category-title>\n <subtext><text>Represents low-quality audio with a bitrate of 24000 and 1 channel.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/Call Status.xml": "<page>\n <h1>Call Status</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">Call.<sb>Status</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing call statuses.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>ACTIVE</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Indicates that the call is playing.</text></subtext>\n <category-title><ref><sb>PAUSED</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Indicates that the call is paused.</text></subtext>\n <category-title><ref><sb>IDLE</sb></ref> <shi>=</shi> 4</category-title>\n <subtext><text>Indicates that the call is idle.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/Call Type.xml": "<page>\n <h1>Call Type</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">Call.<sb>Type</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing call types.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>GROUP</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Group call type.</text></subtext>\n <category-title><ref><sb>PRIVATE</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Private call type.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/ChatUpdate Status.xml": "<page>\n <h1>ChatUpdate Status</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">ChatUpdate.<sb>Status</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing chat update status in telegram calls.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>KICKED</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Indicates that you was kicked from the chat.</text></subtext>\n <category-title><ref><sb>LEFT_GROUP</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Indicates that you left the chat.</text></subtext>\n <category-title><ref><sb>CLOSED_VOICE_CHAT</sb></ref> <shi>=</shi> 4</category-title>\n <subtext><text>Indicates that the voice chat was closed.</text></subtext>\n <category-title><ref><sb>INVITED_VOICE_CHAT</sb></ref> <shi>=</shi> 8</category-title>\n <subtext><text>Indicates that you was invited to the voice chat.</text></subtext>\n <category-title><ref><sb>DISCARDED_CALL</sb></ref> <shi>=</shi> 16</category-title>\n <subtext><text>Indicates that the call was discarded.</text></subtext>\n <category-title><ref><sb>INCOMING_CALL</sb></ref> <shi>=</shi> 32</category-title>\n <subtext><text>Indicates that an incoming call is available.</text></subtext>\n <category-title><ref><sb>BUSY_CALL</sb></ref> <shi>=</shi> 64</category-title>\n <subtext><text>Indicates that the receiver is busy with another call.</text></subtext>\n <category-title><ref><sb>LEFT_CALL</sb></ref> <shi>=</shi> KICKED | LEFT_GROUP | CLOSED_VOICE_CHAT | DISCARDED_CALL | BUSY_CALL</category-title>\n <subtext><text>Indicates that you left the call.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/Device.xml": "<page>\n <h1>Device</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>Device</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_DEVICE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>MICROPHONE</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"STREAM_DEVICE_MICROPHONE_DESC\"/>\n\n <category-title><ref><sb>SPEAKER</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"STREAM_DEVICE_SPEAKER_DESC\"/>\n\n <category-title><ref><sb>CAMERA</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"STREAM_DEVICE_CAMERA_DESC\"/>\n\n <category-title><ref><sb>SCREEN</sb></ref> <shi>=</shi> 3</category-title>\n <config id=\"STREAM_DEVICE_SCREEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/Direction.xml": "<page>\n <h1>Direction</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>Direction</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_MODE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>OUTGOING</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MODE_CAPTURE_DESC\"/>\n\n <category-title><ref><sb>INCOMING</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MODE_PLAYBACK_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/ExternalMedia.xml": "<page>\n <h1>ExternalMedia</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>ExternalMedia</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for the kind of media that is being played externally.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>AUDIO</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"TYPE_AUDIO_DESC\"/>\n\n <category-title><ref><sb>VIDEO</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"TYPE_VIDEO_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/GroupCallParticipant Action.xml": "<page>\n <h1>GroupCallParticipant Action</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">GroupCallParticipant.<sb>Action</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration of actions for group call participants.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>JOINED</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Represents a participant joined in a group call.</text></subtext>\n\n <category-title><ref><sb>LEFT</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Represents a participant left a group call.</text></subtext>\n\n <category-title><ref><sb>KICKED</sb></ref> <shi>=</shi> 4</category-title>\n <subtext><text>Represents a participant kicked from a group call, usually when it joins from a different device while already in the call.</text></subtext>\n\n <category-title><ref><sb>UPDATED</sb></ref> <shi>=</shi> 8</category-title>\n <subtext><text>Represents a participant updated in a group call.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/MediaStream Flags.xml": "<page>\n <h1>MediaStream Flags</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">MediaStream.<sb>Flags</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing media stream requirements in telegram calls.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>AUTO_DETECT</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Automatically detects the presence of the stream.</text></subtext>\n\n <category-title><ref><sb>IGNORE</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Ignores the stream.</text></subtext>\n\n <category-title><ref><sb>REQUIRED</sb></ref> <shi>=</shi> 4</category-title>\n <subtext><text>Indicates that the stream is mandatory.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/StreamEnded Type.xml": "<page>\n <h1>StreamEnded Type</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">StreamEnded.<sb>Type</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing the type of stream that has ended.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>AUDIO</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"TYPE_AUDIO_DESC\"/>\n\n <category-title><ref><sb>VIDEO</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"TYPE_VIDEO_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/VideoQuality.xml": "<page>\n <h1>VideoQuality</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.<sb>VideoQuality</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration of video quality settings for video streams in telegram calls.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>UHD_4K</sb></ref> <shi>=</shi> (3840, 2160, 60)</category-title>\n <subtext><text>Represents ultra-high-definition 4K video with a resolution of 3840x2160 and 60 FPS.</text></subtext>\n\n <category-title><ref><sb>QHD_2K</sb></ref> <shi>=</shi> (2560, 1440, 60)</category-title>\n <subtext><text>Represents quad high-definition 2K video with a resolution of 2560x1440 and 60 FPS.</text></subtext>\n\n <category-title><ref><sb>FHD_1080p</sb></ref> <shi>=</shi> (1920, 1080, 60)</category-title>\n <subtext><text>Represents full high-definition 1080p video with a resolution of 1920x1080 and 60 FPS.</text></subtext>\n\n <category-title><ref><sb>HD_720p</sb></ref> <shi>=</shi> (1280, 720, 30)</category-title>\n <subtext><text>Represents high-definition 720p video with a resolution of 1280x720 and 30 FPS.</text></subtext>\n\n <category-title><ref><sb>SD_480p</sb></ref> <shi>=</shi> (854, 480, 30)</category-title>\n <subtext><text>Represents standard-definition 480p video with a resolution of 854x480 and 30 FPS.</text></subtext>\n\n <category-title><ref><sb>SD_360p</sb></ref> <shi>=</shi> (640, 360, 30)</category-title>\n <subtext><text>Represents standard-definition 360p video with a resolution of 640x360 and 30 FPS.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Idle.xml": "<page>\n <h1>Idle</h1>\n <text>\n This function will run indefinitely in order to block the main script\n execution and prevent it from exiting while having client(s) that are still running in the background.\n\n PyTgCalls works by keeping your handlers in a pool of worker threads, which run\n concurrently outside the main thread. Calling idle() will ensure that the client(s) remain active, by\n preventing the main script from ending until you decide to quit.\n\n Once a signal is received (e.g.: from CTRL+C) the function will terminate and your main script will continue.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"15\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app1 = PyTgCalls(client1)\n app2 = PyTgCalls(client2)\n app3 = PyTgCalls(client3)\n\n ... # Set handlers up\n\n app1.start()\n app2.start()\n app3.start()\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">pytgcalls.<sb>idle</sb></ref>()\n </category-title>\n <subtext>\n <text>Blocks the main script execution until a signal is received.</text>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Leave Call.xml": "<page>\n <h1>Leave Call</h1>\n <alert type=\"warning\">\n <text>This method replaces the deprecated <code>leave_group_call</code> method.</text>\n </alert>\n <text>This method allows leaving and stopping a group call or a private call, or declining a private call.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.leave_call(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>leave_call</sb></ref>()\n </category-title>\n <subtext>\n <text>Leave a group call or a private call.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n <category-title><ref>close</ref>: <shi>bool</shi></category-title>\n <subtext><text>Whether to close the call or just leave it.</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Run.xml": "<page>\n <h1>Run</h1>\n <text>\n This is a convenience method that calls <docs-ref link=\"/PyTgCalls/Basic Methods/Start\">start()</docs-ref>, <docs-ref link=\"/PyTgCalls/Basic Methods/Idle\">idle()</docs-ref> in sequence.\n It makes running a client less verbose, but it is not suitable in case you want to run more than one client in a single script,\n since the <docs-ref link=\"/PyTgCalls/Basic Methods/Idle\">idle()</docs-ref> part will block all the subsequent code after starting the client.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"8\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n app = PyTgCalls(client)\n\n ... # Call API decorators / MtProto decorators\n\n app.run()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>run</sb></ref>()\n </category-title>\n <subtext>\n <text>Start the client, idle the main script and finally stop the client.</text>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"RUNNING_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Start.xml": "<page>\n <h1>Start</h1>\n <text>\n This method start and then initialize NTgCalls core.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"8\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n app = PyTgCalls(client)\n\n ... # Call API decorators / MTProto decorators\n\n app.start()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>start</sb></ref>()\n </category-title>\n <subtext>\n <text>Start the client.</text>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"RUNNING_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Calling Methods.xml": "<page>\n <h1>Calling Methods</h1>\n <text>\n At this point, we have successfully <docs-ref link=\"/PyTgCalls/Install Guide\">installed PyTgCalls</docs-ref> and installed an MTProto client;\n we are now aiming towards the core of the library. It\u2019s time to start playing with the API!\n </text>\n <h2>Basic Usage</h2>\n <text>Making API method calls with PyTgCalls is very simple. Here\u2019s a basic example we are going to examine step by step:</text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n api_id = 12345\n api_hash = '0123456789abcdef0123456789abcdef'\n ...\n app = PyTgCalls(client)\n app.start()\n app.play(\n -1001185324811,\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n idle()\n </syntax-highlight>\n <h3>Basic step-by-step</h3>\n <list style=\"numbers\">\n <item>\n Let\u2019s begin by importing the Client class and idle function:\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n </syntax-highlight>\n </item>\n <item>\n Now let\u2019s import your MTProto Client:\n <multisyntax id=\"mtproto\">\n <tabs>\n <tab id=\"pyrogram\">PyrogramMod</tab>\n <tab id=\"telethon\">Telethon</tab>\n <tab id=\"hydrogram\">Hydrogram</tab>\n </tabs>\n <syntax-highlight id=\"pyrogram\">\n from pyrogram import Client\n </syntax-highlight>\n <syntax-highlight id=\"telethon\">\n from telethon import TelegramClient\n </syntax-highlight>\n <syntax-highlight id=\"hydrogram\">\n from hydrogram import Client\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n Set your api_id and api_hash taken from <a href=\"https://my.telegram.org/apps\">my.telegram.org</a>:\n <syntax-highlight>\n api_id = 12345\n api_hash = '0123456789abcdef0123456789abcdef'\n </syntax-highlight>\n </item>\n <item>\n Initialize the MTProto client:\n <multisyntax id=\"mtproto\">\n <tabs>\n <tab id=\"pyrogram\">PyrogramMod</tab>\n <tab id=\"telethon\">Telethon</tab>\n <tab id=\"hydrogram\">Hydrogram</tab>\n </tabs>\n <syntax-highlight id=\"pyrogram\">\n client = Client('test_session', api_id, api_hash)\n </syntax-highlight>\n <syntax-highlight id=\"telethon\">\n client = TelegramClient('test_session', api_id, api_hash)\n </syntax-highlight>\n <syntax-highlight id=\"hydrogram\">\n client = Client('test_session', api_id, api_hash)\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n Initialize the PyTgCalls client:\n <syntax-highlight>\n app = PyTgCalls(client)\n </syntax-highlight>\n </item>\n <item>\n Start the PyTgCalls client:\n <syntax-highlight>\n app.start()\n </syntax-highlight>\n </item>\n <item>\n Now you can call any method you want:\n <syntax-highlight>\n app.play(\n -1001185324811,\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n </syntax-highlight>\n </item>\n <item>\n Lastly, call the idle function to keep your code running:\n <syntax-highlight>\n idle()\n </syntax-highlight>\n </item>\n </list>\n <h2>Asynchronous Calls</h2>\n <text>In case you wish to run PyTgCalls asynchronously:</text>\n <syntax-highlight>\n import asyncio\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n app = PyTgCalls(client)\n\n async def main():\n await app.start()\n await app.play(\n -1001185324811,\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n await idle()\n\n asyncio.run(main())\n </syntax-highlight>\n <h3>Asynchronous step-by-step</h3>\n <list style=\"numbers\">\n <item>\n Import PyTgCalls, AsyncIO and create an instance:\n <syntax-highlight>\n import asyncio\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n app = PyTgCalls(client)\n </syntax-highlight>\n </item>\n <item>\n Async methods can\u2019t be executed at the top level, because they must be within an async-defined function;\n here, we define one, and we put our code inside it; method calls require the await keyword:\n <syntax-highlight>\n async def main():\n await app.start()\n await app.play(\n -1001185324811,\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n await idle()\n </syntax-highlight>\n </item>\n <item>\n Then, we tell asyncio to call <code>main()</code> in async mode\n <syntax-highlight>asyncio.get_event_loop().run_until_complete(main())</syntax-highlight>\n </item>\n </list>\n</page>","/PyTgCalls/Changelogs.xml": "<page>\n <h1>Changelogs</h1>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgFeb26.png\"\n minititle=\"MINOR UPDATE\"\n bigtitle=\"PyTgCalls v2.2.11\"\n description=\"Enhanced Android Stability, Performance, and More!\"\n mainbg=\"#070d16\"\n version=\"2.2.11\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Stream Change Control:</b> Added <code>keep_open</code> parameter to <docs-ref link=\"/NTgCalls/Available Types/AudioDescription\">AudioDescription</docs-ref> and <docs-ref link=\"/NTgCalls/Available Types/VideoDescription\">VideoDescription</docs-ref>, allowing you to force stream changes or let the StreamManager automatically detect them.</text></item>\n <item><text><b>JSON Performance Boost:</b> Replaced nlohmann JSON with Boost.JSON for improved parsing and serialization performance.</text></item>\n <item><text><b>Android Builds Now Stable:</b> Addressed the experimental-relative-c++-abi-vtables issue on x86_64, making Android builds fully stable and production-ready.</text></item>\n <item><text><b>Android Audio Improvements:</b> Now using Oboe for audio handling on Android, providing lower latency and better performance.</text></item>\n <item><text><b>Linux Performance Upgrades:</b> Updated to the latest versions of libX11, FFmpeg, mesa, glib, boost and libwebrtc for improved stability and performance.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgMay25.png\"\n minititle=\"MINOR UPDATE\"\n bigtitle=\"PyTgCalls v2.2.X\"\n description=\"Support for Large Group Calls, RTMP Streams, and More!\"\n mainbg=\"#070d16\"\n version=\"2.2.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Support for Large Group Calls:</b> PyTgCalls now supports group calls with 20 or more participants in channels, allowing the deprecation of the <code>UnMuteNeeded</code> exception.</text></item>\n <item><text><b>RTMP Stream Integration:</b> You can now connect to RTMP streams and <sb>record</sb> them using the <docs-ref link=\"/PyTgCalls/Stream Methods/Record\">record()</docs-ref> method. This enables streaming external RTMP content directly into your group calls.</text></item>\n <item><text><b> Group Call Discarding Option:</b> The <code>close</code> parameter has been added to the <docs-ref link=\"/PyTgCalls/Basic Methods/Leave Call\">leave_call()</docs-ref> method, allowing you to fully terminate a group call when it's no longer needed.</text></item>\n <item><text><b>Enhanced Participant Caching:</b> The <docs-ref link=\"/PyTgCalls/Basic Methods/Get Participants\">get_participants()</docs-ref> method now supports proper caching for clients using the <code>no_update</code> parameter, ensuring accurate participant lists without triggering unnecessary updates.</text></item>\n <item><text><b>New ChatUpdate Event:</b> The <docs-ref link=\"/PyTgCalls/Advanced Types/ChatUpdate\">ChatUpdate</docs-ref> event has been introduced to track changes such as busy call status. You can now use the <code>filters.chat_update(ChatUpdate.Status.BUSY_CALL)</code> filter to monitor these updates.</text></item>\n <item><text><b>New Group Call Participant Event:</b> The <docs-ref link=\"/PyTgCalls/Advanced Types/UpdatedGroupCallParticipant\">UpdatedGroupCallParticipant</docs-ref> event enables handling of actions like participants joining from another device or being kicked. Use <code>filters.call_participant(GroupCallParticipant.Action.KICKED)</code> to listen for such events.</text></item>\n <item><text><b>Improved Audio/Video Encoding Performance:</b> Audio and video encoding performance has been significantly improved thanks to an optimized FFmpeg build. The latest version takes advantage of advanced CPU instruction sets like AVX2, resulting in faster processing and lower latency.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Breaking Changes</h3>\n <list>\n <item>\n <text>Now the <docs-ref link=\"/PyTgCalls/Available Enums/GroupCallParticipant Action\">pytgcalls.GroupCallParticipant.Action</docs-ref> has been moved from <docs-ref link=\"/PyTgCalls/Advanced Types/GroupCallParticipant\">pytgcalls.GroupCallParticipant</docs-ref> to <docs-ref link=\"/PyTgCalls/Advanced Types/UpdatedGroupCallParticipant\">pytgcalls.UpdatedGroupCallParticipant</docs-ref>.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n @call_py.on_update(filters.call_participant())\n async def participant_handler(_: PyTgCalls, update: UpdatedGroupCallParticipant):\n print(update.participant.user_id, update.participant.action)\n </syntax-highlight>\n <syntax-highlight>\n @call_py.on_update(filters.call_participant())\n async def participant_handler(_: PyTgCalls, update: UpdatedGroupCallParticipant):\n print(update.participant.user_id, update.action)\n </syntax-highlight>\n </multisyntax>\n </item>\n </list>\n <h3 noref=\"true\">Additional Notes</h3>\n <text>\n The repository <a href=\"https://github.com/AshokShau/TgMusicBot\">AshokShau/TgMusicBot</a> has won the <docs-ref link=\"/PyTgCalls/Changelogs#PyTgCon2K24\">#PyTgCon2K24</docs-ref> contest!\n It is now officially featured in the Quickstart section of the NTgCalls documentation.\n Check it out to see an excellent example of what you can build with PyTgCalls!\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgMar25.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v2.1.X\"\n description=\"Enhanced Group Calls, Recording, and More!\"\n mainbg=\"#070d16\"\n version=\"2.1.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Group Calls V2 \u2013 Stream Video & Screen Simultaneously:</b> Now you can stream both your screen and video at the same time! Learn more in <docs-ref link=\"/PyTgCalls/Stream Descriptors/Stream\">pytgcalls.types.raw.Stream</docs-ref>.</text></item>\n <item><text><b>Record Your Streams:</b> PyTgCalls now supports stream recording! Find out how to use it <docs-ref link=\"/PyTgCalls/Stream Methods/Record\">here</docs-ref>.</text></item>\n <item><text><b>Performance & Stability Boost:</b> We've upgraded WebRTC to the latest version (<a href=\"https://chromiumdash.appspot.com/branches\">m132</a>) and optimized the codebase for better stability and speed.</text></item>\n <item><text><b>PyTgCalls Now Supports Java for Android:</b> You can now use PyTgCalls in Android apps with Java! Check out <a href=\"https://github.com/pytgcalls/Telegram-X\">Telegram-X</a> for usage details or find the library <a href=\"https://central.sonatype.com/artifact/io.github.pytgcalls/ntgcalls\">here</a>.</text></item>\n <item><text><b>Massive CPU Optimization:</b> CPU usage reduced by up to 60% and system calls decreased by 90%, making everything more efficient.</text></item>\n <item><text><b>Clearer C Binding Error Messages:</b> Debugging is now easier with detailed error messages for C bindings.</text></item>\n <item><text><b>Native Media Device Streaming:</b> Stream your microphone, camera, or screen directly with Media Devices. Learn more <docs-ref link=\"/PyTgCalls/Media Devices\">here</docs-ref>.</text></item>\n <item><text><b>Better Performance with OpenH264:</b> Now supporting OpenH264 for lower CPU usage and improved performance.</text></item>\n </list>\n <h3 noref=\"true\">Breaking Changes</h3>\n <list>\n <item>\n <text>Now the <docs-ref link=\"/PyTgCalls/Media Devices\">MediaDevices</docs-ref> has been refactored, so was renamed the <code>get_screen_devices()</code> and <code>get_audio_devices()</code> to <code>screen_devices()</code> and <code>microphone_devices()</code>.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # Get screen devices\n screen_devices = MediaDevices.get_screen_devices()\n <br/>\n # Get microphone devices\n audio_devices = MediaDevices.get_audio_devices()\n </syntax-highlight>\n <syntax-highlight>\n # Get screen devices\n screen_devices = MediaDevices.screen_devices()\n <br/>\n # Get microphone devices\n audio_devices = MediaDevices.microphone_devices()\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n <text>Some media management methods were renamed, for example, for example <code>pause_stream()</code> was changed to <code>pause()</code></text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # Pause the stream\n call_py.pause_stream(-1001234567890)\n <br/>\n # Resume the stream\n call_py.resume_stream(-1001234567890)\n <br/>\n # Mute the stream\n call_py.mute_stream(-1001234567890)\n <br/>\n # Unmute the stream\n call_py.unmute_stream(-1001234567890)\n <br/>\n # Get the current played time\n call_py.played_time(-1001234567890)\n </syntax-highlight>\n <syntax-highlight>\n # Pause the stream\n call_py.pause(-1001234567890)\n <br/>\n # Resume the stream\n call_py.resume(-1001234567890)\n <br/>\n # Mute the stream\n call_py.mute(-1001234567890)\n <br/>\n # Unmute the stream\n call_py.unmute(-1001234567890)\n <br/>\n # Get the current played time\n call_py.time(-1001234567890)\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n <text>To retrieve the current call status, use the <code>capture</code> field instead of <code>status</code> since now CallStatus can return also the current recording status.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # Get the current call status\n call_py.calls[-1001234567890].status\n </syntax-highlight>\n <syntax-highlight>\n # Get the current call status\n call_py.calls[-1001234567890].capture\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n <text>Now the <code>stream_end</code> filter requires brackets, since now accepts multiple parameters.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # On stream end\n @call_py.on_update(filters.stream_end)\n async def on_stream_end(client: PyTgCalls, update: Update):\n print(update)\n </syntax-highlight>\n <syntax-highlight>\n # On stream end\n @call_py.on_update(filters.stream_end())\n async def on_stream_end(client: PyTgCalls, update: Update):\n print(update)\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n <text>Removed <code>StreamAudioEnded</code> and <code>StreamVideoEnded</code> in favor of <code>StreamEnded</code> with the <code>stream_type</code> and <code>device</code> field.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # On stream ended\n @call_py.on_update(filters.stream_end())\n async def on_stream_ended(client: PyTgCalls, update: Update):\n # Check the stream type\n if isinstance(update, StreamAudioEnded):\n print(update)\n elif isinstance(update, StreamVideoEnded):\n print(update)\n </syntax-highlight>\n <syntax-highlight>\n # On stream ended\n @call_py.on_update(filters.stream_end())\n async def on_stream_ended(client: PyTgCalls, update: StreamEnded):\n # Check the stream type\n if update.stream_type == StreamEnded.Type.AUDIO:\n print(update)\n elif update.stream_type == StreamEnded.Type.VIDEO:\n print(update)\n </syntax-highlight>\n </multisyntax>\n </item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgSep24.png\"\n minititle=\"MINOR UPDATE\"\n bigtitle=\"PyTgCalls v2.0.3\"\n description=\"Private Calls Stable, Performances Improvements and more!\"\n mainbg=\"#070d16\"\n version=\"2.0.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Private Calls are Now Stable:</b> Easily make private calls, even for groups, with a single method\u2014just use <docs-ref link=\"/PyTgCalls/Basic Methods/Play\">play()</docs-ref>! Check out the example here: <a href=\"https://github.com/pytgcalls/pytgcalls/blob/master/example/p2p_example/example_p2p.py\">Private Calls</a>.</text></item>\n <item><text><b>Performance Boost:</b> We're now running the latest WebRTC version (<a href=\"https://chromiumdash.appspot.com/branches\">m128</a>), bringing key performance fixes. Plus, with the latest pybind11 update, issues with Python's garbage collection have been resolved for a smoother experience.</text></item>\n <item><text><b>New \"adjust_by_height\" Feature:</b> Adjust video resolution by height instead of width, giving you more flexibility in how you manage your video streams. Learn more <docs-ref link=\"/PyTgCalls/Stream Descriptors/VideoParameters\">here</docs-ref>.</text></item>\n <item><text><b>New Event Handlers (remove_handler & add_handler):</b> These methods allow you to register listeners for existing events just like the decorators in the library. Use them to handle events such as \"stream ended\" or \"new user connected\" within PyTgCalls. Find out more <docs-ref link=\"/PyTgCalls/Using Handlers\">here</docs-ref>.</text></item>\n <item><text><b>Improved Documentation:</b> Enjoy clearer, more detailed documentation with fresh examples, a new UI, a powerful search engine, and step-by-step guidance to help you get started quickly.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Community Milestone</h3>\n <text>\n <b>Thank You All:</b> We've reached a new milestone with over 400 thousand of active monthly users! We're grateful for your support and feedback, which has helped us improve PyTgCalls and make it the go-to library for all your real-time communication needs.\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgApr24.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v2.0.X\"\n description=\"Private Calls, Code Rework, Async Support and more!\"\n mainbg=\"#070d16\"\n version=\"2.0.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Private Calls:</b> Now you can make private calls by just using a single method for also group calls, by using <docs-ref link=\"/PyTgCalls/Basic Methods/Play\">play()</docs-ref>.</text></item>\n <item><text><b>Code Rework:</b> The code has been reworked to improve performance, stability and to make it more readable.</text></item>\n <item><text><b>Async Support:</b> NTgCalls now supports asynchronous methods for improved performance.</text></item>\n <item><text><b>Filters for Updates:</b> Added filters for updates to allow for more granular control over updates, <docs-ref link=\"/PyTgCalls/Filters\">More Info</docs-ref>.</text></item>\n <item><text><b>Improved Documentation:</b> Updated documentation with more examples, new UI and comprehensive guidance.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Breaking Changes</h3>\n <list>\n <item>\n <text>Now methods like <code>change_stream()</code> and <code>join_group_call()</code> was removed, now you can use <code>play()</code> for both private, group calls and changing streams.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # Change stream\n call_py.change_stream(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n <br/>\n # Join group call\n call_py.join_group_call(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n </syntax-highlight>\n <syntax-highlight>\n # Change stream\n call_py.play(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n <br/>\n # Join group call\n call_py.play(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n <text>Now all listeners like <code>on_stream_end()</code> was unified in <code>on_update()</code> and with <docs-ref link=\"/PyTgCalls/Filters\">filters</docs-ref>, for example:</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n ...\n # On Closed Voice Chat\n @call_py.on_closed_voice_chat()\n async def on_closed_voice_chat(client: PyTgCalls, update: Update):\n print(update)\n <br/>\n # On stream end\n @call_py.on_stream_end()\n async def on_stream_end(client: PyTgCalls, update: Update):\n print(update)\n </syntax-highlight>\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n # On Closed Voice Chat\n @call_py.on_update(filters.chat_update(ChatUpdate.Status.CLOSED_VOICE_CHAT))\n async def on_closed_voice_chat(client: PyTgCalls, update: Update):\n print(update)\n <br/>\n # On stream end\n @call_py.on_update(filters.stream_end)\n async def on_stream_end(client: PyTgCalls, update: Update):\n print(update)\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n <text>Reworked <code>GroupCall</code> type, now is <docs-ref link=\"/PyTgCalls/Advanced Types/Call\">Call</docs-ref> and now is more powerful and easy to use.</text>\n </item>\n <item>\n <text>Removed <code>JoinedGroupCallParticipant</code> and <code>LeftGroupCallParticipant</code> classes, now you can see the action in <docs-ref link=\"/PyTgCalls/Advanced Types/GroupCallParticipant\">GroupCallParticipant</docs-ref> class.</text>\n </item>\n <item>\n <text>Removed all legacy types and input stream, now is a mandatory to use <docs-ref link=\"/PyTgCalls/Stream Descriptors/MediaStream\">MediaStream</docs-ref> for all streams.</text>\n </item>\n <item>\n <text>Now <code>ping()</code> from <docs-ref link=\"/PyTgCalls/Client\">Client</docs-ref> is not anymore a coroutine, now is a normal method.</text>\n </item>\n <item>\n <text>Removed <code>get_active_call()</code> and <code>get_call()</code>, now is a mandatory to use <code>calls()</code> from <docs-ref link=\"/PyTgCalls/Client\">Client</docs-ref>.</text>\n </item>\n <item>\n <text>Renamed <code>leave_group_call</code> to <docs-ref link=\"/PyTgCalls/Basic Methods/Leave Call\">leave_call()</docs-ref>.</text>\n </item>\n <item>\n <text>Moved <code>MediaStream</code> flags under <docs-ref link=\"/PyTgCalls/Available Enums/MediaStream Flags\">MediaStream.Flags</docs-ref> instead of <code>MediaStream</code>.</text>\n </item>\n <item>\n <text>Now <code>invite_hash</code>, <code>join_as</code> and <code>auto_start</code> are part of <docs-ref link=\"/PyTgCalls/Advanced Types/GroupCallConfig\">GroupCallConfig</docs-ref> instead of <code>join_group_call</code>.</text>\n </item>\n <item>\n <text>Renamed <code>additional_ffmpeg_parameters</code> to <code>ffmpeg_parameters</code> in <docs-ref link=\"/PyTgCalls/Stream Descriptors/MediaStream\">MediaStream</docs-ref>.</text>\n </item>\n <item>\n <text>For more info about breaking changes, check the <docs-ref link=\"/PyTgCalls/Examples\">Examples</docs-ref>, if we missed something, please <a href=\"https://github.com/pytgcalls/docsdata/issues/new\">open an issue</a>.</text>\n </item>\n </list>\n <h3 noref=\"true\">Additional Notes</h3>\n <text>\n We're pleased to announce that now is available an unofficial porting of NTgCalls for Rust, for more info, check the <a href=\"https://github.com/YouKnow-sys/ntgcalls-rs\">repository</a>.\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgFeb24.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v1.2.X\"\n description=\"Static Typing, YtDlp support and More\"\n mainbg=\"#070d16\"\n version=\"1.2.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Static Typing:</b> PyTgCalls is now fully statically typed, ensuring that the types of each method and class are thoroughly checked.</text></item>\n <item><text><b>YtDlp Support:</b> MediaStream now supports links from YouTube using YtDlp, for example: <a href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\">https://www.youtube.com/watch?v=iSbLHrrqmoM</a></text></item>\n <item>\n <text><b>MediaStream Quality Support:</b> MediaStream now accepts enhanced quality options for audio and video parameters. For audio, use <docs-ref link=\"/PyTgCalls/Available Enums/AudioQuality\">AudioQuality</docs-ref>, and for video, use <docs-ref link=\"/PyTgCalls/Available Enums/VideoQuality\">VideoQuality</docs-ref>.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n 'input.mp4',\n AudioParameters.from_quality(AudioQuality.STUDIO),\n VideoParameters.from_quality(VideoQuality.FHD_1080p),\n ),\n )\n </syntax-highlight>\n <syntax-highlight>\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n 'input.mp4',\n AudioQuality.STUDIO,\n VideoQuality.FHD_1080p,\n ),\n )\n </syntax-highlight>\n </multisyntax>\n </item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Breaking Changes</h3>\n <list>\n <item><text>Now all raw methods like AudioParameters, VideoParameters, AudioStream, VideoStream, and Stream are all under <code>pytgcalls.types.raw</code> instead of <code>pytgcalls.types</code>.</text></item>\n <item><text>The exception class <code>pytgcalls.exceptions.TelegramServerError</code> is now part of <code>ntgcalls.TelegramServerError</code>.</text></item>\n </list>\n <h3 noref=\"true\">Additional Notes</h3>\n <text>\n We're pleased to announce that pre-compiled wheels optimized for ARM64 devices are now available.\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgCon24.png\"\n minititle=\"NEWS\"\n bigtitle=\"#PyTgCon2K24\"\n description=\"If you've crafted a public open repository, it's time to showcase your work in the PyTgCalls Contest! \ud83c\udf1f\"\n mainbg=\"#070d16\"\n version=\"1.1.6\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n presentationtitle=\"PyTgCalls Contest\"\n presentationdescription=\"Competition for bot developers\"\n presentationbuttontitle=\"Participate\"\n presentationbuttonurl=\"https://github.com/pytgcalls/pytgcalls/discussions/199\"\n presentationimage=\"/src/assets/contest.png\"\n />\n <subtext>\n <h3 noref=\"true\">Here's how to join:</h3>\n <list>\n <item><text><b>Visit the discussion page:</b> <a href=\"https://github.com/pytgcalls/pytgcalls/discussions/199\">PyTgCalls Contest</a></text></item>\n <item><text><b> Share these details:</b> Your Repository Name, Brief Description of Your Bot, Link to Your Repository</text></item>\n </list>\n <h3 noref=\"true\">Prizes and Recognition</h3>\n <list>\n <item><text>Encourage upvotes by reposting this message in your channels.</text></item>\n <item><text>The bot with the highest upvotes earns a prestigious place in the PyTgCalls documentation.</text></item>\n </list>\n <h3 noref=\"true\">Contest Rules</h3>\n <list>\n <item><text>Make sure your repository goes beyond minor tweaks of a fork.</text></item>\n <item><text>Use the <a href=\"https://pypi.org/project/py-tgcalls/1.1.2/\">latest</a> PyTgCalls version).</text></item>\n <item><text>Your repository should be public.</text></item>\n </list>\n <text>Join the contest now and showcase your PyTgCalls-powered bot for a chance to be featured prominently on the PyTgCalls documentation! Good luck!</text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgDec23v2.png\"\n minititle=\"MINOR UPDATE\"\n bigtitle=\"PyTgCalls v1.1.X\"\n description=\"Unified Stream Design, AutoStart GroupCalls and More\"\n mainbg=\"#070d16\"\n version=\"1.1.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>AutoStart of Group Calls:</b> Now GroupCalls will be started automatically if they are not started, if you want to know how to disable it, <docs-ref link=\"/PyTgCalls/Basic Methods/Play#Details\">read here</docs-ref>.</text></item>\n <item>\n <text><b>Unified Stream Design:</b> Now you can do whatever you want, streaming audio, video, both, recording the stream etc. with just one class!.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # Play audio and video from and MP4 file\n call_py.join_group_call(\n -1001234567890,\n AudioVideoPiped(\n 'input.mp4',\n ),\n )\n <br/>\n # Stream audio only from an MP4 file\n call_py.join_group_call(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n <br/>\n # Stream screen\n call_py.join_group_call(\n -1001234567890,\n CaptureVideoDesktop(\n MediaDevices.get_screen_devices()[0],\n ),\n )\n </syntax-highlight>\n <syntax-highlight>\n # Play audio and video from and MP4 file\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n 'input.mp4',\n ),\n )\n <br/>\n # Stream audio only from an MP4 file\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n 'input.mp4',\n video_flags=MediaStream.IGNORE,\n ),\n )\n <br/>\n # Stream screen\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n MediaDevices.get_screen_devices()[0],\n ),\n )\n </syntax-highlight>\n </multisyntax>\n </item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Deprecation Notice</h3>\n <text>\n As we said in the last post,\n now PyTgCalls <b>0.8.6</b> has reached the <b>end of life</b>,\n so this update is completely incompatible with this or previous versions.\n We have also deprecated most of the Stream Piped methods, here's the list:\n </text>\n <list>\n <item><text>AudioImagePiped</text></item>\n <item><text>AudioPiped</text></item>\n <item><text>AudioVideoPiped</text></item>\n <item><text>CaptureAudioDevice</text></item>\n <item><text>CaptureAVDesktop</text></item>\n <item><text>CaptureAVDeviceDesktop</text></item>\n <item><text>CaptureVideoDesktop</text></item>\n <item><text>VideoPiped</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgDec23.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v1.0.X\"\n description=\"NTgCalls, Hydrogram Support, New Documentation, and More\"\n mainbg=\"#070d16\"\n version=\"1.0.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>NTgCalls Integration:</b> The PyTgCalls core has been updated to use NTgCalls instead of TgCallsJS, making it more portable and eliminating overhead. Now, you only need to install ffmpeg on your machine, resulting in improved performance.</text></item>\n <item><text><b>Hydrogram Support:</b> Official support for Hydrogram, a new mtproto client based on Pyrogram, providing new possibilities and enhancing the overall experience.</text></item>\n <item><text><b>New Documentation:</b> Revamped documentation with improved clarity, comprehensive examples, and up-to-date guidance for developers.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Community Milestone</h3>\n <text>\n <b>Thank You All:</b> Celebrating over 100 thousand Downloads! The project has seen remarkable growth, averaging around 8,000 downloads per week since its launch. We appreciate the community's strong interest and support.\n </text>\n <h3 noref=\"true\">Deprecation Notice</h3>\n <text>\n <b>End-of-Life (EOL) Dates:</b> Due to changes in Pyrogram and significant time since the release of PyTgCalls 0.8.X, different versions are marked for end-of-life:\n </text>\n <list>\n <item><text><b>0.8.0, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5:</b> Support ended due to outdated versions.</text></item>\n <item><text><b>0.8.6:</b> Support will continue until December 18 due to Pyrogram archiving.</text></item>\n <item><text><b>0.9.X:</b> Current Long-Term Support.</text></item>\n <item><text><b>1.0.X:</b> Latest version with high-support rate.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgSep22.png\"\n minititle=\"BUG FIXES\"\n bigtitle=\"PyTgCalls v0.9.X\"\n description=\"Feature Enhancements and Bug Fixes\"\n mainbg=\"#070d16\"\n version=\"0.9.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Time Tracking:</b> Added the ability to determine the time of the currently playing audio/video. For more details, check <docs-ref link=\"/PyTgCalls/Stream Methods/Played Time\">Played Time</docs-ref>.</text></item>\n <item><text><b>New Errors:</b> Introduced two new errors, UnMuteNeeded and RTMPStreamNeeded.</text></item>\n </list>\n <h3 noref=\"true\">Changes & Bug Fixes</h3>\n <list>\n <item><text><b>End of Life for Python3.6:</b> Support for Python 3.6 has reached the end of life and is no longer maintained.</text></item>\n <item><text><b>Security Fix:</b> Addressed a security issue with the ID generation process to enhance overall security.</text></item>\n <item><text><b>Multi-Thread Removal:</b> Removed Multi-Thread Py-TgCalls due to no bug fixes by Node.js for over 4 years.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgJul22.png\"\n minititle=\"NEWS\"\n bigtitle=\"Google Partnership!\"\n description=\"Py-TgCalls classified as one of most used projects on PyPI\"\n mainbg=\"#070d16\"\n version=\"0.9.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n presentationbuttontitle=\"Download\"\n />\n <subtext>\n <text>\n As we know, Google is in charge of financing Python.\n Due to the recent events with the <a href=\"https://gitprotect.io/blog/compromised-npm-packages-malware-and-github/\">Node.js situation</a>, PyPI ran for cover,\n thanks to the strong collaboration between Python and the Google Open Source Security Team they offered 4000 Titan Tokens for free available only in some regions of the world.\n PyPI to distribute these security tokens was based on a criterion, that is; any project in the top 1% of downloads in the previous 6 months is considered critical,\n at the moment only <b>3500 projects</b> are considered out of <b>350 thousand</b> are considered as such and py-tgcalls is considered a critical project.\n According to statistics last month, it was downloaded <b>684 thousand</b> times.\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgDec21.png\"\n minititle=\"BUG FIXES\"\n bigtitle=\"PyTgCalls v0.8.3\"\n description=\"WebRTC Retry Fixes and Asynchronous Method Invocation\"\n mainbg=\"#070d16\"\n version=\"0.8.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">Changes & Bug Fixes</h3>\n <list>\n <item><text><b>WebRTC Retry Fixes:</b> Addressed issues with WebRTC retry for more reliable connections.</text></item>\n <item><text><b>Asynchronous Method Invocation:</b> All methods, such as join_group_call, now use asyncio future, waiting for responses from Node.js asynchronously.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgNov21.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v0.8.X\"\n description=\"Telethon Support, Group/Channel Join, Video Group Call, and More\"\n mainbg=\"#070d16\"\n version=\"0.8.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item>\n <text><b>Internal FFmpeg Conversion:</b> Introduced internal FFmpeg conversion for AudioPiped, AudioVideoPiped, and AudioImagePiped for seamless multimedia handling.</text>\n <syntax-highlight mark=\"3-5\">\n call_py.join_group_call(\n -1001234567890,\n AudioVideoPiped(\n 'input.webm',\n ),\n stream_type=StreamType().pulse_stream,\n )\n </syntax-highlight>\n </item>\n <item><text><b>Remote Stream Support:</b> Added support for remote streams for more diverse streaming options.</text></item>\n <item><text><b>Stream Image with Audio:</b> Added the ability to stream images with audio using AudioImagePiped.</text></item>\n <item><text><b>GetParticipants and OnParticipantChange:</b> New functionalities for handling participants in group calls.</text></item>\n <item><text><b>Browser Constants as Headers:</b> Added browser constants as headers for FFmpeg.</text></item>\n <item><text><b>Python 3.10 Support:</b> Added compatibility with Python 3.10.</text></item>\n </list>\n <h3 noref=\"true\">Changes & Fixes</h3>\n <list>\n <item><text><b>Proportion Video Support:</b> Added support for all proportion video formats for a more versatile video experience.</text></item>\n <item><text><b>Communication Fix:</b> Addressed stderr overflow by adding a reader for improved Node.js communication.</text></item>\n <item><text><b>WebRTC Connection Retry:</b> Added automatic retry if WebRTC connection fails for more reliable connections.</text></item>\n <item><text><b>Lighter Buffer Reader:</b> Optimized the Buffer Reader for lighter resource usage.</text></item>\n <item><text><b>Multiple Ping Requests:</b> Now supports multiple ping requests for improved responsiveness.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgAug21v2.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v0.7.X\"\n description=\"Code Cleanup, Full Asynchronous Support, and Enhanced Functionality\"\n mainbg=\"#070d16\"\n version=\"0.7.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Custom Exceptions:</b> Added custom exceptions for more robust error handling.</text></item>\n <item><text><b>Platform Support:</b> Added support for Windows, macOS, and Linux Arm64.</text></item>\n </list>\n <h3 noref=\"true\">Changes & Fixes</h3>\n <list>\n <item><text><b>PyTgCalls Re-Base:</b> Code cleanup and fixes for a more streamlined and efficient codebase.</text></item>\n <item><text><b>Fully Async:</b> The library is now fully asynchronous for improved performance.</text></item>\n <item><text><b>Communication Update:</b> Removed the internal socket server for Node.js communication between Python, replaced with stdin and stdout.</text></item>\n <item><text><b>CustomAPI Renewed:</b> CustomAPI upgraded to version 2.1 with new features and improvements.</text></item>\n <item><text><b>RawUpdate Enhancement:</b> RawUpdate renewed with PyTgCalls Object Update for better handling of updates.</text></item>\n <item><text><b>Method Name Change:</b> .run() is now .start() and no longer blocks code execution.</text></item>\n <item><text><b>Logging Update:</b> Now logs are directed to Python Logging for improved logging capabilities.</text></item>\n <item><text><b>Voice Call Handling:</b> If the stream is deleted, the userbot will exit the voice call by printing an error in RawUpdate.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgAug21.png\"\n minititle=\"MINOR UPDATE\"\n bigtitle=\"PyTgCalls v0.6.X\"\n description=\"Multi-core Beta Support, Function Execution Without Node.js Core Waiting, and More\"\n mainbg=\"#070d16\"\n version=\"0.6.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Multi-core support:</b> PyTgCalls now supports multiple cores for enhanced performance.</text></item>\n <item><text><b>Remote version check:</b> Added the ability to check for the latest version available on GitHub remotely.</text></item>\n </list>\n <h3 noref=\"true\">Changes & Fixes</h3>\n <list>\n <item><text><b>CustomAPI 2.0:</b> Upgraded to CustomAPI version 2.0 with new features and improvements.</text></item>\n <item><text><b>Security Fix:</b> Addressed a security vulnerability for a more secure experience.</text></item>\n <item><text><b>Function execution without Node.js Core waiting:</b> Users can now call functions without waiting for the Node.js Core.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgJul21.png\"\n minititle=\"BUG FIXES\"\n bigtitle=\"PyTgCalls v0.5.X\"\n description=\"Smoother Installation, Active Calls Resolved, and Enhanced Error Insight\"\n mainbg=\"#070d16\"\n version=\"0.5.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">Changes & Fixes</h3>\n <list>\n <item><text><b>Fixed PyPi builds: </b>Fixed an issue where PyTgCalls compiled without the JavaScript core</text></item>\n <item><text><b>Improved join_group_call error: </b>The join_group_call error is now more descriptive</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n </subtext>\n </category>\n</page>","/PyTgCalls/Client.xml": "<page>\n <h1>PyTgCalls Client</h1>\n <text>\n You now are in the API Reference section. Here you can find detailed information about PyTgCalls API:\n the main Client class, all available methods, types, attributes and decorators detailed descriptions can be found starting from this page.\n\n This page is about the Client class, which exposes high-level methods for easy access to the API.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"1-3\">\n from pytgcalls import PyTgCalls\n\n app = PyTgCalls(client)\n app.start()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.<sb>PyTgCalls</sb></ref>\n </category-title>\n <subtext>\n <text>PyTgCalls Client, the main tool for interacting with Telegram Calls.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>app</ref>: Union[<a href=\"https://docs.pyrogram.org/api/client\">pyrogram.Client</a>, <a href=\"https://docs.telethon.dev/en/latest/modules/client.html\">telethon.TelegramClient</a>, <a href=\"https://hydrogram.amanoteam.com/en/latest/api/client.html\">hydrogram.Client</a>]</category-title>\n <subtext><text>Pass the MTProto Client</text></subtext>\n <category-title><ref>cache_duration</ref>: <shi>int</shi></category-title>\n <subtext><text>Cache duration of a Full Chat query</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>STATIC METHODS</pg-title>\n <subtext>\n <category-title><shi>async</shi> <ref><sb>calls</sb></ref> <shi>-> dict</shi>[<shi>int</shi>, <docs-ref link=\"/PyTgCalls/Advanced Types/Call\">Call</docs-ref>]</category-title>\n <config id=\"LIST_CALLS_DESC\"/>\n\n <category-title><shi>async</shi> <ref><sb>group_calls</sb></ref> <shi>-> dict</shi>[<shi>int</shi>, <docs-ref link=\"/PyTgCalls/Advanced Types/Call\">Call</docs-ref>]</category-title>\n <subtext><text>Get all group calls</text></subtext>\n\n <category-title><shi>async</shi> <ref><sb>private_calls</sb></ref> <shi>-> dict</shi>[<shi>int</shi>, <docs-ref link=\"/PyTgCalls/Advanced Types/Call\">Call</docs-ref>]</category-title>\n <subtext><text>Get all private calls</text></subtext>\n\n <category-title><ref><sb>cache_peer</sb></ref> <shi>-></shi> <config id=\"ARG_UNION_PEER\"/></category-title>\n <subtext><text>Get current Telegram user</text></subtext>\n\n <category-title><ref><sb>ping</sb></ref> <shi>-></shi> <shi>int</shi></category-title>\n <subtext><text>Ping of NTgCalls core</text></subtext>\n\n <category-title><ref><sb>mtproto_client</sb></ref> <shi>-></shi> Any</category-title>\n <subtext><text>Get the MTProto client</text></subtext>\n\n <category-title><shi>async</shi> <ref><sb>cpu_usage</sb></ref> <shi>-> float</shi></category-title>\n <subtext><text>Get the CPU usage of the current process</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <category-title>exception <ref>pytgcalls.exceptions.<sb>InvalidMTProtoClient</sb></ref></category-title>\n <subtext><text>You set an invalid MTProto client.</text></subtext>\n </subtext>\n </category>\n </subtext>\n\n </category>\n</page>","/PyTgCalls/Custom Api.xml": "<page>\n <h1>Custom API</h1>\n <text>\n You now are in the API Reference section where you can find detailed information about the Custom API:\n the Front-end API class, all available methods, types, attributes and decorators detailed descriptions can be found starting from this page.\n\n This page is about the CustomAPI class, which exposes high-level methods for easy access to the API.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"3-10\">\n from pytgcalls import CustomApi\n\n api = CustomApi()\n\n @api.on_update_custom_api()\n async def custom_api_request(request: dict):\n print(request)\n return {\n 'response': 'FOXES',\n }\n api.start()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.<sb>CustomApi</sb></ref>\n </category-title>\n <subtext>\n <text>CustomApi, the main means host the local http api server.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>port</ref>: <shi>int</shi></category-title>\n <subtext><text>CustomApi port of the http server</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>METHODS</pg-title>\n <subtext>\n <category-title><ref><sb>start</sb></ref>()</category-title>\n <subtext><text>This method starts the internal http webserver, this is helpful if you need an API interface to PyTgCalls.</text></subtext>\n </subtext>\n </category>\n </subtext>\n </category>\n</page>","/PyTgCalls/Decorators.xml": "<page>\n <h1>Decorators</h1>\n <text>\n While still being methods bound to the <docs-ref link=\"/PyTgCalls/Client\">PyTgCalls</docs-ref> class,\n decorators hold a special significance that justifies a dedicated page.\n\n Decorators allow you to register callback functions for handling updates in a much easier and cleaner way.\n All you need to do is add the decorators on top of your functions.\n </text>\n <syntax-highlight mark=\"8-9\">\n from pytgcalls import PyTgCalls\n from pytgcalls.types import Update\n from pytgcalls import filters as call_filters\n ...\n client = # Here Your MTProto Client\n app = PyTgCalls(client)\n\n @app.on_update(call_filters.stream_end())\n async def handler(client: PyTgCalls, update: Update):\n print(update)\n\n app.run()\n </syntax-highlight>\n <separator/>\n <h1>PyTgCalls Decorators</h1>\n <br/>\n <category>\n <category-title><ref>@PyTgCalls.<sb>on_update</sb></ref>()</category-title>\n <subtext>\n <text>\n Decorator for handling all incoming updates.\n When any update is received, this decorator will be triggered.\n </text>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>filters</ref>: Optional[<docs-ref link=\"/PyTgCalls/Filters\">Filters</docs-ref>]</category-title>\n </subtext>\n <h3>Example</h3>\n <syntax-highlight mark=\"5-6\">\n from pytgcalls.types import Update\n ...\n app = PyTgCalls(client)\n ...\n @app.on_update()\n async def handler(client: PyTgCalls, update: Update):\n print(chat_id)\n ...\n app.run()\n </syntax-highlight>\n </subtext>\n </category>\n <br/>\n <h1>CustomApi Decorators</h1>\n <category-title><ref>@CustomApi.<sb>on_update_custom_api</sb></ref>()</category-title>\n <subtext>\n <text>Decorator for handling incoming HTTP events.</text>\n <pg-title>RAISES</pg-title>\n <subtext>\n <category-title>exception <ref>pytgcalls.exceptions.<sb>TooManyCustomApiDecorators</sb></ref></category-title>\n <subtext><text>You have set too many decorators.</text></subtext>\n </subtext>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-10\">\n ...\n webserver = CustomApi(client)\n ...\n @webserver.on_update_custom_api()\n async def handler(request: dict):\n print(update)\n ... # Add Your Code here, switch or etc.\n return {\n 'result': 'OK',\n }\n webserver.start()\n idle()\n </syntax-highlight>\n </subtext>\n</page>","/PyTgCalls/Examples.xml": "<page>\n <h1>Examples</h1>\n <text>\n This page contains example scripts to demonstrate how PyTgCalls looks like.\n\n Every script is working right away (assuming you correctly set up your credentials), meaning you can simply copy-paste them\n and run. The only things you have to modify are session names and target chats, where applicable.\n\n The examples listed below can be treated as building blocks for your own applications and are designed to be simple enough\n to give you a basic idea.\n </text>\n <separator/>\n <table>\n <definitions>\n <column>Example</column>\n <column>Description</column>\n </definitions>\n <item>\n <column><ref-shi url=\"example/additional_ffmpeg_parameters/additional_ffmpeg_parameters.py\">additional_ffmpeg_parameters</ref-shi></column>\n <column>Append parameters to ffmpeg</column>\n </item>\n <item>\n <column><ref-shi url=\"example/bridged_calls/example_bridged.py\">bridged_calls</ref-shi></column>\n <column>Create a bridge between two group calls</column>\n </item>\n <item>\n <column><ref-shi url=\"example/capture_mic/example_mic.py\">capture_mic</ref-shi></column>\n <column>Capture microphone</column>\n </item>\n <item>\n <column><ref-shi url=\"example/custom_api/example_api.py\">custom_api</ref-shi></column>\n <column>Use custom API server to bind PHP or other API to PyTgCalls</column>\n </item>\n <item>\n <column><ref-shi url=\"example/custom_filters/example_custom.py\">custom_filters</ref-shi></column>\n <column>Make custom filters to use it in PyTgCalls</column>\n </item>\n <item>\n <column><ref-shi url=\"example/docker_example/docker_example.py\">docker_example</ref-shi></column>\n <column>Run PyTgCalls in Docker image</column>\n </item>\n <item>\n <column><ref-shi url=\"example/external_capture/example_external.py\">external_capture</ref-shi></column>\n <column>Capture audio and video frames and receive them as updates</column>\n </item>\n <item>\n <column><ref-shi url=\"example/fifo_conversion/example_fifo.py\">fifo_conversion</ref-shi></column>\n <column>Play a stream from fifo</column>\n </item>\n <item>\n <column><ref-shi url=\"example/frame_sending/example_frame_sending.py\">frame_sending</ref-shi></column>\n <column>Send audio frames manually from Python directly.</column>\n </item>\n <item>\n <column><ref-shi url=\"example/multiple_clients/example_multiple.py\">multiple_clients</ref-shi></column>\n <column>Use multiple clients in one script</column>\n </item>\n <item>\n <column><ref-shi url=\"example/p2p_example/example_p2p.py\">p2p_example</ref-shi></column>\n <column>Play a stream from a private call using PyTgCalls</column>\n </item>\n <item>\n <column><ref-shi url=\"example/piped_audio_calls/example_piped_audio.py\">piped_audio_calls</ref-shi></column>\n <column>Play audio using ffmpeg for live conversion (with integrated ffmpeg)</column>\n </item>\n <item>\n <column><ref-shi url=\"example/piped_image_calls/example_piped_image.py\">piped_image_calls</ref-shi></column>\n <column>Play audio and image using ffmpeg for live conversion (with integrated ffmpeg)</column>\n </item>\n <item>\n <column><ref-shi url=\"example/raw_streaming/example_video.py\">raw_streaming</ref-shi></column>\n <column>Play PCM16L and RAW_VIDEO from disk</column>\n </item>\n <item>\n <column><ref-shi url=\"example/remote_piped_play/example_remote_piped.py\">remote_piped_play</ref-shi></column>\n <column>Play a stream from a remote link using ffmpeg for live conversion (with integrated ffmpeg)</column>\n </item>\n <item>\n <column><ref-shi url=\"example/remote_stream_with_header/remote_stream_with_header.py\">remote_stream_with_header</ref-shi></column>\n <column>Play a stream from a remote link using ffmpeg for live conversion (with integrated ffmpeg) with additional headers</column>\n </item>\n <item>\n <column><ref-shi url=\"example/screen_sharing/example_desktop.py\">screen_sharing</ref-shi></column>\n <column>Screen sharing</column>\n </item>\n <item>\n <column><ref-shi url=\"example/screen_sharing_mic/example_desktop_mic.py\">screen_sharing_mic</ref-shi></column>\n <column>Screen sharing with microphone</column>\n </item>\n <item>\n <column><ref-shi url=\"example/simple_calls/example_simple.py\">simple_calls</ref-shi></column>\n <column>A simple example about using PyTgCalls with High Level Methods</column>\n </item>\n <item>\n <column><ref-shi url=\"example/telethon_example/example_telethon.py\">telethon_example</ref-shi></column>\n <column>A simple example about using PyTgCalls with Telethon</column>\n </item>\n <item>\n <column><ref-shi url=\"example/video_calls/example_piped_video.py\">video_calls</ref-shi></column>\n <column>Play audio and video using ffmpeg for live conversion (with integrated ffmpeg)</column>\n </item>\n <item>\n <column><ref-shi url=\"example/whisper_transcription/example_transcription.py\">whisper_transcription</ref-shi></column>\n <column>Transcribe audio from a group call or a private call using Whisper AI</column>\n </item>\n <item>\n <column><ref-shi url=\"example/youtube_dl/youtube_dl_example.py\">youtube_dl</ref-shi></column>\n <column>Example usage of PyTgCalls with YoutubeDL</column>\n </item>\n </table>\n</page>","/PyTgCalls/Filters.xml": "<page>\n <h1>Filters</h1>\n <text>\n Filters are objects that can be used to filter the content of incoming updates.\n <docs-ref link=\"/PyTgCalls/Using Filters\">Read more about how filters work.</docs-ref>\n </text>\n <h2>Details</h2>\n <category>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">create</sb></ref>()</category-title>\n <subtext>\n <text>\n Easily create a custom filter.\n\n Custom filters give you extra control over which updates are allowed or not to be processed by your handlers.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>func</ref>: <shi>callable</shi></category-title>\n <subtext>\n <text>\n A function that accepts three positional arguments (filter, client, update) and returns a boolean: True if the update\n should be handled, False otherwise. The filter argument refers to the filter itself and can be used to access keyword\n arguments (read below). The client argument refers to the Client that received the update. The update argument type will\n vary depending on which <docs-ref link=\"/PyTgCalls/Decorators\">Handler</docs-ref> is coming from. Your function body can then access the incoming update attributes and decide\n whether to allow it or not.\n </text>\n </subtext>\n <category-title><ref>name</ref>: Optional[<shi>str</shi>]</category-title>\n <subtext>\n <text>\n Your filter\u2019s name. Can be anything you like. Defaults to \"CustomFilter\".\n </text>\n </subtext>\n <category-title><ref>**kwargs</ref>: Optional[Any]</category-title>\n <subtext>\n <text>\n Any additional keyword arguments you want to pass to your filter function.\n </text>\n </subtext>\n </subtext>\n </subtext>\n <br/>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">me</sb></ref></category-title>\n <subtext>\n <text>\n Filter updates for yourself.\n </text>\n </subtext>\n <br/>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">stream_end</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter updates for when a stream ends.\n </text>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>stream_type</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/StreamEnded Type\">StreamEnded.Type</docs-ref>]</category-title>\n <subtext>\n <text>\n Pass one or more stream type to filter stream end updates.\n </text>\n </subtext>\n <category-title><ref>device</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/Device\">Device</docs-ref>]</category-title>\n <subtext>\n <text>\n Pass one or more devices to filter stream end updates.\n </text>\n </subtext>\n </subtext>\n </subtext>\n <br/>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">chat</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter updates coming from one or more chats.\n You can use <a href=\"https://docs.python.org/3/library/stdtypes.html#set\">set bound methods</a> to manipulate the chats container.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>chats</ref>: Union[<shi>int</shi>, <shi>str</shi>, <shi>list</shi>]</category-title>\n <subtext>\n <text>\n Pass one or more chat ids/usernames to filter chats. Defaults to None (no chats).\n </text>\n </subtext>\n </subtext>\n </subtext>\n <br/>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">chat_update</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter specific type of chat updates.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>flags</ref>: <docs-ref link=\"/PyTgCalls/Available Enums/ChatUpdate Status\">ChatUpdate.Status</docs-ref></category-title>\n <subtext>\n <text>\n Pass one or more flags to filter chat updates.\n </text>\n </subtext>\n </subtext>\n </subtext>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">call_participant</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter updates for when a call participant joins, leaves or is updated.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>flags</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/GroupCallParticipant Action\">GroupCallParticipant.Action</docs-ref>]</category-title>\n <subtext>\n <text>\n Pass one or more flags to filter call participant updates.\n </text>\n </subtext>\n </subtext>\n </subtext>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">stream_frame</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter updates for when stream frames are received.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>directions</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/Direction\">Direction</docs-ref>]</category-title>\n <subtext>\n <text>\n Pass one or more directions to filter stream frames.\n </text>\n </subtext>\n <category-title><ref>devices</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/Device\">Device</docs-ref>]</category-title>\n <subtext>\n <text>\n Pass one or more devices to filter stream frames.\n </text>\n </subtext>\n </subtext>\n </subtext>\n </category>\n</page>","/PyTgCalls/Handling Updates.xml": "<page>\n <h1>Handling Updates</h1>\n <text>\n Calling API methods sequentially is cool, but what if, for example, the list of participants changes?\n This page covers updates and how to handle such events in PyTgCalls. Let\u2019s have a look at how they work.\n </text>\n <h2>Defining Updates</h2>\n <text>\n First of all, let's define what these updates are. As hinted earlier, updates are events that happen in PyTgCalls, such as\n joining a group call, changes in the participant list, stream ended etc. They are meant to notify you about a new\n specific state change. These updates are handled by registering one or more callback functions in your app\n using <docs-ref link=\"/PyTgCalls/Decorators\">Decorators</docs-ref>.\n\n Each handler deals with a specific event. When a matching update arrives from Telegram or NTgCalls, the registered callback\n function will be called back by the framework, and its body will execute.\n </text>\n <h2>Registering a Handler</h2>\n <text>\n To explain how handlers work, let's examine the one that will be in charge of handling <code>StreamVideoEnded</code>\n updates, which occur when a video stream ends. The same setup logic is shared with every type of handler, and you should not\n have troubles settings them up once you have learned from this section.\n </text>\n <alert type=\"note\">\n You can mix <code>def</code> and <code>async def</code> handlers as much as you need,\n PyTgCalls will still work concurrently and efficiently regardless of what you choose.\n </alert>\n <h3>Using Decorators</h3>\n <text>The most elegant way to register a stream end handler is by using the <docs-ref link=\"\">on_stream_end()</docs-ref> decorator:</text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls, filters\n from pytgcalls.types import Update\n from pytgcalls.types import MediaStream\n ...\n app = PyTgCalls(client)\n\n @app.on_update(filters.stream_end())\n async def my_handler(client: PyTgCalls, update: Update):\n if isinstance(update, StreamVideoEnded):\n await pytgcalls.play(\n -1001185324811,\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n\n app.run()\n </syntax-highlight>\n <text>\n The defined <code>my_handler</code> function, which accepts two arguments (client, update),\n will be executed whenever a new update arrives.\n </text>\n <br/>\n <h3>Using add_handler()</h3>\n <text>\n The <docs-ref link=\"/PyTgCalls/Using Handlers#Registering=Handlers\">add_handler()</docs-ref> method takes any handler instance that wraps around your defined callback function and registers it in your Client.\n It is useful in case you want to programmatically add handlers.\n </text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls, filters\n from pytgcalls.types import Update\n from pytgcalls.types import MediaStream\n ...\n app = PyTgCalls(client)\n\n async def my_handler(client: PyTgCalls, update: Update):\n if isinstance(update, StreamVideoEnded):\n await pytgcalls.play(\n -1001185324811,\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n\n app.add_handler(my_handler, filters.stream_end())\n app.run()\n </syntax-highlight>\n</page>","/PyTgCalls/Install Guide.xml": "<page>\n <h1>Install Guide</h1>\n <text>\n Being a modern Python library, <b>PyTgCalls</b> requires Python 3.10+ to be installed in your system.\n We recommend using the latest versions of both Python 3 and pip.\n </text>\n <list>\n <item>Get Python 3 from the <a href=\"https://www.python.org/downloads/\">Python website</a> or use your package manager.</item>\n <item>Get pip by following the instructions <a href=\"https://pip.pypa.io/en/latest/installing/\">here</a>.</item>\n </list>\n <alert type=\"important\">PyTgCalls only supports <b>Python 3</b>, starting from version 3.10.</alert>\n <separator/>\n <h2>Install PyTgCalls</h2>\n <text>The easiest way to install and upgrade PyTgCalls to its latest stable version is by using pip:</text>\n <syntax-highlight language=\"bash\">\n $ pip3 install -U py-tgcalls\n </syntax-highlight>\n <h2>Bleeding Edge</h2>\n <text>\n PyTgCalls is always evolving: although new releases on PyPI are only published when a significant number of changes are added,\n this doesn\u2019t mean you can\u2019t try new features right now!\n\n In case you\u2019d like to try out the latest PyTgCalls\u2019 features, the <a href=\"https://github.com/pytgcalls/pytgcalls\">GitHub repo</a> is constantly updated with new changes;\n you can install the development version straight from the <code>master</code> branch using this command (note \u201cmaster.zip\u201d in the link):\n </text>\n <syntax-highlight language=\"bash\">\n $ pip3 install -U git+https://github.com/pytgcalls/pytgcalls\n </syntax-highlight>\n <h2>Verifying</h2>\n <text>To verify that PyTgCalls is correctly installed, open a Python shell and import it. If no errors show up you are good to go.</text>\n <syntax-highlight language=\"python\">\n >>> import pytgcalls\n >>> pytgcalls.__version__\n '<config id=\"PYTGCALLS_VERSION\"/>'\n </syntax-highlight>\n</page>","/PyTgCalls/Media Devices.xml": "<page>\n <h1>Media Devices</h1>\n <text>\n This class offers methods to access information regarding media devices available on your system.\n This functionality proves valuable when you intend to stream content from either your screen or microphone.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"13\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n from pytgcalls import MediaDevices\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.play(\n -1001185324811,\n MediaDevices.get_audio_devices()[0],\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.<sb>MediaDevices</sb></ref>\n </category-title>\n <subtext>\n <text>MediaDevices, the main tool for retrieving media devices list.</text>\n <br/>\n <category>\n <pg-title>METHODS</pg-title>\n <subtext>\n <category-title><ref><sb>microphone_devices</sb></ref>() <shi>-> list</shi>[<docs-ref link=\"/PyTgCalls/Advanced Types/InputDevice\">pytgcalls.InputDevice</docs-ref>]</category-title>\n <subtext><text>Retrieve a list of available microphone devices</text></subtext>\n\n <category-title><ref><sb>speaker_devices</sb></ref>() <shi>-> list</shi>[<docs-ref link=\"/PyTgCalls/Advanced Types/SpeakerDevice\">pytgcalls.SpeakerDevice</docs-ref>]</category-title>\n <subtext><text>Retrieve a list of available speaker devices</text></subtext>\n\n <category-title><ref><sb>camera_devices</sb></ref>() <shi>-> list</shi>[<docs-ref link=\"/PyTgCalls/Advanced Types/InputDevice\">pytgcalls.InputDevice</docs-ref>]</category-title>\n <subtext><text>Retrieve a list of available camera devices</text></subtext>\n\n <category-title><ref><sb>screen_devices</sb></ref>() <shi>-> list</shi>[<docs-ref link=\"/PyTgCalls/Advanced Types/ScreenDevice\">pytgcalls.ScreenDevice</docs-ref>]</category-title>\n <subtext><text>Retrieve a list of available screen devices</text></subtext>\n </subtext>\n </category>\n </subtext>\n </category>\n</page>","/PyTgCalls/Quick Start.xml": "<page>\n <h1>Quick Start</h1>\n <text>The next few steps serve as a quick start for all new Pythoneers that want to see PyTgCalls in action as quickly as possible. Let\u2019s go!</text>\n <h2>Get PyTgCalls Real Fast</h2>\n <list style=\"numbers\">\n <item>Install PyTgCalls with <code><shi language=\"bash\">pip3 install -U py-tgcalls</shi></code>.</item>\n <item>\n Choose your MTProto client between <a href=\"https://github.com/PyrogramMod/PyrogramMod\">PyrogramMod (ex Pyrogram)</a>,\n <a href=\"https://github.com/LonamiWebs/Telethon\">Telethon</a> or <a href=\"https://github.com/AmanoTeam/hydrogram\">Hydrogram</a>.\n </item>\n <item>Get your own Telegram API key from <a href=\"https://my.telegram.org/apps\">my.telegram.org</a></item>\n <item>\n Open your favorite text editor and use the following:\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n chat_id = -1001185324811\n app = PyTgCalls(client)\n app.start()\n app.play(\n chat_id,\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n idle()\n </syntax-highlight>\n </item>\n <item>Replace <code>client</code> and <code>chat_id</code> values with your own.</item>\n <item>Save the file as <code>main.py</code>.</item>\n <item>Watch PyTgCalls playing the audio file.</item>\n <item>Join our <a href=\"https://t.me/PyTgCallsChat\">community</a>.</item>\n </list>\n <h2>Enjoy the API</h2>\n <text>\n That was just a brief overview that barely scratched the surface!\n In the following few pages of the introduction,\n we\u2019ll have a much more in-depth look at what we have just done.\n\n Are you feeling eager to continue?\n You can take a shortcut to Call Methods and return later to learn more details.\n </text>\n</page>","/PyTgCalls/Stream Descriptors/AudioParameters.xml": "<page>\n <h1>AudioParameters</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.raw.<sb>AudioParameters</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUDIO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>bitrate</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_SAMPLE_DESC\"/>\n\n <category-title><ref>channels</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_CHAN_DESC\"/>\n </subtext>\n <br/>\n <pg-title>STATIC METHODS</pg-title>\n <subtext>\n <category-title><ref><sb>from_quality</sb></ref>(quality: <docs-ref link=\"/PyTgCalls/Available Enums/AudioQuality\">AudioQuality</docs-ref>)</category-title>\n <subtext>\n <alert type=\"warning\">\n <text>\n This method was deprecated on PyTgCalls 1.2.X, use directly\n <docs-ref link=\"/PyTgCalls/Available Enums/AudioQuality\">AudioQuality</docs-ref> in MediaStream instead\n </text>\n </alert>\n <text>Create an AudioParameters instance from an AudioQuality enumeration.</text>\n </subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/AudioStream.xml": "<page>\n <h1>AudioStream</h1>\n <alert type=\"warning\">\n <text>This class replaces the deprecated <code>pytgcalls.types.raw.InputAudioStream</code>.</text>\n </alert>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.raw.<sb>AudioStream</sb></ref>\n </category-title>\n <subtext>\n <text>The raw audio stream (PCM16L) descriptor</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_MEDIA_SOURCE\"/>\n\n <category-title><ref>path</ref>: <shi>str</shi></category-title>\n <subtext><text>The audio file path or shell command (PCM16L format only).</text></subtext>\n\n <category-title><ref>parameters</ref>: <docs-ref link=\"/PyTgCalls/Stream Descriptors/AudioParameters\">pytgcalls.types.raw.AudioParameters</docs-ref></category-title>\n <config id=\"ARG_AUDIO_PARAMS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/MediaStream.xml": "<page>\n <h1>MediaStream</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>MediaStream</sb></ref>\n </category-title>\n <subtext>\n <text>The media stream piped descriptor.</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>media_path</ref>: Union[<shi>str</shi>, ScreenInfo, DeviceInfo]</category-title>\n <subtext><text>The audio, video, image or media device path.</text></subtext>\n\n <config id=\"ARG_AUDIO_PARAMSv2\"/>\n <config id=\"ARG_VIDEO_PARAMSv2\"/>\n\n <category-title><ref>audio_path</ref>: Optional[Union[<shi>str</shi>, Path, <docs-ref link=\"/PyTgCalls/Advanced Types/InputDevice\">InputDevice</docs-ref>, <docs-ref link=\"/PyTgCalls/Available Enums/ExternalMedia\">ExternalMedia</docs-ref>]]</category-title>\n <subtext><text>The audio or input audio device path.</text></subtext>\n\n <category-title><ref>audio_flags</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/MediaStream Flags\">Flags</docs-ref>]</category-title>\n <subtext>\n <text>\n Flag used to control the handling of the audio stream in the media. It allows the system to decide whether to automatically detect, ignore, or require the audio stream.\n </text>\n </subtext>\n\n <category-title><ref>video_flags</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/MediaStream Flags\">Flags</docs-ref>]</category-title>\n <subtext>\n <text>\n Flag used to control the handling of the video stream in the media. It allows the system to decide whether to automatically detect, ignore, or require the video stream.\n </text>\n </subtext>\n\n <config id=\"ARG_HTTP_PARAMS\"/>\n <category-title><ref>ffmpeg_parameters</ref>: Optional[<shi>str</shi>]</category-title>\n <subtext><text>FFmpeg additional parameters.</text></subtext>\n <category-title><ref>ytdlp_parameters</ref>: Optional[<shi>str</shi>]</category-title>\n <subtext><text>yt-dlp additional parameters.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/RecordStream.xml": "<page>\n <h1>RecordStream</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>RecordStream</sb></ref>\n </category-title>\n <subtext>\n <text>The record stream piped descriptor.</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>audio</ref>: Optional[Union[<shi>bool</shi>, <shi>str</shi>, <docs-ref link=\"/PyTgCalls/Advanced Types/SpeakerDevice\">SpeakerDevice</docs-ref>]]</category-title>\n <subtext><text>The speaker device, audio file or if it should be sent as updates.</text></subtext>\n\n <config id=\"ARG_AUDIO_PARAMSv2\"/>\n\n <category-title><ref>camera</ref>: Optional[<shi>bool</shi>]</category-title>\n <subtext><text>Whether to record the camera.</text></subtext>\n\n <category-title><ref>screen</ref>: Optional[<shi>bool</shi>]</category-title>\n <subtext><text>Whether to record the screen.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/Stream.xml": "<page>\n <h1>Stream</h1>\n <alert type=\"warning\">\n <text>This class replaces the deprecated <code>InputStream</code>.</text>\n </alert>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>Stream</sb></ref>\n </category-title>\n <subtext>\n <text>Stream Descriptor.</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>microphone</ref>: Optional[<docs-ref link=\"/PyTgCalls/Stream Descriptors/AudioStream\">pytgcalls.types.raw.AudioStream</docs-ref>]</category-title>\n <config id=\"MICROPHONE_DESC\"/>\n\n <category-title><ref>speaker</ref>: Optional[<docs-ref link=\"/PyTgCalls/Stream Descriptors/AudioStream\">pytgcalls.types.raw.AudioStream</docs-ref>]</category-title>\n <config id=\"SPEAKER_DESC\"/>\n\n <category-title><ref>camera</ref>: Optional[<docs-ref link=\"/PyTgCalls/Stream Descriptors/VideoStream\">pytgcalls.types.raw.VideoStream</docs-ref>]</category-title>\n <config id=\"CAMERA_DESC\"/>\n\n <category-title><ref>screen</ref>: Optional[<docs-ref link=\"/PyTgCalls/Stream Descriptors/VideoStream\">pytgcalls.types.raw.VideoStream</docs-ref>]</category-title>\n <config id=\"SCREEN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/VideoParameters.xml": "<page>\n <h1>VideoParameters</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.raw.<sb>VideoParameters</sb></ref>\n </category-title>\n <subtext>\n <text>Stream\u2019s video parameters.</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_VIDEO_CONFIG\"/>\n\n <category-title><ref>frame_rate</ref>: <shi>int</shi></category-title>\n <config id=\"VIDEO_FPS_DESC\"/>\n\n <category-title><ref>adjust_by_height</ref>: <shi>bool</shi></category-title>\n <subtext><text>Adjust the video resolution by height instead of width.</text></subtext>\n </subtext>\n <br/>\n <pg-title>STATIC METHODS</pg-title>\n <subtext>\n <category-title><ref><sb>from_quality</sb></ref>(quality: <docs-ref link=\"/PyTgCalls/Available Enums/VideoQuality\">VideoQuality</docs-ref>)</category-title>\n <subtext>\n <alert type=\"warning\">\n <text>\n This method was deprecated on PyTgCalls 1.2.X, use directly\n <docs-ref link=\"/PyTgCalls/Available Enums/VideoQuality\">VideoQuality</docs-ref> in MediaStream instead\n </text>\n </alert>\n <text>Create an VideoParameters instance from an VideoQuality enumeration.</text>\n </subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/VideoStream.xml": "<page>\n <h1>VideoStream</h1>\n <alert type=\"warning\">\n <text>This class replaces the deprecated <code>InputVideoStream</code>.</text>\n </alert>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.raw.<sb>VideoStream</sb></ref>\n </category-title>\n <subtext>\n <text>The raw video stream (YUV420P) descriptor</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_MEDIA_SOURCE\"/>\n\n <category-title><ref>path</ref>: <shi>str</shi></category-title>\n <subtext><text>The video file path or shell command (YUV420P format only).</text></subtext>\n\n <category-title><ref>parameters </ref>: <docs-ref link=\"/PyTgCalls/Stream Descriptors/VideoParameters\">pytgcalls.types.raw.VideoParameters</docs-ref></category-title>\n <config id=\"ARG_VIDEO_PARAMS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Mute.xml": "<page>\n <h1>Mute</h1>\n <text>This method allows muting the userbot via MTProto APIs.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.mute(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>mute</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <text>Mute the userbot</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Pause.xml": "<page>\n <h1>Pause</h1>\n <text>This method allows pausing the streaming file.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.pause(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>pause</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <text>Pause the stream</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Play.xml": "<page>\n <p2p-banner/>\n <h1>Play</h1>\n <alert type=\"warning\">\n <text>This method replaces the deprecated <code>join_group_call</code> and <code>change_stream</code> methods.</text>\n </alert>\n <text>This method allows streaming audio or video to a group call or a private call.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-13\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.play(\n -1001185324811,\n 'test.mp4',\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>play</sb></ref>()\n </category-title>\n <subtext>\n <text>Join in a group call or accept/request a private call to stream audio or video.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n <category-title><ref>stream</ref>: Optional[Union[<docs-ref link=\"/PyTgCalls/Stream Descriptors/Stream\">Stream</docs-ref>, <docs-ref link=\"/PyTgCalls/Stream Descriptors/MediaStream\">MediaStream</docs-ref>, <docs-ref link=\"/PyTgCalls/Advanced Types/InputDevice\">InputDevice</docs-ref>, Path, <shi>str</shi>]]</category-title>\n <subtext><text>Input Streams base descriptor</text></subtext>\n\n <config id=\"CALL_CONFIG_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_MTPROTO\"/>\n <config id=\"GROUP_CALL_EXCEPTIONS\"/>\n <config id=\"STREAM_EXCEPTIONS\"/>\n <config id=\"CALL_EXCEPTIONS\"/>\n <config id=\"RTMP_STREAMING_UNSUPPORTED\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Record.xml": "<page>\n <h1>Record</h1>\n <text>This method allows recording audio or video from a group call or a private call.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-13\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.record(\n -1001185324811,\n 'record.mp3',\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>record</sb></ref>()\n </category-title>\n <subtext>\n <text>Join in a group call or accept/request a private call to record audio or video.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n <category-title><ref>stream</ref>: Union[<docs-ref link=\"/PyTgCalls/Stream Descriptors/Stream\">Stream</docs-ref>, <docs-ref link=\"/PyTgCalls/Stream Descriptors/RecordStream\">RecordStream</docs-ref>, <docs-ref link=\"/PyTgCalls/Advanced Types/SpeakerDevice\">SpeakerDevice</docs-ref>, Path, <shi>str</shi>]</category-title>\n <subtext><text>Output Streams base descriptor</text></subtext>\n <config id=\"CALL_CONFIG_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_MTPROTO\"/>\n <config id=\"GROUP_CALL_EXCEPTIONS\"/>\n <config id=\"FFMPEG_EXCEPTION\"/>\n <config id=\"SHELL_EXCEPTION\"/>\n <config id=\"CALL_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Resume.xml": "<page>\n <h1>Resume</h1>\n <text>This method allows resuming the streaming file.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.resume(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>resume</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <text>Resume the stream</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Time.xml": "<page>\n <h1>Time</h1>\n <config id=\"TIME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"11-13\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n print(\n app.time(\n -1001185324811,\n )\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>time</sb></ref>() <shi>-> int</shi>\n </category-title>\n <subtext>\n <config id=\"TIME_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n <category-title><ref>direction</ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Available Enums/Direction\">Direction</docs-ref></category-title>\n <config id=\"STREAM_MODE_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/UnMute.xml": "<page>\n <h1>UnMute</h1>\n <text>This method allows unmuting the userbot via MTProto APIs</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.unmute(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>unmute</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <text>UnMute the userbot</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Using Filters.xml": "<page>\n <h1>Using Filters</h1>\n <text>\n So far we\u2019ve seen <docs-ref link=\"/PyTgCalls/Decorators\">how to register a decorator</docs-ref> function that executes every time an update comes from the server,\n but there\u2019s much more than that to come.\n\n Here we\u2019ll discuss <docs-ref link=\"/PyTgCalls/Filters\">filters</docs-ref>. Filters enable a fine-grain control over what kind of updates are allowed or\n not to be passed in your callback functions, based on their inner details.\n </text>\n <separator/>\n <h2>Single Filters</h2>\n <text>Let\u2019s start right away with a simple example:</text>\n <list>\n <item>\n <text>\n This example will show you how to only handle updates that are an Incoming Call\n and ignore any other update. Filters are passed as the first argument of the decorator:\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n @app.on_update(filters.chat_update(ChatUpdate.Status.INCOMING_CALL))\n def on_incoming_call(client, update):\n print(\"Incoming call!\", update)\n </syntax-highlight>\n </text>\n </item>\n <item>\n <text>\n or, without decorators. Here filters are passed as the second argument of the add_handler function;\n the first is the callback function itself:\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n def on_incoming_call(client, update):\n print(\"Incoming call!\", update)\n\n pytgcalls.add_handler(on_incoming_call, filters.chat_update(ChatUpdate.Status.INCOMING_CALL))\n </syntax-highlight>\n </text>\n </item>\n </list>\n <h2>Combining Filters</h2>\n <text>\n Filters can be used in a more advanced way by inverting and combining more filters together using bitwise operators <code>~</code>, <code>&</code> and <code>|</code>:\n <list>\n <item>\n <item>Use <code>~</code> to invert a filter (behaves like the <code>not</code> operator).</item>\n </item>\n <item>\n <item>Use <code>&</code> and <code>|</code> to combine filters together (behaves like the <code>and</code> and <code>or</code> operators).</item>\n </item>\n </list>\n Here are some examples:\n <list>\n <item>\n <text>\n This example will show you how to only handle updates that are <b>left</b> updates from a specific <b>chat</b> and ignore any other update:\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n @app.on_update(~filters.chat_update(ChatUpdate.Status.LEFT_GROUP) & filters.chat(1234567890))\n def on_incoming_voice_call(client, update):\n print(\"Left chat!\", update)\n </syntax-highlight>\n </text>\n </item>\n <item>\n <text>\n This example will show you how to only handle updates that are <b>left</b> updates or <b>incoming call</b> updates and from a specific <b>chat</b>:\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n @app.on_update(filters.chat(1234567890) & (filters.chat_update(ChatUpdate.Status.LEFT_GROUP) | filters.chat_update(ChatUpdate.Status.INCOMING_CALL)))\n def on_incoming_voice_call(client, update):\n print(\"Incoming voice call or left chat!\", update)\n </syntax-highlight>\n </text>\n </item>\n </list>\n </text>\n</page>","/PyTgCalls/Using Handlers.xml": "<page>\n <h1>Using Handlers</h1>\n <text>\n Handlers are used to instruct PyTgCalls to execute a specific function when a certain event occurs.\n For a much more convenient way to handle updates, you can use the <docs-ref link=\"/PyTgCalls/Decorators\">decorators</docs-ref> instead.\n </text>\n <separator/>\n <h2>Registering Handlers</h2>\n <text>\n To register a handler, you need to use the <ref>add_handler</ref> method.\n This method takes two arguments: the first is the callback function, and the second is the filter.\n </text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls.types import Update\n from pytgcalls import filters as call_filters\n ...\n\n client = # Here Your MTProto Client\n app = PyTgCalls(client)\n\n async def handler(client: PyTgCalls, update: Update):\n print(update)\n ...\n app.add_handler(handler, call_filters.stream_end())\n ...\n </syntax-highlight>\n <h2>Removing Handlers</h2>\n <text>\n To remove a handler, you need to use the <ref>remove_handler</ref> method.\n This method takes the callback function as its only argument.\n </text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls.types import Update\n ...\n\n client = # Here Your MTProto Client\n app = PyTgCalls(client)\n\n async def handler(client: PyTgCalls, update: Update):\n print(update)\n ...\n app.remove_handler(handler)\n ...\n </syntax-highlight>\n</page>"}