170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi/*
270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * Copyright (C) 2017 The Android Open Source Project
370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi *
470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * you may not use this file except in compliance with the License.
670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * You may obtain a copy of the License at
770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi *
870efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi *
1070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * See the License for the specific language governing permissions and
1470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * limitations under the License.
1570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi */
1670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
1770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivipackage android.media;
1870efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
1970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Triviimport android.annotation.NonNull;
2070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Triviimport android.annotation.SystemApi;
21035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungimport android.media.VolumeShaper;
2270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Triviimport android.os.RemoteException;
2370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Triviimport android.util.Log;
2470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
2570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Triviimport java.lang.IllegalArgumentException;
2670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Triviimport java.util.Objects;
2770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
2870efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi/**
2970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * Class to remotely control a player.
3070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi * @hide
3170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi */
3270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi@SystemApi
3370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivipublic class PlayerProxy {
3470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
3570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    private final static String TAG = "PlayerProxy";
3670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    private final static boolean DEBUG = false;
3770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
3870efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    private final AudioPlaybackConfiguration mConf; // never null
3970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
4070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    /**
4170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     * @hide
4270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     * Constructor. Proxy for this player associated with this AudioPlaybackConfiguration
4370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     * @param conf the configuration being proxied.
4470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     */
4570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    PlayerProxy(@NonNull AudioPlaybackConfiguration apc) {
4670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        if (apc == null) {
4770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            throw new IllegalArgumentException("Illegal null AudioPlaybackConfiguration");
4870efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        }
4970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        mConf = apc;
5070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    };
5170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
5270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    //=====================================================================
5370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    // Methods matching the IPlayer interface
5470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    /**
5570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     * @hide
5670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     */
5770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    @SystemApi
5899489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    public void start() {
5970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        try {
6070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            mConf.getIPlayer().start();
6170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        } catch (NullPointerException|RemoteException e) {
6270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            throw new IllegalStateException(
6370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi                    "No player to proxy for start operation, player already released?", e);
6470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        }
6570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    }
6670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
6770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    /**
6870efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     * @hide
6970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     */
7070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    @SystemApi
7199489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    public void pause() {
7270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        try {
7370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            mConf.getIPlayer().pause();
7470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        } catch (NullPointerException|RemoteException e) {
7570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            throw new IllegalStateException(
7670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi                    "No player to proxy for pause operation, player already released?", e);
7770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        }
7870efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    }
7970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
8070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    /**
8170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     * @hide
8270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     */
8370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    @SystemApi
8499489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    public void stop() {
8570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        try {
8670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            mConf.getIPlayer().stop();
8770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        } catch (NullPointerException|RemoteException e) {
8870efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            throw new IllegalStateException(
8970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi                    "No player to proxy for stop operation, player already released?", e);
9070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        }
9170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    }
9270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
9370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    /**
9470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     * @hide
9599489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi     * @param vol
9670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi     */
9770efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    @SystemApi
9899489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    public void setVolume(float vol) {
9970efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        try {
10070efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            mConf.getIPlayer().setVolume(vol);
10170efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        } catch (NullPointerException|RemoteException e) {
10270efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi            throw new IllegalStateException(
10370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi                    "No player to proxy for setVolume operation, player already released?", e);
10470efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi        }
10570efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi    }
10670efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi
10799489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    /**
10899489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi     * @hide
10999489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi     * @param pan
11099489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi     */
11199489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    @SystemApi
11299489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    public void setPan(float pan) {
11399489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi        try {
11499489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi            mConf.getIPlayer().setPan(pan);
11599489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi        } catch (NullPointerException|RemoteException e) {
11699489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi            throw new IllegalStateException(
11799489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi                    "No player to proxy for setPan operation, player already released?", e);
11899489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi        }
11999489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    }
12099489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi
12199489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    /**
12299489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi     * @hide
12399489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi     * @param delayMs
12499489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi     */
12599489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    @SystemApi
12699489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    public void setStartDelayMs(int delayMs) {
12799489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi        try {
12899489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi            mConf.getIPlayer().setStartDelayMs(delayMs);
12999489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi        } catch (NullPointerException|RemoteException e) {
13099489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi            throw new IllegalStateException(
13199489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi                    "No player to proxy for setStartDelayMs operation, player already released?",
13299489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi                    e);
13399489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi        }
13499489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi    }
13599489ccf740d369193a8ffc7eeb4bbde6919bd65Jean-Michel Trivi
136035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    /**
137035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung     * @hide
138035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung     * @param configuration
139035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung     * @param operation
140035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung     * @return volume shaper id or error
141035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung     */
142035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    public void applyVolumeShaper(
143035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung            @NonNull VolumeShaper.Configuration configuration,
144035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung            @NonNull VolumeShaper.Operation operation) {
145035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        try {
146035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung            mConf.getIPlayer().applyVolumeShaper(configuration, operation);
147035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        } catch (NullPointerException|RemoteException e) {
148035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung            throw new IllegalStateException(
149035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung                    "No player to proxy for applyVolumeShaper operation,"
150035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung                    + " player already released?", e);
151035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        }
152035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    }
15370efb526915d437b72a51a957293dd1e1ce7fd7dJean-Michel Trivi}
154