blob: c443865d8d22e72035b919edf6bdd1a2a5cfc30d [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>
18#include <media/PlayerBase.h>
19
20#define max(a, b) ((a) > (b) ? (a) : (b))
21#define min(a, b) ((a) < (b) ? (a) : (b))
22
23namespace android {
24
Ytai Ben-Tsvif0658f42020-10-26 11:51:14 -070025using media::VolumeShaperConfiguration;
26using media::VolumeShaperOperation;
Ivan Lozano8cf3a072017-08-09 09:01:33 -070027
Eric Laurentb5323222017-05-31 15:01:56 -070028//--------------------------------------------------------------------------------------------------
29PlayerBase::PlayerBase() : BnPlayer(),
30 mPanMultiplierL(1.0f), mPanMultiplierR(1.0f),
31 mVolumeMultiplierL(1.0f), mVolumeMultiplierR(1.0f),
32 mPIId(PLAYER_PIID_INVALID), mLastReportedEvent(PLAYER_STATE_UNKNOWN)
33{
34 ALOGD("PlayerBase::PlayerBase()");
35 // use checkService() to avoid blocking if audio service is not up yet
36 sp<IBinder> binder = defaultServiceManager()->checkService(String16("audio"));
37 if (binder == 0) {
38 ALOGE("PlayerBase(): binding to audio service failed, service up?");
39 } else {
40 mAudioManager = interface_cast<IAudioManager>(binder);
41 }
42}
43
44
45PlayerBase::~PlayerBase() {
46 ALOGD("PlayerBase::~PlayerBase()");
47 baseDestroy();
48}
49
50void PlayerBase::init(player_type_t playerType, audio_usage_t usage) {
51 if (mAudioManager == 0) {
52 ALOGE("AudioPlayer realize: no audio service, player will not be registered");
53 } else {
54 mPIId = mAudioManager->trackPlayer(playerType, usage, AUDIO_CONTENT_TYPE_UNKNOWN, this);
55 }
56}
57
58void PlayerBase::baseDestroy() {
59 serviceReleasePlayer();
60 if (mAudioManager != 0) {
61 mAudioManager.clear();
62 }
63}
64
65//------------------------------------------------------------------------------
66void PlayerBase::servicePlayerEvent(player_state_t event) {
67 if (mAudioManager != 0) {
68 // only report state change
69 Mutex::Autolock _l(mPlayerStateLock);
70 if (event != mLastReportedEvent
71 && mPIId != PLAYER_PIID_INVALID) {
72 mLastReportedEvent = event;
73 mAudioManager->playerEvent(mPIId, event);
74 }
75 }
76}
77
78void PlayerBase::serviceReleasePlayer() {
79 if (mAudioManager != 0
80 && mPIId != PLAYER_PIID_INVALID) {
81 mAudioManager->releasePlayer(mPIId);
82 }
83}
84
Eric Laurenta2f296e2017-06-21 18:51:47 -070085//FIXME temporary method while some player state is outside of this class
Eric Laurentb5323222017-05-31 15:01:56 -070086void PlayerBase::reportEvent(player_state_t event) {
87 servicePlayerEvent(event);
88}
89
Eric Laurent1d32e9f2017-06-02 14:01:32 -070090status_t PlayerBase::startWithStatus() {
91 status_t status = playerStart();
92 if (status == NO_ERROR) {
Eric Laurentb5323222017-05-31 15:01:56 -070093 servicePlayerEvent(PLAYER_STATE_STARTED);
94 } else {
Eric Laurenta2f296e2017-06-21 18:51:47 -070095 ALOGW("PlayerBase::start() error %d", status);
96 }
97 return status;
98}
99
100status_t PlayerBase::pauseWithStatus() {
101 status_t status = playerPause();
102 if (status == NO_ERROR) {
103 servicePlayerEvent(PLAYER_STATE_PAUSED);
104 } else {
105 ALOGW("PlayerBase::pause() error %d", status);
106 }
107 return status;
108}
109
110
111status_t PlayerBase::stopWithStatus() {
112 status_t status = playerStop();
113 if (status == NO_ERROR) {
114 servicePlayerEvent(PLAYER_STATE_STOPPED);
115 } else {
116 ALOGW("PlayerBase::stop() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700117 }
Eric Laurent1d32e9f2017-06-02 14:01:32 -0700118 return status;
119}
120
121//------------------------------------------------------------------------------
122// Implementation of IPlayer
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700123binder::Status PlayerBase::start() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700124 ALOGD("PlayerBase::start() from IPlayer");
Eric Laurent1d32e9f2017-06-02 14:01:32 -0700125 (void)startWithStatus();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700126 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700127}
128
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700129binder::Status PlayerBase::pause() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700130 ALOGD("PlayerBase::pause() from IPlayer");
131 (void)pauseWithStatus();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700132 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700133}
134
135
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700136binder::Status PlayerBase::stop() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700137 ALOGD("PlayerBase::stop() from IPlayer");
138 (void)stopWithStatus();
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700139 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700140}
141
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700142binder::Status PlayerBase::setVolume(float vol) {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700143 ALOGD("PlayerBase::setVolume() from IPlayer");
Eric Laurentb5323222017-05-31 15:01:56 -0700144 {
145 Mutex::Autolock _l(mSettingsLock);
146 mVolumeMultiplierL = vol;
147 mVolumeMultiplierR = vol;
148 }
Eric Laurenta2f296e2017-06-21 18:51:47 -0700149 status_t status = playerSetVolume();
150 if (status != NO_ERROR) {
151 ALOGW("PlayerBase::setVolume() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700152 }
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700153 return binder::Status::fromStatusT(status);
Eric Laurentb5323222017-05-31 15:01:56 -0700154}
155
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700156binder::Status PlayerBase::setPan(float pan) {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700157 ALOGD("PlayerBase::setPan() from IPlayer");
Eric Laurentb5323222017-05-31 15:01:56 -0700158 {
159 Mutex::Autolock _l(mSettingsLock);
160 pan = min(max(-1.0f, pan), 1.0f);
161 if (pan >= 0.0f) {
162 mPanMultiplierL = 1.0f - pan;
163 mPanMultiplierR = 1.0f;
164 } else {
165 mPanMultiplierL = 1.0f;
166 mPanMultiplierR = 1.0f + pan;
167 }
168 }
Eric Laurenta2f296e2017-06-21 18:51:47 -0700169 status_t status = playerSetVolume();
170 if (status != NO_ERROR) {
171 ALOGW("PlayerBase::setPan() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700172 }
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700173 return binder::Status::fromStatusT(status);
Eric Laurentb5323222017-05-31 15:01:56 -0700174}
175
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700176binder::Status PlayerBase::setStartDelayMs(int32_t delayMs __unused) {
Eric Laurentb5323222017-05-31 15:01:56 -0700177 ALOGW("setStartDelay() is not supported");
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700178 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700179}
180
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700181binder::Status PlayerBase::applyVolumeShaper(
Ytai Ben-Tsvif0658f42020-10-26 11:51:14 -0700182 const VolumeShaperConfiguration& configuration __unused,
183 const VolumeShaperOperation& operation __unused) {
Eric Laurentb5323222017-05-31 15:01:56 -0700184 ALOGW("applyVolumeShaper() is not supported");
Ivan Lozano8cf3a072017-08-09 09:01:33 -0700185 return binder::Status::ok();
Eric Laurentb5323222017-05-31 15:01:56 -0700186}
187
188} // namespace android