blob: af7c71366ed19a4f4beb6ae0c5a56bbdd7a614da [file] [log] [blame]
/*
* Copyright (c) 2019, 2021 The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Changes from Qualcomm Innovation Center are provided under the following license:
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#ifndef SESSION_ALSAUTILS_H
#define SESSION_ALSAUTILS_H
#include "Session.h"
#include "ResourceManager.h"
#include "PayloadBuilder.h"
#include <tinyalsa/asoundlib.h>
#include <sound/asound.h>
class Stream;
class Session;
enum class MixerCtlType: uint32_t {
MIXER_SET_ID_STRING,
MIXER_SET_ID_VALUE,
MIXER_SET_ID_ARRAY,
};
enum FeCtrlsIndex {
FE_CONTROL,
FE_METADATA,
FE_CONNECT,
FE_DISCONNECT,
FE_SETPARAM,
FE_GETTAGGEDINFO,
FE_SETPARAMTAG,
FE_GETPARAM,
FE_ECHOREFERENCE,
FE_SIDETONE,
FE_LOOPBACK,
FE_EVENT,
FE_SETCAL,
FE_FLUSH,
FE_MAX_NUM_MIXER_CONTROLS,
};
enum BeCtrlsIndex {
BE_METADATA,
BE_MEDIAFMT,
BE_SETPARAM,
BE_GROUP_ATTR,
BE_MAX_NUM_MIXER_CONTROLS,
};
class SessionAlsaUtils
{
private:
SessionAlsaUtils() {};
static struct mixer_ctl *getFeMixerControl(struct mixer *am, std::string feName,
uint32_t idx);
static struct mixer_ctl *getBeMixerControl(struct mixer *am, std::string beName,
uint32_t idx);
static struct mixer_ctl *getStaticMixerControl(struct mixer *am, std::string name);
public:
~SessionAlsaUtils();
static bool isRxDevice(uint32_t devId);
static int setMixerCtlData(struct mixer_ctl *ctl, MixerCtlType id, void *data, int size);
static int getTagMetadata(int32_t tagsent, std::vector <std::pair<int, int>> &tkv, struct agm_tag_config *tagConfig);
static int getCalMetadata(std::vector <std::pair<int, int>> &ckv, struct agm_cal_config* calConfig);
static unsigned int bitsToAlsaFormat(unsigned int bits);
static int openDev(std::shared_ptr<ResourceManager> rmHandle,
const std::vector<int> &DevIds, int32_t backEndId, std::string backEndName);
static int open(Stream * s, std::shared_ptr<ResourceManager> rm, const std::vector<int> &DevIds,
const std::vector<std::pair<int32_t, std::string>> &BackEnds);
static int open(Stream * s, std::shared_ptr<ResourceManager> rm,
const std::vector<int> &RxDevIds, const std::vector<int> &TxDevIds,
const std::vector<std::pair<int32_t, std::string>> &rxBackEnds,
const std::vector<std::pair<int32_t, std::string>> &txBackEnds);
static int rwACDBTunnel(Stream * streamHandle, std::shared_ptr<ResourceManager> rmHandle,
pal_device_id_t deviceId, void *payload, bool isParamWrite, uint32_t instanceId);
static int close(Stream * s, std::shared_ptr<ResourceManager> rm, const std::vector<int> &DevIds,
const std::vector<std::pair<int32_t, std::string>> &BackEnds, std::vector<std::pair<std::string, int>> &freedevicemetadata);
static int close(Stream * s, std::shared_ptr<ResourceManager> rm,
const std::vector<int> &RxDevIds, const std::vector<int> &TxDevIds,
const std::vector<std::pair<int32_t, std::string>> &rxBackEnds,
const std::vector<std::pair<int32_t, std::string>> &txBackEnds,
std::vector<std::pair<std::string, int>> &freeDeviceMetaData);
static int getModuleInstanceId(struct mixer *mixer, int device, const char *intf_name,
int tag_id, uint32_t *miid);
static int getTagsWithModuleInfo(struct mixer *mixer, int device, const char *intf_name,
uint8_t *payload);
static int setMixerParameter(struct mixer *mixer, int device,
void *payload, int size);
static int setStreamMetadataType(struct mixer *mixer, int device, const char *val);
static int registerMixerEvent(struct mixer *mixer, int device, const char *intf_name, int tag_id, void *payload, int payload_size);
static int registerMixerEvent(struct mixer *mixer, int device, void *payload, int payload_size);
static int setECRefPath(struct mixer *mixer, int device, const char *intf_name);
static int getTimestamp(struct mixer *mixer, const std::vector<int> &DevIds, uint32_t spr_miid, struct pal_session_time *stime);
static int disconnectSessionDevice(Stream* streamHandle, pal_stream_type_t streamType,
std::shared_ptr<ResourceManager> rm, struct pal_device &dAttr,
const std::vector<int> &pcmDevIds,
const std::vector<std::pair<int32_t, std::string>> &aifBackEndsToDisconnect);
static int disconnectSessionDevice(Stream* streamHandle, pal_stream_type_t streamType,
std::shared_ptr<ResourceManager> rmHandle, struct pal_device &dAttr,
const std::vector<int> &pcmTxDevIds,const std::vector<int> &pcmRxDevIds,
const std::vector<std::pair<int32_t, std::string>> &aifBackEndsToDisconnect);
static int connectSessionDevice(Session* sess, Stream* streamHandle, pal_stream_type_t streamType,
std::shared_ptr<ResourceManager> rm, struct pal_device &dAttr,
const std::vector<int> &pcmDevIds,
const std::vector<std::pair<int32_t, std::string>> &aifBackEndsToConnect);
static int connectSessionDevice(Session* sess, Stream* streamHandle, pal_stream_type_t streamType,
std::shared_ptr<ResourceManager> rmHandle, struct pal_device &dAttr,
const std::vector<int> &pcmTxDevIds,const std::vector<int> &pcmRxDevIds,
const std::vector<std::pair<int32_t, std::string>> &aifBackEndsToConnect);
static int setupSessionDevice(Stream* streamHandle, pal_stream_type_t streamType,
std::shared_ptr<ResourceManager> rm, struct pal_device &dAttr,
const std::vector<int> &pcmDevIds,
const std::vector<std::pair<int32_t, std::string>> &aifBackEndsToConnect);
static std::shared_ptr<Device> getDeviceObj(int32_t beDevId,
std::vector<std::shared_ptr<Device>> &associatedDevices);
static pcm_format palToAlsaFormat(uint32_t fmt_id);
static int setDeviceMetadata(std::shared_ptr<ResourceManager> rmHandle,
std::string backEndName,
std::vector <std::pair<int, int>> &deviceKV);
static int setDeviceMediaConfig(std::shared_ptr<ResourceManager> rmHandle,
std::string backEndName, struct pal_device *dAttr);
static int setDeviceCustomPayload(std::shared_ptr<ResourceManager> rmHandle,
std::string backEndName, void *payload, size_t size);
static unsigned int bytesToFrames(size_t bufSizeInBytes, unsigned int channels,
enum pcm_format format);
static bool isMmapUsecase(struct pal_stream_attributes attr);
static void getAgmMetaData(const std::vector <std::pair<int, int>> &kv,
const std::vector <std::pair<int, int>> &ckv,
struct prop_data *propData,
struct agmMetaData &md);
static int rwParameterACDB(Stream * streamHandle, struct mixer *mixer,
void *inParamPayload, size_t inPayloadSize,
pal_device_id_t palDeviceId, uint32_t sampleRate,
uint32_t instanceId, bool isParamWrite);
static int mixerWriteDatapathParams(struct mixer *mixer, int device,
void *payload, int size);
static int flush(std::shared_ptr<ResourceManager> rm, uint32_t id);
};
#endif //SESSION_ALSA_UTILS