1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * 3*ec779b8eSAndroid Build Coastguard Worker * Copyright 2007, The Android Open Source Project 4*ec779b8eSAndroid Build Coastguard Worker * 5*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*ec779b8eSAndroid Build Coastguard Worker * 9*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*ec779b8eSAndroid Build Coastguard Worker * 11*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 16*ec779b8eSAndroid Build Coastguard Worker */ 17*ec779b8eSAndroid Build Coastguard Worker 18*ec779b8eSAndroid Build Coastguard Worker #pragma once 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <stdlib.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #include <android/media/audio/common/AudioMMapPolicyInfo.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <android/media/audio/common/AudioMMapPolicyType.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <media/audiohal/DeviceHalInterface.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h> 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker namespace android { 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker class AudioStreamIn; 33*ec779b8eSAndroid Build Coastguard Worker class AudioStreamOut; 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker class AudioHwDevice { 36*ec779b8eSAndroid Build Coastguard Worker public: 37*ec779b8eSAndroid Build Coastguard Worker enum Flags { 38*ec779b8eSAndroid Build Coastguard Worker AHWD_CAN_SET_MASTER_VOLUME = 0x1, 39*ec779b8eSAndroid Build Coastguard Worker AHWD_CAN_SET_MASTER_MUTE = 0x2, 40*ec779b8eSAndroid Build Coastguard Worker // Means that this isn't a terminal module, and software patches 41*ec779b8eSAndroid Build Coastguard Worker // are used to transport audio data further. 42*ec779b8eSAndroid Build Coastguard Worker AHWD_IS_INSERT = 0x4, 43*ec779b8eSAndroid Build Coastguard Worker // This Module supports BT Latency mode control 44*ec779b8eSAndroid Build Coastguard Worker AHWD_SUPPORTS_BT_LATENCY_MODES = 0x8, 45*ec779b8eSAndroid Build Coastguard Worker }; 46*ec779b8eSAndroid Build Coastguard Worker AudioHwDevice(audio_module_handle_t handle,const char * moduleName,const sp<DeviceHalInterface> & hwDevice,Flags flags)47*ec779b8eSAndroid Build Coastguard Worker AudioHwDevice(audio_module_handle_t handle, 48*ec779b8eSAndroid Build Coastguard Worker const char *moduleName, 49*ec779b8eSAndroid Build Coastguard Worker const sp<DeviceHalInterface>& hwDevice, 50*ec779b8eSAndroid Build Coastguard Worker Flags flags) 51*ec779b8eSAndroid Build Coastguard Worker : mHandle(handle) 52*ec779b8eSAndroid Build Coastguard Worker , mModuleName(strdup(moduleName)) 53*ec779b8eSAndroid Build Coastguard Worker , mHwDevice(hwDevice) 54*ec779b8eSAndroid Build Coastguard Worker , mFlags(flags) { } ~AudioHwDevice()55*ec779b8eSAndroid Build Coastguard Worker virtual ~AudioHwDevice() { free((void *)mModuleName); } 56*ec779b8eSAndroid Build Coastguard Worker canSetMasterVolume()57*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] bool canSetMasterVolume() const { 58*ec779b8eSAndroid Build Coastguard Worker return (0 != (mFlags & AHWD_CAN_SET_MASTER_VOLUME)); 59*ec779b8eSAndroid Build Coastguard Worker } 60*ec779b8eSAndroid Build Coastguard Worker canSetMasterMute()61*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] bool canSetMasterMute() const { 62*ec779b8eSAndroid Build Coastguard Worker return (0 != (mFlags & AHWD_CAN_SET_MASTER_MUTE)); 63*ec779b8eSAndroid Build Coastguard Worker } 64*ec779b8eSAndroid Build Coastguard Worker isInsert()65*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] bool isInsert() const { 66*ec779b8eSAndroid Build Coastguard Worker return (0 != (mFlags & AHWD_IS_INSERT)); 67*ec779b8eSAndroid Build Coastguard Worker } 68*ec779b8eSAndroid Build Coastguard Worker supportsBluetoothVariableLatency()69*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] bool supportsBluetoothVariableLatency() const { 70*ec779b8eSAndroid Build Coastguard Worker return (0 != (mFlags & AHWD_SUPPORTS_BT_LATENCY_MODES)); 71*ec779b8eSAndroid Build Coastguard Worker } 72*ec779b8eSAndroid Build Coastguard Worker handle()73*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] audio_module_handle_t handle() const { return mHandle; } moduleName()74*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] const char *moduleName() const { return mModuleName; } hwDevice()75*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] sp<DeviceHalInterface> hwDevice() const { return mHwDevice; } 76*ec779b8eSAndroid Build Coastguard Worker 77*ec779b8eSAndroid Build Coastguard Worker /** This method creates and opens the audio hardware output stream. 78*ec779b8eSAndroid Build Coastguard Worker * The "address" parameter qualifies the "devices" audio device type if needed. 79*ec779b8eSAndroid Build Coastguard Worker * The format format depends on the device type: 80*ec779b8eSAndroid Build Coastguard Worker * - Bluetooth devices use the MAC address of the device in the form "00:11:22:AA:BB:CC" 81*ec779b8eSAndroid Build Coastguard Worker * - USB devices use the ALSA card and device numbers in the form "card=X;device=Y" 82*ec779b8eSAndroid Build Coastguard Worker * - Other devices may use a number or any other string. 83*ec779b8eSAndroid Build Coastguard Worker */ 84*ec779b8eSAndroid Build Coastguard Worker status_t openOutputStream( 85*ec779b8eSAndroid Build Coastguard Worker AudioStreamOut **ppStreamOut, 86*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t handle, 87*ec779b8eSAndroid Build Coastguard Worker audio_devices_t deviceType, 88*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t *flags, 89*ec779b8eSAndroid Build Coastguard Worker struct audio_config *config, 90*ec779b8eSAndroid Build Coastguard Worker const char *address, 91*ec779b8eSAndroid Build Coastguard Worker const std::vector<playback_track_metadata_v7_t>& sourceMetadata); 92*ec779b8eSAndroid Build Coastguard Worker 93*ec779b8eSAndroid Build Coastguard Worker status_t openInputStream( 94*ec779b8eSAndroid Build Coastguard Worker AudioStreamIn **ppStreamIn, 95*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t handle, 96*ec779b8eSAndroid Build Coastguard Worker audio_devices_t deviceType, 97*ec779b8eSAndroid Build Coastguard Worker audio_input_flags_t flags, 98*ec779b8eSAndroid Build Coastguard Worker struct audio_config *config, 99*ec779b8eSAndroid Build Coastguard Worker const char *address, 100*ec779b8eSAndroid Build Coastguard Worker audio_source_t source, 101*ec779b8eSAndroid Build Coastguard Worker audio_devices_t outputDevice, 102*ec779b8eSAndroid Build Coastguard Worker const char *outputDeviceAddress); 103*ec779b8eSAndroid Build Coastguard Worker 104*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] bool supportsAudioPatches() const; 105*ec779b8eSAndroid Build Coastguard Worker 106*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] status_t getAudioPort(struct audio_port_v7 *port) const; 107*ec779b8eSAndroid Build Coastguard Worker 108*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] status_t getMmapPolicyInfos( 109*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioMMapPolicyType policyType, 110*ec779b8eSAndroid Build Coastguard Worker std::vector<media::audio::common::AudioMMapPolicyInfo> *policyInfos) const; 111*ec779b8eSAndroid Build Coastguard Worker 112*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] int32_t getAAudioMixerBurstCount() const; 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] int32_t getAAudioHardwareBurstMinUsec() const; 115*ec779b8eSAndroid Build Coastguard Worker 116*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] status_t getAudioMixPort(const struct audio_port_v7 *devicePort, 117*ec779b8eSAndroid Build Coastguard Worker struct audio_port_v7 *mixPort) const; 118*ec779b8eSAndroid Build Coastguard Worker 119*ec779b8eSAndroid Build Coastguard Worker private: 120*ec779b8eSAndroid Build Coastguard Worker const audio_module_handle_t mHandle; 121*ec779b8eSAndroid Build Coastguard Worker const char * const mModuleName; 122*ec779b8eSAndroid Build Coastguard Worker sp<DeviceHalInterface> mHwDevice; 123*ec779b8eSAndroid Build Coastguard Worker const Flags mFlags; 124*ec779b8eSAndroid Build Coastguard Worker }; 125*ec779b8eSAndroid Build Coastguard Worker 126*ec779b8eSAndroid Build Coastguard Worker } // namespace android 127