agora-python-server-sdk 2.0.1__tar.gz → 2.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agora_python_server_sdk-2.0.1/agora_python_server_sdk.egg-info → agora_python_server_sdk-2.0.3}/PKG-INFO +1 -1
- agora_python_server_sdk-2.0.3/agora/rtc/__init__.py +65 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/_audio_frame_observer.py +12 -10
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/_local_user_observer.py +41 -37
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/_rtc_connection_observer.py +32 -30
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/_video_encoded_frame_observer.py +3 -1
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/_video_frame_observer.py +4 -2
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/agora_base.py +0 -5
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/agora_service.py +12 -11
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/audio_encoded_frame_sender.py +4 -2
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/audio_vad.py +4 -2
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/local_audio_track.py +9 -7
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/local_user.py +40 -40
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/local_video_track.py +6 -4
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/remote_audio_track.py +3 -1
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/remote_video_track.py +8 -6
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/rtc_connection.py +10 -8
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/video_frame_sender.py +3 -1
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3/agora_python_server_sdk.egg-info}/PKG-INFO +1 -1
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora_python_server_sdk.egg-info/SOURCES.txt +1 -6
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/setup.py +12 -15
- agora_python_server_sdk-2.0.1/agora/rtc/__init__.py +0 -23
- agora_python_server_sdk-2.0.1/tests/test_conn.py +0 -30
- agora_python_server_sdk-2.0.1/tests/test_conn2.py +0 -73
- agora_python_server_sdk-2.0.1/tests/test_conn3.py +0 -95
- agora_python_server_sdk-2.0.1/tests/test_conn4.py +0 -90
- agora_python_server_sdk-2.0.1/tests/test_conn5.py +0 -68
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/MANIFEST.in +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/README.md +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/agora_parameter.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/audio_frame_observer.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/audio_pcm_data_sender.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/globals.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/local_user_observer.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/media_node_factory.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/rtc_connection_observer.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/video_encoded_frame_observer.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/video_frame_observer.py +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora_python_server_sdk.egg-info/dependency_links.txt +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora_python_server_sdk.egg-info/top_level.txt +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/pyproject.toml +0 -0
- {agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/setup.cfg +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
import logging
|
|
6
|
+
logger = logging.getLogger(__name__)
|
|
7
|
+
import ctypes
|
|
8
|
+
from urllib import request
|
|
9
|
+
import site
|
|
10
|
+
import zipfile
|
|
11
|
+
import ssl
|
|
12
|
+
ssl._create_default_https_context = ssl._create_unverified_context
|
|
13
|
+
|
|
14
|
+
def _check_download_and_extract_sdk():
|
|
15
|
+
agora_service_path = os.path.dirname(os.path.abspath(__file__))
|
|
16
|
+
sdk_dir = os.path.join(agora_service_path, "agora_sdk")
|
|
17
|
+
zip_path = os.path.join(agora_service_path, "agora_rtc_sdk.zip")
|
|
18
|
+
|
|
19
|
+
url = "https://download.agora.io/sdk/release/agora_rtc_sdk_linux_v4.4_20240914_1538_336910.zip"
|
|
20
|
+
libagora_rtc_sdk_path = os.path.join(sdk_dir, "libagora_rtc_sdk.so")
|
|
21
|
+
if sys.platform == 'darwin':
|
|
22
|
+
url = "https://download.agora.io/sdk/release/agora_rtc_sdk_mac_v4.4_20240914_1538_336910.zip"
|
|
23
|
+
libagora_rtc_sdk_path = os.path.join(sdk_dir, "libAgoraRtcKit.dylib")
|
|
24
|
+
|
|
25
|
+
if os.path.exists(libagora_rtc_sdk_path):
|
|
26
|
+
return
|
|
27
|
+
|
|
28
|
+
logger.error("agora sdk was broken!!! now download it, please wait for a while...")
|
|
29
|
+
if os.path.exists(sdk_dir):
|
|
30
|
+
os.system(f"rm -rf {sdk_dir}")
|
|
31
|
+
os.makedirs(agora_service_path, exist_ok=True)
|
|
32
|
+
if os.path.exists(zip_path):
|
|
33
|
+
os.remove(zip_path)
|
|
34
|
+
|
|
35
|
+
logger.info(f"agora_service_path: {agora_service_path}")
|
|
36
|
+
logger.info(f"Downloading {url}...")
|
|
37
|
+
request.urlretrieve(url, zip_path)
|
|
38
|
+
|
|
39
|
+
logger.info(f"Extracting {zip_path}...")
|
|
40
|
+
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
|
|
41
|
+
zip_ref.extractall(agora_service_path)
|
|
42
|
+
|
|
43
|
+
if os.path.exists(zip_path):
|
|
44
|
+
os.remove(zip_path)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
_check_download_and_extract_sdk()
|
|
48
|
+
|
|
49
|
+
sdk_dir = os.path.dirname(os.path.abspath(__file__))
|
|
50
|
+
lib_path = os.path.join(sdk_dir, 'agora_sdk')
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
if sys.platform == 'darwin':
|
|
54
|
+
lib_agora_rtc_path =os.path.join(lib_path, 'libAgoraRtcKit.dylib')
|
|
55
|
+
agora_lib = ctypes.CDLL(lib_agora_rtc_path)
|
|
56
|
+
|
|
57
|
+
elif sys.platform == 'linux':
|
|
58
|
+
lib_agora_rtc_path =os.path.join(lib_path, 'libagora_rtc_sdk.so')
|
|
59
|
+
ctypes.CDLL(os.path.join(lib_path, 'libagora-fdkaac.so'))
|
|
60
|
+
ctypes.CDLL(os.path.join(lib_path, 'libaosl.so'))
|
|
61
|
+
agora_lib = ctypes.CDLL(lib_agora_rtc_path)
|
|
62
|
+
except OSError as e:
|
|
63
|
+
logger.error(f"Error loading the library: {e}")
|
|
64
|
+
logger.error(f"Attempted to load from: {lib_agora_rtc_path}")
|
|
65
|
+
sys.exit(1)
|
{agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/_audio_frame_observer.py
RENAMED
|
@@ -3,6 +3,8 @@ from .agora_base import *
|
|
|
3
3
|
from .local_user import *
|
|
4
4
|
import ctypes
|
|
5
5
|
from .audio_frame_observer import *
|
|
6
|
+
import logging
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
6
8
|
|
|
7
9
|
|
|
8
10
|
class AudioFrameInner(ctypes.Structure):
|
|
@@ -73,31 +75,31 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
73
75
|
# self.on_get_ear_monitoring_audio_frame_param = ON_GET_EAR_MONITORING_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_ear_monitoring_audio_frame_param)
|
|
74
76
|
|
|
75
77
|
def _on_record_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
76
|
-
|
|
78
|
+
logger.debug(f"AudioFrameObserverInner _on_record_audio_frame: {local_user_handle}, {channel_id}, {audio_frame_inner}")
|
|
77
79
|
channel_id_str = channel_id.decode('utf-8')
|
|
78
80
|
frame = audio_frame_inner.contents._to_audio_frame()
|
|
79
81
|
ret = self.observer.on_record_audio_frame(self.local_user, channel_id_str, frame)
|
|
80
82
|
return ret
|
|
81
83
|
|
|
82
84
|
def _on_playback_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
83
|
-
|
|
85
|
+
logger.debug(f"AudioFrameObserverInner _on_playback_audio_frame: {local_user_handle}, {channel_id}, {audio_frame_inner}")
|
|
84
86
|
channel_id_str = channel_id.decode('utf-8')
|
|
85
87
|
frame = audio_frame_inner.contents._to_audio_frame()
|
|
86
88
|
ret = self.observer.on_playback_audio_frame(self.local_user, channel_id_str, frame)
|
|
87
89
|
return ret
|
|
88
90
|
|
|
89
91
|
def _on_mixed_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
90
|
-
|
|
92
|
+
logger.debug(f"AudioFrameObserverInner _on_mixed_audio_frame: {local_user_handle}, {channel_id}, {audio_frame_inner}")
|
|
91
93
|
ret = self.observer.on_mixed_audio_frame(self.local_user, audio_frame_inner)
|
|
92
94
|
return ret
|
|
93
95
|
|
|
94
96
|
def _on_ear_monitoring_audio_frame(self, local_user_handle, audio_frame_inner):
|
|
95
|
-
|
|
97
|
+
logger.debug(f"AudioFrameObserverInner _on_ear_monitoring_audio_frame: {local_user_handle}, {audio_frame_inner}")
|
|
96
98
|
ret = self.observer.on_ear_monitoring_audio_frame(self.local_user, audio_frame_inner)
|
|
97
99
|
return ret
|
|
98
100
|
|
|
99
101
|
def _on_playback_audio_frame_before_mixing(self, local_user_handle, channel_id, user_id, audio_frame_inner):
|
|
100
|
-
|
|
102
|
+
logger.debug(f"AudioFrameObserverInner _on_playback_audio_frame_before_mixing: {local_user_handle}, {channel_id}, {user_id}, {audio_frame_inner}")
|
|
101
103
|
if channel_id is None:
|
|
102
104
|
channel_id_str = ""
|
|
103
105
|
else:
|
|
@@ -109,12 +111,12 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
109
111
|
return ret
|
|
110
112
|
|
|
111
113
|
def _on_get_audio_frame_position(self, local_user_handle):
|
|
112
|
-
|
|
114
|
+
logger.debug(f"AudioFrameObserverInner _on_get_audio_frame_position: {local_user_handle}")
|
|
113
115
|
return 0
|
|
114
116
|
return self.observer.on_get_audio_frame_position(self.local_user)
|
|
115
117
|
|
|
116
118
|
def _on_get_playback_audio_frame_param(self, local_user_handle):
|
|
117
|
-
|
|
119
|
+
logger.debug(f"AudioFrameObserverInner _on_get_playback_audio_frame_param: {local_user_handle}")
|
|
118
120
|
params = AudioParams()
|
|
119
121
|
params.sample_rate = 16000 # 示例值
|
|
120
122
|
params.channels = 1 # 示例值
|
|
@@ -124,7 +126,7 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
124
126
|
return self.observer.on_get_playback_audio_frame_param(self.local_user)
|
|
125
127
|
|
|
126
128
|
def _on_get_record_audio_frame_param(self, local_user_handle):
|
|
127
|
-
|
|
129
|
+
logger.debug(f"AudioFrameObserverInner _on_get_record_audio_frame_param: {local_user_handle}")
|
|
128
130
|
params = AudioParams()
|
|
129
131
|
params.sample_rate = 16000 # 示例值
|
|
130
132
|
params.channels = 1 # 示例值
|
|
@@ -134,7 +136,7 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
134
136
|
return self.observer.on_get_record_audio_frame_param(self.local_user)
|
|
135
137
|
|
|
136
138
|
def _on_get_mixed_audio_frame_param(self, local_user_handle):
|
|
137
|
-
|
|
139
|
+
logger.debug(f"AudioFrameObserverInner _on_get_mixed_audio_frame_param: {local_user_handle}")
|
|
138
140
|
params = AudioParams()
|
|
139
141
|
params.sample_rate = 16000 # 示例值
|
|
140
142
|
params.channels = 1 # 示例值
|
|
@@ -144,7 +146,7 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
144
146
|
return self.observer.on_get_mixed_audio_frame_param(self.local_user)
|
|
145
147
|
|
|
146
148
|
def _on_get_ear_monitoring_audio_frame_param(self, local_user_handle):
|
|
147
|
-
|
|
149
|
+
logger.debug(f"AudioFrameObserverInner _on_get_ear_monitoring_audio_frame_param: {local_user_handle}")
|
|
148
150
|
params = AudioParams()
|
|
149
151
|
params.sample_rate = 16000 # 示例值
|
|
150
152
|
params.channels = 1 # 示例值
|
{agora_python_server_sdk-2.0.1 → agora_python_server_sdk-2.0.3}/agora/rtc/_local_user_observer.py
RENAMED
|
@@ -3,6 +3,10 @@ from .agora_base import *
|
|
|
3
3
|
from .local_user import *
|
|
4
4
|
from .remote_audio_track import RemoteAudioTrack, RemoteAudioTrackStats
|
|
5
5
|
from .remote_video_track import RemoteVideoTrack, RemoteVideoTrackStats
|
|
6
|
+
import logging
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
6
10
|
uid_t = ctypes.c_uint
|
|
7
11
|
track_id_t = ctypes.c_uint
|
|
8
12
|
|
|
@@ -208,46 +212,46 @@ class RTCLocalUserObserverInner(ctypes.Structure):
|
|
|
208
212
|
Avoid to create a global LocalAudioTrack map table as it can significantly impact performance .
|
|
209
213
|
"""
|
|
210
214
|
def _on_audio_track_publish_success(self, local_user_handle, local_audio_track_handle):
|
|
211
|
-
|
|
215
|
+
logger.debug(f"LocalUserCB _on_audio_track_publish_success: {local_user_handle}, {local_audio_track_handle}")
|
|
212
216
|
#note: to get
|
|
213
217
|
audio_track = self.local_user.get_audio_map(local_audio_track_handle)
|
|
214
218
|
self.local_user_observer.on_audio_track_publish_success(self.local_user, audio_track)
|
|
215
219
|
|
|
216
220
|
def _on_video_track_publish_success(self, local_user_handle, local_video_track_handle):
|
|
217
|
-
|
|
221
|
+
logger.debug(f"LocalUserCB _on_video_track_publish_success: {local_user_handle}, {local_video_track_handle}")
|
|
218
222
|
video_track = self.local_user.get_video_map(local_video_track_handle)
|
|
219
223
|
self.local_user_observer.on_video_track_publish_success(self.local_user, video_track)
|
|
220
224
|
|
|
221
225
|
def _on_video_track_publish_start(self, local_user_handle, local_video_track_handle):
|
|
222
|
-
|
|
226
|
+
logger.debug(f"LocalUserCB _on_video_track_publish_start: {local_user_handle}, {local_video_track_handle}")
|
|
223
227
|
video_track = self.local_user.get_video_map(local_video_track_handle)
|
|
224
228
|
self.local_user_observer.on_video_track_publish_start(self.local_user, video_track)
|
|
225
229
|
|
|
226
230
|
def _on_audio_track_publish_start(self, local_user_handle, local_audio_track_handle):
|
|
227
|
-
|
|
231
|
+
logger.debug(f"LocalUserCB _on_audio_track_publish_start: {local_user_handle}, {local_audio_track_handle}")
|
|
228
232
|
audio_track = self.local_user.get_audio_map(local_audio_track_handle)
|
|
229
233
|
self.local_user_observer.on_audio_track_publish_start(self.local_user, audio_track)
|
|
230
234
|
|
|
231
235
|
def _on_audio_track_unpublished(self, local_user_handle, local_audio_track_handle):
|
|
232
|
-
|
|
236
|
+
logger.debug(f"LocalUserCB _on_audio_track_unpublished: {local_user_handle}, {local_audio_track_handle}")
|
|
233
237
|
audio_track = self.local_user.get_audio_map(local_audio_track_handle)
|
|
234
238
|
self.local_user._del_audio_map(local_audio_track_handle)
|
|
235
239
|
self.local_user_observer.on_audio_track_unpublished(self.local_user, audio_track)
|
|
236
240
|
|
|
237
241
|
def _on_audio_track_publication_failure(self, local_user_handle, local_audio_track_handle, error_code):
|
|
238
|
-
|
|
242
|
+
logger.debug(f"LocalUserCB _on_audio_track_publication_failure: {local_user_handle}, {local_audio_track_handle}, {error_code}")
|
|
239
243
|
audio_track = self.local_user.get_audio_map(local_audio_track_handle)
|
|
240
244
|
#note :move from map for failed publish
|
|
241
245
|
self.local_user.del_audio_map(local_audio_track_handle)
|
|
242
246
|
self.local_user_observer.on_audio_track_publication_failure(self.local_user, audio_track, error_code)
|
|
243
247
|
|
|
244
248
|
def _on_local_audio_track_state_changed(self, local_user_handle, local_audio_track_handle, state, error):
|
|
245
|
-
|
|
249
|
+
logger.debug(f"LocalUserCB _on_local_audio_track_state_changed: {local_user_handle}, {local_audio_track_handle}, {state}, {error}")
|
|
246
250
|
audio_track = self.local_user.get_audio_map(local_audio_track_handle)
|
|
247
251
|
self.local_user_observer.on_local_audio_track_state_changed(self.local_user, audio_track, state, error)
|
|
248
252
|
|
|
249
253
|
def _on_local_audio_track_statistics(self, local_user_handle, stats):
|
|
250
|
-
#
|
|
254
|
+
#logger.debug("LocalUserCB _on_local_audio_track_statistics:", local_user_handle, stats)
|
|
251
255
|
#stats: pointer to LocalAudioStats
|
|
252
256
|
local_audio_stats = stats.contents
|
|
253
257
|
self.local_user_observer.on_local_audio_track_statistics(self.local_user, local_audio_stats)
|
|
@@ -264,7 +268,7 @@ class RTCLocalUserObserverInner(ctypes.Structure):
|
|
|
264
268
|
# user_id & remote_audio_track_handle, so we should construct RemoteAudioTrack with (user_id & remote_audio_track_handle
|
|
265
269
|
# and save it in local_user, then in app layer, we can get RemoteAudioTrack with userid)
|
|
266
270
|
def _on_user_audio_track_subscribed(self, local_user_handle, user_id, remote_audio_track_handle):
|
|
267
|
-
|
|
271
|
+
logger.debug(f"LocalUserCB _on_user_audio_track_subscribed: {local_user_handle}, {user_id}, {remote_audio_track_handle}")
|
|
268
272
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
269
273
|
# note: this is a pointer to agora::rtc::IRemoteAudioTrack
|
|
270
274
|
remote_audio_track = RemoteAudioTrack(remote_audio_track_handle, user_id_str)
|
|
@@ -273,65 +277,65 @@ class RTCLocalUserObserverInner(ctypes.Structure):
|
|
|
273
277
|
self.local_user_observer.on_user_audio_track_subscribed(self.local_user, user_id_str, remote_audio_track)
|
|
274
278
|
|
|
275
279
|
def _on_remote_audio_track_statistics(self, local_user_handle, remote_audio_track_handle, stats):
|
|
276
|
-
|
|
280
|
+
logger.debug(f"LocalUserCB _on_remote_audio_track_statistics: {local_user_handle}, {remote_audio_track_handle}, {stats}")
|
|
277
281
|
audio_stats = stats.contents #RemoteAudioTrackStats
|
|
278
282
|
remote_audio_track = self.local_user.get_remote_audio_map(remote_audio_track_handle)
|
|
279
283
|
self.local_user_observer.on_remote_audio_track_statistics(self.local_user, remote_audio_track, audio_stats)
|
|
280
284
|
|
|
281
285
|
|
|
282
286
|
def _on_user_audio_track_state_changed(self, local_user_handle, user_id, remote_audio_track_handle, state, reason, elapsed):
|
|
283
|
-
|
|
287
|
+
logger.debug(f"LocalUserCB _on_user_audio_track_state_changed: {local_user_handle}, {user_id}, {remote_audio_track_handle}, {state}, {reason}, {elapsed}")
|
|
284
288
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
285
289
|
remote_audio_track = self.local_user.get_remote_audio_map(remote_audio_track_handle)
|
|
286
290
|
self.local_user_observer.on_user_audio_track_state_changed(self.local_user, user_id_str, remote_audio_track, state, reason, elapsed)
|
|
287
291
|
|
|
288
292
|
def _on_audio_subscribe_state_changed(self, local_user_handle, channel_id, user_id, state, reason, elapsed):
|
|
289
|
-
|
|
293
|
+
logger.debug(f"LocalUserCB _on_audio_subscribe_state_changed: {local_user_handle}, {channel_id}, {user_id}, {state}, {reason}, {elapsed}")
|
|
290
294
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
291
295
|
channel_id_str = channel_id.decode('utf-8') if channel_id else ""
|
|
292
296
|
self.local_user_observer.on_audio_subscribe_state_changed(self.local_user, channel_id_str, user_id_str, state, reason, elapsed)
|
|
293
297
|
|
|
294
298
|
def _on_audio_publish_state_changed(self, local_user_handle, channel_id, state, reason, elapsed):
|
|
295
|
-
|
|
299
|
+
logger.debug(f"LocalUserCB _on_audio_publish_state_changed: {local_user_handle}, {channel_id}, {state}, {reason}, {elapsed}")
|
|
296
300
|
channel_id_str = channel_id.decode('utf-8') if channel_id else ""
|
|
297
301
|
self.local_user_observer.on_audio_publish_state_changed(self.local_user, channel_id_str, state, reason, elapsed)
|
|
298
302
|
|
|
299
303
|
def _on_first_remote_audio_frame(self, local_user_handle, user_id, elapsed):
|
|
300
|
-
|
|
304
|
+
logger.debug(f"LocalUserCB _on_first_remote_audio_frame: {local_user_handle}, {user_id}, {elapsed}")
|
|
301
305
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
302
306
|
self.local_user_observer.on_first_remote_audio_frame(self.local_user, user_id_str, elapsed)
|
|
303
307
|
|
|
304
308
|
def _on_first_remote_audio_decoded(self, local_user_handle, user_id, elapsed):
|
|
305
|
-
|
|
309
|
+
logger.debug(f"LocalUserCB _on_first_remote_audio_decoded: {local_user_handle}, {user_id}, {elapsed}")
|
|
306
310
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
307
311
|
self.local_user_observer.on_first_remote_audio_decoded(self.local_user, user_id_str, elapsed)
|
|
308
312
|
|
|
309
313
|
def _on_video_track_unpublished(self, local_user_handle, local_video_track_handle):
|
|
310
|
-
|
|
314
|
+
logger.debug(f"LocalUserCB _on_video_track_unpublished: {local_user_handle}, {local_video_track_handle}")
|
|
311
315
|
local_video_track = self.local_user.get_video_map(local_video_track_handle)
|
|
312
316
|
#and then remove it from the local user
|
|
313
317
|
self.local_user.del_video_map(local_video_track_handle)
|
|
314
318
|
self.local_user_observer.on_video_track_unpublished(self.local_user, local_video_track)
|
|
315
319
|
|
|
316
320
|
def _on_video_track_publication_failure(self, local_user_handle, local_video_track_handle, error_code):
|
|
317
|
-
|
|
321
|
+
logger.debug(f"LocalUserCB _on_video_track_publication_failure: {local_user_handle}, {local_video_track_handle}, {error_code}")
|
|
318
322
|
local_video_track = self.local_user.get_video_map(local_video_track_handle)
|
|
319
323
|
self.local_user_observer.on_video_track_publication_failure(self.local_user, local_video_track, error_code)
|
|
320
324
|
|
|
321
325
|
def _on_local_video_track_state_changed(self, local_user_handle, local_video_track_handle, state, error):
|
|
322
|
-
|
|
326
|
+
logger.debug(f"LocalUserCB _on_local_video_track_state_changed: {local_user_handle}, {local_video_track_handle}, {state}, {error}")
|
|
323
327
|
local_video_track = self.local_user.get_video_map(local_video_track_handle)
|
|
324
328
|
self.local_user_observer.on_local_video_track_state_changed(self.local_user, local_video_track, state, error)
|
|
325
329
|
|
|
326
330
|
def _on_local_video_track_statistics(self, local_user_handle, local_video_track_handle, stats):
|
|
327
|
-
|
|
331
|
+
logger.debug(f"LocalUserCB _on_local_video_track_statistics: {local_user_handle}, {local_video_track_handle}, {stats}")
|
|
328
332
|
#stats: ctypes.pointer to LocalVideoTrackStats
|
|
329
333
|
local_video_track = self.local_user.get_video_map(local_video_track_handle)
|
|
330
334
|
video_stats = stats.contents
|
|
331
335
|
self.local_user_observer.on_local_video_track_statistics(self.local_user, local_video_track, video_stats)
|
|
332
336
|
# # #ctypes.CFUNCTYPE(None, AGORA_HANDLE, user_id_t, ctypes.POINTER(VideoTrackInfo), AGORA_HANDLE)
|
|
333
337
|
def _on_user_video_track_subscribed(self, local_user_handle, user_id, video_track_info, remote_video_track_handle):
|
|
334
|
-
|
|
338
|
+
logger.debug(f"LocalUserCB _on_user_video_track_subscribed: {local_user_handle}, {user_id}, {remote_video_track_handle}, {video_track_info}")
|
|
335
339
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
336
340
|
# track_info = video_track_info.contents._to_track_info()
|
|
337
341
|
track_info = video_track_info.contents #videoTrackInfo
|
|
@@ -339,83 +343,83 @@ class RTCLocalUserObserverInner(ctypes.Structure):
|
|
|
339
343
|
#note: for video, one user can publish multiple video tracks, so the identifier is the remote_video_track_handle,
|
|
340
344
|
# its diff to audiotrack
|
|
341
345
|
self.local_user.set_remote_video_map(remote_video_track_handle, remote_video_track)
|
|
342
|
-
track_info = video_track_info.contents.
|
|
346
|
+
track_info = video_track_info.contents._convert_to_video_track_info()
|
|
343
347
|
self.local_user_observer.on_user_video_track_subscribed(self.local_user, user_id_str, track_info, remote_video_track)
|
|
344
348
|
|
|
345
349
|
def _on_user_video_track_state_changed(self, local_user_handle, user_id, remote_video_track_handle, state, reason, elapsed):
|
|
346
|
-
|
|
350
|
+
logger.debug(f"LocalUserCB _on_user_video_track_state_changed: {local_user_handle}, {user_id}, {remote_video_track_handle}, {state}, {reason}, {elapsed}")
|
|
347
351
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
348
352
|
video_track = self.local_user.get_remote_video_map(remote_video_track_handle)
|
|
349
353
|
self.local_user_observer.on_user_video_track_state_changed(self.local_user, user_id_str, video_track, state, reason, elapsed)
|
|
350
354
|
|
|
351
355
|
def _on_remote_video_track_statistics(self, local_user_handle, remote_video_track_handle, stats_ptr):
|
|
352
|
-
|
|
356
|
+
logger.debug(f"LocalUserCB _on_remote_video_track_statistics: {local_user_handle}, {remote_video_track_handle}, {stats_ptr}")
|
|
353
357
|
remote_stats = stats_ptr.contents #RemoteVideoTrackStats
|
|
354
358
|
video_track = self.local_user.get_remote_video_map(remote_video_track_handle)
|
|
355
359
|
self.local_user_observer.on_remote_video_track_statistics(self.local_user, video_track, remote_stats)
|
|
356
360
|
|
|
357
361
|
def _on_audio_volume_indication(self, local_user_handle, audio_volume_info_ptr, speaker_number, total_volume):
|
|
358
|
-
|
|
362
|
+
logger.debug(f"LocalUserCB _on_audio_volume_indication: {local_user_handle}, {audio_volume_info_ptr}, {speaker_number}, {total_volume}")
|
|
359
363
|
audio_volume_info = audio_volume_info_ptr.contents
|
|
360
364
|
self.local_user_observer.on_audio_volume_indication(self.local_user, audio_volume_info, speaker_number, total_volume)
|
|
361
365
|
|
|
362
366
|
def _on_active_speaker(self, local_user_handle, user_id):
|
|
363
|
-
|
|
367
|
+
logger.debug(f"LocalUserCB _on_active_speaker: {local_user_handle}, {user_id}")
|
|
364
368
|
user_id_str = user_id.decode('utf-8')
|
|
365
369
|
self.local_user_observer.on_active_speaker(self.local_user, user_id_str)
|
|
366
370
|
|
|
367
371
|
def _on_remote_video_stream_info_updated(self, local_user_handle, remote_video_stream_info_ptr):
|
|
368
|
-
|
|
372
|
+
logger.debug(f"LocalUserCB _on_remote_video_stream_info_updated: {local_user_handle}, {remote_video_stream_info_ptr}")
|
|
369
373
|
video_stream_info = remote_video_stream_info_ptr.contents
|
|
370
374
|
self.local_user_observer.on_remote_video_stream_info_updated(self.local_user, video_stream_info)
|
|
371
375
|
|
|
372
376
|
def _on_video_subscribe_state_changed(self, local_user_handle, channel_id, user_id, state, reason, elapsed):
|
|
373
|
-
|
|
377
|
+
logger.debug(f"LocalUserCB _on_video_subscribe_state_changed: {local_user_handle}, {channel_id}, {user_id}, {state}, {reason}, {elapsed}")
|
|
374
378
|
user_id_str = user_id.decode('utf-8')
|
|
375
379
|
channel_id_str = channel_id.decode('utf-8')
|
|
376
380
|
self.local_user_observer.on_video_subscribe_state_changed(self.local_user, channel_id_str, user_id_str, state, reason, elapsed)
|
|
377
381
|
|
|
378
382
|
def _on_video_publish_state_changed(self, local_user_handle, channel_id, state, reason, elapsed):
|
|
379
|
-
|
|
383
|
+
logger.debug(f"LocalUserCB _on_video_publish_state_changed: {local_user_handle}, {channel_id}, {state}, {reason}, {elapsed}")
|
|
380
384
|
channel_id_str = channel_id.decode('utf-8')
|
|
381
385
|
self.local_user_observer.on_video_publish_state_changed(self.local_user, channel_id_str, state, reason, elapsed)
|
|
382
386
|
|
|
383
387
|
def _on_first_remote_video_frame(self, local_user_handle, user_id, width, height, elapsed):
|
|
384
|
-
|
|
388
|
+
logger.debug(f"LocalUserCB _on_first_remote_video_frame: {local_user_handle}, {user_id}, {width}, {height}, {elapsed}")
|
|
385
389
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
386
390
|
self.local_user_observer.on_first_remote_video_frame(self.local_user, user_id_str, width, height, elapsed)
|
|
387
391
|
|
|
388
392
|
def _on_first_remote_video_decoded(self, local_user_handle, user_id, width, height, elapsed):
|
|
389
|
-
|
|
393
|
+
logger.debug(f"LocalUserCB _on_first_remote_video_decoded: {local_user_handle}, {user_id}, {width}, {height}, {elapsed}")
|
|
390
394
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
391
395
|
self.local_user_observer.on_first_remote_video_decoded(self.local_user, user_id_str, width, height, elapsed)
|
|
392
396
|
|
|
393
397
|
def _on_first_remote_video_frame_rendered(self, local_user_handle, user_id, width, height, elapsed):
|
|
394
|
-
|
|
398
|
+
logger.debug(f"LocalUserCB _on_first_remote_video_frame_rendered: {local_user_handle}, {user_id}, {width}, {height}, {elapsed}")
|
|
395
399
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
396
400
|
self.local_user_observer.on_first_remote_video_frame_rendered(self.local_user, user_id_str, width, height, elapsed)
|
|
397
401
|
|
|
398
402
|
def _on_video_size_changed(self, local_user_handle, user_id, width, height, elapsed):
|
|
399
|
-
|
|
403
|
+
logger.debug(f"LocalUserCB _on_video_size_changed: {local_user_handle}, {user_id}, {width}, {height}, {elapsed}")
|
|
400
404
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
401
405
|
self.local_user_observer.on_video_size_changed(self.local_user, user_id_str, width, height, elapsed)
|
|
402
406
|
|
|
403
407
|
def _on_user_info_updated(self, local_user_handle, user_id, msg, val):
|
|
404
|
-
|
|
408
|
+
logger.debug(f"LocalUserCB _on_user_info_updated: {local_user_handle}, {user_id}, {msg}, {val}")
|
|
405
409
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
406
410
|
self.local_user_observer.on_user_info_updated(self.local_user, user_id_str, msg, val)
|
|
407
411
|
|
|
408
412
|
def _on_intra_request_received(self, local_user_handle):
|
|
409
|
-
|
|
413
|
+
logger.debug(f"LocalUserCB _on_intra_request_received: {local_user_handle}")
|
|
410
414
|
self.local_user_observer.on_intra_request_received(self.local_user)
|
|
411
415
|
|
|
412
416
|
def _on_remote_subscribe_fallback_to_audio_only(self, local_user_handle, user_id, is_fallback):
|
|
413
|
-
|
|
417
|
+
logger.debug(f"LocalUserCB _on_remote_subscribe_fallback_to_audio_only: {local_user_handle}, {user_id}, {is_fallback}")
|
|
414
418
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
415
419
|
self.local_user_observer.on_remote_subscribe_fallback_to_audio_only(self.local_user, user_id_str, is_fallback)
|
|
416
420
|
|
|
417
421
|
def _on_stream_message(self, local_user_handle, user_id, stream_id, data, size):
|
|
418
|
-
|
|
422
|
+
logger.debug(f"LocalUserCB _on_stream_message: {local_user_handle}, {user_id}, {stream_id}, {data}, {size}")
|
|
419
423
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
420
424
|
bytes_from_c = ctypes.string_at(data, size)
|
|
421
425
|
data_byte_array = bytearray(bytes_from_c).decode()
|
|
@@ -423,7 +427,7 @@ class RTCLocalUserObserverInner(ctypes.Structure):
|
|
|
423
427
|
self.local_user_observer.on_stream_message(self.local_user, user_id_str, stream_id, data_byte_array, size)
|
|
424
428
|
|
|
425
429
|
def _on_user_state_changed(self, local_user_handle, user_id, state):
|
|
426
|
-
|
|
430
|
+
logger.debug(f"LocalUserCB _on_user_state_changed: {local_user_handle}, {user_id}, {state}")
|
|
427
431
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
428
432
|
self.local_user_observer.on_user_state_changed(self.local_user, user_id_str, state)
|
|
429
433
|
|