blob: 504c0fdf964fda668ddf5685d63dc45e6309b05d [file] [log] [blame]
Mikhail Naganove5d747e2021-11-16 01:31:03 +00001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <optional>
20#include <set>
21#include <utility>
22#include <vector>
23
Mikhail Naganovf84d6402022-06-16 00:35:31 +000024#include <aidl/android/hardware/audio/core/AudioRoute.h>
25#include <aidl/android/hardware/audio/core/IModule.h>
26#include <aidl/android/media/audio/common/AudioPort.h>
Mikhail Naganove5d747e2021-11-16 01:31:03 +000027
28class ModuleConfig {
29 public:
Mikhail Naganovf84d6402022-06-16 00:35:31 +000030 using SrcSinkPair = std::pair<aidl::android::media::audio::common::AudioPortConfig,
31 aidl::android::media::audio::common::AudioPortConfig>;
Mikhail Naganove5d747e2021-11-16 01:31:03 +000032 using SrcSinkGroup =
Mikhail Naganovf84d6402022-06-16 00:35:31 +000033 std::pair<aidl::android::hardware::audio::core::AudioRoute, std::vector<SrcSinkPair>>;
Mikhail Naganove5d747e2021-11-16 01:31:03 +000034
Mikhail Naganovf84d6402022-06-16 00:35:31 +000035 explicit ModuleConfig(aidl::android::hardware::audio::core::IModule* module);
36 const ndk::ScopedAStatus& getStatus() const { return mStatus; }
37 std::string getError() const { return mStatus.getMessage(); }
Mikhail Naganove5d747e2021-11-16 01:31:03 +000038
Mikhail Naganovf84d6402022-06-16 00:35:31 +000039 std::vector<aidl::android::media::audio::common::AudioPort> getAttachedDevicePorts() const;
40 std::vector<aidl::android::media::audio::common::AudioPort> getExternalDevicePorts() const;
41 std::vector<aidl::android::media::audio::common::AudioPort> getInputMixPorts() const;
42 std::vector<aidl::android::media::audio::common::AudioPort> getOutputMixPorts() const;
43 std::vector<aidl::android::media::audio::common::AudioPort> getMixPorts(bool isInput) const {
Mikhail Naganove5d747e2021-11-16 01:31:03 +000044 return isInput ? getInputMixPorts() : getOutputMixPorts();
45 }
46
Mikhail Naganovf84d6402022-06-16 00:35:31 +000047 std::vector<aidl::android::media::audio::common::AudioPort> getAttachedDevicesPortsForMixPort(
48 bool isInput, const aidl::android::media::audio::common::AudioPort& mixPort) const {
Mikhail Naganove5d747e2021-11-16 01:31:03 +000049 return isInput ? getAttachedSourceDevicesPortsForMixPort(mixPort)
50 : getAttachedSinkDevicesPortsForMixPort(mixPort);
51 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +000052 std::vector<aidl::android::media::audio::common::AudioPort>
53 getAttachedSinkDevicesPortsForMixPort(
54 const aidl::android::media::audio::common::AudioPort& mixPort) const;
55 std::vector<aidl::android::media::audio::common::AudioPort>
56 getAttachedSourceDevicesPortsForMixPort(
57 const aidl::android::media::audio::common::AudioPort& mixPort) const;
58 std::optional<aidl::android::media::audio::common::AudioPort>
59 getSourceMixPortForAttachedDevice() const;
Mikhail Naganove5d747e2021-11-16 01:31:03 +000060
61 std::optional<SrcSinkPair> getNonRoutableSrcSinkPair(bool isInput) const;
62 std::optional<SrcSinkPair> getRoutableSrcSinkPair(bool isInput) const;
63 std::vector<SrcSinkGroup> getRoutableSrcSinkGroups(bool isInput) const;
64
Mikhail Naganovf84d6402022-06-16 00:35:31 +000065 std::vector<aidl::android::media::audio::common::AudioPortConfig>
Mikhail Naganov00603d12022-05-02 22:52:13 +000066 getPortConfigsForAttachedDevicePorts() const {
67 return generateAudioDevicePortConfigs(getAttachedDevicePorts(), false);
68 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +000069 std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts()
70 const {
Mikhail Naganove5d747e2021-11-16 01:31:03 +000071 auto inputs = generateInputAudioMixPortConfigs(getInputMixPorts(), false);
72 auto outputs = generateOutputAudioMixPortConfigs(getOutputMixPorts(), false);
73 inputs.insert(inputs.end(), outputs.begin(), outputs.end());
74 return inputs;
75 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +000076 std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts(
Mikhail Naganove5d747e2021-11-16 01:31:03 +000077 bool isInput) const {
78 return isInput ? generateInputAudioMixPortConfigs(getInputMixPorts(), false)
79 : generateOutputAudioMixPortConfigs(getOutputMixPorts(), false);
80 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +000081 std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForMixPorts(
82 bool isInput, const aidl::android::media::audio::common::AudioPort& port) const {
Mikhail Naganove5d747e2021-11-16 01:31:03 +000083 return isInput ? generateInputAudioMixPortConfigs({port}, false)
84 : generateOutputAudioMixPortConfigs({port}, false);
85 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +000086 std::optional<aidl::android::media::audio::common::AudioPortConfig> getSingleConfigForMixPort(
Mikhail Naganove5d747e2021-11-16 01:31:03 +000087 bool isInput) const {
88 const auto config = isInput ? generateInputAudioMixPortConfigs(getInputMixPorts(), true)
89 : generateOutputAudioMixPortConfigs(getOutputMixPorts(), true);
90 // TODO: Avoid returning configs for offload since they require an extra
91 // argument to openOutputStream.
92 if (!config.empty()) {
93 return *config.begin();
94 } else {
95 return {};
96 }
97 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +000098 std::optional<aidl::android::media::audio::common::AudioPortConfig> getSingleConfigForMixPort(
99 bool isInput, const aidl::android::media::audio::common::AudioPort& port) const {
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000100 const auto config = isInput ? generateInputAudioMixPortConfigs({port}, true)
101 : generateOutputAudioMixPortConfigs({port}, true);
102 if (!config.empty()) {
103 return *config.begin();
104 } else {
105 return {};
106 }
107 }
108
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000109 std::vector<aidl::android::media::audio::common::AudioPortConfig> getPortConfigsForDevicePort(
110 const aidl::android::media::audio::common::AudioPort& port) const {
Mikhail Naganov00603d12022-05-02 22:52:13 +0000111 return generateAudioDevicePortConfigs({port}, false);
112 }
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000113 aidl::android::media::audio::common::AudioPortConfig getSingleConfigForDevicePort(
114 const aidl::android::media::audio::common::AudioPort& port) const {
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000115 const auto config = generateAudioDevicePortConfigs({port}, true);
116 return *config.begin();
117 }
118
Mikhail Naganov00603d12022-05-02 22:52:13 +0000119 std::string toString() const;
120
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000121 private:
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000122 std::vector<aidl::android::media::audio::common::AudioPortConfig>
123 generateInputAudioMixPortConfigs(
124 const std::vector<aidl::android::media::audio::common::AudioPort>& ports,
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000125 bool singleProfile) const;
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000126 std::vector<aidl::android::media::audio::common::AudioPortConfig>
127 generateOutputAudioMixPortConfigs(
128 const std::vector<aidl::android::media::audio::common::AudioPort>& ports,
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000129 bool singleProfile) const;
130
131 // Unlike MixPorts, the generator for DevicePorts always returns a non-empty
132 // vector for a non-empty input port list. If there are no profiles in the
Mikhail Naganov00603d12022-05-02 22:52:13 +0000133 // port, its initial configs are looked up, if there are none,
134 // then an empty config is used, assuming further negotiation via setAudioPortConfig.
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000135 std::vector<aidl::android::media::audio::common::AudioPortConfig>
136 generateAudioDevicePortConfigs(
137 const std::vector<aidl::android::media::audio::common::AudioPort>& ports,
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000138 bool singleProfile) const;
139
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000140 ndk::ScopedAStatus mStatus = ndk::ScopedAStatus::ok();
141 std::vector<aidl::android::media::audio::common::AudioPort> mPorts;
142 std::vector<aidl::android::media::audio::common::AudioPortConfig> mInitialConfigs;
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000143 std::set<int32_t> mAttachedSinkDevicePorts;
144 std::set<int32_t> mAttachedSourceDevicePorts;
Mikhail Naganov00603d12022-05-02 22:52:13 +0000145 std::set<int32_t> mExternalDevicePorts;
Mikhail Naganovf84d6402022-06-16 00:35:31 +0000146 std::vector<aidl::android::hardware::audio::core::AudioRoute> mRoutes;
Mikhail Naganove5d747e2021-11-16 01:31:03 +0000147};