diff --git a/frameworks/native/audioadapter/include/audio_service_adapter.h b/frameworks/native/audioadapter/include/audio_service_adapter.h index d562ec6d344fe2a3fa4a26d0eed7c772b6fea3aa..87276e2594c883b1d55f247efd468dafd1c81f6c 100644 --- a/frameworks/native/audioadapter/include/audio_service_adapter.h +++ b/frameworks/native/audioadapter/include/audio_service_adapter.h @@ -111,7 +111,14 @@ public: * @param adapterName name of default audio sink to be set * @return Returns sink ids. */ - virtual std::vector getTargetSinks(std::string adapterName) = 0; + virtual std::vector GetTargetSinks(std::string adapterName) = 0; + + /** + * @brief get all sinks + * + * @return Returns sink infos. + */ + virtual std::vector GetAllSinks() = 0; /** * @brief sets audio volume diff --git a/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h b/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h index ea6775dd108f4179a7c0ec466000ee85f1be8980..45bc6336ac36a11497811b2c74aab09a45a8ca32 100644 --- a/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h +++ b/frameworks/native/audioadapter/include/pulse_audio_service_adapter_impl.h @@ -44,7 +44,8 @@ public: std::vector GetAllSourceOutputs() override; void Disconnect() override; - std::vector getTargetSinks(std::string adapterName) override; + std::vector GetTargetSinks(std::string adapterName) override; + std::vector GetAllSinks() override; int32_t SetLocalDefaultSink(std::string name) override; int32_t MoveSinkInputByIndexOrName(uint32_t sinkInputId, uint32_t sinkIndex, std::string sinkName) override; int32_t MoveSourceOutputByIndexOrName(uint32_t sourceOutputId, @@ -73,8 +74,7 @@ private: uint32_t idx; std::vector sinkInputList; std::vector sourceOutputList; - std::string adapterName; - std::vector sinkIds; + std::vector sinkInfos; int32_t moveResult; }; diff --git a/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp b/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp index a3962c70b96912ab6e56b328302edd18eaf2d4ac..2827c4c66294acea0ebca893ea50b258ec860189 100644 --- a/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp +++ b/frameworks/native/audioadapter/src/pulse_audio_service_adapter_impl.cpp @@ -55,7 +55,7 @@ bool PulseAudioServiceAdapterImpl::Connect() if (pa_threaded_mainloop_start(mMainLoop) < 0) { AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Failed to start mainloop"); - pa_threaded_mainloop_free (mMainLoop); + pa_threaded_mainloop_free(mMainLoop); return false; } @@ -227,7 +227,6 @@ void PulseAudioServiceAdapterImpl::PaGetSinksCb(pa_context *c, const pa_sink_inf { UserData *userData = reinterpret_cast(userdata); PulseAudioServiceAdapterImpl *thiz = userData->thiz; - std::string adapterName = userData->adapterName; if (eol < 0) { AUDIO_ERR_LOG("[PaGetSinksCb] Failed to get sink information: %{public}s", pa_strerror(pa_context_errno(c))); @@ -245,23 +244,28 @@ void PulseAudioServiceAdapterImpl::PaGetSinksCb(pa_context *c, const pa_sink_inf } const char *adapterCStr = pa_proplist_gets(i->proplist, PA_PROP_DEVICE_STRING); - AUDIO_DEBUG_LOG("[PaGetSinksCb] sink (%{public}d) device[%{public}s]", i->index, adapterCStr); + AUDIO_INFO_LOG("[PaGetSinksCb] sink[%{public}d] device[%{public}s] name[%{public}s]", i->index, adapterCStr, + i->name); std::string sinkDeviceName(adapterCStr); - if (!adapterName.empty() && (adapterName == sinkDeviceName)) { - userData->sinkIds.push_back(i->index); - } + std::string sinkName(i->name); + SinkInfo sinkInfo = {}; + sinkInfo.sinkId = i->index; + sinkInfo.sinkName = sinkName; + sinkInfo.adapterName = sinkDeviceName; + userData->sinkInfos.push_back(sinkInfo); } -std::vector PulseAudioServiceAdapterImpl::getTargetSinks(std::string adapterName) +std::vector PulseAudioServiceAdapterImpl::GetAllSinks() { + AUDIO_INFO_LOG("GetAllSinks enter."); + lock_guard lock(mMutex); unique_ptr userData = make_unique(); userData->thiz = this; - userData->adapterName = adapterName; - userData->sinkIds = {}; + userData->sinkInfos = {}; if (mContext == nullptr) { - AUDIO_ERR_LOG("[getTargetSinks] mContext is nullptr"); - return userData->sinkIds; + AUDIO_ERR_LOG("GetAllSinks mContext is nullptr"); + return userData->sinkInfos; } pa_threaded_mainloop_lock(mMainLoop); @@ -269,9 +273,9 @@ std::vector PulseAudioServiceAdapterImpl::getTargetSinks(std::string a pa_operation *operation = pa_context_get_sink_info_list(mContext, PulseAudioServiceAdapterImpl::PaGetSinksCb, reinterpret_cast(userData.get())); if (operation == nullptr) { - AUDIO_ERR_LOG("[getTargetSinks] pa_context_get_sink_info_list returned nullptr"); + AUDIO_ERR_LOG("GetAllSinks pa_context_get_sink_info_list returned nullptr"); pa_threaded_mainloop_unlock(mMainLoop); - return userData->sinkIds; + return userData->sinkInfos; } while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) { @@ -281,7 +285,20 @@ std::vector PulseAudioServiceAdapterImpl::getTargetSinks(std::string a pa_operation_unref(operation); pa_threaded_mainloop_unlock(mMainLoop); - return userData->sinkIds; + AUDIO_INFO_LOG("GetAllSinks end, get [%{public}zu] sinks.", userData->sinkInfos.size()); + return userData->sinkInfos; +} + +std::vector PulseAudioServiceAdapterImpl::GetTargetSinks(std::string adapterName) +{ + std::vector sinkInfos = GetAllSinks(); + std::vector targetSinkIds = {}; + for (size_t i = 0; i < sinkInfos.size(); i++) { + if (sinkInfos[i].adapterName == adapterName) { + targetSinkIds.push_back(sinkInfos[i].sinkId); + } + } + return targetSinkIds; } int32_t PulseAudioServiceAdapterImpl::SetLocalDefaultSink(std::string name) @@ -289,7 +306,7 @@ int32_t PulseAudioServiceAdapterImpl::SetLocalDefaultSink(std::string name) std::vector allSinkInputs = GetAllSinkInputs(); std::string remoteDevice = "remote"; - std::vector remoteSinks = getTargetSinks(remoteDevice); + std::vector remoteSinks = GetTargetSinks(remoteDevice); // filter sink-inputs which are not connected with remote sinks. for (auto sinkInput : allSinkInputs) { @@ -527,11 +544,12 @@ bool PulseAudioServiceAdapterImpl::IsStreamActive(AudioStreamType streamType) vector PulseAudioServiceAdapterImpl::GetAllSinkInputs() { - lock_guard lock(mMutex); - + AUDIO_INFO_LOG("GetAllSinkInputs enter"); unique_ptr userData = make_unique(); userData->thiz = this; + userData->sinkInfos = GetAllSinks(); + lock_guard lock(mMutex); if (mContext == nullptr) { AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] GetAllSinkInputs mContext is nullptr"); return userData->sinkInputList; @@ -554,6 +572,7 @@ vector PulseAudioServiceAdapterImpl::GetAllSinkInputs() pa_operation_unref(operation); pa_threaded_mainloop_unlock(mMainLoop); + AUDIO_INFO_LOG("GetAllSinkInputs get:[%{public}zu]", userData->sinkInputList.size()); return userData->sinkInputList; } @@ -941,14 +960,6 @@ void PulseAudioServiceAdapterImpl::PaGetAllSinkInputsCb(pa_context *c, const pa_ return; } - uint32_t sessionID = 0; - const char *sessionCStr = pa_proplist_gets(i->proplist, "stream.sessionID"); - if (sessionCStr != nullptr) { - std::stringstream sessionStr; - sessionStr << sessionCStr; - sessionStr >> sessionID; - } - AudioStreamType audioStreamType = STREAM_DEFAULT; const char *streamType = pa_proplist_gets(i->proplist, "stream.type"); if (streamType != nullptr) { @@ -956,11 +967,17 @@ void PulseAudioServiceAdapterImpl::PaGetAllSinkInputsCb(pa_context *c, const pa_ } SinkInput sinkInput = {}; - sinkInput.streamId = sessionID; sinkInput.streamType = audioStreamType; sinkInput.deviceSinkId = i->sink; + for (auto sinkInfo : userData->sinkInfos) { + if (sinkInput.deviceSinkId == sinkInfo.sinkId) { + sinkInput.sinkName = sinkInfo.sinkName; + break; + } + } sinkInput.paStreamId = i->index; + CastValue(sinkInput.streamId, pa_proplist_gets(i->proplist, "stream.sessionID")); CastValue(sinkInput.uid, pa_proplist_gets(i->proplist, "stream.client.uid")); CastValue(sinkInput.pid, pa_proplist_gets(i->proplist, "stream.client.pid")); CastValue(sinkInput.startTime, pa_proplist_gets(i->proplist, "stream.startTime")); diff --git a/frameworks/native/audiorenderer/src/remote_audio_renderer_sink.cpp b/frameworks/native/audiorenderer/src/remote_audio_renderer_sink.cpp index 32310370a1193d8dae39218d997018205a29f3cc..4a2062447f8fb6754da0f4418c3051a8f365aa3b 100644 --- a/frameworks/native/audiorenderer/src/remote_audio_renderer_sink.cpp +++ b/frameworks/native/audiorenderer/src/remote_audio_renderer_sink.cpp @@ -138,6 +138,15 @@ int32_t RemoteAudioRendererSink::ParamEventCallback(AudioExtParamKey key, const RemoteAudioRendererSink* sink = reinterpret_cast(cookie); std::string networkId = sink->GetNetworkId(); AudioParamKey audioKey = AudioParamKey(key); + // render state change to invalid. + if (audioKey == AudioParamKey::RENDER_STATE) { + AUDIO_INFO_LOG("RemoteAudioRendererSink render state invalid, destroy audioRender"); + if ((sink->audioRender_ != nullptr) && (sink->audioAdapter_ != nullptr)) { + sink->audioAdapter_->DestroyRender(sink->audioAdapter_, sink->audioRender_); + } + sink->audioRender_ = nullptr; + sink->isRenderCreated = false; + } AudioSinkCallback* callback = sink->GetParamCallback(); callback->OnAudioParameterChange(networkId, audioKey, condition, value); return 0; @@ -262,10 +271,10 @@ int32_t RemoteAudioRendererSink::CreateRender(struct AudioPort &renderPort) ret = audioAdapter_->CreateRender(audioAdapter_, &deviceDesc, ¶m, &audioRender_); if (ret != 0 || audioRender_ == nullptr) { AUDIO_ERR_LOG("AudioDeviceCreateRender failed"); - audioManager_->UnloadAdapter(audioManager_, audioAdapter_); return ERR_NOT_STARTED; } + isRenderCreated = true; int64_t cost = GetNowTimeMs() - start; AUDIO_INFO_LOG("CreateRender cost[%{public}zu]ms", (size_t)cost); @@ -403,7 +412,6 @@ int32_t RemoteAudioRendererSink::Start(void) AUDIO_ERR_LOG("Create render failed, Audio Port: %{public}d", audioPort_.portId); return ERR_NOT_STARTED; } - isRenderCreated = true; } int32_t ret; diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index fef7fd2879111dcaaa21c10e9d909dff869077a9..b7ba5415fb88f75d9bf6a8b2664740d4eda31a25 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -609,6 +609,12 @@ enum AudioCaptureMode { CAPTURE_MODE_CALLBACK }; +struct SinkInfo { + uint32_t sinkId; // sink id + std::string sinkName; + std::string adapterName; +}; + struct SinkInput { int32_t streamId; AudioStreamType streamType; @@ -618,6 +624,7 @@ struct SinkInput { int32_t pid; // client pid uint32_t paStreamId; // streamId uint32_t deviceSinkId; // sink id + std::string sinkName; // sink name int32_t statusMark; // mark the router status uint64_t startTime; // when this router is created }; diff --git a/services/include/audio_manager_base.h b/services/include/audio_manager_base.h index f44b4843127a79399fbf04f65a5fede12fa24b46..3e06b57eadd1806321f424803aaa8e1c85a86bf6 100644 --- a/services/include/audio_manager_base.h +++ b/services/include/audio_manager_base.h @@ -145,6 +145,13 @@ public: */ virtual void NotifyDeviceInfo(std::string networkId, bool connected) = 0; + /** + * Check remote device state. + * + * @return Returns transaction id. + */ + virtual int32_t CheckRemoteDeviceState(std::string networkId, DeviceRole deviceRole, bool isStartDevice) = 0; + /** * Set parameter callback * @@ -168,6 +175,7 @@ public: GET_REMOTE_AUDIO_PARAMETER = 12, SET_REMOTE_AUDIO_PARAMETER = 13, NOTIFY_DEVICE_INFO = 14, + CHECK_REMOTE_DEVICE_STATE = 15, }; public: diff --git a/services/include/audio_policy/server/service/audio_policy_service.h b/services/include/audio_policy/server/service/audio_policy_service.h index b72143bc773db04475e4e92bb38f5e25124c11ae..68305bbd28304a23dcf4e35c90f1dc9d17b8c546 100644 --- a/services/include/audio_policy/server/service/audio_policy_service.h +++ b/services/include/audio_policy/server/service/audio_policy_service.h @@ -61,6 +61,8 @@ public: bool IsStreamActive(AudioStreamType streamType) const; + void NotifyRemoteRenderState(std::string networkId, std::string condition, std::string value); + int32_t SelectOutputDevice(sptr audioRendererFilter, std::vector> audioDeviceDescriptors); diff --git a/services/include/audio_service/client/audio_manager_proxy.h b/services/include/audio_service/client/audio_manager_proxy.h index 459d024eb1a50e321b01d497001a840d354d9d1c..f71467c2f85bfc77140ee0a870349f92009a9187 100644 --- a/services/include/audio_service/client/audio_manager_proxy.h +++ b/services/include/audio_service/client/audio_manager_proxy.h @@ -42,6 +42,7 @@ public: const char *RetrieveCookie(int32_t &size) override; uint64_t GetTransactionId(DeviceType deviceType, DeviceRole deviceRole) override; void NotifyDeviceInfo(std::string networkId, bool connected) override; + int32_t CheckRemoteDeviceState(std::string networkId, DeviceRole deviceRole, bool isStartDevice) override; int32_t SetParameterCallback(const sptr& object) override; private: static inline BrokerDelegator delegator_; diff --git a/services/include/audio_service/server/audio_server.h b/services/include/audio_service/server/audio_server.h index 7f3255dfc127f784f8bc114bd92780e1d48f830c..37d7b09f9d76e7e88e388a2c160a6f05cab7c6c4 100644 --- a/services/include/audio_service/server/audio_server.h +++ b/services/include/audio_service/server/audio_server.h @@ -58,6 +58,8 @@ public: void NotifyDeviceInfo(std::string networkId, bool connected) override; + int32_t CheckRemoteDeviceState(std::string networkId, DeviceRole deviceRole, bool isStartDevice) override; + // ISinkParameterCallback void OnAudioParameterChange(std::string netWorkId, const AudioParamKey key, const std::string& condition, const std::string value) override; diff --git a/services/src/audio_policy/server/audio_policy_server.cpp b/services/src/audio_policy/server/audio_policy_server.cpp index 0f0fb66c495b7c0ec1a05f30835e72aec6c40a79..21febfdc113472a5d059aae30be4fc2619287c20 100644 --- a/services/src/audio_policy/server/audio_policy_server.cpp +++ b/services/src/audio_policy/server/audio_policy_server.cpp @@ -1427,7 +1427,7 @@ void AudioPolicyServer::RemoteParameterCallback::OnAudioParameterChange(const st return; } if (key == RENDER_STATE) { - AUDIO_DEBUG_LOG("[AudioPolicyServer]: No processing for now"); + server_->mPolicyService.NotifyRemoteRenderState(networkId, condition, value); return; } } diff --git a/services/src/audio_policy/server/service/audio_policy_service.cpp b/services/src/audio_policy/server/service/audio_policy_service.cpp index 12d1937b09f645511fc824eb6ac38f587a20dd27..3585959da6676911570d846cb37a587ab6514576 100644 --- a/services/src/audio_policy/server/service/audio_policy_service.cpp +++ b/services/src/audio_policy/server/service/audio_policy_service.cpp @@ -169,7 +169,7 @@ inline std::string PrintSinkInput(SinkInput sinkInput) value << "uid:[" << sinkInput.uid << "] "; value << "pid:[" << sinkInput.pid << "] "; value << "statusMark:[" << sinkInput.statusMark << "] "; - value << "deviceSinkId:[" << sinkInput.deviceSinkId << "] "; + value << "sinkName:[" << sinkInput.sinkName << "] "; value << "startTime:[" << sinkInput.startTime << "]"; return value.str(); } @@ -204,6 +204,39 @@ std::string AudioPolicyService::GetSelectedDeviceInfo(int32_t uid, int32_t pid, } } +void AudioPolicyService::NotifyRemoteRenderState(std::string networkId, std::string condition, std::string value) +{ + AUDIO_INFO_LOG("NotifyRemoteRenderState device<%{public}s> condition:%{public}s value:%{public}s", + networkId.c_str(), condition.c_str(), value.c_str()); + + vector sinkInputs = mAudioPolicyManager.GetAllSinkInputs(); + vector targetSinkInputs = {}; + for (auto sinkInput : sinkInputs) { + if (sinkInput.sinkName == networkId) { + targetSinkInputs.push_back(sinkInput); + } + } + AUDIO_INFO_LOG("NotifyRemoteRenderState move [%{public}zu] of all [%{public}zu]sink-inputs to local.", + targetSinkInputs.size(), sinkInputs.size()); + sptr localDevice = new(std::nothrow) AudioDeviceDescriptor(); + if (localDevice == nullptr) { + AUDIO_ERR_LOG("Device error: null device."); + return; + } + localDevice->networkId_ = LOCAL_NETWORK_ID; + localDevice->deviceRole_ = DeviceRole::OUTPUT_DEVICE; + localDevice->deviceType_ = DeviceType::DEVICE_TYPE_SPEAKER; + + int32_t ret = MoveToLocalOutputDevice(targetSinkInputs, localDevice); + CHECK_AND_RETURN_LOG((ret == SUCCESS), "MoveToLocalOutputDevice failed!"); + + // Suspend device, notify audio stream manager that device has been changed. + ret = mAudioPolicyManager.SuspendAudioDevice(networkId, true); + CHECK_AND_RETURN_LOG((ret == SUCCESS), "SuspendAudioDevice failed!"); + + AUDIO_INFO_LOG("NotifyRemoteRenderState success"); +} + int32_t AudioPolicyService::SelectOutputDevice(sptr audioRendererFilter, std::vector> audioDeviceDescriptors) { @@ -256,7 +289,7 @@ int32_t AudioPolicyService::SelectOutputDevice(sptr audioRe int32_t AudioPolicyService::MoveToLocalOutputDevice(std::vector sinkInputIds, sptr localDeviceDescriptor) { - AUDIO_INFO_LOG("MoveToLocalOutputDevice start"); + AUDIO_INFO_LOG("MoveToLocalOutputDevice for [%{public}zu] sink-inputs", sinkInputIds.size()); // check if (LOCAL_NETWORK_ID != localDeviceDescriptor->networkId_) { AUDIO_ERR_LOG("MoveToLocalOutputDevice failed: not a local device."); @@ -274,7 +307,7 @@ int32_t AudioPolicyService::MoveToLocalOutputDevice(std::vector sinkI std::string sinkName = GetPortName(mCurrentActiveDevice_); for (size_t i = 0; i < sinkInputIds.size(); i++) { if (mAudioPolicyManager.MoveSinkInputByIndexOrName(sinkInputIds[i].paStreamId, sinkId, sinkName) != SUCCESS) { - AUDIO_DEBUG_LOG("move [%{public}d] to local failed", sinkInputIds[i].streamId); + AUDIO_ERR_LOG("move [%{public}d] to local failed", sinkInputIds[i].streamId); return ERROR; } routerMap_[sinkInputIds[i].uid] = std::pair(LOCAL_NETWORK_ID, sinkInputIds[i].pid); @@ -337,6 +370,10 @@ int32_t AudioPolicyService::MoveToRemoteOutputDevice(std::vector sink } } + CHECK_AND_RETURN_RET_LOG(g_sProxy != nullptr, ERR_OPERATION_FAILED, "Service proxy unavailable"); + CHECK_AND_RETURN_RET_LOG((g_sProxy->CheckRemoteDeviceState(networkId, deviceRole, true) == SUCCESS), + ERR_OPERATION_FAILED, "remote device state is invalid!"); + // start move. for (size_t i = 0; i < sinkInputIds.size(); i++) { if (mAudioPolicyManager.MoveSinkInputByIndexOrName(sinkInputIds[i].paStreamId, sinkId, networkId) != SUCCESS) { diff --git a/services/src/audio_service/client/audio_manager_proxy.cpp b/services/src/audio_service/client/audio_manager_proxy.cpp index 5f95dd6cebcb7ddd5fc4db44bda04a47772d4f9f..161b1429de297254b7e22ec694fe44da418e372d 100644 --- a/services/src/audio_service/client/audio_manager_proxy.cpp +++ b/services/src/audio_service/client/audio_manager_proxy.cpp @@ -319,6 +319,27 @@ void AudioManagerProxy::NotifyDeviceInfo(std::string networkId, bool connected) } } +int32_t AudioManagerProxy::CheckRemoteDeviceState(std::string networkId, DeviceRole deviceRole, bool isStartDevice) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + + if (!data.WriteInterfaceToken(GetDescriptor())) { + AUDIO_ERR_LOG("AudioManagerProxy: WriteInterfaceToken failed"); + return ERR_TRANSACTION_FAILED; + } + data.WriteString(networkId); + data.WriteInt32(static_cast(deviceRole)); + data.WriteBool(isStartDevice); + int32_t error = Remote()->SendRequest(CHECK_REMOTE_DEVICE_STATE, data, reply, option); + if (error != ERR_NONE) { + AUDIO_ERR_LOG("CheckRemoteDeviceState failed in proxy, error: %d", error); + return error; + } + return reply.ReadInt32(); +} + int32_t AudioManagerProxy::UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) { AUDIO_DEBUG_LOG("[%{public}s]", __func__); diff --git a/services/src/audio_service/server/audio_manager_stub.cpp b/services/src/audio_service/server/audio_manager_stub.cpp index 5719c5119ff1b3514b906e631556d81f0b76a174..573ede61f206e8b5f66ceae47cf9ff8e0c326b5f 100644 --- a/services/src/audio_service/server/audio_manager_stub.cpp +++ b/services/src/audio_service/server/audio_manager_stub.cpp @@ -162,6 +162,15 @@ int AudioManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, Messag NotifyDeviceInfo(networkId, connected); return AUDIO_OK; } + case CHECK_REMOTE_DEVICE_STATE: { + AUDIO_DEBUG_LOG("CHECK_REMOTE_DEVICE_STATE AudioManagerStub"); + std::string networkId = data.ReadString(); + DeviceRole deviceRole = static_cast(data.ReadInt32()); + bool isStartDevice = data.ReadBool(); + int32_t result = CheckRemoteDeviceState(networkId, deviceRole, isStartDevice); + reply.WriteInt32(result); + return AUDIO_OK; + } default: { AUDIO_ERR_LOG("default case, need check AudioManagerStub"); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); diff --git a/services/src/audio_service/server/audio_server.cpp b/services/src/audio_service/server/audio_server.cpp index 85814fc22390c5accd6e8f0c090fac1315a3f6a7..44077cafb1d5579ff07eb38f44ecdfe4b295674e 100644 --- a/services/src/audio_service/server/audio_server.cpp +++ b/services/src/audio_service/server/audio_server.cpp @@ -343,6 +343,21 @@ void AudioServer::NotifyDeviceInfo(std::string networkId, bool connected) } } +int32_t AudioServer::CheckRemoteDeviceState(std::string networkId, DeviceRole deviceRole, bool isStartDevice) +{ + AUDIO_INFO_LOG("CheckRemoteDeviceState: device[%{public}s] deviceRole[%{public}d] isStartDevice[%{public}s]", + networkId.c_str(), static_cast(deviceRole), (isStartDevice ? "true" : "false")); + RemoteAudioRendererSink* audioRendererSinkInstance = RemoteAudioRendererSink::GetInstance(networkId.c_str()); + if (audioRendererSinkInstance == nullptr || !audioRendererSinkInstance->rendererInited_) { + return ERR_ILLEGAL_STATE; + } + int32_t ret = SUCCESS; + if (isStartDevice) { + ret = audioRendererSinkInstance->Start(); + } + return ret; +} + void AudioServer::OnAudioParameterChange(std::string netWorkId, const AudioParamKey key, const std::string& condition, const std::string value) {