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