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

Commit 177b9f71 authored by Mikhail Naganov's avatar Mikhail Naganov Committed by Gerrit Code Review
Browse files

Merge "Add remote submix direct paths" into main

parents 1c6aa922 ce9767a9
Loading
Loading
Loading
Loading
+40 −6
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ using aidl::android::media::audio::common::AudioDeviceType;
using aidl::android::media::audio::common::AudioFormatDescription;
using aidl::android::media::audio::common::AudioFormatType;
using aidl::android::media::audio::common::AudioGainConfig;
using aidl::android::media::audio::common::AudioInputFlags;
using aidl::android::media::audio::common::AudioIoFlags;
using aidl::android::media::audio::common::AudioOutputFlags;
using aidl::android::media::audio::common::AudioPort;
@@ -321,20 +322,25 @@ std::unique_ptr<Configuration> getPrimaryConfiguration() {
//
// Mix ports:
//  * "r_submix output", maximum 10 opened streams, maximum 10 active streams
//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000
//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
//  * "r_submix input", maximum 10 opened streams, maximum 10 active streams
//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000
//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
//  * "r_submix output direct", DIRECT|IEC958_NONAUDIO, 1 max open, 1 max active
//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000
//  * "r_submix input direct", DIRECT, 1 max open, 1 max active
//    - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000, 192000

//
// Routes:
//  "r_submix output" -> "Remote Submix Out"
//  "Remote Submix In" -> "r_submix input"
//  "r_submix output", "r_submix output direct" -> "Remote Submix Out"
//  "Remote Submix In" -> "r_submix input", "r_submix input direct"
//
std::unique_ptr<Configuration> getRSubmixConfiguration() {
    static const Configuration configuration = []() {
        Configuration c;
        const std::vector<AudioProfile> remoteSubmixPcmAudioProfiles{
                createProfile(PcmType::INT_16_BIT, {AudioChannelLayout::LAYOUT_STEREO},
                              {8000, 11025, 16000, 32000, 44100, 48000})};
                              {8000, 11025, 16000, 32000, 44100, 48000, 192000})};

        // Device ports

@@ -359,13 +365,41 @@ std::unique_ptr<Configuration> getRSubmixConfiguration() {
        rsubmixOutMix.profiles = remoteSubmixPcmAudioProfiles;
        c.ports.push_back(rsubmixOutMix);

        // Adding a DIRECT flag to rsubmixInMix breaks the mixer paths, so we need separate
        // non direct and direct paths. It is added because for IEC61937 encapsulated over PCM, we
        // need the DIRECT and IEC958_NONAUDIO flags as AudioFlinger adds them.
        AudioPort rsubmixOutDirectMix =
                createPort(c.nextPortId++, "r_submix output direct",
                                makeBitPositionFlagMask({
                                        AudioOutputFlags::DIRECT,
                                        AudioOutputFlags::IEC958_NONAUDIO}),
                                false /* isInput */,
                                createPortMixExt(1 /* maxOpenStreamCount */,
                                                 1 /* maxActiveStreamCount */));
        rsubmixOutDirectMix.profiles = remoteSubmixPcmAudioProfiles;
        c.ports.push_back(rsubmixOutDirectMix);

        AudioPort rsubmixInMix =
                createPort(c.nextPortId++, "r_submix input", 0, true, createPortMixExt(10, 10));
        rsubmixInMix.profiles = remoteSubmixPcmAudioProfiles;
        c.ports.push_back(rsubmixInMix);

        c.routes.push_back(createRoute({rsubmixOutMix}, rsubmixOutDevice));
        // Adding a DIRECT flag to rsubmixInMix breaks the capture paths, so we need separate
        // non direct and direct paths. It is added because for IEC61937 encapsulated over PCM, we
        // need the DIRECT flag for the capability so AudioFlinger can find a DIRECT input match.
        AudioPort rsubmixInDirectMix =
                createPort(c.nextPortId++, "r_submix input direct",
                                makeBitPositionFlagMask({AudioInputFlags::DIRECT}),
                                true /* isInput */,
                                createPortMixExt(1 /* maxOpenStreamCount */,
                                                 1 /* maxActiveStreamCount */));
        rsubmixInDirectMix.profiles = remoteSubmixPcmAudioProfiles;
        c.ports.push_back(rsubmixInDirectMix);

        c.routes.push_back(createRoute(
                {rsubmixOutMix, rsubmixOutDirectMix}, rsubmixOutDevice));
        c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInMix));
        c.routes.push_back(createRoute({rsubmixInDevice}, rsubmixInDirectMix));

        return c;
    }();
+9 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@

using aidl::android::hardware::audio::common::SinkMetadata;
using aidl::android::hardware::audio::common::SourceMetadata;
using aidl::android::media::audio::common::AudioFormatType;
using aidl::android::media::audio::common::AudioOffloadInfo;
using aidl::android::media::audio::common::AudioPort;
using aidl::android::media::audio::common::AudioPortConfig;
@@ -47,6 +48,10 @@ ndk::ScopedAStatus ModuleRemoteSubmix::setMicMute(bool in_mute __unused) {
ndk::ScopedAStatus ModuleRemoteSubmix::createInputStream(
        StreamContext&& context, const SinkMetadata& sinkMetadata,
        const std::vector<MicrophoneInfo>& microphones, std::shared_ptr<StreamIn>* result) {
    if (context.getFormat().type != AudioFormatType::PCM) {
        LOG(DEBUG) << __func__ << ": not supported for format " << context.getFormat().toString();
        return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
    }
    return createStreamInstance<StreamInRemoteSubmix>(result, std::move(context), sinkMetadata,
                                                      microphones);
}
@@ -54,6 +59,10 @@ ndk::ScopedAStatus ModuleRemoteSubmix::createInputStream(
ndk::ScopedAStatus ModuleRemoteSubmix::createOutputStream(
        StreamContext&& context, const SourceMetadata& sourceMetadata,
        const std::optional<AudioOffloadInfo>& offloadInfo, std::shared_ptr<StreamOut>* result) {
    if (context.getFormat().type != AudioFormatType::PCM) {
        LOG(DEBUG) << __func__ << ": not supported for format " << context.getFormat().toString();
        return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
    }
    return createStreamInstance<StreamOutRemoteSubmix>(result, std::move(context), sourceMetadata,
                                                       offloadInfo);
}