1b5323222bd524876dda1ebf89694f186278e2229Eric Laurent/* 2b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * Copyright (C) 2017 The Android Open Source Project 3b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * 4b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * you may not use this file except in compliance with the License. 6b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * You may obtain a copy of the License at 7b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * 8b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * 10b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * Unless required by applicable law or agreed to in writing, software 11b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * See the License for the specific language governing permissions and 14b5323222bd524876dda1ebf89694f186278e2229Eric Laurent * limitations under the License. 15b5323222bd524876dda1ebf89694f186278e2229Eric Laurent */ 16b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 17b5323222bd524876dda1ebf89694f186278e2229Eric Laurent#include <media/TrackPlayerBase.h> 18b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 19b5323222bd524876dda1ebf89694f186278e2229Eric Laurentnamespace android { 20b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 218cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozanousing media::VolumeShaper; 228cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano 23b5323222bd524876dda1ebf89694f186278e2229Eric Laurent//-------------------------------------------------------------------------------------------------- 24b5323222bd524876dda1ebf89694f186278e2229Eric LaurentTrackPlayerBase::TrackPlayerBase() : PlayerBase(), 25b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mPlayerVolumeL(1.0f), mPlayerVolumeR(1.0f) 26b5323222bd524876dda1ebf89694f186278e2229Eric Laurent{ 27b5323222bd524876dda1ebf89694f186278e2229Eric Laurent ALOGD("TrackPlayerBase::TrackPlayerBase()"); 28b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 29b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 30b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 31b5323222bd524876dda1ebf89694f186278e2229Eric LaurentTrackPlayerBase::~TrackPlayerBase() { 32b5323222bd524876dda1ebf89694f186278e2229Eric Laurent ALOGD("TrackPlayerBase::~TrackPlayerBase()"); 33b5323222bd524876dda1ebf89694f186278e2229Eric Laurent doDestroy(); 34b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 35b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 36b5323222bd524876dda1ebf89694f186278e2229Eric Laurentvoid TrackPlayerBase::init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage) { 37b5323222bd524876dda1ebf89694f186278e2229Eric Laurent PlayerBase::init(playerType, usage); 38b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mAudioTrack = pat; 39b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 40b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 41b5323222bd524876dda1ebf89694f186278e2229Eric Laurentvoid TrackPlayerBase::destroy() { 42b5323222bd524876dda1ebf89694f186278e2229Eric Laurent doDestroy(); 43b5323222bd524876dda1ebf89694f186278e2229Eric Laurent baseDestroy(); 44b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 45b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 46b5323222bd524876dda1ebf89694f186278e2229Eric Laurentvoid TrackPlayerBase::doDestroy() { 47b5323222bd524876dda1ebf89694f186278e2229Eric Laurent if (mAudioTrack != 0) { 48b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mAudioTrack->stop(); 49b5323222bd524876dda1ebf89694f186278e2229Eric Laurent // Note that there may still be another reference in post-unlock phase of SetPlayState 50b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mAudioTrack.clear(); 51b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } 52b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 53b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 54b5323222bd524876dda1ebf89694f186278e2229Eric Laurentvoid TrackPlayerBase::setPlayerVolume(float vl, float vr) { 55b5323222bd524876dda1ebf89694f186278e2229Eric Laurent { 56b5323222bd524876dda1ebf89694f186278e2229Eric Laurent Mutex::Autolock _l(mSettingsLock); 57b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mPlayerVolumeL = vl; 58b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mPlayerVolumeR = vr; 59b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } 60b5323222bd524876dda1ebf89694f186278e2229Eric Laurent doSetVolume(); 61b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 62b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 63b5323222bd524876dda1ebf89694f186278e2229Eric Laurent//------------------------------------------------------------------------------ 64b5323222bd524876dda1ebf89694f186278e2229Eric Laurent// Implementation of IPlayer 65b5323222bd524876dda1ebf89694f186278e2229Eric Laurentstatus_t TrackPlayerBase::playerStart() { 66b5323222bd524876dda1ebf89694f186278e2229Eric Laurent status_t status = NO_INIT; 67b5323222bd524876dda1ebf89694f186278e2229Eric Laurent if (mAudioTrack != 0) { 68b5323222bd524876dda1ebf89694f186278e2229Eric Laurent status = mAudioTrack->start(); 69b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } 70b5323222bd524876dda1ebf89694f186278e2229Eric Laurent return status; 71b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 72b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 73b5323222bd524876dda1ebf89694f186278e2229Eric Laurentstatus_t TrackPlayerBase::playerPause() { 74b5323222bd524876dda1ebf89694f186278e2229Eric Laurent status_t status = NO_INIT; 75b5323222bd524876dda1ebf89694f186278e2229Eric Laurent if (mAudioTrack != 0) { 76b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mAudioTrack->pause(); 77b5323222bd524876dda1ebf89694f186278e2229Eric Laurent status = NO_ERROR; 78b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } 79b5323222bd524876dda1ebf89694f186278e2229Eric Laurent return status; 80b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 81b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 82b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 83b5323222bd524876dda1ebf89694f186278e2229Eric Laurentstatus_t TrackPlayerBase::playerStop() { 84b5323222bd524876dda1ebf89694f186278e2229Eric Laurent status_t status = NO_INIT; 85b5323222bd524876dda1ebf89694f186278e2229Eric Laurent if (mAudioTrack != 0) { 86b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mAudioTrack->stop(); 87b5323222bd524876dda1ebf89694f186278e2229Eric Laurent status = NO_ERROR; 88b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } 89b5323222bd524876dda1ebf89694f186278e2229Eric Laurent return status; 90b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 91b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 92b5323222bd524876dda1ebf89694f186278e2229Eric Laurentstatus_t TrackPlayerBase::playerSetVolume() { 93b5323222bd524876dda1ebf89694f186278e2229Eric Laurent return doSetVolume(); 94b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 95b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 96b5323222bd524876dda1ebf89694f186278e2229Eric Laurentstatus_t TrackPlayerBase::doSetVolume() { 97b5323222bd524876dda1ebf89694f186278e2229Eric Laurent status_t status = NO_INIT; 98b5323222bd524876dda1ebf89694f186278e2229Eric Laurent if (mAudioTrack != 0) { 99b5323222bd524876dda1ebf89694f186278e2229Eric Laurent float tl = mPlayerVolumeL * mPanMultiplierL * mVolumeMultiplierL; 100b5323222bd524876dda1ebf89694f186278e2229Eric Laurent float tr = mPlayerVolumeR * mPanMultiplierR * mVolumeMultiplierR; 101b5323222bd524876dda1ebf89694f186278e2229Eric Laurent mAudioTrack->setVolume(tl, tr); 102b5323222bd524876dda1ebf89694f186278e2229Eric Laurent status = NO_ERROR; 103b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } 104b5323222bd524876dda1ebf89694f186278e2229Eric Laurent return status; 105b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 106b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 107b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 1088cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozanobinder::Status TrackPlayerBase::applyVolumeShaper( 1098cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano const VolumeShaper::Configuration& configuration, 1108cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano const VolumeShaper::Operation& operation) { 1118cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano 1128cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano sp<VolumeShaper::Configuration> spConfiguration = new VolumeShaper::Configuration(configuration); 1138cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano sp<VolumeShaper::Operation> spOperation = new VolumeShaper::Operation(operation); 1148cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano 115b5323222bd524876dda1ebf89694f186278e2229Eric Laurent if (mAudioTrack != 0) { 116b5323222bd524876dda1ebf89694f186278e2229Eric Laurent ALOGD("TrackPlayerBase::applyVolumeShaper() from IPlayer"); 1178cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano VolumeShaper::Status status = mAudioTrack->applyVolumeShaper(spConfiguration, spOperation); 118b5323222bd524876dda1ebf89694f186278e2229Eric Laurent if (status < 0) { // a non-negative value is the volume shaper id. 119b5323222bd524876dda1ebf89694f186278e2229Eric Laurent ALOGE("TrackPlayerBase::applyVolumeShaper() failed with status %d", status); 120b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } 1218cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano return binder::Status::fromStatusT(status); 122b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } else { 123b5323222bd524876dda1ebf89694f186278e2229Eric Laurent ALOGD("TrackPlayerBase::applyVolumeShaper()" 1248cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano " no AudioTrack for volume control from IPlayer"); 1258cf3a0788df2ee184b498086b1b8da322eeadccaIvan Lozano return binder::Status::ok(); 126b5323222bd524876dda1ebf89694f186278e2229Eric Laurent } 127b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} 128b5323222bd524876dda1ebf89694f186278e2229Eric Laurent 129b5323222bd524876dda1ebf89694f186278e2229Eric Laurent} // namespace android 130