• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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