Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 517a1327 authored by Nathalie Le Clair's avatar Nathalie Le Clair
Browse files

Add AudioDeviceAttributes as argument to AudioManager API

NoNonSdkCheck: This CL changes the arguments of an existing API that was
annotated already.
Bug: 199846845
Test: atest AidlConversionUnitTests

Change-Id: I90a24c0428d9c77ccd45dff65bbdad198aa81fb2
parent 4e27963e
Loading
Loading
Loading
Loading
+30 −21
Original line number Diff line number Diff line
@@ -18,25 +18,25 @@
//#define LOG_NDEBUG 0

#define LOG_TAG "AudioSystem-JNI"
#include <utils/Log.h>

#include <sstream>
#include <vector>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"

#include <android/media/AudioVibratorInfo.h>
#include <android/media/INativeSpatializerCallback.h>
#include <android/media/ISpatializer.h>
#include <android_os_Parcel.h>
#include <audiomanager/AudioManager.h>
#include <jni.h>
#include <media/AudioContainers.h>
#include <media/AudioPolicy.h>
#include <media/AudioSystem.h>
#include <media/MicrophoneInfo.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedLocalRef.h>
#include <system/audio.h>
#include <system/audio_policy.h>
#include <utils/Log.h>

#include <sstream>
#include <vector>

#include "android_media_AudioAttributes.h"
#include "android_media_AudioDescriptor.h"
#include "android_media_AudioDeviceAttributes.h"
@@ -46,6 +46,7 @@
#include "android_media_AudioProfile.h"
#include "android_media_MicrophoneInfo.h"
#include "android_util_Binder.h"
#include "core_jni_helpers.h"

// ----------------------------------------------------------------------------

@@ -578,18 +579,26 @@ android_media_AudioSystem_routing_callback()
    env->DeleteLocalRef(clazz);
}

