blob: 8793735c547ab504fafeab43724f30382f011051 [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),
Oscar Azucena6f183192020-11-30 11:20:33 -080033 mPIId(PLAYER_PIID_INVALID), mLastReportedEvent(PLAYER_STATE_UNKNOWN),
34 mLastReportedDeviceId(AUDIO_PORT_HANDLE_NONE)
Eric Laurentb5323222017-05-31 15:01:56 -070035{
36 ALOGD("PlayerBase::PlayerBase()");
37 // use checkService() to avoid blocking if audio service is not up yet
38 sp<IBinder> binder = defaultServiceManager()->checkService(String16("audio"));
39 if (binder == 0) {
40 ALOGE("PlayerBase(): binding to audio service failed, service up?");
41 } else {
42 mAudioManager = interface_cast<IAudioManager>(binder);
43 }
44}
45
46
47PlayerBase::~PlayerBase() {
48 ALOGD("PlayerBase::~PlayerBase()");
49 baseDestroy();
50}
51
52void PlayerBase::init(player_type_t playerType, audio_usage_t usage) {
53 if (mAudioManager == 0) {
54 ALOGE("AudioPlayer realize: no audio service, player will not be registered");
55 } else {
56 mPIId = mAudioManager->trackPlayer(playerType, usage, AUDIO_CONTENT_TYPE_UNKNOWN, this);
57 }
58}
59
60void PlayerBase::baseDestroy() {
61 serviceReleasePlayer();
62 if (mAudioManager != 0) {
63 mAudioManager.clear();
64 }
65}
66
67//------------------------------------------------------------------------------
Oscar Azucena6f183192020-11-30 11:20:33 -080068void PlayerBase::servicePlayerEvent(player_state_t event, audio_port_handle_t deviceId) {
Eric Laurentb5323222017-05-31 15:01:56 -070069 if (mAudioManager != 0) {
Oscar Azucena6f183192020-11-30 11:20:33 -080070 bool changed = false;
71 {
72 Mutex::Autolock _l(mDeviceIdLock);
73 changed = mLastReportedDeviceId != deviceId;
74 mLastReportedDeviceId = deviceId;
75 }
76
77 {
78 Mutex::Autolock _l(mPlayerStateLock);
79 // PLAYER_UPDATE_DEVICE_ID is not saved as an actual state, instead it is used to update
80 // device ID only.
81 if ((event != PLAYER_UPDATE_DEVICE_ID) && (event != mLastReportedEvent)) {
82 mLastReportedEvent = event;
83 changed = true;
84 }
85 }
86 if (changed && (mPIId != PLAYER_PIID_INVALID)) {
87 mAudioManager->playerEvent(mPIId, event, deviceId);
Eric Laurentb5323222017-05-31 15:01:56 -070088 }
89 }
90}
91
92void PlayerBase::serviceReleasePlayer() {
93 if (mAudioManager != 0
94 && mPIId != PLAYER_PIID_INVALID) {
95 mAudioManager->releasePlayer(mPIId);
96 }
97}
98
Eric Laurenta2f296e2017-06-21 18:51:47 -070099//FIXME temporary method while some player state is outside of this class
Oscar Azucena6f183192020-11-30 11:20:33 -0800100void PlayerBase::reportEvent(player_state_t event, audio_port_handle_t deviceId) {
101 servicePlayerEvent(event, deviceId);
Eric Laurentb5323222017-05-31 15:01:56 -0700102}
103
Oscar Azucena6f183192020-11-30 11:20:33 -0800104void PlayerBase::baseUpdateDeviceId(audio_port_handle_t deviceId) {
105 servicePlayerEvent(PLAYER_UPDATE_DEVICE_ID, deviceId);
106}
107
108status_t PlayerBase::startWithStatus(audio_port_handle_t deviceId) {
Eric Laurent1d32e9f2017-06-02 14:01:32 -0700109 status_t status = playerStart();
110 if (status == NO_ERROR) {
Oscar Azucena6f183192020-11-30 11:20:33 -0800111 servicePlayerEvent(PLAYER_STATE_STARTED, deviceId);
Eric Laurentb5323222017-05-31 15:01:56 -0700112 } else {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700113 ALOGW("PlayerBase::start() error %d", status);
114 }
115 return status;
116}
117
118status_t PlayerBase::pauseWithStatus() {
119 status_t status = playerPause();
120 if (status == NO_ERROR) {
Oscar Azucena6f183192020-11-30 11:20:33 -0800121 servicePlayerEvent(PLAYER_STATE_PAUSED, AUDIO_PORT_HANDLE_NONE);
Eric Laurenta2f296e2017-06-21 18:51:47 -0700122 } else {
123 ALOGW("PlayerBase::pause() error %d", status);
124 }
125 return status;
126}
127
Eric Laurenta2f296e2017-06-21 18:51:47 -0700128status_t PlayerBase::stopWithStatus() {
129 status_t status = playerStop();
Oscar Azucena6f183192020-11-30 11:20:33 -0800130
Eric Laurenta2f296e2017-06-21 18:51:47 -0700131 if (status == NO_ERROR) {
Oscar Azucena6f183192020-11-30 11:20:33 -0800132 servicePlayerEvent(PLAYER_STATE_STOPPED, AUDIO_PORT_HANDLE_NONE);
Eric Laurenta2f296e2017-06-21 18:51:47 -0700133 } else {
134 ALOGW("PlayerBase::stop() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700135 }
Eric Laurent1d32e9f2017-06-02 14:01:32 -0700136 return status;
137}
138
139//------------------------------------------------------------------------------
140// Implementation of IPlayer
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700141binder::Status PlayerBase::start() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700142 ALOGD("PlayerBase::start() from IPlayer");
Oscar Azucena6f183192020-11-30 11:20:33 -0800143 audio_port_handle_t deviceId;
144 {
145 Mutex::Autolock _l(mDeviceIdLock);
146 deviceId = mLastReportedDeviceId;
147 }
148 (void)startWithStatus(deviceId);
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700149 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700150}
151
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700152binder::Status PlayerBase::pause() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700153 ALOGD("PlayerBase::pause() from IPlayer");
154 (void)pauseWithStatus();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700155 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700156}
157
158
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700159binder::Status PlayerBase::stop() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700160 ALOGD("PlayerBase::stop() from IPlayer");
161 (void)stopWithStatus();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700162 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700163}
164
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700165binder::Status PlayerBase::setVolume(float vol) {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700166 ALOGD("PlayerBase::setVolume() from IPlayer");
Eric Laurentb5323222017-05-31 15:01:56 -0700167 {
168 Mutex::Autolock _l(mSettingsLock);
169 mVolumeMultiplierL = vol;
170 mVolumeMultiplierR = vol;
171 }
Eric Laurenta2f296e2017-06-21 18:51:47 -0700172 status_t status = playerSetVolume();
173 if (status != NO_ERROR) {
174 ALOGW("PlayerBase::setVolume() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700175 }
Andy Hung1131b6e2020-12-08 20:47:45 -0800176 return binderStatusFromStatusT(status);
Eric Laurentb5323222017-05-31 15:01:56 -0700177}
178
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700179binder::Status PlayerBase::setPan(float pan) {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700180 ALOGD("PlayerBase::setPan() from IPlayer");
Eric Laurentb5323222017-05-31 15:01:56 -0700181 {
182 Mutex::Autolock _l(mSettingsLock);
183 pan = min(max(-1.0f, pan), 1.0f);
184 if (pan >= 0.0f) {
185 mPanMultiplierL = 1.0f - pan;
186 mPanMultiplierR = 1.0f;
187 } else {
188 mPanMultiplierL = 1.0f;
189 mPanMultiplierR = 1.0f + pan;
190 }
191 }
Eric Laurenta2f296e2017-06-21 18:51:47 -0700192 status_t status = playerSetVolume();
193 if (status != NO_ERROR) {
194 ALOGW("PlayerBase::setPan() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700195 }
Andy Hung1131b6e2020-12-08 20:47:45 -0800196 return binderStatusFromStatusT(status);
Eric Laurentb5323222017-05-31 15:01:56 -0700197}
198
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700199binder::Status PlayerBase::setStartDelayMs(int32_t delayMs __unused) {
Eric Laurentb5323222017-05-31 15:01:56 -0700200 ALOGW("setStartDelay() is not supported");
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700201 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700202}
203
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700204binder::Status PlayerBase::applyVolumeShaper(
Ytai Ben-Tsvif0658f42020-10-26 11:51:14 -0700205 const VolumeShaperConfiguration& configuration __unused,
206 const VolumeShaperOperation& operation __unused) {
Eric Laurentb5323222017-05-31 15:01:56 -0700207 ALOGW("applyVolumeShaper() is not supported");
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700208 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700209}
210
211} // namespace android