blob: 7868318686109b0a717a01fd32898bd2acf2d5b8 [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
25//--------------------------------------------------------------------------------------------------
26PlayerBase::PlayerBase() : BnPlayer(),
27 mPanMultiplierL(1.0f), mPanMultiplierR(1.0f),
28 mVolumeMultiplierL(1.0f), mVolumeMultiplierR(1.0f),
29 mPIId(PLAYER_PIID_INVALID), mLastReportedEvent(PLAYER_STATE_UNKNOWN)
30{
31 ALOGD("PlayerBase::PlayerBase()");
32 // use checkService() to avoid blocking if audio service is not up yet
33 sp<IBinder> binder = defaultServiceManager()->checkService(String16("audio"));
34 if (binder == 0) {
35 ALOGE("PlayerBase(): binding to audio service failed, service up?");
36 } else {
37 mAudioManager = interface_cast<IAudioManager>(binder);
38 }
39}
40
41
42PlayerBase::~PlayerBase() {
43 ALOGD("PlayerBase::~PlayerBase()");
44 baseDestroy();
45}
46
47void PlayerBase::init(player_type_t playerType, audio_usage_t usage) {
48 if (mAudioManager == 0) {
49 ALOGE("AudioPlayer realize: no audio service, player will not be registered");
50 } else {
51 mPIId = mAudioManager->trackPlayer(playerType, usage, AUDIO_CONTENT_TYPE_UNKNOWN, this);
52 }
53}
54
55void PlayerBase::baseDestroy() {
56 serviceReleasePlayer();
57 if (mAudioManager != 0) {
58 mAudioManager.clear();
59 }
60}
61
62//------------------------------------------------------------------------------
63void PlayerBase::servicePlayerEvent(player_state_t event) {
64 if (mAudioManager != 0) {
65 // only report state change
66 Mutex::Autolock _l(mPlayerStateLock);
67 if (event != mLastReportedEvent
68 && mPIId != PLAYER_PIID_INVALID) {
69 mLastReportedEvent = event;
70 mAudioManager->playerEvent(mPIId, event);
71 }
72 }
73}
74
75void PlayerBase::serviceReleasePlayer() {
76 if (mAudioManager != 0
77 && mPIId != PLAYER_PIID_INVALID) {
78 mAudioManager->releasePlayer(mPIId);
79 }
80}
81
Eric Laurenta2f296e2017-06-21 18:51:47 -070082//FIXME temporary method while some player state is outside of this class
Eric Laurentb5323222017-05-31 15:01:56 -070083void PlayerBase::reportEvent(player_state_t event) {
84 servicePlayerEvent(event);
85}
86
Eric Laurent1d32e9f2017-06-02 14:01:32 -070087status_t PlayerBase::startWithStatus() {
88 status_t status = playerStart();
89 if (status == NO_ERROR) {
Eric Laurentb5323222017-05-31 15:01:56 -070090 servicePlayerEvent(PLAYER_STATE_STARTED);
91 } else {
Eric Laurenta2f296e2017-06-21 18:51:47 -070092 ALOGW("PlayerBase::start() error %d", status);
93 }
94 return status;
95}
96
97status_t PlayerBase::pauseWithStatus() {
98 status_t status = playerPause();
99 if (status == NO_ERROR) {
100 servicePlayerEvent(PLAYER_STATE_PAUSED);
101 } else {
102 ALOGW("PlayerBase::pause() error %d", status);
103 }
104 return status;
105}
106
107
108status_t PlayerBase::stopWithStatus() {
109 status_t status = playerStop();
110 if (status == NO_ERROR) {
111 servicePlayerEvent(PLAYER_STATE_STOPPED);
112 } else {
113 ALOGW("PlayerBase::stop() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700114 }
Eric Laurent1d32e9f2017-06-02 14:01:32 -0700115 return status;
116}
117
118//------------------------------------------------------------------------------
119// Implementation of IPlayer
120void PlayerBase::start() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700121 ALOGD("PlayerBase::start() from IPlayer");
Eric Laurent1d32e9f2017-06-02 14:01:32 -0700122 (void)startWithStatus();
Eric Laurentb5323222017-05-31 15:01:56 -0700123}
124
125void PlayerBase::pause() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700126 ALOGD("PlayerBase::pause() from IPlayer");
127 (void)pauseWithStatus();
Eric Laurentb5323222017-05-31 15:01:56 -0700128}
129
130
131void PlayerBase::stop() {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700132 ALOGD("PlayerBase::stop() from IPlayer");
133 (void)stopWithStatus();
Eric Laurentb5323222017-05-31 15:01:56 -0700134}
135
136void PlayerBase::setVolume(float vol) {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700137 ALOGD("PlayerBase::setVolume() from IPlayer");
Eric Laurentb5323222017-05-31 15:01:56 -0700138 {
139 Mutex::Autolock _l(mSettingsLock);
140 mVolumeMultiplierL = vol;
141 mVolumeMultiplierR = vol;
142 }
Eric Laurenta2f296e2017-06-21 18:51:47 -0700143 status_t status = playerSetVolume();
144 if (status != NO_ERROR) {
145 ALOGW("PlayerBase::setVolume() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700146 }
147}
148
149void PlayerBase::setPan(float pan) {
Eric Laurenta2f296e2017-06-21 18:51:47 -0700150 ALOGD("PlayerBase::setPan() from IPlayer");
Eric Laurentb5323222017-05-31 15:01:56 -0700151 {
152 Mutex::Autolock _l(mSettingsLock);
153 pan = min(max(-1.0f, pan), 1.0f);
154 if (pan >= 0.0f) {
155 mPanMultiplierL = 1.0f - pan;
156 mPanMultiplierR = 1.0f;
157 } else {
158 mPanMultiplierL = 1.0f;
159 mPanMultiplierR = 1.0f + pan;
160 }
161 }
Eric Laurenta2f296e2017-06-21 18:51:47 -0700162 status_t status = playerSetVolume();
163 if (status != NO_ERROR) {
164 ALOGW("PlayerBase::setPan() error %d", status);
Eric Laurentb5323222017-05-31 15:01:56 -0700165 }
166}
167
168void PlayerBase::setStartDelayMs(int32_t delayMs __unused) {
169 ALOGW("setStartDelay() is not supported");
170}
171
172void PlayerBase::applyVolumeShaper(
173 const sp<VolumeShaper::Configuration>& configuration __unused,
174 const sp<VolumeShaper::Operation>& operation __unused) {
175 ALOGW("applyVolumeShaper() is not supported");
176}
177
178status_t PlayerBase::onTransact(
179 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
180{
181 return BnPlayer::onTransact(code, data, reply, flags);
182}
183
184} // namespace android