1 /** 2 * Copyright (C) 2022 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 package com.android.telephony.imsmedia; 18 19 import android.hardware.radio.ims.media.IImsMedia; 20 import android.hardware.radio.ims.media.IImsMediaListener; 21 import android.hardware.radio.ims.media.IImsMediaSession; 22 import android.hardware.radio.ims.media.LocalEndPoint; 23 import android.hardware.radio.ims.media.RtpConfig; 24 import android.os.RemoteException; 25 import android.os.ServiceManager; 26 import android.telephony.imsmedia.AudioConfig; 27 28 import com.android.telephony.imsmedia.Utils.OpenSessionParams; 29 import com.android.telephony.imsmedia.util.Log; 30 31 /** 32 * This connects to IImsMedia HAL and invokes all the HAL APIs 33 */ 34 public class AudioOffloadService { 35 36 private static final String LOG_TAG = "AudioOffloadService"; 37 38 private IImsMedia mImsMedia; 39 private ImsMediaController.OpenSessionCallback mMediaControllerCallback; 40 private static AudioOffloadService sInstance; 41 private ImsMediaListener listener; 42 AudioOffloadService()43 private AudioOffloadService() { 44 listener = new ImsMediaListener(); 45 initMediaHal(); 46 } 47 getInstance()48 public static AudioOffloadService getInstance() { 49 if (sInstance == null) { 50 sInstance = new AudioOffloadService(); 51 } 52 53 return sInstance; 54 } 55 56 // Initializes the HAL initMediaHal()57 private synchronized void initMediaHal() { 58 Log.d(LOG_TAG, "initMediaHal"); 59 60 try { 61 mImsMedia = IImsMedia.Stub.asInterface(ServiceManager.waitForDeclaredService( 62 IImsMedia.DESCRIPTOR + "/default")); 63 mImsMedia.setListener(listener); 64 } catch (Exception e) { 65 Log.e(LOG_TAG, "initMediaHal: Exception: " + e); 66 return; 67 } 68 } 69 getIImsMedia()70 public IImsMedia getIImsMedia() { 71 72 if (mImsMedia != null) { 73 return mImsMedia; 74 } 75 76 // Reconnect to ImsMedia HAL 77 initMediaHal(); 78 79 return mImsMedia; 80 } 81 openSession(int sessionId, OpenSessionParams sessionParams)82 public void openSession(int sessionId, OpenSessionParams sessionParams) { 83 final LocalEndPoint lep = new LocalEndPoint(); 84 final RtpConfig rtpConfig = Utils.convertToRtpConfig( 85 (AudioConfig)sessionParams.getRtpConfig()); 86 87 /** 88 * Store the reference to the media MediaControllerCallback so that it can 89 * be used for notifying the onOpenSuccess() or onOpenFailure() callbacks. 90 */ 91 mMediaControllerCallback = sessionParams.getCallback(); 92 93 /** Create LocalEndPoint from {@link OpenSessionParams} */ 94 lep.rtpFd = sessionParams.getRtpFd(); 95 lep.rtcpFd = sessionParams.getRtcpFd(); 96 lep.modemId = 1; // TODO : Use the logical modem ID 97 98 try { 99 getIImsMedia().openSession(sessionId, lep, rtpConfig); 100 } catch (RemoteException e) { 101 Log.e(LOG_TAG, "openSession: " + e); 102 } 103 } 104 closeSession(int sessionId)105 public void closeSession(int sessionId) { 106 try { 107 getIImsMedia().closeSession(sessionId); 108 } catch (RemoteException e) { 109 Log.e(LOG_TAG, "closeSession: " + e); 110 } 111 } 112 113 private class ImsMediaListener extends IImsMediaListener.Stub { 114 115 @Override getInterfaceHash()116 public String getInterfaceHash() { 117 return IImsMediaListener.HASH; 118 } 119 120 @Override getInterfaceVersion()121 public int getInterfaceVersion() { 122 return IImsMediaListener.VERSION; 123 } 124 125 @Override onOpenSessionSuccess(int sessionId, IImsMediaSession session)126 public void onOpenSessionSuccess(int sessionId, IImsMediaSession session) { 127 mMediaControllerCallback.onOpenSessionSuccess(sessionId, session); 128 } 129 130 @Override onOpenSessionFailure(int sessionId, int error)131 public void onOpenSessionFailure(int sessionId, int error) { 132 mMediaControllerCallback.onOpenSessionFailure(sessionId, error); 133 } 134 135 @Override onSessionClosed(int sessionId)136 public void onSessionClosed(int sessionId) { 137 mMediaControllerCallback.onSessionClosed(sessionId); 138 } 139 } 140 } 141