diff --git a/unitree_sdk2py/g1/audio/g1_audio_client.py b/unitree_sdk2py/g1/audio/g1_audio_client.py index d8d0bc3..8b3e84e 100644 --- a/unitree_sdk2py/g1/audio/g1_audio_client.py +++ b/unitree_sdk2py/g1/audio/g1_audio_client.py @@ -35,6 +35,14 @@ def TtsMaker(self, text: str, speaker_id: int): code, data = self._Call(ROBOT_API_ID_AUDIO_TTS, parameter) return code + def PlayStream(self, app_name: str, stream_id: str, pcm_data: list): + p = {} + p["app_name"] = app_name + p["stream_id"] = stream_id + parameter = json.dumps(p) + code, data = self._CallParamBinary(ROBOT_API_ID_AUDIO_START_PLAY, parameter, pcm_data) + return code + def GetVolume(self): p = {} parameter = json.dumps(p) diff --git a/unitree_sdk2py/rpc/client.py b/unitree_sdk2py/rpc/client.py index d774e53..28a06aa 100644 --- a/unitree_sdk2py/rpc/client.py +++ b/unitree_sdk2py/rpc/client.py @@ -70,6 +70,13 @@ def _CallBinaryNoReply(self, apiId: int, parameter: list): else: return RPC_ERR_CLIENT_API_NOT_REG + def _CallParamBinary(self, apiId: int, parameter: str, binary: list): + ret, proirity, leaseId = self.__CheckApi(apiId) + if ret == 0: + return self._CallParamBinaryBase(apiId, parameter, binary, proirity, leaseId) + else: + return RPC_ERR_CLIENT_API_NOT_REG, None + def _RegistApi(self, apiId: int, proirity: int): self.__apiMapping[apiId] = proirity diff --git a/unitree_sdk2py/rpc/client_base.py b/unitree_sdk2py/rpc/client_base.py index 1bac028..20fcbea 100644 --- a/unitree_sdk2py/rpc/client_base.py +++ b/unitree_sdk2py/rpc/client_base.py @@ -86,6 +86,28 @@ def _CallBinaryNoReplyBase(self, apiId: int, parameter: list, proirity: int, lea else: return RPC_ERR_CLIENT_SEND + def _CallParamBinaryBase(self, apiId: int, parameter: str, binary: list, proirity: int = 0, leaseId: int = 0): + header = self.__SetHeader(apiId, leaseId, proirity, False) + request = Request(header, parameter, binary) + + future = self.__stub.SendRequest(request, self.__timeout) + if future is None: + return RPC_ERR_CLIENT_SEND, None + + result = future.GetResult(self.__timeout) + + if result.code != FutureResult.FUTURE_SUCC: + self.__stub.RemoveFuture(request.header.identity.id) + code = RPC_ERR_CLIENT_API_TIMEOUT if result.code == FutureResult.FUTUTE_ERR_TIMEOUT else RPC_ERR_UNKNOWN + return code, None + + response = result.value + + if response.header.identity.api_id != apiId: + return RPC_ERR_CLIENT_API_NOT_MATCH, None + else: + return response.header.status.code, response.data + def __SetHeader(self, apiId: int, leaseId: int, priority: int, noReply: bool): identity = RequestIdentity(time.monotonic_ns(), apiId) lease = RequestLease(leaseId)