static jint
android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address, jstring device_name,
                                                   jint codec)
{
    const char *c_address = env->GetStringUTFChars(device_address, NULL);
    const char *c_name = env->GetStringUTFChars(device_name, NULL);
    int status = check_AudioSystem_Command(AudioSystem::setDeviceConnectionState(static_cast <audio_devices_t>(device),
                                          static_cast <audio_policy_dev_state_t>(state),
                                          c_address, c_name,
static jint android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz,
                                                               jint state, jobject jParcel,
                                                               jint codec) {
    int status;
    if (Parcel *parcel = parcelForJavaObject(env, jParcel); parcel != nullptr) {
        android::media::audio::common::AudioPort port{};
        if (status_t statusOfParcel = port.readFromParcel(parcel); statusOfParcel == OK) {
            status = check_AudioSystem_Command(
                    AudioSystem::setDeviceConnectionState(static_cast<audio_policy_dev_state_t>(
                                                                  state),
                                                          port,
                                                          static_cast<audio_format_t>(codec)));
    env->ReleaseStringUTFChars(device_address, c_address);
    env->ReleaseStringUTFChars(device_name, c_name);
        } else {
            ALOGE("Failed to read from parcel: %s", statusToString(statusOfParcel).c_str());
            status = kAudioStatusError;
        }
    } else {
        ALOGE("Failed to retrieve the native parcel from Java parcel");
        status = kAudioStatusError;
    }
    return (jint) status;
}

@@ -2830,7 +2839,7 @@ static const JNINativeMethod gMethods[] =
         {"newAudioSessionId", "()I", (void *)android_media_AudioSystem_newAudioSessionId},
         {"newAudioPlayerId", "()I", (void *)android_media_AudioSystem_newAudioPlayerId},
         {"newAudioRecorderId", "()I", (void *)android_media_AudioSystem_newAudioRecorderId},
         {"setDeviceConnectionState", "(IILjava/lang/String;Ljava/lang/String;I)I",
         {"setDeviceConnectionState", "(ILandroid/os/Parcel;I)I",
          (void *)android_media_AudioSystem_setDeviceConnectionState},
         {"getDeviceConnectionState", "(ILjava/lang/String;)I",
          (void *)android_media_AudioSystem_getDeviceConnectionState},
+12 −1
Original line number Diff line number Diff line
@@ -166,10 +166,21 @@ public final class AudioDeviceAttributes implements Parcelable {
     * @param address the address of the device, or an empty string for devices without one
     */
    public AudioDeviceAttributes(int nativeType, @NonNull String address) {
        this(nativeType, address, "");
    }

    /**
     * @hide
     * Constructor called from BtHelper to connect or disconnect a Bluetooth device.
     * @param nativeType the internal device type, as defined in {@link AudioSystem}
     * @param address the address of the device, or an empty string for devices without one
     * @param name the name of the device, or an empty string for devices without one
     */
    public AudioDeviceAttributes(int nativeType, @NonNull String address, @NonNull String name) {
        mRole = (nativeType & AudioSystem.DEVICE_BIT_IN) != 0 ? ROLE_INPUT : ROLE_OUTPUT;
        mType = AudioDeviceInfo.convertInternalDeviceToDeviceType(nativeType);
        mAddress = address;
        mName = "";
        mName = name;
        mNativeType = nativeType;
        mAudioProfiles = new ArrayList<>();
        mAudioDescriptors = new ArrayList<>();
+22 −3
Original line number Diff line number Diff line
@@ -5860,10 +5860,29 @@ public class AudioManager {
     */
    @UnsupportedAppUsage
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public void setWiredDeviceConnectionState(int type, int state, String address, String name) {
    public void setWiredDeviceConnectionState(int device, int state, String address,
            String name) {
        final IAudioService service = getService();
        int role = isOutputDevice(device)
                ? AudioDeviceAttributes.ROLE_OUTPUT : AudioDeviceAttributes.ROLE_INPUT;
        AudioDeviceAttributes attributes = new AudioDeviceAttributes(
                role, AudioDeviceInfo.convertInternalDeviceToDeviceType(device), address,
                name, new ArrayList<>()/*mAudioProfiles*/, new ArrayList<>()/*mAudioDescriptors*/);
        setWiredDeviceConnectionState(attributes, state);
    }

    /**
     * Indicate wired accessory connection state change and attributes.
     * @param state      new connection state: 1 connected, 0 disconnected
     * @param attributes attributes of the connected device
     * {@hide}
     */
    @UnsupportedAppUsage
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public void setWiredDeviceConnectionState(AudioDeviceAttributes attributes, int state) {
        final IAudioService service = getService();
        try {
            service.setWiredDeviceConnectionState(type, state, address, name,
            service.setWiredDeviceConnectionState(attributes, state,
                    mApplicationContext.getOpPackageName());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
+20 −3
Original line number Diff line number Diff line
@@ -26,10 +26,12 @@ import android.bluetooth.BluetoothLeAudioCodecConfig;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.audio.common.AidlConversion;
import android.media.audiofx.AudioEffect;
import android.media.audiopolicy.AudioMix;
import android.os.Build;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -1542,9 +1544,24 @@ public class AudioSystem
     *     {@link #AUDIO_STATUS_ERROR} or {@link #AUDIO_STATUS_SERVER_DIED}
     */
    @UnsupportedAppUsage
    public static native int setDeviceConnectionState(int device, int state,
                                                      String device_address, String device_name,
                                                      int codecFormat);
    public static int setDeviceConnectionState(AudioDeviceAttributes attributes, int state,
            int codecFormat) {
        android.media.audio.common.AudioPort port =
                AidlConversion.api2aidl_AudioDeviceAttributes_AudioPort(attributes);
        Parcel parcel = Parcel.obtain();
        port.writeToParcel(parcel, 0);
        parcel.setDataPosition(0);
        try {
            return setDeviceConnectionState(state, parcel, codecFormat);
        } finally {
            parcel.recycle();
        }
    }
    /**
     * @hide
     */
    @UnsupportedAppUsage
    public static native int setDeviceConnectionState(int state, Parcel parcel, int codecFormat);
    /** @hide */
    @UnsupportedAppUsage
    public static native int getDeviceConnectionState(int device, String device_address);
+1 −2
Original line number Diff line number Diff line
@@ -215,8 +215,7 @@ interface IAudioService {
    IRingtonePlayer getRingtonePlayer();
    int getUiSoundsStreamType();

    void setWiredDeviceConnectionState(int type, int state, String address, String name,
            String caller);
    void setWiredDeviceConnectionState(in AudioDeviceAttributes aa, int state, String caller);

    @UnsupportedAppUsage
    AudioRoutesInfo startWatchingRoutes(in IAudioRoutesObserver observer);
Loading