1 /* 2 * Copyright (C) 2023 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 <functional> 20 #include <iostream> 21 #include <memory> 22 #include <optional> 23 #include <vector> 24 25 #include <aidl/android/media/audio/common/AudioChannelLayout.h> 26 #include <aidl/android/media/audio/common/AudioFormatDescription.h> 27 #include <aidl/android/media/audio/common/AudioPort.h> 28 29 #include "core-impl/Stream.h" 30 31 extern "C" { 32 #include <tinyalsa/pcm.h> 33 #include "alsa_device_profile.h" 34 #include "alsa_device_proxy.h" 35 } 36 37 namespace aidl::android::hardware::audio::core::alsa { 38 39 struct DeviceProfile { 40 int card; 41 int device; 42 int direction; /* PCM_OUT or PCM_IN */ 43 bool isExternal; 44 }; 45 std::ostream& operator<<(std::ostream& os, const DeviceProfile& device); 46 using DeviceProxyDeleter = std::function<void(alsa_device_proxy*)>; 47 using DeviceProxy = std::unique_ptr<alsa_device_proxy, DeviceProxyDeleter>; 48 49 ::aidl::android::media::audio::common::AudioChannelLayout getChannelLayoutMaskFromChannelCount( 50 unsigned int channelCount, int isInput); 51 ::aidl::android::media::audio::common::AudioChannelLayout getChannelIndexMaskFromChannelCount( 52 unsigned int channelCount); 53 unsigned int getChannelCountFromChannelMask( 54 const ::aidl::android::media::audio::common::AudioChannelLayout& channelMask, bool isInput); 55 std::vector<::aidl::android::media::audio::common::AudioChannelLayout> getChannelMasksFromProfile( 56 const alsa_device_profile* profile); 57 std::optional<DeviceProfile> getDeviceProfile( 58 const ::aidl::android::media::audio::common::AudioDevice& audioDevice, bool isInput); 59 std::optional<DeviceProfile> getDeviceProfile( 60 const ::aidl::android::media::audio::common::AudioPort& audioPort); 61 std::optional<struct pcm_config> getPcmConfig(const StreamContext& context, bool isInput); 62 std::vector<int> getSampleRatesFromProfile(const alsa_device_profile* profile); 63 DeviceProxy makeDeviceProxy(); 64 DeviceProxy openProxyForAttachedDevice(const DeviceProfile& deviceProfile, 65 struct pcm_config* pcmConfig, size_t bufferFrameCount); 66 DeviceProxy openProxyForExternalDevice(const DeviceProfile& deviceProfile, 67 struct pcm_config* pcmConfig, bool requireExactMatch); 68 std::optional<alsa_device_profile> readAlsaDeviceInfo(const DeviceProfile& deviceProfile); 69 void resetTransferredFrames(DeviceProxy& proxy, uint64_t frames); 70 71 ::aidl::android::media::audio::common::AudioFormatDescription 72 c2aidl_pcm_format_AudioFormatDescription(enum pcm_format legacy); 73 pcm_format aidl2c_AudioFormatDescription_pcm_format( 74 const ::aidl::android::media::audio::common::AudioFormatDescription& aidl); 75 76 } // namespace aidl::android::hardware::audio::core::alsa 77