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