blob: ee7480b63d309529fa912aed3089309ee6a687a3 [file] [log] [blame]
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -07001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <binding/AAudioBinderAdapter.h>
Andy Hung1131b6e2020-12-08 20:47:45 -080018#include <media/AidlConversionUtil.h>
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070019#include <utility/AAudioUtilities.h>
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -070020
21namespace aaudio {
22
Andy Hung1131b6e2020-12-08 20:47:45 -080023using android::aidl_utils::statusTFromBinderStatus;
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070024using android::binder::Status;
25
jiabin5f787812023-03-02 20:42:43 +000026AAudioBinderAdapter::AAudioBinderAdapter(IAAudioService* delegate,
27 int32_t serviceLifetimeId)
28 : mDelegate(delegate), mServiceLifetimeId(serviceLifetimeId) {}
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -070029
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070030void AAudioBinderAdapter::registerClient(const android::sp<IAAudioClient>& client) {
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -070031 mDelegate->registerClient(client);
32}
33
jiabin5f787812023-03-02 20:42:43 +000034AAudioHandleInfo AAudioBinderAdapter::openStream(const AAudioStreamRequest& request,
35 AAudioStreamConfiguration& config) {
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070036 aaudio_handle_t result;
37 StreamParameters params;
38 Status status = mDelegate->openStream(request.parcelable(),
39 &params,
40 &result);
41 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -080042 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070043 }
44 config = params;
jiabin5f787812023-03-02 20:42:43 +000045 return {mServiceLifetimeId, result};
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -070046}
47
jiabin5f787812023-03-02 20:42:43 +000048aaudio_result_t AAudioBinderAdapter::closeStream(const AAudioHandleInfo& streamHandleInfo) {
49 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
50 return AAUDIO_ERROR_DISCONNECTED;
51 }
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070052 aaudio_result_t result;
jiabin5f787812023-03-02 20:42:43 +000053 Status status = mDelegate->closeStream(streamHandleInfo.getHandle(), &result);
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070054 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -080055 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070056 }
57 return result;
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -070058}
59
jiabin5f787812023-03-02 20:42:43 +000060aaudio_result_t AAudioBinderAdapter::getStreamDescription(const AAudioHandleInfo& streamHandleInfo,
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070061 AudioEndpointParcelable& endpointOut) {
jiabin5f787812023-03-02 20:42:43 +000062 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
63 return AAUDIO_ERROR_DISCONNECTED;
64 }
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070065 aaudio_result_t result;
66 Endpoint endpoint;
jiabin5f787812023-03-02 20:42:43 +000067 Status status = mDelegate->getStreamDescription(streamHandleInfo.getHandle(),
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070068 &endpoint,
69 &result);
70 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -080071 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070072 }
73 endpointOut = std::move(endpoint);
74 return result;
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -070075}
76
jiabin5f787812023-03-02 20:42:43 +000077aaudio_result_t AAudioBinderAdapter::startStream(const AAudioHandleInfo& streamHandleInfo) {
78 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
79 return AAUDIO_ERROR_DISCONNECTED;
80 }
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070081 aaudio_result_t result;
jiabin5f787812023-03-02 20:42:43 +000082 Status status = mDelegate->startStream(streamHandleInfo.getHandle(), &result);
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070083 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -080084 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070085 }
86 return result;
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -070087}
88
jiabin5f787812023-03-02 20:42:43 +000089aaudio_result_t AAudioBinderAdapter::pauseStream(const AAudioHandleInfo& streamHandleInfo) {
90 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
91 return AAUDIO_ERROR_DISCONNECTED;
92 }
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070093 aaudio_result_t result;
jiabin5f787812023-03-02 20:42:43 +000094 Status status = mDelegate->pauseStream(streamHandleInfo.getHandle(), &result);
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070095 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -080096 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -070097 }
98 return result;
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -070099}
100
jiabin5f787812023-03-02 20:42:43 +0000101aaudio_result_t AAudioBinderAdapter::stopStream(const AAudioHandleInfo& streamHandleInfo) {
102 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
103 return AAUDIO_ERROR_DISCONNECTED;
104 }
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700105 aaudio_result_t result;
jiabin5f787812023-03-02 20:42:43 +0000106 Status status = mDelegate->stopStream(streamHandleInfo.getHandle(), &result);
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700107 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -0800108 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700109 }
110 return result;
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -0700111}
112
jiabin5f787812023-03-02 20:42:43 +0000113aaudio_result_t AAudioBinderAdapter::flushStream(const AAudioHandleInfo& streamHandleInfo) {
114 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
115 return AAUDIO_ERROR_DISCONNECTED;
116 }
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700117 aaudio_result_t result;
jiabin5f787812023-03-02 20:42:43 +0000118 Status status = mDelegate->flushStream(streamHandleInfo.getHandle(), &result);
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700119 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -0800120 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700121 }
122 return result;
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -0700123}
124
jiabin5f787812023-03-02 20:42:43 +0000125aaudio_result_t AAudioBinderAdapter::registerAudioThread(const AAudioHandleInfo& streamHandleInfo,
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -0700126 pid_t clientThreadId,
127 int64_t periodNanoseconds) {
jiabin5f787812023-03-02 20:42:43 +0000128 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
129 return AAUDIO_ERROR_DISCONNECTED;
130 }
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700131 aaudio_result_t result;
jiabin5f787812023-03-02 20:42:43 +0000132 Status status = mDelegate->registerAudioThread(
133 streamHandleInfo.getHandle(), clientThreadId, periodNanoseconds, &result);
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700134 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -0800135 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700136 }
137 return result;
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -0700138}
139
jiabin5f787812023-03-02 20:42:43 +0000140aaudio_result_t AAudioBinderAdapter::unregisterAudioThread(const AAudioHandleInfo& streamHandleInfo,
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -0700141 pid_t clientThreadId) {
jiabin5f787812023-03-02 20:42:43 +0000142 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
143 return AAUDIO_ERROR_DISCONNECTED;
144 }
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700145 aaudio_result_t result;
jiabin5f787812023-03-02 20:42:43 +0000146 Status status = mDelegate->unregisterAudioThread(
147 streamHandleInfo.getHandle(), clientThreadId, &result);
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700148 if (!status.isOk()) {
Andy Hung1131b6e2020-12-08 20:47:45 -0800149 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
Ytai Ben-Tsvic5f45872020-08-18 10:39:44 -0700150 }
151 return result;
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -0700152}
153
jiabin5f787812023-03-02 20:42:43 +0000154aaudio_result_t AAudioBinderAdapter::exitStandby(const AAudioHandleInfo& streamHandleInfo,
jiabinf7f06152021-11-22 18:10:14 +0000155 AudioEndpointParcelable &endpointOut) {
jiabin5f787812023-03-02 20:42:43 +0000156 if (streamHandleInfo.getServiceLifetimeId() != mServiceLifetimeId) {
157 return AAUDIO_ERROR_DISCONNECTED;
158 }
jiabinf7f06152021-11-22 18:10:14 +0000159 aaudio_result_t result;
160 Endpoint endpoint;
jiabin5f787812023-03-02 20:42:43 +0000161 Status status = mDelegate->exitStandby(streamHandleInfo.getHandle(), &endpoint, &result);
jiabinf7f06152021-11-22 18:10:14 +0000162 if (!status.isOk()) {
163 result = AAudioConvert_androidToAAudioResult(statusTFromBinderStatus(status));
164 }
165 endpointOut = std::move(endpoint);
166 return result;
167}
168
Ytai Ben-Tsvi734e3502020-08-24 14:57:36 -0700169} // namespace aaudio