blob: 5999040eb5dbb3cf0e398983b861602a8ffaf47f [file] [log] [blame]
Eric Laurentb5323222017-05-31 15:01:56 -07001/*
2 * Copyright (C) 2017 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 <binder/IServiceManager.h>
Andy Hung1131b6e2020-12-08 20:47:45 -080018#include <media/AidlConversionUtil.h>
Eric Laurentb5323222017-05-31 15:01:56 -070019#include <media/PlayerBase.h>
20
21#define max(a, b) ((a) > (b) ? (a) : (b))
22#define min(a, b) ((a) < (b) ? (a) : (b))
23
24namespace android {
Andy Hung1131b6e2020-12-08 20:47:45 -080025using aidl_utils::binderStatusFromStatusT;
Ytai Ben-Tsvif0658f42020-10-26 11:51:14 -070026using media::VolumeShaperConfiguration;
27using media::VolumeShaperOperation;
Ivan Lozano8cf3a072017-08-09 09:01:33 -070028
Eric Laurentb5323222017-05-31 15:01:56 -070029//--------------------------------------------------------------------------------------------------
30PlayerBase::PlayerBase() : BnPlayer(),
31 mPanMultiplierL(1.0f), mPanMultiplierR(1.0f),
32 mVolumeMultiplierL(1.0f), mVolumeMultiplierR(1.0f),
Robert Wub7f8edc2024-11-04 19:54:38 +000033 mPIId(PLAYER_PIID_INVALID), mLastReportedEvent(PLAYER_STATE_UNKNOWN)
Eric Laurentb5323222017-05-31 15:01:56 -070034{
35 ALOGD("PlayerBase::PlayerBase()");
36 // use checkService() to avoid blocking if audio service is not up yet
37 sp<IBinder> binder = defaultServiceManager()->checkService(String16("audio"));
38 if (binder == 0) {
39 ALOGE("PlayerBase(): binding to audio service failed, service up?");
40 } else {
41 mAudioManager = interface_cast<IAudioManager>(binder);
42 }
43}
44
45
46PlayerBase::~PlayerBase() {
47 ALOGD("PlayerBase::~PlayerBase()");
48 baseDestroy();
49}
50
Eric Laurent41931252021-01-29 20:40:35 +010051void PlayerBase::init(player_type_t playerType, audio_usage_t usage, audio_session_t sessionId) {
Eric Laurentb5323222017-05-31 15:01:56 -070052 if (mAudioManager == 0) {
53 ALOGE("AudioPlayer realize: no audio service, player will not be registered");
54 } else {
Eric Laurent41931252021-01-29 20:40:35 +010055 mPIId = mAudioManager->trackPlayer(playerType, usage, AUDIO_CONTENT_TYPE_UNKNOWN, this,
56 sessionId);
Eric Laurentb5323222017-05-31 15:01:56 -070057 }
58}
59
Vlad Popaec1788e2022-08-04 11:23:30 +020060void PlayerBase::triggerPortIdUpdate(audio_port_handle_t portId) const {
61 if (mAudioManager == nullptr) {
62 ALOGE("%s: no audio service, player %d will not update portId %d",
63 __func__,
64 mPIId,
65 portId);
66 return;
67 }
68
69 if (mPIId != PLAYER_PIID_INVALID && portId != AUDIO_PORT_HANDLE_NONE) {
Robert Wub7f8edc2024-11-04 19:54:38 +000070 mAudioManager->playerEvent(mPIId, android::PLAYER_UPDATE_PORT_ID, { portId });
Vlad Popaec1788e2022-08-04 11:23:30 +020071 }
72}
73
Eric Laurentb5323222017-05-31 15:01:56 -070074void PlayerBase::baseDestroy() {
75 serviceReleasePlayer();
76 if (mAudioManager != 0) {
77 mAudioManager.clear();
78 }
79}
80
81//------------------------------------------------------------------------------
Robert Wub7f8edc2024-11-04 19:54:38 +000082void PlayerBase::servicePlayerEvent(player_state_t event, const DeviceIdVector& deviceIds) {
Eric Laurentb5323222017-05-31 15:01:56 -070083 if (mAudioManager != 0) {
Oscar Azucenae0414ec2020-12-22 20:40:07 +000084 bool changed = false;
85 {
86 Mutex::Autolock _l(mDeviceIdLock);
Robert Wub7f8edc2024-11-04 19:54:38 +000087 changed = !areDeviceIdsEqual(deviceIds, mLastReportedDeviceIds);
88 mLastReportedDeviceIds = deviceIds;
Oscar Azucenae0414ec2020-12-22 20:40:07 +000089 }
90
91 {
92 Mutex::Autolock _l(mPlayerStateLock);
93 // PLAYER_UPDATE_DEVICE_ID is not saved as an actual state, instead it is used to update
94 // device ID only.
95 if ((event != PLAYER_UPDATE_DEVICE_ID) && (event != mLastReportedEvent)) {
96 mLastReportedEvent = event;
97 changed = true;
98 }
99 }
100 if (changed && (mPIId != PLAYER_PIID_INVALID)) {
Robert Wub7f8edc2024-11-04 19:54:38 +0000101 mAudioManager->playerEvent(mPIId, event, deviceIds);
Eric Laurentb5323222017-05-31 15:01:56 -0700102 }
103 }
104}
105
106void PlayerBase::serviceReleasePlayer() {
107 if (mAudioManager != 0
108 && mPIId != PLAYER_PIID_INVALID) {
109 mAudioManager->releasePlayer(mPIId);
110 }
111}
112
Eric Laurenta2f296e2017-06-21 18:51:47 -0700113//FIXME temporary method while some player state is outside of this class
Robert Wub7f8edc2024-11-04 19:54:38 +0000114void PlayerBase::reportEvent(player_state_t event, const DeviceIdVector& deviceIds) {
115 servicePlayerEvent(event, deviceIds);
Eric Laurentb5323222017-05-31 15:01:56 -0700116}
117
Robert Wub7f8edc2024-11-04 19:54:38 +0000118void PlayerBase::baseUpdateDeviceIds(const DeviceIdVector& deviceIds) {
119 servicePlayerEvent(PLAYER_UPDATE_DEVICE_ID, deviceIds);
Oscar Azucenae0414ec2020-12-22 20:40:07 +0000120}
121
Robert Wub7f8edc2024-11-04 19:54:38 +0000122status_t PlayerBase::startWithStatus(const DeviceIdVector& deviceIds) {
Eric Laurent1d32e9f2017-06-02 14:01:32 -0700123 status_t status = playerStart();
124 if (status == NO_ERROR) {
Robert Wub7f8edc2024-11-04 19:54:38 +0000125 servicePlayerEvent(PLAYER_STATE_STARTED, deviceIds);
Eric Laurentb5323222017-05-31 15:01:56 -0700126 } else {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700127 ALOGW("PlayerBase::start() error %d", status);
128 }
129 return status;
130}
131
132status_t PlayerBase::pauseWithStatus() {
133 status_t status = playerPause();
134 if (status == NO_ERROR) {
Robert Wub7f8edc2024-11-04 19:54:38 +0000135 servicePlayerEvent(PLAYER_STATE_PAUSED, {});
Eric Laurenta2f296e2017-06-21 18:51:47 -0700136 } else {
137 ALOGW("PlayerBase::pause() error %d", status);
138 }
139 return status;
140}
141
Eric Laurenta2f296e2017-06-21 18:51:47 -0700142status_t PlayerBase::stopWithStatus() {
143 status_t status = playerStop();
Oscar Azucenae0414ec2020-12-22 20:40:07 +0000144
Eric Laurenta2f296e2017-06-21 18:51:47 -0700145 if (status == NO_ERROR) {
Robert Wub7f8edc2024-11-04 19:54:38 +0000146 servicePlayerEvent(PLAYER_STATE_STOPPED, {});
Eric Laurenta2f296e2017-06-21 18:51:47 -0700147 } else {
148 ALOGW("PlayerBase::stop() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700149 }
Eric Laurent1d32e9f2017-06-02 14:01:32 -0700150 return status;
151}
152
153//------------------------------------------------------------------------------
154// Implementation of IPlayer
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700155binder::Status PlayerBase::start() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700156 ALOGD("PlayerBase::start() from IPlayer");
Robert Wub7f8edc2024-11-04 19:54:38 +0000157 DeviceIdVector deviceIds;
Oscar Azucenae0414ec2020-12-22 20:40:07 +0000158 {
159 Mutex::Autolock _l(mDeviceIdLock);
Robert Wub7f8edc2024-11-04 19:54:38 +0000160 deviceIds = mLastReportedDeviceIds;
Oscar Azucenae0414ec2020-12-22 20:40:07 +0000161 }
Robert Wub7f8edc2024-11-04 19:54:38 +0000162 (void)startWithStatus(deviceIds);
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700163 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700164}
165
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700166binder::Status PlayerBase::pause() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700167 ALOGD("PlayerBase::pause() from IPlayer");
168 (void)pauseWithStatus();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700169 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700170}
171
172
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700173binder::Status PlayerBase::stop() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700174 ALOGD("PlayerBase::stop() from IPlayer");
175 (void)stopWithStatus();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700176 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700177}
178
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700179binder::Status PlayerBase::setVolume(float vol) {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700180 ALOGD("PlayerBase::setVolume() from IPlayer");
Eric Laurentb5323222017-05-31 15:01:56 -0700181 {
182 Mutex::Autolock _l(mSettingsLock);
183 mVolumeMultiplierL = vol;
184 mVolumeMultiplierR = vol;
185 }
Eric Laurenta2f296e2017-06-21 18:51:47 -0700186 status_t status = playerSetVolume();
187 if (status != NO_ERROR) {
188 ALOGW("PlayerBase::setVolume() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700189 }
Andy Hung1131b6e2020-12-08 20:47:45 -0800190 return binderStatusFromStatusT(status);
Eric Laurentb5323222017-05-31 15:01:56 -0700191}
192
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700193binder::Status PlayerBase::setPan(float pan) {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700194 ALOGD("PlayerBase::setPan() from IPlayer");
Eric Laurentb5323222017-05-31 15:01:56 -0700195 {
196 Mutex::Autolock _l(mSettingsLock);
197 pan = min(max(-1.0f, pan), 1.0f);
198 if (pan >= 0.0f) {
199 mPanMultiplierL = 1.0f - pan;
200 mPanMultiplierR = 1.0f;
201 } else {
202 mPanMultiplierL = 1.0f;
203 mPanMultiplierR = 1.0f + pan;
204 }
205 }
Eric Laurenta2f296e2017-06-21 18:51:47 -0700206 status_t status = playerSetVolume();
207 if (status != NO_ERROR) {
208 ALOGW("PlayerBase::setPan() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700209 }
Andy Hung1131b6e2020-12-08 20:47:45 -0800210 return binderStatusFromStatusT(status);
Eric Laurentb5323222017-05-31 15:01:56 -0700211}
212
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700213binder::Status PlayerBase::setStartDelayMs(int32_t delayMs __unused) {
Eric Laurentb5323222017-05-31 15:01:56 -0700214 ALOGW("setStartDelay() is not supported");
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700215 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700216}
217
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700218binder::Status PlayerBase::applyVolumeShaper(
Ytai Ben-Tsvif0658f42020-10-26 11:51:14 -0700219 const VolumeShaperConfiguration& configuration __unused,
220 const VolumeShaperOperation& operation __unused) {
Eric Laurentb5323222017-05-31 15:01:56 -0700221 ALOGW("applyVolumeShaper() is not supported");
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700222 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700223}
224
225} // namespace android