blob: b507046c3cff215cfd195b05d3021fde3f09814a [file] [log] [blame]
yucliu616c55f2020-05-11 17:48:57 -07001// Copyright (C) 2020 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#define LOG_TAG "audio_proxy_client"
16
17#include "AudioProxyManager.h"
18
19#include <mutex>
20
21// clang-format off
22#include PATH(device/google/atv/audio_proxy/FILE_VERSION/IAudioProxyDevicesManager.h)
23// clang-format on
24
25#include <hidl/HidlTransportSupport.h>
26#include <utils/Log.h>
27
28#include "AudioProxyDevice.h"
29#include "BusDeviceImpl.h"
30
31#define QUOTE(s) #s
32#define TO_STR(s) QUOTE(s)
33
34using ::android::sp;
35using ::android::status_t;
36using ::android::hardware::hidl_death_recipient;
37using ::android::hardware::Return;
38using ::device::google::atv::audio_proxy::CPP_VERSION::
39 IAudioProxyDevicesManager;
40
41namespace audio_proxy {
42namespace CPP_VERSION {
43namespace {
44
45bool checkDevice(audio_proxy_device_t* device) {
46 return device && device->get_address;
47}
48
49class DeathRecipient;
50
51class AudioProxyManagerImpl : public AudioProxyManager {
52 public:
53 explicit AudioProxyManagerImpl(const sp<IAudioProxyDevicesManager>& manager);
54 ~AudioProxyManagerImpl() override = default;
55
56 bool registerDevice(audio_proxy_device_t* device) override;
57
58 void reconnectService();
59
60 private:
61 std::mutex mLock;
62 sp<IAudioProxyDevicesManager> mService;
63 std::unique_ptr<AudioProxyDevice> mDevice;
64
65 sp<DeathRecipient> mDeathRecipient;
66};
67
68class DeathRecipient : public hidl_death_recipient {
69 public:
70 explicit DeathRecipient(AudioProxyManagerImpl& manager) : mManager(manager) {}
71 ~DeathRecipient() override = default;
72
73 void serviceDied(
74 uint64_t cookie,
75 const android::wp<::android::hidl::base::V1_0::IBase>& who) override {
76 mManager.reconnectService();
77 }
78
79 private:
80 AudioProxyManagerImpl& mManager;
81};
82
83AudioProxyManagerImpl::AudioProxyManagerImpl(
84 const sp<IAudioProxyDevicesManager>& manager)
85 : mService(manager), mDeathRecipient(new DeathRecipient(*this)) {
86 mService->linkToDeath(mDeathRecipient, 1234);
87}
88
89bool AudioProxyManagerImpl::registerDevice(audio_proxy_device_t* device) {
90 if (!checkDevice(device)) {
91 ALOGE("Invalid device.");
92 return false;
93 }
94
95 std::lock_guard<std::mutex> guard(mLock);
96 if (mDevice) {
97 ALOGE("Device already registered!");
98 return false;
99 }
100
101 mDevice = std::make_unique<AudioProxyDevice>(device);
102
103 const char* address = mDevice->getAddress();
104 return mService->registerDevice(address, new BusDeviceImpl(mDevice.get()));
105}
106
107void AudioProxyManagerImpl::reconnectService() {
108 std::lock_guard<std::mutex> guard(mLock);
109 mService = IAudioProxyDevicesManager::getService();
110 if (!mService) {
111 ALOGE("Failed to reconnect service");
112 return;
113 }
114
115 if (mDevice) {
116 bool success = mService->registerDevice(mDevice->getAddress(),
117 new BusDeviceImpl(mDevice.get()));
118 ALOGE_IF(!success, "fail to register device after reconnect.");
119 }
120}
121
122} // namespace
123
124std::unique_ptr<AudioProxyManager> createAudioProxyManager() {
125 auto service = IAudioProxyDevicesManager::getService();
126 if (!service) {
127 return nullptr;
128 }
129
130 ALOGI("Connect to audio proxy service %s", TO_STR(FILE_VERSION));
131 return std::make_unique<AudioProxyManagerImpl>(service);
132}
133
134} // namespace CPP_VERSION
135} // namespace audio_proxy