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

Commit 82d1f458 authored by Eric Laurent's avatar Eric Laurent
Browse files

Spatializer: add tests for latency mode selection

Bug: 323905633
Bug: 324068114
Test: adb shell /data/nativetest64/spatializer_tests/spatializer_tests
Change-Id: Ie2b6fee0ca56643c99e488d646c2180a451b7790
parent e449a0e8
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -46,6 +46,9 @@
          "include-filter": "com.google.android.gts.audio.AudioPolicyHostTest"
        }
      ]
    },
    {
      "name": "spatializer_tests"
    }
  ]
}
+6 −0
Original line number Diff line number Diff line
@@ -107,3 +107,9 @@ cc_library {
        "framework-permission-aidl-cpp",
    ],
}

cc_library_headers {
    name: "libaudiopolicyservice_headers",
    host_supported: true,
    export_include_dirs: ["."],
}
+4 −4
Original line number Diff line number Diff line
@@ -1096,7 +1096,7 @@ audio_latency_mode_t Spatializer::selectHeadtrackingConnectionMode_l() {
}

void Spatializer::checkSensorsState_l() {
    audio_latency_mode_t requestedLatencyMode = AUDIO_LATENCY_MODE_FREE;
    mRequestedLatencyMode = AUDIO_LATENCY_MODE_FREE;
    const bool supportsSetLatencyMode = !mSupportedLatencyModes.empty();
    bool supportsLowLatencyMode;
    if (com::android::media::audio::dsa_over_bt_le_audio()) {
@@ -1117,7 +1117,7 @@ void Spatializer::checkSensorsState_l() {
                    && mDesiredHeadTrackingMode != HeadTrackingMode::STATIC
                    && mHeadSensor != SpatializerPoseController::INVALID_SENSOR) {
                if (supportsLowLatencyMode) {
                    requestedLatencyMode = selectHeadtrackingConnectionMode_l();
                    mRequestedLatencyMode = selectHeadtrackingConnectionMode_l();
                }
                if (mEngine != nullptr) {
                    setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
@@ -1139,9 +1139,9 @@ void Spatializer::checkSensorsState_l() {
    }
    if (mOutput != AUDIO_IO_HANDLE_NONE && supportsSetLatencyMode) {
        const status_t status =
                AudioSystem::setRequestedLatencyMode(mOutput, requestedLatencyMode);
                AudioSystem::setRequestedLatencyMode(mOutput, mRequestedLatencyMode);
        ALOGD("%s: setRequestedLatencyMode for output thread(%d) to %s returned %d", __func__,
              mOutput, toString(requestedLatencyMode).c_str(), status);
              mOutput, toString(mRequestedLatencyMode).c_str(), status);
    }
}

+45 −3
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <audio_utils/SimpleLog.h>
#include <math.h>
#include <media/AudioEffect.h>
#include <media/MediaMetricsItem.h>
#include <media/audiohal/EffectsFactoryHalInterface.h>
#include <media/VectorRecorder.h>
#include <media/audiohal/EffectHalInterface.h>
@@ -153,6 +154,34 @@ class Spatializer : public media::BnSpatializer,
        return mLevel;
    }

    /** For test only */
    std::unordered_set<media::audio::common::HeadTracking::ConnectionMode>
            getSupportedHeadtrackingConnectionModes() const {
        return mSupportedHeadtrackingConnectionModes;
    }

    /** For test only */
    media::audio::common::HeadTracking::ConnectionMode getHeadtrackingConnectionMode() const {
        return mHeadtrackingConnectionMode;
    }

    /** For test only */
    std::vector<audio_latency_mode_t> getSupportedLatencyModes() const {
        audio_utils::lock_guard lock(mMutex);
        return mSupportedLatencyModes;
    }

    /** For test only */
    std::vector<audio_latency_mode_t> getOrderedLowLatencyModes() const {
        return mOrderedLowLatencyModes;
    }

    /** For test only */
    audio_latency_mode_t getRequestedLatencyMode() const {
        audio_utils::lock_guard lock(mMutex);
        return mRequestedLatencyMode;
    }

    /** Called by audio policy service when the special output mixer dedicated to spatialization
     * is opened and the spatializer engine must be created.
     */
@@ -164,6 +193,12 @@ class Spatializer : public media::BnSpatializer,
    /** Returns the output stream the spatializer is attached to. */
    audio_io_handle_t getOutput() const { audio_utils::lock_guard lock(mMutex); return mOutput; }

    /** For test only */
    void setOutput(audio_io_handle_t output) {
        audio_utils::lock_guard lock(mMutex);
        mOutput = output;
    }

    void updateActiveTracks(size_t numActiveTracks);

    /** Gets the channel mask, sampling rate and format set for the spatializer input. */
@@ -188,6 +223,10 @@ class Spatializer : public media::BnSpatializer,
    // NO_INIT: Spatializer creation failed.
    static void sendEmptyCreateSpatializerMetricWithStatus(status_t status);

    /** Made public for test only */
    void onSupportedLatencyModesChangedMsg(
            audio_io_handle_t output, std::vector<audio_latency_mode_t>&& modes);

private:
    Spatializer(effect_descriptor_t engineDescriptor,
                     SpatializerPolicyCallback *callback);
@@ -200,8 +239,6 @@ private:

    void onHeadToStagePoseMsg(const std::vector<float>& headToStage);
    void onActualModeChangeMsg(media::HeadTrackingMode mode);
    void onSupportedLatencyModesChangedMsg(
            audio_io_handle_t output, std::vector<audio_latency_mode_t>&& modes);

    static constexpr int kMaxEffectParamValues = 10;
    /**
@@ -484,9 +521,11 @@ private:
    std::vector<media::audio::common::Spatialization::Mode> mSpatializationModes;
    std::vector<audio_channel_mask_t> mChannelMasks;
    bool mSupportsHeadTracking;

    /** List of supported head tracking connection modes reported by the spatializer.
     * If the list is empty, the spatializer does not support any optional connection
     * mode and mode HeadTracking::ConnectionMode::FRAMEWORK_PROCESSED is assumed.
     * This is set in the factory constructor and can be accessed without mutex.
     */
    std::unordered_set<media::audio::common::HeadTracking::ConnectionMode>
            mSupportedHeadtrackingConnectionModes;
@@ -504,6 +543,9 @@ private:
    std::vector<audio_latency_mode_t> mSupportedLatencyModes GUARDED_BY(mMutex);
    /** preference order for low latency modes according to persist.bluetooth.hid.transport */
    std::vector<audio_latency_mode_t> mOrderedLowLatencyModes;

    audio_latency_mode_t mRequestedLatencyMode GUARDED_BY(mMutex) = AUDIO_LATENCY_MODE_FREE;

    /** string to latency mode map used to parse bluetooth.core.le.dsa_transport_preference */
    static const std::map<std::string, audio_latency_mode_t> sStringToLatencyModeMap;
    static const std::vector<const char*> sHeadPoseKeys;
+37 −0
Original line number Diff line number Diff line
@@ -108,3 +108,40 @@ cc_test {
    test_suites: ["device-tests"],

}

cc_test {
    name: "spatializer_tests",

    defaults: [
        "latest_android_media_audio_common_types_cpp_shared",
        "libaudiopolicyservice_dependencies",
    ],

    require_root: true,

    shared_libs: [
        "libaudioclient",
        "libaudiofoundation",
        "libcutils",
        "liblog",
    ],

    static_libs: [
        "libaudiopolicyservice",
    ],

    header_libs: [
          "libaudiohal_headers",
          "libaudiopolicyservice_headers",
          "libmediametrics_headers",
    ],

    srcs: ["spatializer_tests.cpp"],

    cflags: [
        "-Wall",
        "-Werror",
    ],

    test_suites: ["device-tests"],
}
Loading