agora-python-server-sdk 1.1.0__tar.gz → 2.0.5__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.
Potentially problematic release.
This version of agora-python-server-sdk might be problematic. Click here for more details.
- agora_python_server_sdk-2.0.5/MANIFEST.in +1 -0
- agora_python_server_sdk-2.0.5/PKG-INFO +53 -0
- agora_python_server_sdk-2.0.5/README.md +36 -0
- agora_python_server_sdk-2.0.5/agora/rtc/__init__.py +75 -0
- agora_python_server_sdk-2.0.5/agora/rtc/_audio_frame_observer.py +143 -0
- agora_python_server_sdk-2.0.5/agora/rtc/_local_user_observer.py +383 -0
- agora_python_server_sdk-2.0.5/agora/rtc/_rtc_connection_observer.py +280 -0
- agora_python_server_sdk-2.0.5/agora/rtc/_video_encoded_frame_observer.py +56 -0
- agora_python_server_sdk-2.0.5/agora/rtc/_video_frame_observer.py +74 -0
- agora_python_server_sdk-2.0.5/agora/rtc/agora_base.py +350 -0
- agora_python_server_sdk-2.0.5/agora/rtc/agora_parameter.py +179 -0
- agora_python_server_sdk-2.0.5/agora/rtc/agora_service.py +261 -0
- agora_python_server_sdk-2.0.5/agora/rtc/audio_encoded_frame_sender.py +76 -0
- agora_python_server_sdk-2.0.5/agora/rtc/audio_frame_observer.py +32 -0
- agora_python_server_sdk-2.0.5/agora/rtc/audio_pcm_data_sender.py +34 -0
- {agora_python_server_sdk-1.1.0/agora_service → agora_python_server_sdk-2.0.5/agora/rtc}/audio_vad.py +15 -8
- agora_python_server_sdk-2.0.5/agora/rtc/globals.py +63 -0
- agora_python_server_sdk-2.0.5/agora/rtc/local_audio_track.py +108 -0
- agora_python_server_sdk-2.0.5/agora/rtc/local_user.py +532 -0
- agora_python_server_sdk-2.0.5/agora/rtc/local_user_observer.py +117 -0
- agora_python_server_sdk-2.0.5/agora/rtc/local_video_track.py +77 -0
- agora_python_server_sdk-2.0.5/agora/rtc/media_node_factory.py +65 -0
- agora_python_server_sdk-2.0.5/agora/rtc/remote_audio_track.py +66 -0
- agora_python_server_sdk-2.0.5/agora/rtc/remote_video_track.py +131 -0
- agora_python_server_sdk-2.0.5/agora/rtc/rtc_connection.py +337 -0
- agora_python_server_sdk-2.0.5/agora/rtc/rtc_connection_observer.py +89 -0
- agora_python_server_sdk-2.0.5/agora/rtc/video_encoded_frame_observer.py +20 -0
- agora_python_server_sdk-2.0.5/agora/rtc/video_encoded_image_sender.py +87 -0
- agora_python_server_sdk-2.0.5/agora/rtc/video_frame_observer.py +47 -0
- agora_python_server_sdk-2.0.5/agora/rtc/video_frame_sender.py +92 -0
- agora_python_server_sdk-2.0.5/agora_python_server_sdk.egg-info/PKG-INFO +53 -0
- agora_python_server_sdk-2.0.5/agora_python_server_sdk.egg-info/SOURCES.txt +35 -0
- agora_python_server_sdk-2.0.5/agora_python_server_sdk.egg-info/top_level.txt +1 -0
- {agora_python_server_sdk-1.1.0 → agora_python_server_sdk-2.0.5}/setup.py +17 -19
- agora_python_server_sdk-1.1.0/MANIFEST.in +0 -1
- agora_python_server_sdk-1.1.0/PKG-INFO +0 -70
- agora_python_server_sdk-1.1.0/README.md +0 -53
- agora_python_server_sdk-1.1.0/agora_python_server_sdk.egg-info/PKG-INFO +0 -70
- agora_python_server_sdk-1.1.0/agora_python_server_sdk.egg-info/SOURCES.txt +0 -21
- agora_python_server_sdk-1.1.0/agora_python_server_sdk.egg-info/top_level.txt +0 -1
- agora_python_server_sdk-1.1.0/agora_service/__init__.py +0 -21
- agora_python_server_sdk-1.1.0/agora_service/agora_base.py +0 -71
- agora_python_server_sdk-1.1.0/agora_service/agora_service.py +0 -110
- agora_python_server_sdk-1.1.0/agora_service/audio_frame_observer.py +0 -65
- agora_python_server_sdk-1.1.0/agora_service/audio_pcm_data_sender.py +0 -86
- agora_python_server_sdk-1.1.0/agora_service/local_audio_track.py +0 -30
- agora_python_server_sdk-1.1.0/agora_service/local_user.py +0 -15
- agora_python_server_sdk-1.1.0/agora_service/media_node_factory.py +0 -16
- agora_python_server_sdk-1.1.0/agora_service/rtc_conn_observer.py +0 -299
- agora_python_server_sdk-1.1.0/agora_service/rtc_connection.py +0 -321
- agora_python_server_sdk-1.1.0/agora_service/video_frame_observer.py +0 -34
- agora_python_server_sdk-1.1.0/agora_service/video_sender.py +0 -193
- {agora_python_server_sdk-1.1.0 → agora_python_server_sdk-2.0.5}/agora_python_server_sdk.egg-info/dependency_links.txt +0 -0
- {agora_python_server_sdk-1.1.0 → agora_python_server_sdk-2.0.5}/pyproject.toml +0 -0
- {agora_python_server_sdk-1.1.0 → agora_python_server_sdk-2.0.5}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exclude agora_rtc/agora/rtc/agora_sdk/*
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: agora_python_server_sdk
|
|
3
|
+
Version: 2.0.5
|
|
4
|
+
Summary: A Python SDK for Agora Server
|
|
5
|
+
Home-page: https://github.com/AgoraIO-Extensions/Agora-Python-Server-SDK
|
|
6
|
+
Classifier: Intended Audience :: Developers
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
9
|
+
Classifier: Topic :: Multimedia :: Video
|
|
10
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
14
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
15
|
+
Requires-Python: >=3.8
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
# Note
|
|
19
|
+
- This is a Python SDK wrapper for the Agora RTC SDK.
|
|
20
|
+
- It supports Linux and Mac platforms.
|
|
21
|
+
- The examples are provided as very simple demonstrations and are not recommended for use in production environments.
|
|
22
|
+
|
|
23
|
+
# Very Important Notice !!!
|
|
24
|
+
- A process can only have one instance.
|
|
25
|
+
- An instance can have multiple connections.
|
|
26
|
+
- In all observers or callbacks, you must not call the SDK's own APIs, nor perform CPU-intensive tasks in the callbacks; data copying is allowed.
|
|
27
|
+
|
|
28
|
+
# Required Operating Systems and Python Versions
|
|
29
|
+
- Supported Linux versions:
|
|
30
|
+
- Ubuntu 18.04 LTS and above
|
|
31
|
+
- CentOS 7.0 and above
|
|
32
|
+
|
|
33
|
+
- Supported Mac versions:
|
|
34
|
+
- MacOS 13 and above
|
|
35
|
+
|
|
36
|
+
- Python version:
|
|
37
|
+
- Python 3.8 and above
|
|
38
|
+
|
|
39
|
+
# Using Agora-Python-Server-SDK
|
|
40
|
+
```
|
|
41
|
+
pip install agora_python_server_sdk
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
# Running Examples
|
|
45
|
+
|
|
46
|
+
## Preparing Test Data
|
|
47
|
+
- Download and unzip [test_data.zip](https://download.agora.io/demo/test/test_data_202408221437.zip) to the Agora-Python-Server-SDK directory.
|
|
48
|
+
|
|
49
|
+
## Executing Test Script
|
|
50
|
+
```
|
|
51
|
+
python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
|
|
52
|
+
```
|
|
53
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Note
|
|
2
|
+
- This is a Python SDK wrapper for the Agora RTC SDK.
|
|
3
|
+
- It supports Linux and Mac platforms.
|
|
4
|
+
- The examples are provided as very simple demonstrations and are not recommended for use in production environments.
|
|
5
|
+
|
|
6
|
+
# Very Important Notice !!!
|
|
7
|
+
- A process can only have one instance.
|
|
8
|
+
- An instance can have multiple connections.
|
|
9
|
+
- In all observers or callbacks, you must not call the SDK's own APIs, nor perform CPU-intensive tasks in the callbacks; data copying is allowed.
|
|
10
|
+
|
|
11
|
+
# Required Operating Systems and Python Versions
|
|
12
|
+
- Supported Linux versions:
|
|
13
|
+
- Ubuntu 18.04 LTS and above
|
|
14
|
+
- CentOS 7.0 and above
|
|
15
|
+
|
|
16
|
+
- Supported Mac versions:
|
|
17
|
+
- MacOS 13 and above
|
|
18
|
+
|
|
19
|
+
- Python version:
|
|
20
|
+
- Python 3.8 and above
|
|
21
|
+
|
|
22
|
+
# Using Agora-Python-Server-SDK
|
|
23
|
+
```
|
|
24
|
+
pip install agora_python_server_sdk
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
# Running Examples
|
|
28
|
+
|
|
29
|
+
## Preparing Test Data
|
|
30
|
+
- Download and unzip [test_data.zip](https://download.agora.io/demo/test/test_data_202408221437.zip) to the Agora-Python-Server-SDK directory.
|
|
31
|
+
|
|
32
|
+
## Executing Test Script
|
|
33
|
+
```
|
|
34
|
+
python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
|
|
35
|
+
```
|
|
36
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
import hashlib
|
|
14
|
+
|
|
15
|
+
def get_file_md5(file_path):
|
|
16
|
+
hash_md5 = hashlib.md5()
|
|
17
|
+
with open(file_path, "rb") as f:
|
|
18
|
+
for chunk in iter(lambda: f.read(4096), b""):
|
|
19
|
+
hash_md5.update(chunk)
|
|
20
|
+
return hash_md5.hexdigest()
|
|
21
|
+
|
|
22
|
+
def _check_download_and_extract_sdk():
|
|
23
|
+
agora_service_path = os.path.dirname(os.path.abspath(__file__))
|
|
24
|
+
sdk_dir = os.path.join(agora_service_path, "agora_sdk")
|
|
25
|
+
zip_path = os.path.join(agora_service_path, "agora_rtc_sdk.zip")
|
|
26
|
+
|
|
27
|
+
url = "https://download.agora.io/sdk/release/agora_rtc_sdk_linux_v4.4.30-20240928_160128-358664.zip"
|
|
28
|
+
libagora_rtc_sdk_path = os.path.join(sdk_dir, "libagora_rtc_sdk.so")
|
|
29
|
+
rtc_md5 = "2c1d3fcac8ba6a491be4254186e963fc"
|
|
30
|
+
if sys.platform == 'darwin':
|
|
31
|
+
url = "https://download.agora.io/sdk/release/agora_sdk_mac_v4.4.30_22119_FULL_20240928_1647_358680.zip"
|
|
32
|
+
libagora_rtc_sdk_path = os.path.join(sdk_dir, "libAgoraRtcKit.dylib")
|
|
33
|
+
rtc_md5 = "e0be66fa1d9a067c04fa68dca634b35e"
|
|
34
|
+
|
|
35
|
+
if os.path.exists(libagora_rtc_sdk_path) and get_file_md5(libagora_rtc_sdk_path) == rtc_md5:
|
|
36
|
+
return
|
|
37
|
+
|
|
38
|
+
logger.error("missing agora sdk, now download it, please wait for a while...")
|
|
39
|
+
if os.path.exists(sdk_dir):
|
|
40
|
+
os.system(f"rm -rf {sdk_dir}")
|
|
41
|
+
os.makedirs(agora_service_path, exist_ok=True)
|
|
42
|
+
if os.path.exists(zip_path):
|
|
43
|
+
os.remove(zip_path)
|
|
44
|
+
|
|
45
|
+
logger.info(f"agora_service_path: {agora_service_path}")
|
|
46
|
+
logger.info(f"Downloading {url}...")
|
|
47
|
+
request.urlretrieve(url, zip_path)
|
|
48
|
+
|
|
49
|
+
logger.info(f"Extracting {zip_path}...")
|
|
50
|
+
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
|
|
51
|
+
zip_ref.extractall(agora_service_path)
|
|
52
|
+
|
|
53
|
+
if os.path.exists(zip_path):
|
|
54
|
+
os.remove(zip_path)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
_check_download_and_extract_sdk()
|
|
58
|
+
|
|
59
|
+
sdk_dir = os.path.dirname(os.path.abspath(__file__))
|
|
60
|
+
lib_path = os.path.join(sdk_dir, 'agora_sdk')
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
if sys.platform == 'darwin':
|
|
64
|
+
lib_agora_rtc_path =os.path.join(lib_path, 'libAgoraRtcKit.dylib')
|
|
65
|
+
agora_lib = ctypes.CDLL(lib_agora_rtc_path)
|
|
66
|
+
|
|
67
|
+
elif sys.platform == 'linux':
|
|
68
|
+
lib_agora_rtc_path =os.path.join(lib_path, 'libagora_rtc_sdk.so')
|
|
69
|
+
ctypes.CDLL(os.path.join(lib_path, 'libagora-fdkaac.so'))
|
|
70
|
+
ctypes.CDLL(os.path.join(lib_path, 'libaosl.so'))
|
|
71
|
+
agora_lib = ctypes.CDLL(lib_agora_rtc_path)
|
|
72
|
+
except OSError as e:
|
|
73
|
+
logger.error(f"Error loading the library: {e}")
|
|
74
|
+
logger.error(f"Attempted to load from: {lib_agora_rtc_path}")
|
|
75
|
+
sys.exit(1)
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import ctypes
|
|
2
|
+
from .agora_base import *
|
|
3
|
+
from .local_user import *
|
|
4
|
+
import ctypes
|
|
5
|
+
from .audio_frame_observer import *
|
|
6
|
+
import logging
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AudioFrameInner(ctypes.Structure):
|
|
11
|
+
_fields_ = [
|
|
12
|
+
("type", ctypes.c_int),
|
|
13
|
+
("samples_per_channel", ctypes.c_int),
|
|
14
|
+
("bytes_per_sample", ctypes.c_int),
|
|
15
|
+
("channels", ctypes.c_int),
|
|
16
|
+
("samples_per_sec", ctypes.c_int),
|
|
17
|
+
("buffer", ctypes.c_void_p),
|
|
18
|
+
("render_time_ms", ctypes.c_int64),
|
|
19
|
+
("avsync_type", ctypes.c_int),
|
|
20
|
+
("far_field_flag", ctypes.c_int),
|
|
21
|
+
("rms", ctypes.c_int),
|
|
22
|
+
("voice_prob", ctypes.c_int),
|
|
23
|
+
("music_prob", ctypes.c_int),
|
|
24
|
+
("pitch", ctypes.c_int)
|
|
25
|
+
]
|
|
26
|
+
def _to_audio_frame(self):
|
|
27
|
+
audio_frame = AudioFrame()
|
|
28
|
+
audio_frame.type = self.type
|
|
29
|
+
audio_frame.samples_per_channel = self.samples_per_channel
|
|
30
|
+
audio_frame.bytes_per_sample = self.bytes_per_sample
|
|
31
|
+
audio_frame.channels = self.channels
|
|
32
|
+
audio_frame.samples_per_sec = self.samples_per_sec
|
|
33
|
+
cdata = ctypes.string_at(self.buffer, self.samples_per_channel * self.bytes_per_sample * self.channels)
|
|
34
|
+
audio_frame.buffer = bytearray(cdata)
|
|
35
|
+
audio_frame.render_time_ms = self.render_time_ms
|
|
36
|
+
audio_frame.avsync_type = self.avsync_type
|
|
37
|
+
audio_frame.far_field_flag = self.far_field_flag
|
|
38
|
+
audio_frame.rms = self.rms
|
|
39
|
+
audio_frame.voice_prob = self.voice_prob
|
|
40
|
+
audio_frame.music_prob = self.music_prob
|
|
41
|
+
audio_frame.pitch = self.pitch
|
|
42
|
+
|
|
43
|
+
return audio_frame
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
ON_RECORD_AUDIO_FRAME_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.c_char_p, ctypes.POINTER(AudioFrameInner))
|
|
47
|
+
ON_PLAYBACK_AUDIO_FRAME_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.c_char_p, ctypes.POINTER(AudioFrameInner))
|
|
48
|
+
ON_MIXED_AUDIO_FRAME_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.c_char_p, ctypes.POINTER(AudioFrameInner))
|
|
49
|
+
ON_EAR_MONITORING_AUDIO_FRAME_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.POINTER(AudioFrameInner))
|
|
50
|
+
ON_PLAYBACK_AUDIO_FRAME_BEFORE_MIXING_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE, ctypes.c_char_p, user_id_t, ctypes.POINTER(AudioFrameInner))
|
|
51
|
+
ON_GET_AUDIO_FRAME_POSITION_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, AGORA_HANDLE)
|
|
52
|
+
ON_GET_PLAYBACK_AUDIO_FRAME_PARAM_CALLBACK = ctypes.CFUNCTYPE(AudioParams, AGORA_HANDLE)
|
|
53
|
+
ON_GET_RECORD_AUDIO_FRAME_PARAM_CALLBACK = ctypes.CFUNCTYPE(AudioParams, AGORA_HANDLE)
|
|
54
|
+
ON_GET_MIXED_AUDIO_FRAME_PARAM_CALLBACK = ctypes.CFUNCTYPE(AudioParams, AGORA_HANDLE)
|
|
55
|
+
ON_GET_EAR_MONITORING_AUDIO_FRAME_PARAM_CALLBACK = ctypes.CFUNCTYPE(AudioParams, AGORA_HANDLE)
|
|
56
|
+
|
|
57
|
+
class AudioFrameObserverInner(ctypes.Structure):
|
|
58
|
+
_fields_ = [
|
|
59
|
+
("on_record_audio_frame", ON_RECORD_AUDIO_FRAME_CALLBACK),
|
|
60
|
+
("on_playback_audio_frame", ON_PLAYBACK_AUDIO_FRAME_CALLBACK),
|
|
61
|
+
("on_mixed_audio_frame", ON_MIXED_AUDIO_FRAME_CALLBACK),
|
|
62
|
+
("on_ear_monitoring_audio_frame", ON_EAR_MONITORING_AUDIO_FRAME_CALLBACK),
|
|
63
|
+
|
|
64
|
+
("on_playback_audio_frame_before_mixing", ON_PLAYBACK_AUDIO_FRAME_BEFORE_MIXING_CALLBACK),
|
|
65
|
+
("on_get_audio_frame_position", ON_GET_AUDIO_FRAME_POSITION_CALLBACK),
|
|
66
|
+
("on_get_playback_audio_frame_param", ON_GET_PLAYBACK_AUDIO_FRAME_PARAM_CALLBACK),
|
|
67
|
+
("on_get_record_audio_frame_param", ON_GET_RECORD_AUDIO_FRAME_PARAM_CALLBACK),
|
|
68
|
+
|
|
69
|
+
("on_get_mixed_audio_frame_param", ON_GET_MIXED_AUDIO_FRAME_PARAM_CALLBACK),
|
|
70
|
+
("on_get_ear_monitoring_audio_frame_param", ON_GET_EAR_MONITORING_AUDIO_FRAME_PARAM_CALLBACK)
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
def __init__(self, observer:IAudioFrameObserver, local_user: 'LocalUser'):
|
|
74
|
+
self.observer = observer
|
|
75
|
+
self.local_user = local_user
|
|
76
|
+
self.on_record_audio_frame = ON_RECORD_AUDIO_FRAME_CALLBACK(self._on_record_audio_frame)
|
|
77
|
+
self.on_playback_audio_frame = ON_PLAYBACK_AUDIO_FRAME_CALLBACK(self._on_playback_audio_frame)
|
|
78
|
+
self.on_mixed_audio_frame = ON_MIXED_AUDIO_FRAME_CALLBACK(self._on_mixed_audio_frame)
|
|
79
|
+
self.on_ear_monitoring_audio_frame = ON_EAR_MONITORING_AUDIO_FRAME_CALLBACK(self._on_ear_monitoring_audio_frame)
|
|
80
|
+
self.on_playback_audio_frame_before_mixing = ON_PLAYBACK_AUDIO_FRAME_BEFORE_MIXING_CALLBACK(self._on_playback_audio_frame_before_mixing)
|
|
81
|
+
self.on_get_audio_frame_position = ON_GET_AUDIO_FRAME_POSITION_CALLBACK(self._on_get_audio_frame_position)
|
|
82
|
+
|
|
83
|
+
# self.on_get_playback_audio_frame_param = ON_GET_PLAYBACK_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_playback_audio_frame_param)
|
|
84
|
+
# self.on_get_record_audio_frame_param = ON_GET_RECORD_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_record_audio_frame_param)
|
|
85
|
+
# self.on_get_mixed_audio_frame_param = ON_GET_MIXED_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_mixed_audio_frame_param)
|
|
86
|
+
# self.on_get_ear_monitoring_audio_frame_param = ON_GET_EAR_MONITORING_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_ear_monitoring_audio_frame_param)
|
|
87
|
+
|
|
88
|
+
def _on_record_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
89
|
+
logger.debug(f"AudioFrameObserverInner _on_record_audio_frame: {local_user_handle}, {channel_id}, {audio_frame_inner}")
|
|
90
|
+
channel_id_str = channel_id.decode('utf-8')
|
|
91
|
+
frame = audio_frame_inner.contents._to_audio_frame()
|
|
92
|
+
ret = self.observer.on_record_audio_frame(self.local_user, channel_id_str, frame)
|
|
93
|
+
return ret
|
|
94
|
+
|
|
95
|
+
def _on_playback_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
96
|
+
logger.debug(f"AudioFrameObserverInner _on_playback_audio_frame: {local_user_handle}, {channel_id}, {audio_frame_inner}")
|
|
97
|
+
channel_id_str = channel_id.decode('utf-8')
|
|
98
|
+
frame = audio_frame_inner.contents._to_audio_frame()
|
|
99
|
+
ret = self.observer.on_playback_audio_frame(self.local_user, channel_id_str, frame)
|
|
100
|
+
return ret
|
|
101
|
+
|
|
102
|
+
def _on_mixed_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
103
|
+
logger.debug(f"AudioFrameObserverInner _on_mixed_audio_frame: {local_user_handle}, {channel_id}, {audio_frame_inner}")
|
|
104
|
+
ret = self.observer.on_mixed_audio_frame(self.local_user, audio_frame_inner)
|
|
105
|
+
return ret
|
|
106
|
+
|
|
107
|
+
def _on_ear_monitoring_audio_frame(self, local_user_handle, audio_frame_inner):
|
|
108
|
+
logger.debug(f"AudioFrameObserverInner _on_ear_monitoring_audio_frame: {local_user_handle}, {audio_frame_inner}")
|
|
109
|
+
ret = self.observer.on_ear_monitoring_audio_frame(self.local_user, audio_frame_inner)
|
|
110
|
+
return ret
|
|
111
|
+
|
|
112
|
+
def _on_playback_audio_frame_before_mixing(self, local_user_handle, channel_id, user_id, audio_frame_inner):
|
|
113
|
+
#logger.debug(f"AudioFrameObserverInner _on_playback_audio_frame_before_mixing: {local_user_handle}, {channel_id}, {user_id}, {audio_frame_inner}")
|
|
114
|
+
if channel_id is None:
|
|
115
|
+
channel_id_str = ""
|
|
116
|
+
else:
|
|
117
|
+
channel_id_str = channel_id.decode('utf-8')
|
|
118
|
+
|
|
119
|
+
user_id_str = user_id.decode('utf-8')
|
|
120
|
+
frame = audio_frame_inner.contents._to_audio_frame()
|
|
121
|
+
ret = self.observer.on_playback_audio_frame_before_mixing(self.local_user, channel_id_str, user_id_str, frame)
|
|
122
|
+
return ret
|
|
123
|
+
|
|
124
|
+
def _on_get_audio_frame_position(self, local_user_handle):
|
|
125
|
+
logger.debug(f"AudioFrameObserverInner _on_get_audio_frame_position: {local_user_handle}")
|
|
126
|
+
return self.observer.on_get_audio_frame_position(self.local_user)
|
|
127
|
+
|
|
128
|
+
def _on_get_playback_audio_frame_param(self, local_user_handle) -> AudioParams:
|
|
129
|
+
logger.debug(f"AudioFrameObserverInner _on_get_playback_audio_frame_param: {local_user_handle}")
|
|
130
|
+
return self.observer.on_get_playback_audio_frame_param(self.local_user)
|
|
131
|
+
|
|
132
|
+
def _on_get_record_audio_frame_param(self, local_user_handle) -> AudioParams:
|
|
133
|
+
logger.debug(f"AudioFrameObserverInner _on_get_record_audio_frame_param: {local_user_handle}")
|
|
134
|
+
return self.observer.on_get_record_audio_frame_param(self.local_user)
|
|
135
|
+
|
|
136
|
+
def _on_get_mixed_audio_frame_param(self, local_user_handle) -> AudioParams:
|
|
137
|
+
logger.debug(f"AudioFrameObserverInner _on_get_mixed_audio_frame_param: {local_user_handle}")
|
|
138
|
+
return self.observer.on_get_mixed_audio_frame_param(self.local_user)
|
|
139
|
+
|
|
140
|
+
def _on_get_ear_monitoring_audio_frame_param(self, local_user_handle) -> AudioParams:
|
|
141
|
+
logger.debug(f"AudioFrameObserverInner _on_get_ear_monitoring_audio_frame_param: {local_user_handle}")
|
|
142
|
+
return self.observer.on_get_ear_monitoring_audio_frame_param(self.local_user)
|
|
143
|
+
|