diff --git a/Qualcomm/QtiAudio/Android.mk b/Qualcomm/QtiAudio/Android.mk
new file mode 100644
index 0000000..50e7f54
--- /dev/null
+++ b/Qualcomm/QtiAudio/Android.mk
@@ -0,0 +1,13 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_CERTIFICATE := platform
+LOCAL_PRIVILEGED_MODULE := true
+LOCAL_PACKAGE_NAME := QtiAudio
+LOCAL_PROGUARD_ENABLED := disabled
+
+LOCAL_PRIVATE_PLATFORM_APIS := true
+include $(BUILD_PACKAGE)
diff --git a/Qualcomm/QtiAudio/AndroidManifest.xml b/Qualcomm/QtiAudio/AndroidManifest.xml
new file mode 100644
index 0000000..8ab6812
--- /dev/null
+++ b/Qualcomm/QtiAudio/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+	package="me.phh.qti.audio"
+	android:sharedUserId="android.uid.system"
+	android:persistent="true">
+
+    <application
+	    android:label="@string/app_label">
+
+	    <receiver android:name=".Starter">
+		    <intent-filter>
+			    <action android:name="android.intent.action.BOOT_COMPLETED"/>
+		    </intent-filter>
+	    </receiver>
+	    <service android:name=".Service" />
+    </application>
+</manifest>
diff --git a/Qualcomm/QtiAudio/res/values/strings.xml b/Qualcomm/QtiAudio/res/values/strings.xml
new file mode 100644
index 0000000..1ced373
--- /dev/null
+++ b/Qualcomm/QtiAudio/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_label">Qualcomm audio</string>
+</resources>
diff --git a/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java
new file mode 100644
index 0000000..5c69742
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java
@@ -0,0 +1,129 @@
+package me.phh.qti.audio;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+import android.media.AudioManager;
+import android.media.AudioSystem;
+import android.os.IBinder;
+import android.os.UEventObserver;
+import android.os.SystemProperties;
+
+public class Service extends android.app.Service {
+	AudioManager audioManager;
+	@Override public void onCreate() {
+		String fp = SystemProperties.get("ro.vendor.build.fingerprint", "nothing");
+		audioManager = getSystemService(AudioManager.class);
+
+		new java.lang.Thread() {
+			@Override
+			public void run() {
+				android.util.Log.d("PHH", "Hello");
+				try {
+					vendor.qti.hardware.radio.am.V1_0.IQcRilAudio service;
+					service = vendor.qti.hardware.radio.am.V1_0.IQcRilAudio.getService("slot1");
+					service.setCallback(cb);
+				} catch(Exception e) {}
+				try {
+					vendor.qti.hardware.radio.am.V1_0.IQcRilAudio service;
+					service = vendor.qti.hardware.radio.am.V1_0.IQcRilAudio.getService("slot2");
+					service.setCallback(cb);
+				} catch(Exception e) {}
+				try {
+					vendor.qti.qcril.am.V1_0.IQcRilAudio service;
+					service = vendor.qti.qcril.am.V1_0.IQcRilAudio.getService("slot1");
+					service.setCallback(cb2);
+				} catch(Exception e) {}
+				try {
+					vendor.qti.qcril.am.V1_0.IQcRilAudio service;
+					service = vendor.qti.qcril.am.V1_0.IQcRilAudio.getService("slot2");
+					service.setCallback(cb2);
+				} catch(Exception e) {}
+                if(fp.contains("OnePlus6")) {
+                    try {
+                        (new UEventObserver() {
+                            @Override
+                            public void onUEvent(UEventObserver.UEvent event) {
+                                try {
+                                    android.util.Log.v("PHH", "USB UEVENT: " + event.toString());
+                                    String state = event.get("STATE");
+
+                                    boolean ringing = state.contains("USB=0");
+                                    boolean silent = state.contains("(null)=0");
+                                    boolean vibrate = state.contains("USB_HOST=0");
+                                    android.util.Log.v("PHH", "Got ringing = " + ringing + ", silent = " + silent + ", vibrate = " + vibrate);
+                                    if(ringing && !silent && !vibrate)
+                                        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
+                                    if(silent && !ringing && !vibrate)
+                                        audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
+                                    if(vibrate && !silent && !ringing)
+                                        audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
+                                } catch(Exception e) {
+                                    android.util.Log.d("PHH", "Failed parsing uevent", e);
+                                }
+
+                            }
+                        }).startObserving("DEVPATH=/devices/platform/soc/soc:tri_state_key");
+                    } catch(Exception e) {
+                        android.util.Log.d("PHH", "Failed setting UEventObserver", e);
+                    }
+                }
+
+            }
+        }.start();
+    }
+
+    vendor.qti.hardware.radio.am.V1_0.IQcRilAudioCallback cb = new vendor.qti.hardware.radio.am.V1_0.IQcRilAudioCallback.Stub() {
+        @Override
+        public String getParameters(String parameter) {
+            android.util.Log.d("PHH", "Got getParameters " + parameter);
+            try {
+                return AudioSystem.getParameters(parameter);
+            } catch(Exception e) {
+                android.util.Log.d("PHH", "Failed getting parameters");
+            }
+            return "";
+        }
+
+        @Override
+        public int setParameters(String parameters) {
+            android.util.Log.d("PHH", "Got setParameters " + parameters);
+            try {
+                AudioSystem.setParameters(parameters);
+            } catch(Exception e) {
+                android.util.Log.d("PHH", "Failed setting parameters");
+            }
+            return 0;
+        }
+    };
+
+    vendor.qti.qcril.am.V1_0.IQcRilAudioCallback cb2 = new vendor.qti.qcril.am.V1_0.IQcRilAudioCallback.Stub() {
+        @Override
+        public String getParameters(String parameter) {
+            android.util.Log.d("PHH", "Got getParameters " + parameter);
+            try {
+                return AudioSystem.getParameters(parameter);
+            } catch(Exception e) {
+                android.util.Log.d("PHH", "Failed getting parameters");
+            }
+            return "";
+        }
+
+        @Override
+        public int setParameters(String parameters) {
+            android.util.Log.d("PHH", "Got setParameters " + parameters);
+            try {
+                AudioSystem.setParameters(parameters);
+            } catch(Exception e) {
+                android.util.Log.d("PHH", "Failed setting parameters");
+            }
+            return 0;
+        }
+    };
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+}
diff --git a/Qualcomm/QtiAudio/src/me/phh/qti/audio/Starter.java b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Starter.java
new file mode 100644
index 0000000..2700ec6
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Starter.java
@@ -0,0 +1,13 @@
+package me.phh.qti.audio;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class Starter extends BroadcastReceiver {
+
+	@Override
+	public void onReceive(Context ctxt, Intent intent) {
+		ctxt.startService(new Intent(ctxt, Service.class));
+	}
+}
diff --git a/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudio.java b/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudio.java
new file mode 100644
index 0000000..7e08568
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudio.java
@@ -0,0 +1,490 @@
+package vendor.qti.hardware.radio.am.V1_0;
+
+public interface IQcRilAudio extends android.hidl.base.V1_0.IBase {
+    public static final String kInterfaceName = "vendor.qti.hardware.radio.am@1.0::IQcRilAudio";
+
+    /* package private */ static IQcRilAudio asInterface(android.os.IHwBinder binder) {
+        if (binder == null) {
+            return null;
+        }
+
+        android.os.IHwInterface iface =
+                binder.queryLocalInterface(kInterfaceName);
+
+        if ((iface != null) && (iface instanceof IQcRilAudio)) {
+            return (IQcRilAudio)iface;
+        }
+
+        IQcRilAudio proxy = new IQcRilAudio.Proxy(binder);
+
+        try {
+            for (String descriptor : proxy.interfaceChain()) {
+                if (descriptor.equals(kInterfaceName)) {
+                    return proxy;
+                }
+            }
+        } catch (android.os.RemoteException e) {
+        }
+
+        return null;
+    }
+
+    public static IQcRilAudio castFrom(android.os.IHwInterface iface) {
+        return (iface == null) ? null : IQcRilAudio.asInterface(iface.asBinder());
+    }
+
+    @Override
+    public android.os.IHwBinder asBinder();
+
+    public static IQcRilAudio getService(String serviceName) throws android.os.RemoteException {
+        return IQcRilAudio.asInterface(android.os.HwBinder.getService("vendor.qti.hardware.radio.am@1.0::IQcRilAudio",serviceName));
+    }
+
+    public static IQcRilAudio getService() throws android.os.RemoteException {
+        return IQcRilAudio.asInterface(android.os.HwBinder.getService("vendor.qti.hardware.radio.am@1.0::IQcRilAudio","default"));
+    }
+
+    void setCallback(IQcRilAudioCallback iQcRilAudioCallback)
+        throws android.os.RemoteException;
+    void setError(int error)
+        throws android.os.RemoteException;
+    java.util.ArrayList<String> interfaceChain()
+        throws android.os.RemoteException;
+    String interfaceDescriptor()
+        throws android.os.RemoteException;
+    java.util.ArrayList<byte[/* 32 */]> getHashChain()
+        throws android.os.RemoteException;
+    void setHALInstrumentation()
+        throws android.os.RemoteException;
+    boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+        throws android.os.RemoteException;
+    void ping()
+        throws android.os.RemoteException;
+    android.hidl.base.V1_0.DebugInfo getDebugInfo()
+        throws android.os.RemoteException;
+    void notifySyspropsChanged()
+        throws android.os.RemoteException;
+    boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+        throws android.os.RemoteException;
+
+    public static final class Proxy implements IQcRilAudio {
+        private android.os.IHwBinder mRemote;
+
+        public Proxy(android.os.IHwBinder remote) {
+            mRemote = java.util.Objects.requireNonNull(remote);
+        }
+
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return mRemote;
+        }
+
+        @Override
+        public String toString() {
+            try {
+                return this.interfaceDescriptor() + "@Proxy";
+            } catch (android.os.RemoteException ex) {
+                /* ignored; handled below. */
+            }
+            return "[class or subclass of " + IQcRilAudio.kInterfaceName + "]@Proxy";
+        }
+
+        // Methods from ::vendor::qti::hardware::radio::am::V1_0::IQcRilAudio follow.
+        @Override
+        public void setCallback(IQcRilAudioCallback iQcRilAudioCallback)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudio.kInterfaceName);
+            _hidl_request.writeStrongBinder(iQcRilAudioCallback == null ? null : iQcRilAudioCallback.asBinder());
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(1 /* setCallback */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setError(int error)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudio.kInterfaceName);
+            _hidl_request.writeInt32(error);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(2 /* setError */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        // Methods from ::android::hidl::base::V1_0::IBase follow.
+        @Override
+        public java.util.ArrayList<String> interfaceChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256067662 /* interfaceChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<String> _hidl_out_descriptors = _hidl_reply.readStringVector();
+                return _hidl_out_descriptors;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public String interfaceDescriptor()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256136003 /* interfaceDescriptor */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_descriptor = _hidl_reply.readString();
+                return _hidl_out_descriptor;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public java.util.ArrayList<byte[/* 32 */]> getHashChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256398152 /* getHashChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain =  new java.util.ArrayList<byte[/* 32 */]>();
+                {
+                    android.os.HwBlob _hidl_blob = _hidl_reply.readBuffer(16 /* size */);
+                    {
+                        int _hidl_vec_size = _hidl_blob.getInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */);
+                        android.os.HwBlob childBlob = _hidl_reply.readEmbeddedBuffer(
+                                _hidl_vec_size * 32,_hidl_blob.handle(),
+                                0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */,true /* nullable */);
+
+                        _hidl_out_hashchain.clear();
+                        for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                            final byte[/* 32 */] _hidl_vec_element = new byte[32];
+                            {
+                                long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                    _hidl_vec_element[_hidl_index_1_0] = childBlob.getInt8(_hidl_array_offset_1);
+                                    _hidl_array_offset_1 += 1;
+                                }
+                            }
+                            _hidl_out_hashchain.add(_hidl_vec_element);
+                        }
+                    }
+                }
+                return _hidl_out_hashchain;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setHALInstrumentation()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256462420 /* setHALInstrumentation */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+                throws android.os.RemoteException {
+            return mRemote.linkToDeath(recipient, cookie);
+        }
+        @Override
+        public void ping()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256921159 /* ping */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public android.hidl.base.V1_0.DebugInfo getDebugInfo()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257049926 /* getDebugInfo */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                android.hidl.base.V1_0.DebugInfo _hidl_out_info = new android.hidl.base.V1_0.DebugInfo();
+                _hidl_out_info.readFromParcel(_hidl_reply);
+                return _hidl_out_info;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void notifySyspropsChanged()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257120595 /* notifySyspropsChanged */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+                throws android.os.RemoteException {
+            return mRemote.unlinkToDeath(recipient);
+        }
+    }
+
+    public static abstract class Stub extends android.os.HwBinder implements IQcRilAudio {
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return this;
+        }
+
+        @Override
+        public final java.util.ArrayList<String> interfaceChain() {
+            return new java.util.ArrayList<String>(java.util.Arrays.asList(
+                    IQcRilAudio.kInterfaceName,
+                    android.hidl.base.V1_0.IBase.kInterfaceName));
+        }
+
+        @Override
+        public final String interfaceDescriptor() {
+            return IQcRilAudio.kInterfaceName;
+
+        }
+
+        @Override
+        public final java.util.ArrayList<byte[/* 32 */]> getHashChain() {
+            return new java.util.ArrayList<byte[/* 32 */]>(java.util.Arrays.asList(
+                    new byte[/* 32 */]{35,-44,101,61,83,-91,-11,20,118,-65,-39,105,-3,86,89,122,53,28,5,43,84,86,-31,121,46,5,33,-49,104,103,89,13} /* 23d4653d53a5f51476bfd969fd56597a351c052b5456e1792e0521cf6867590d */,
+                    new byte[/* 32 */]{-67,-38,-74,24,77,122,52,109,-90,-96,125,-64,-126,-116,-15,-102,105,111,76,-86,54,17,-59,31,46,20,86,90,20,-76,15,-39} /* bddab6184d7a346da6a07dc0828cf19a696f4caa3611c51f2e14565a14b40fd9 */));
+
+        }
+
+        @Override
+        public final void setHALInstrumentation() {
+
+        }
+
+        @Override
+        public final boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie) {
+            return true;
+        }
+
+        @Override
+        public final void ping() {
+            return;
+
+        }
+
+        @Override
+        public final android.hidl.base.V1_0.DebugInfo getDebugInfo() {
+            android.hidl.base.V1_0.DebugInfo info = new android.hidl.base.V1_0.DebugInfo();
+            info.pid = -1;
+            info.ptr = 0;
+            info.arch = android.hidl.base.V1_0.DebugInfo.Architecture.UNKNOWN;return info;
+        }
+
+        @Override
+        public final void notifySyspropsChanged() {
+            android.os.SystemProperties.reportSyspropChanged();
+        }
+
+        @Override
+        public final boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient) {
+            return true;
+
+        }
+
+        @Override
+        public android.os.IHwInterface queryLocalInterface(String descriptor) {
+            if (kInterfaceName.equals(descriptor)) {
+                return this;
+            }
+            return null;
+        }
+
+        public void registerAsService(String serviceName) throws android.os.RemoteException {
+            registerService(serviceName);
+        }
+
+        @Override
+        public String toString() {
+            return this.interfaceDescriptor() + "@Stub";
+        }
+
+        @Override
+        public void onTransact(int _hidl_code, android.os.HwParcel _hidl_request, final android.os.HwParcel _hidl_reply, int _hidl_flags)
+                throws android.os.RemoteException {
+            switch (_hidl_code) {
+                case 1 /* setCallback */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudio.kInterfaceName);
+
+                    IQcRilAudioCallback iQcRilAudioCallback = IQcRilAudioCallback.asInterface(_hidl_request.readStrongBinder());
+                    setCallback(iQcRilAudioCallback);
+                    break;
+                }
+
+                case 2 /* setError */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudio.kInterfaceName);
+
+                    int error = _hidl_request.readInt32();
+                    setError(error);
+                    break;
+                }
+
+                case 256067662 /* interfaceChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<String> _hidl_out_descriptors = interfaceChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeStringVector(_hidl_out_descriptors);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256131655 /* debug */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256136003 /* interfaceDescriptor */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    String _hidl_out_descriptor = interfaceDescriptor();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_descriptor);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256398152 /* getHashChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain = getHashChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    {
+                        android.os.HwBlob _hidl_blob = new android.os.HwBlob(16 /* size */);
+                        {
+                            int _hidl_vec_size = _hidl_out_hashchain.size();
+                            _hidl_blob.putInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);
+                            _hidl_blob.putBool(0 /* offset */ + 12 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);
+                            android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * 32));
+                            for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                                {
+                                    long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                    for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                        childBlob.putInt8(_hidl_array_offset_1, _hidl_out_hashchain.get(_hidl_index_0)[_hidl_index_1_0]);
+                                        _hidl_array_offset_1 += 1;
+                                    }
+                                }
+                            }
+                            _hidl_blob.putBlob(0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);
+                        }
+                        _hidl_reply.writeBuffer(_hidl_blob);
+                    }
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256462420 /* setHALInstrumentation */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    setHALInstrumentation();
+                    break;
+                }
+
+                case 256660548 /* linkToDeath */:
+                {
+                break;
+                }
+
+                case 256921159 /* ping */:
+                {
+                break;
+                }
+
+                case 257049926 /* getDebugInfo */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    android.hidl.base.V1_0.DebugInfo _hidl_out_info = getDebugInfo();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_out_info.writeToParcel(_hidl_reply);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 257120595 /* notifySyspropsChanged */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    notifySyspropsChanged();
+                    break;
+                }
+
+                case 257250372 /* unlinkToDeath */:
+                {
+                break;
+                }
+
+            }
+        }
+    }
+}
diff --git a/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudioCallback.java b/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudioCallback.java
new file mode 100644
index 0000000..6be55a3
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudioCallback.java
@@ -0,0 +1,504 @@
+package vendor.qti.hardware.radio.am.V1_0;
+
+public interface IQcRilAudioCallback extends android.hidl.base.V1_0.IBase {
+    public static final String kInterfaceName = "vendor.qti.hardware.radio.am@1.0::IQcRilAudioCallback";
+
+    /* package private */ static IQcRilAudioCallback asInterface(android.os.IHwBinder binder) {
+        if (binder == null) {
+            return null;
+        }
+
+        android.os.IHwInterface iface =
+                binder.queryLocalInterface(kInterfaceName);
+
+        if ((iface != null) && (iface instanceof IQcRilAudioCallback)) {
+            return (IQcRilAudioCallback)iface;
+        }
+
+        IQcRilAudioCallback proxy = new IQcRilAudioCallback.Proxy(binder);
+
+        try {
+            for (String descriptor : proxy.interfaceChain()) {
+                if (descriptor.equals(kInterfaceName)) {
+                    return proxy;
+                }
+            }
+        } catch (android.os.RemoteException e) {
+        }
+
+        return null;
+    }
+
+    public static IQcRilAudioCallback castFrom(android.os.IHwInterface iface) {
+        return (iface == null) ? null : IQcRilAudioCallback.asInterface(iface.asBinder());
+    }
+
+    @Override
+    public android.os.IHwBinder asBinder();
+
+    public static IQcRilAudioCallback getService(String serviceName) throws android.os.RemoteException {
+        return IQcRilAudioCallback.asInterface(android.os.HwBinder.getService("vendor.qti.hardware.radio.am@1.0::IQcRilAudioCallback",serviceName));
+    }
+
+    public static IQcRilAudioCallback getService() throws android.os.RemoteException {
+        return IQcRilAudioCallback.asInterface(android.os.HwBinder.getService("vendor.qti.hardware.radio.am@1.0::IQcRilAudioCallback","default"));
+    }
+
+    String getParameters(String str)
+        throws android.os.RemoteException;
+    int setParameters(String str)
+        throws android.os.RemoteException;
+    java.util.ArrayList<String> interfaceChain()
+        throws android.os.RemoteException;
+    String interfaceDescriptor()
+        throws android.os.RemoteException;
+    java.util.ArrayList<byte[/* 32 */]> getHashChain()
+        throws android.os.RemoteException;
+    void setHALInstrumentation()
+        throws android.os.RemoteException;
+    boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+        throws android.os.RemoteException;
+    void ping()
+        throws android.os.RemoteException;
+    android.hidl.base.V1_0.DebugInfo getDebugInfo()
+        throws android.os.RemoteException;
+    void notifySyspropsChanged()
+        throws android.os.RemoteException;
+    boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+        throws android.os.RemoteException;
+
+    public static final class Proxy implements IQcRilAudioCallback {
+        private android.os.IHwBinder mRemote;
+
+        public Proxy(android.os.IHwBinder remote) {
+            mRemote = java.util.Objects.requireNonNull(remote);
+        }
+
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return mRemote;
+        }
+
+        @Override
+        public String toString() {
+            try {
+                return this.interfaceDescriptor() + "@Proxy";
+            } catch (android.os.RemoteException ex) {
+                /* ignored; handled below. */
+            }
+            return "[class or subclass of " + IQcRilAudioCallback.kInterfaceName + "]@Proxy";
+        }
+
+        // Methods from ::vendor::qti::hardware::radio::am::V1_0::IQcRilAudioCallback follow.
+        @Override
+        public String getParameters(String str)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudioCallback.kInterfaceName);
+            _hidl_request.writeString(str);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(1 /* getParameters */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_result = _hidl_reply.readString();
+                return _hidl_out_result;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public int setParameters(String str)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudioCallback.kInterfaceName);
+            _hidl_request.writeString(str);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(2 /* setParameters */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                int _hidl_out_success = _hidl_reply.readInt32();
+                return _hidl_out_success;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        // Methods from ::android::hidl::base::V1_0::IBase follow.
+        @Override
+        public java.util.ArrayList<String> interfaceChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256067662 /* interfaceChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<String> _hidl_out_descriptors = _hidl_reply.readStringVector();
+                return _hidl_out_descriptors;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public String interfaceDescriptor()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256136003 /* interfaceDescriptor */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_descriptor = _hidl_reply.readString();
+                return _hidl_out_descriptor;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public java.util.ArrayList<byte[/* 32 */]> getHashChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256398152 /* getHashChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain =  new java.util.ArrayList<byte[/* 32 */]>();
+                {
+                    android.os.HwBlob _hidl_blob = _hidl_reply.readBuffer(16 /* size */);
+                    {
+                        int _hidl_vec_size = _hidl_blob.getInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */);
+                        android.os.HwBlob childBlob = _hidl_reply.readEmbeddedBuffer(
+                                _hidl_vec_size * 32,_hidl_blob.handle(),
+                                0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */,true /* nullable */);
+
+                        _hidl_out_hashchain.clear();
+                        for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                            final byte[/* 32 */] _hidl_vec_element = new byte[32];
+                            {
+                                long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                    _hidl_vec_element[_hidl_index_1_0] = childBlob.getInt8(_hidl_array_offset_1);
+                                    _hidl_array_offset_1 += 1;
+                                }
+                            }
+                            _hidl_out_hashchain.add(_hidl_vec_element);
+                        }
+                    }
+                }
+                return _hidl_out_hashchain;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setHALInstrumentation()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256462420 /* setHALInstrumentation */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+                throws android.os.RemoteException {
+            return mRemote.linkToDeath(recipient, cookie);
+        }
+        @Override
+        public void ping()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256921159 /* ping */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public android.hidl.base.V1_0.DebugInfo getDebugInfo()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257049926 /* getDebugInfo */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                android.hidl.base.V1_0.DebugInfo _hidl_out_info = new android.hidl.base.V1_0.DebugInfo();
+                _hidl_out_info.readFromParcel(_hidl_reply);
+                return _hidl_out_info;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void notifySyspropsChanged()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257120595 /* notifySyspropsChanged */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+                throws android.os.RemoteException {
+            return mRemote.unlinkToDeath(recipient);
+        }
+    }
+
+    public static abstract class Stub extends android.os.HwBinder implements IQcRilAudioCallback {
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return this;
+        }
+
+        @Override
+        public final java.util.ArrayList<String> interfaceChain() {
+            return new java.util.ArrayList<String>(java.util.Arrays.asList(
+                    IQcRilAudioCallback.kInterfaceName,
+                    android.hidl.base.V1_0.IBase.kInterfaceName));
+        }
+
+        @Override
+        public final String interfaceDescriptor() {
+            return IQcRilAudioCallback.kInterfaceName;
+
+        }
+
+        @Override
+        public final java.util.ArrayList<byte[/* 32 */]> getHashChain() {
+            return new java.util.ArrayList<byte[/* 32 */]>(java.util.Arrays.asList(
+                    new byte[/* 32 */]{-52,108,-122,12,-23,-127,-15,-89,-101,-41,-8,-38,67,-55,-25,-127,86,-27,-94,-49,-69,-90,93,89,61,-12,102,18,-25,61,16,47} /* cc6c860ce981f1a79bd7f8da43c9e78156e5a2cfbba65d593df46612e73d102f */,
+                    new byte[/* 32 */]{-67,-38,-74,24,77,122,52,109,-90,-96,125,-64,-126,-116,-15,-102,105,111,76,-86,54,17,-59,31,46,20,86,90,20,-76,15,-39} /* bddab6184d7a346da6a07dc0828cf19a696f4caa3611c51f2e14565a14b40fd9 */));
+
+        }
+
+        @Override
+        public final void setHALInstrumentation() {
+
+        }
+
+        @Override
+        public final boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie) {
+            return true;
+        }
+
+        @Override
+        public final void ping() {
+            return;
+
+        }
+
+        @Override
+        public final android.hidl.base.V1_0.DebugInfo getDebugInfo() {
+            android.hidl.base.V1_0.DebugInfo info = new android.hidl.base.V1_0.DebugInfo();
+            info.pid = -1;
+            info.ptr = 0;
+            info.arch = android.hidl.base.V1_0.DebugInfo.Architecture.UNKNOWN;return info;
+        }
+
+        @Override
+        public final void notifySyspropsChanged() {
+            android.os.SystemProperties.reportSyspropChanged();
+        }
+
+        @Override
+        public final boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient) {
+            return true;
+
+        }
+
+        @Override
+        public android.os.IHwInterface queryLocalInterface(String descriptor) {
+            if (kInterfaceName.equals(descriptor)) {
+                return this;
+            }
+            return null;
+        }
+
+        public void registerAsService(String serviceName) throws android.os.RemoteException {
+            registerService(serviceName);
+        }
+
+        @Override
+        public String toString() {
+            return this.interfaceDescriptor() + "@Stub";
+        }
+
+        @Override
+        public void onTransact(int _hidl_code, android.os.HwParcel _hidl_request, final android.os.HwParcel _hidl_reply, int _hidl_flags)
+                throws android.os.RemoteException {
+            switch (_hidl_code) {
+                case 1 /* getParameters */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudioCallback.kInterfaceName);
+
+                    String str = _hidl_request.readString();
+                    String _hidl_out_result = getParameters(str);
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_result);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 2 /* setParameters */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudioCallback.kInterfaceName);
+
+                    String str = _hidl_request.readString();
+                    int _hidl_out_success = setParameters(str);
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeInt32(_hidl_out_success);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256067662 /* interfaceChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<String> _hidl_out_descriptors = interfaceChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeStringVector(_hidl_out_descriptors);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256131655 /* debug */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256136003 /* interfaceDescriptor */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    String _hidl_out_descriptor = interfaceDescriptor();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_descriptor);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256398152 /* getHashChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain = getHashChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    {
+                        android.os.HwBlob _hidl_blob = new android.os.HwBlob(16 /* size */);
+                        {
+                            int _hidl_vec_size = _hidl_out_hashchain.size();
+                            _hidl_blob.putInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);
+                            _hidl_blob.putBool(0 /* offset */ + 12 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);
+                            android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * 32));
+                            for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                                {
+                                    long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                    for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                        childBlob.putInt8(_hidl_array_offset_1, _hidl_out_hashchain.get(_hidl_index_0)[_hidl_index_1_0]);
+                                        _hidl_array_offset_1 += 1;
+                                    }
+                                }
+                            }
+                            _hidl_blob.putBlob(0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);
+                        }
+                        _hidl_reply.writeBuffer(_hidl_blob);
+                    }
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256462420 /* setHALInstrumentation */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    setHALInstrumentation();
+                    break;
+                }
+
+                case 256660548 /* linkToDeath */:
+                {
+                break;
+                }
+
+                case 256921159 /* ping */:
+                {
+                break;
+                }
+
+                case 257049926 /* getDebugInfo */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    android.hidl.base.V1_0.DebugInfo _hidl_out_info = getDebugInfo();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_out_info.writeToParcel(_hidl_reply);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 257120595 /* notifySyspropsChanged */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    notifySyspropsChanged();
+                    break;
+                }
+
+                case 257250372 /* unlinkToDeath */:
+                {
+                break;
+                }
+
+            }
+        }
+    }
+}
diff --git a/Qualcomm/QtiAudio/src/vendor/qti/qcril/am/V1_0/IQcRilAudio.java b/Qualcomm/QtiAudio/src/vendor/qti/qcril/am/V1_0/IQcRilAudio.java
new file mode 100644
index 0000000..7bd3bd1
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/vendor/qti/qcril/am/V1_0/IQcRilAudio.java
@@ -0,0 +1,490 @@
+package vendor.qti.qcril.am.V1_0;
+
+public interface IQcRilAudio extends android.hidl.base.V1_0.IBase {
+    public static final String kInterfaceName = "vendor.qti.qcril.am@1.0::IQcRilAudio";
+
+    /* package private */ static IQcRilAudio asInterface(android.os.IHwBinder binder) {
+        if (binder == null) {
+            return null;
+        }
+
+        android.os.IHwInterface iface =
+                binder.queryLocalInterface(kInterfaceName);
+
+        if ((iface != null) && (iface instanceof IQcRilAudio)) {
+            return (IQcRilAudio)iface;
+        }
+
+        IQcRilAudio proxy = new IQcRilAudio.Proxy(binder);
+
+        try {
+            for (String descriptor : proxy.interfaceChain()) {
+                if (descriptor.equals(kInterfaceName)) {
+                    return proxy;
+                }
+            }
+        } catch (android.os.RemoteException e) {
+        }
+
+        return null;
+    }
+
+    public static IQcRilAudio castFrom(android.os.IHwInterface iface) {
+        return (iface == null) ? null : IQcRilAudio.asInterface(iface.asBinder());
+    }
+
+    @Override
+    public android.os.IHwBinder asBinder();
+
+    public static IQcRilAudio getService(String serviceName) throws android.os.RemoteException {
+        return IQcRilAudio.asInterface(android.os.HwBinder.getService("vendor.qti.qcril.am@1.0::IQcRilAudio",serviceName));
+    }
+
+    public static IQcRilAudio getService() throws android.os.RemoteException {
+        return IQcRilAudio.asInterface(android.os.HwBinder.getService("vendor.qti.qcril.am@1.0::IQcRilAudio","default"));
+    }
+
+    void setCallback(IQcRilAudioCallback iQcRilAudioCallback)
+        throws android.os.RemoteException;
+    void setError(int error)
+        throws android.os.RemoteException;
+    java.util.ArrayList<String> interfaceChain()
+        throws android.os.RemoteException;
+    String interfaceDescriptor()
+        throws android.os.RemoteException;
+    java.util.ArrayList<byte[/* 32 */]> getHashChain()
+        throws android.os.RemoteException;
+    void setHALInstrumentation()
+        throws android.os.RemoteException;
+    boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+        throws android.os.RemoteException;
+    void ping()
+        throws android.os.RemoteException;
+    android.hidl.base.V1_0.DebugInfo getDebugInfo()
+        throws android.os.RemoteException;
+    void notifySyspropsChanged()
+        throws android.os.RemoteException;
+    boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+        throws android.os.RemoteException;
+
+    public static final class Proxy implements IQcRilAudio {
+        private android.os.IHwBinder mRemote;
+
+        public Proxy(android.os.IHwBinder remote) {
+            mRemote = java.util.Objects.requireNonNull(remote);
+        }
+
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return mRemote;
+        }
+
+        @Override
+        public String toString() {
+            try {
+                return this.interfaceDescriptor() + "@Proxy";
+            } catch (android.os.RemoteException ex) {
+                /* ignored; handled below. */
+            }
+            return "[class or subclass of " + IQcRilAudio.kInterfaceName + "]@Proxy";
+        }
+
+        // Methods from ::vendor::qti::qcril::am::V1_0::IQcRilAudio follow.
+        @Override
+        public void setCallback(IQcRilAudioCallback iQcRilAudioCallback)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudio.kInterfaceName);
+            _hidl_request.writeStrongBinder(iQcRilAudioCallback == null ? null : iQcRilAudioCallback.asBinder());
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(1 /* setCallback */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setError(int error)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudio.kInterfaceName);
+            _hidl_request.writeInt32(error);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(2 /* setError */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        // Methods from ::android::hidl::base::V1_0::IBase follow.
+        @Override
+        public java.util.ArrayList<String> interfaceChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256067662 /* interfaceChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<String> _hidl_out_descriptors = _hidl_reply.readStringVector();
+                return _hidl_out_descriptors;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public String interfaceDescriptor()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256136003 /* interfaceDescriptor */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_descriptor = _hidl_reply.readString();
+                return _hidl_out_descriptor;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public java.util.ArrayList<byte[/* 32 */]> getHashChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256398152 /* getHashChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain =  new java.util.ArrayList<byte[/* 32 */]>();
+                {
+                    android.os.HwBlob _hidl_blob = _hidl_reply.readBuffer(16 /* size */);
+                    {
+                        int _hidl_vec_size = _hidl_blob.getInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */);
+                        android.os.HwBlob childBlob = _hidl_reply.readEmbeddedBuffer(
+                                _hidl_vec_size * 32,_hidl_blob.handle(),
+                                0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */,true /* nullable */);
+
+                        _hidl_out_hashchain.clear();
+                        for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                            final byte[/* 32 */] _hidl_vec_element = new byte[32];
+                            {
+                                long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                    _hidl_vec_element[_hidl_index_1_0] = childBlob.getInt8(_hidl_array_offset_1);
+                                    _hidl_array_offset_1 += 1;
+                                }
+                            }
+                            _hidl_out_hashchain.add(_hidl_vec_element);
+                        }
+                    }
+                }
+                return _hidl_out_hashchain;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setHALInstrumentation()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256462420 /* setHALInstrumentation */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+                throws android.os.RemoteException {
+            return mRemote.linkToDeath(recipient, cookie);
+        }
+        @Override
+        public void ping()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256921159 /* ping */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public android.hidl.base.V1_0.DebugInfo getDebugInfo()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257049926 /* getDebugInfo */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                android.hidl.base.V1_0.DebugInfo _hidl_out_info = new android.hidl.base.V1_0.DebugInfo();
+                _hidl_out_info.readFromParcel(_hidl_reply);
+                return _hidl_out_info;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void notifySyspropsChanged()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257120595 /* notifySyspropsChanged */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+                throws android.os.RemoteException {
+            return mRemote.unlinkToDeath(recipient);
+        }
+    }
+
+    public static abstract class Stub extends android.os.HwBinder implements IQcRilAudio {
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return this;
+        }
+
+        @Override
+        public final java.util.ArrayList<String> interfaceChain() {
+            return new java.util.ArrayList<String>(java.util.Arrays.asList(
+                    IQcRilAudio.kInterfaceName,
+                    android.hidl.base.V1_0.IBase.kInterfaceName));
+        }
+
+        @Override
+        public final String interfaceDescriptor() {
+            return IQcRilAudio.kInterfaceName;
+
+        }
+
+        @Override
+        public final java.util.ArrayList<byte[/* 32 */]> getHashChain() {
+            return new java.util.ArrayList<byte[/* 32 */]>(java.util.Arrays.asList(
+                    new byte[/* 32 */]{82,124,73,19,-39,-73,105,27,-122,26,21,28,-31,97,-125,53,-78,-16,31,83,-75,-74,-11,-65,-9,-8,-85,76,124,-116,-77,-9} /* 527c4913d9b7691b861a151ce1618335b2f01f53b5b6f5bff7f8ab4c7c8cb3f7 */,
+                    new byte[/* 32 */]{-67,-38,-74,24,77,122,52,109,-90,-96,125,-64,-126,-116,-15,-102,105,111,76,-86,54,17,-59,31,46,20,86,90,20,-76,15,-39} /* bddab6184d7a346da6a07dc0828cf19a696f4caa3611c51f2e14565a14b40fd9 */));
+
+        }
+
+        @Override
+        public final void setHALInstrumentation() {
+
+        }
+
+        @Override
+        public final boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie) {
+            return true;
+        }
+
+        @Override
+        public final void ping() {
+            return;
+
+        }
+
+        @Override
+        public final android.hidl.base.V1_0.DebugInfo getDebugInfo() {
+            android.hidl.base.V1_0.DebugInfo info = new android.hidl.base.V1_0.DebugInfo();
+            info.pid = -1;
+            info.ptr = 0;
+            info.arch = android.hidl.base.V1_0.DebugInfo.Architecture.UNKNOWN;return info;
+        }
+
+        @Override
+        public final void notifySyspropsChanged() {
+            android.os.SystemProperties.reportSyspropChanged();
+        }
+
+        @Override
+        public final boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient) {
+            return true;
+
+        }
+
+        @Override
+        public android.os.IHwInterface queryLocalInterface(String descriptor) {
+            if (kInterfaceName.equals(descriptor)) {
+                return this;
+            }
+            return null;
+        }
+
+        public void registerAsService(String serviceName) throws android.os.RemoteException {
+            registerService(serviceName);
+        }
+
+        @Override
+        public String toString() {
+            return this.interfaceDescriptor() + "@Stub";
+        }
+
+        @Override
+        public void onTransact(int _hidl_code, android.os.HwParcel _hidl_request, final android.os.HwParcel _hidl_reply, int _hidl_flags)
+                throws android.os.RemoteException {
+            switch (_hidl_code) {
+                case 1 /* setCallback */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudio.kInterfaceName);
+
+                    IQcRilAudioCallback iQcRilAudioCallback = IQcRilAudioCallback.asInterface(_hidl_request.readStrongBinder());
+                    setCallback(iQcRilAudioCallback);
+                    break;
+                }
+
+                case 2 /* setError */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudio.kInterfaceName);
+
+                    int error = _hidl_request.readInt32();
+                    setError(error);
+                    break;
+                }
+
+                case 256067662 /* interfaceChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<String> _hidl_out_descriptors = interfaceChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeStringVector(_hidl_out_descriptors);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256131655 /* debug */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256136003 /* interfaceDescriptor */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    String _hidl_out_descriptor = interfaceDescriptor();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_descriptor);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256398152 /* getHashChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain = getHashChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    {
+                        android.os.HwBlob _hidl_blob = new android.os.HwBlob(16 /* size */);
+                        {
+                            int _hidl_vec_size = _hidl_out_hashchain.size();
+                            _hidl_blob.putInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);
+                            _hidl_blob.putBool(0 /* offset */ + 12 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);
+                            android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * 32));
+                            for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                                {
+                                    long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                    for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                        childBlob.putInt8(_hidl_array_offset_1, _hidl_out_hashchain.get(_hidl_index_0)[_hidl_index_1_0]);
+                                        _hidl_array_offset_1 += 1;
+                                    }
+                                }
+                            }
+                            _hidl_blob.putBlob(0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);
+                        }
+                        _hidl_reply.writeBuffer(_hidl_blob);
+                    }
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256462420 /* setHALInstrumentation */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    setHALInstrumentation();
+                    break;
+                }
+
+                case 256660548 /* linkToDeath */:
+                {
+                break;
+                }
+
+                case 256921159 /* ping */:
+                {
+                break;
+                }
+
+                case 257049926 /* getDebugInfo */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    android.hidl.base.V1_0.DebugInfo _hidl_out_info = getDebugInfo();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_out_info.writeToParcel(_hidl_reply);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 257120595 /* notifySyspropsChanged */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    notifySyspropsChanged();
+                    break;
+                }
+
+                case 257250372 /* unlinkToDeath */:
+                {
+                break;
+                }
+
+            }
+        }
+    }
+}
diff --git a/Qualcomm/QtiAudio/src/vendor/qti/qcril/am/V1_0/IQcRilAudioCallback.java b/Qualcomm/QtiAudio/src/vendor/qti/qcril/am/V1_0/IQcRilAudioCallback.java
new file mode 100644
index 0000000..5be09c3
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/vendor/qti/qcril/am/V1_0/IQcRilAudioCallback.java
@@ -0,0 +1,504 @@
+package vendor.qti.qcril.am.V1_0;
+
+public interface IQcRilAudioCallback extends android.hidl.base.V1_0.IBase {
+    public static final String kInterfaceName = "vendor.qti.qcril.am@1.0::IQcRilAudioCallback";
+
+    /* package private */ static IQcRilAudioCallback asInterface(android.os.IHwBinder binder) {
+        if (binder == null) {
+            return null;
+        }
+
+        android.os.IHwInterface iface =
+                binder.queryLocalInterface(kInterfaceName);
+
+        if ((iface != null) && (iface instanceof IQcRilAudioCallback)) {
+            return (IQcRilAudioCallback)iface;
+        }
+
+        IQcRilAudioCallback proxy = new IQcRilAudioCallback.Proxy(binder);
+
+        try {
+            for (String descriptor : proxy.interfaceChain()) {
+                if (descriptor.equals(kInterfaceName)) {
+                    return proxy;
+                }
+            }
+        } catch (android.os.RemoteException e) {
+        }
+
+        return null;
+    }
+
+    public static IQcRilAudioCallback castFrom(android.os.IHwInterface iface) {
+        return (iface == null) ? null : IQcRilAudioCallback.asInterface(iface.asBinder());
+    }
+
+    @Override
+    public android.os.IHwBinder asBinder();
+
+    public static IQcRilAudioCallback getService(String serviceName) throws android.os.RemoteException {
+        return IQcRilAudioCallback.asInterface(android.os.HwBinder.getService("vendor.qti.qcril.am@1.0::IQcRilAudioCallback",serviceName));
+    }
+
+    public static IQcRilAudioCallback getService() throws android.os.RemoteException {
+        return IQcRilAudioCallback.asInterface(android.os.HwBinder.getService("vendor.qti.qcril.am@1.0::IQcRilAudioCallback","default"));
+    }
+
+    String getParameters(String str)
+        throws android.os.RemoteException;
+    int setParameters(String str)
+        throws android.os.RemoteException;
+    java.util.ArrayList<String> interfaceChain()
+        throws android.os.RemoteException;
+    String interfaceDescriptor()
+        throws android.os.RemoteException;
+    java.util.ArrayList<byte[/* 32 */]> getHashChain()
+        throws android.os.RemoteException;
+    void setHALInstrumentation()
+        throws android.os.RemoteException;
+    boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+        throws android.os.RemoteException;
+    void ping()
+        throws android.os.RemoteException;
+    android.hidl.base.V1_0.DebugInfo getDebugInfo()
+        throws android.os.RemoteException;
+    void notifySyspropsChanged()
+        throws android.os.RemoteException;
+    boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+        throws android.os.RemoteException;
+
+    public static final class Proxy implements IQcRilAudioCallback {
+        private android.os.IHwBinder mRemote;
+
+        public Proxy(android.os.IHwBinder remote) {
+            mRemote = java.util.Objects.requireNonNull(remote);
+        }
+
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return mRemote;
+        }
+
+        @Override
+        public String toString() {
+            try {
+                return this.interfaceDescriptor() + "@Proxy";
+            } catch (android.os.RemoteException ex) {
+                /* ignored; handled below. */
+            }
+            return "[class or subclass of " + IQcRilAudioCallback.kInterfaceName + "]@Proxy";
+        }
+
+        // Methods from ::vendor::qti::qcril::am::V1_0::IQcRilAudioCallback follow.
+        @Override
+        public String getParameters(String str)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudioCallback.kInterfaceName);
+            _hidl_request.writeString(str);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(1 /* getParameters */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_result = _hidl_reply.readString();
+                return _hidl_out_result;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public int setParameters(String str)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudioCallback.kInterfaceName);
+            _hidl_request.writeString(str);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(2 /* setParameters */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                int _hidl_out_success = _hidl_reply.readInt32();
+                return _hidl_out_success;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        // Methods from ::android::hidl::base::V1_0::IBase follow.
+        @Override
+        public java.util.ArrayList<String> interfaceChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256067662 /* interfaceChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<String> _hidl_out_descriptors = _hidl_reply.readStringVector();
+                return _hidl_out_descriptors;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public String interfaceDescriptor()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256136003 /* interfaceDescriptor */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_descriptor = _hidl_reply.readString();
+                return _hidl_out_descriptor;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public java.util.ArrayList<byte[/* 32 */]> getHashChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256398152 /* getHashChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain =  new java.util.ArrayList<byte[/* 32 */]>();
+                {
+                    android.os.HwBlob _hidl_blob = _hidl_reply.readBuffer(16 /* size */);
+                    {
+                        int _hidl_vec_size = _hidl_blob.getInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */);
+                        android.os.HwBlob childBlob = _hidl_reply.readEmbeddedBuffer(
+                                _hidl_vec_size * 32,_hidl_blob.handle(),
+                                0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */,true /* nullable */);
+
+                        _hidl_out_hashchain.clear();
+                        for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                            final byte[/* 32 */] _hidl_vec_element = new byte[32];
+                            {
+                                long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                    _hidl_vec_element[_hidl_index_1_0] = childBlob.getInt8(_hidl_array_offset_1);
+                                    _hidl_array_offset_1 += 1;
+                                }
+                            }
+                            _hidl_out_hashchain.add(_hidl_vec_element);
+                        }
+                    }
+                }
+                return _hidl_out_hashchain;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setHALInstrumentation()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256462420 /* setHALInstrumentation */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+                throws android.os.RemoteException {
+            return mRemote.linkToDeath(recipient, cookie);
+        }
+        @Override
+        public void ping()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256921159 /* ping */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public android.hidl.base.V1_0.DebugInfo getDebugInfo()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257049926 /* getDebugInfo */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                android.hidl.base.V1_0.DebugInfo _hidl_out_info = new android.hidl.base.V1_0.DebugInfo();
+                _hidl_out_info.readFromParcel(_hidl_reply);
+                return _hidl_out_info;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void notifySyspropsChanged()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257120595 /* notifySyspropsChanged */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+                throws android.os.RemoteException {
+            return mRemote.unlinkToDeath(recipient);
+        }
+    }
+
+    public static abstract class Stub extends android.os.HwBinder implements IQcRilAudioCallback {
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return this;
+        }
+
+        @Override
+        public final java.util.ArrayList<String> interfaceChain() {
+            return new java.util.ArrayList<String>(java.util.Arrays.asList(
+                    IQcRilAudioCallback.kInterfaceName,
+                    android.hidl.base.V1_0.IBase.kInterfaceName));
+        }
+
+        @Override
+        public final String interfaceDescriptor() {
+            return IQcRilAudioCallback.kInterfaceName;
+
+        }
+
+        @Override
+        public final java.util.ArrayList<byte[/* 32 */]> getHashChain() {
+            return new java.util.ArrayList<byte[/* 32 */]>(java.util.Arrays.asList(
+                    new byte[/* 32 */]{22,71,-88,81,-45,-109,-85,-22,53,113,-87,-70,-10,95,-8,67,61,-23,36,43,97,41,40,122,-128,-85,108,-33,4,101,-120,-97} /* 1647a851d393abea3571a9baf65ff8433de9242b6129287a80ab6cdf0465889f */,
+                    new byte[/* 32 */]{-67,-38,-74,24,77,122,52,109,-90,-96,125,-64,-126,-116,-15,-102,105,111,76,-86,54,17,-59,31,46,20,86,90,20,-76,15,-39} /* bddab6184d7a346da6a07dc0828cf19a696f4caa3611c51f2e14565a14b40fd9 */));
+
+        }
+
+        @Override
+        public final void setHALInstrumentation() {
+
+        }
+
+        @Override
+        public final boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie) {
+            return true;
+        }
+
+        @Override
+        public final void ping() {
+            return;
+
+        }
+
+        @Override
+        public final android.hidl.base.V1_0.DebugInfo getDebugInfo() {
+            android.hidl.base.V1_0.DebugInfo info = new android.hidl.base.V1_0.DebugInfo();
+            info.pid = -1;
+            info.ptr = 0;
+            info.arch = android.hidl.base.V1_0.DebugInfo.Architecture.UNKNOWN;return info;
+        }
+
+        @Override
+        public final void notifySyspropsChanged() {
+            android.os.SystemProperties.reportSyspropChanged();
+        }
+
+        @Override
+        public final boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient) {
+            return true;
+
+        }
+
+        @Override
+        public android.os.IHwInterface queryLocalInterface(String descriptor) {
+            if (kInterfaceName.equals(descriptor)) {
+                return this;
+            }
+            return null;
+        }
+
+        public void registerAsService(String serviceName) throws android.os.RemoteException {
+            registerService(serviceName);
+        }
+
+        @Override
+        public String toString() {
+            return this.interfaceDescriptor() + "@Stub";
+        }
+
+        @Override
+        public void onTransact(int _hidl_code, android.os.HwParcel _hidl_request, final android.os.HwParcel _hidl_reply, int _hidl_flags)
+                throws android.os.RemoteException {
+            switch (_hidl_code) {
+                case 1 /* getParameters */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudioCallback.kInterfaceName);
+
+                    String str = _hidl_request.readString();
+                    String _hidl_out_result = getParameters(str);
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_result);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 2 /* setParameters */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudioCallback.kInterfaceName);
+
+                    String str = _hidl_request.readString();
+                    int _hidl_out_success = setParameters(str);
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeInt32(_hidl_out_success);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256067662 /* interfaceChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<String> _hidl_out_descriptors = interfaceChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeStringVector(_hidl_out_descriptors);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256131655 /* debug */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256136003 /* interfaceDescriptor */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    String _hidl_out_descriptor = interfaceDescriptor();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_descriptor);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256398152 /* getHashChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain = getHashChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    {
+                        android.os.HwBlob _hidl_blob = new android.os.HwBlob(16 /* size */);
+                        {
+                            int _hidl_vec_size = _hidl_out_hashchain.size();
+                            _hidl_blob.putInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);
+                            _hidl_blob.putBool(0 /* offset */ + 12 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);
+                            android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * 32));
+                            for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                                {
+                                    long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                    for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                        childBlob.putInt8(_hidl_array_offset_1, _hidl_out_hashchain.get(_hidl_index_0)[_hidl_index_1_0]);
+                                        _hidl_array_offset_1 += 1;
+                                    }
+                                }
+                            }
+                            _hidl_blob.putBlob(0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);
+                        }
+                        _hidl_reply.writeBuffer(_hidl_blob);
+                    }
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256462420 /* setHALInstrumentation */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    setHALInstrumentation();
+                    break;
+                }
+
+                case 256660548 /* linkToDeath */:
+                {
+                break;
+                }
+
+                case 256921159 /* ping */:
+                {
+                break;
+                }
+
+                case 257049926 /* getDebugInfo */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    android.hidl.base.V1_0.DebugInfo _hidl_out_info = getDebugInfo();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_out_info.writeToParcel(_hidl_reply);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 257120595 /* notifySyspropsChanged */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    notifySyspropsChanged();
+                    break;
+                }
+
+                case 257250372 /* unlinkToDeath */:
+                {
+                break;
+                }
+
+            }
+        }
+    }
+}
