diff --git a/audio/aidl/default/Configuration.cpp b/audio/aidl/default/Configuration.cpp index 6d5357bf39..7b2deb7431 100644 --- a/audio/aidl/default/Configuration.cpp +++ b/audio/aidl/default/Configuration.cpp @@ -393,4 +393,73 @@ std::unique_ptr getRSubmixConfiguration() { return std::make_unique(configuration); } +// Usb configuration: +// +// Device ports: +// * "USB Headset Out", OUT_HEADSET, CONNECTION_USB +// - no profiles specified +// * "USB Headset In", IN_HEADSET, CONNECTION_USB +// - no profiles specified +// +// Mix ports: +// * "usb_headset output", 1 max open, 1 max active stream +// - no profiles specified +// * "usb_headset input", 1 max open, 1 max active stream +// - no profiles specified +// +// Profiles for device port connected state: +// * USB Headset Out": +// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000 +// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000 +// * USB Headset In": +// - profile PCM 16-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000 +// - profile PCM 24-bit; MONO, STEREO, INDEX_MASK_1, INDEX_MASK_2; 44100, 48000 +// +std::unique_ptr getUsbConfiguration() { + static const Configuration configuration = []() { + const std::vector standardPcmAudioProfiles = { + createProfile(PcmType::INT_16_BIT, + {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO, + AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2}, + {44100, 48000}), + createProfile(PcmType::INT_24_BIT, + {AudioChannelLayout::LAYOUT_MONO, AudioChannelLayout::LAYOUT_STEREO, + AudioChannelLayout::INDEX_MASK_1, AudioChannelLayout::INDEX_MASK_2}, + {44100, 48000})}; + Configuration c; + + // Device ports + + AudioPort usbOutHeadset = + createPort(c.nextPortId++, "USB Headset Out", 0, false, + createDeviceExt(AudioDeviceType::OUT_HEADSET, 0, + AudioDeviceDescription::CONNECTION_USB)); + c.ports.push_back(usbOutHeadset); + c.connectedProfiles[usbOutHeadset.id] = standardPcmAudioProfiles; + + AudioPort usbInHeadset = + createPort(c.nextPortId++, "USB Headset In", 0, true, + createDeviceExt(AudioDeviceType::IN_HEADSET, 0, + AudioDeviceDescription::CONNECTION_USB)); + c.ports.push_back(usbInHeadset); + c.connectedProfiles[usbInHeadset.id] = standardPcmAudioProfiles; + + // Mix ports + + AudioPort usbHeadsetOutMix = + createPort(c.nextPortId++, "usb_headset output", 0, false, createPortMixExt(1, 1)); + c.ports.push_back(usbHeadsetOutMix); + + AudioPort usbHeadsetInMix = + createPort(c.nextPortId++, "usb_headset input", 0, true, createPortMixExt(1, 1)); + c.ports.push_back(usbHeadsetInMix); + + c.routes.push_back(createRoute({usbHeadsetOutMix}, usbOutHeadset)); + c.routes.push_back(createRoute({usbInHeadset}, usbHeadsetInMix)); + + return c; + }(); + return std::make_unique(configuration); +} + } // namespace aidl::android::hardware::audio::core::internal diff --git a/audio/aidl/default/Module.cpp b/audio/aidl/default/Module.cpp index 7e829e3ef1..82d1ef8329 100644 --- a/audio/aidl/default/Module.cpp +++ b/audio/aidl/default/Module.cpp @@ -259,6 +259,8 @@ internal::Configuration& Module::getConfig() { case Type::R_SUBMIX: mConfig = std::move(internal::getRSubmixConfiguration()); break; + case Type::USB: + mConfig = std::move(internal::getUsbConfiguration()); } } return *mConfig; diff --git a/audio/aidl/default/android.hardware.audio.service-aidl.xml b/audio/aidl/default/android.hardware.audio.service-aidl.xml index 46b665f876..9636a58d48 100644 --- a/audio/aidl/default/android.hardware.audio.service-aidl.xml +++ b/audio/aidl/default/android.hardware.audio.service-aidl.xml @@ -9,6 +9,11 @@ 1 IModule/r_submix + + android.hardware.audio.core + 1 + IModule/usb + android.hardware.audio.core 1 diff --git a/audio/aidl/default/include/core-impl/Configuration.h b/audio/aidl/default/include/core-impl/Configuration.h index 3b4c494297..1aca1fe1bb 100644 --- a/audio/aidl/default/include/core-impl/Configuration.h +++ b/audio/aidl/default/include/core-impl/Configuration.h @@ -44,5 +44,6 @@ struct Configuration { std::unique_ptr getPrimaryConfiguration(); std::unique_ptr getRSubmixConfiguration(); +std::unique_ptr getUsbConfiguration(); } // namespace aidl::android::hardware::audio::core::internal diff --git a/audio/aidl/default/include/core-impl/Module.h b/audio/aidl/default/include/core-impl/Module.h index acdbe4fcbe..80a22dc0e3 100644 --- a/audio/aidl/default/include/core-impl/Module.h +++ b/audio/aidl/default/include/core-impl/Module.h @@ -31,7 +31,7 @@ class Module : public BnModule { public: // This value is used for all AudioPatches and reported by all streams. static constexpr int32_t kLatencyMs = 10; - enum Type : int { DEFAULT, R_SUBMIX }; + enum Type : int { DEFAULT, R_SUBMIX, USB }; explicit Module(Type type) : mType(type) {} diff --git a/audio/aidl/default/main.cpp b/audio/aidl/default/main.cpp index b66c13495c..1933509c38 100644 --- a/audio/aidl/default/main.cpp +++ b/audio/aidl/default/main.cpp @@ -55,7 +55,8 @@ int main() { return std::make_pair(module, moduleBinder); }; auto modules = {createModule(Module::Type::DEFAULT, "default"), - createModule(Module::Type::R_SUBMIX, "r_submix")}; + createModule(Module::Type::R_SUBMIX, "r_submix"), + createModule(Module::Type::USB, "usb")}; ABinderProcess_joinThreadPool(); return EXIT_FAILURE; // should not reach