blob: 64fbe3bb201e546f0357767971cdc8b2be22a563 [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) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#ifndef SESSION_H
#define SESSION_H
#include "PayloadBuilder.h"
#include "PalDefs.h"
#include <mutex>
#include <algorithm>
#include <vector>
#include <string.h>
#include <stdlib.h>
#include <memory>
#include <errno.h>
#include "PalCommon.h"
#include "Device.h"
typedef enum {
GRAPH = 0,
MODULE ,
CALIBRATION,
CODEC_DMA_CONFIG,
MEDIA_CONFIG,
IN_MEDIA_CONFIG,
OUT_MEDIA_CONFIG
}configType;
typedef enum {
SESSION_IDLE,
SESSION_OPENED,
SESSION_STARTED,
SESSION_FLUSHED,
SESSION_STOPPED,
}sessionState;
typedef enum {
PM_QOS_VOTE_DISABLE = 0,
PM_QOS_VOTE_ENABLE = 1
} pmQosVote;
typedef enum {
SLOT_MASK1 = 1,
SLOT_MASK3 = 3,
SLOT_MASK7 = 7,
SLOT_MASK15 = 15,
}slot_mask_t;
#define EVENT_ID_SOFT_PAUSE_PAUSE_COMPLETE 0x0800103F
const std::map<std::uint32_t, std::uint32_t> slotMaskBwLUT {
{16, 0},
{24, 0x40000000},
{32, 0x80000000},
};
const std::map<std::uint32_t, slot_mask_t> slotMaskLUT {
{1, SLOT_MASK1},
{2, SLOT_MASK3},
{3, SLOT_MASK7},
{4, SLOT_MASK15},
};
#define MSPP_SOFT_PAUSE_DELAY 150
class Stream;
class ResourceManager;
class Session
{
protected:
void * handle_t;
std::mutex kvMutex;
Session();
std::shared_ptr<ResourceManager> rm;
struct mixer *mixer;
std::vector<std::pair<int32_t, std::string>> rxAifBackEnds;
std::vector<std::pair<int32_t, std::string>> txAifBackEnds;
void *customPayload;
size_t customPayloadSize;
int updateCustomPayload(void *payload, size_t size);
int freeCustomPayload(uint8_t **payload, size_t *payloadSize);
uint32_t eventId;
void *eventPayload;
size_t eventPayloadSize;
bool RegisterForEvents = false;
Stream *streamHandle;
static struct pcm *pcmEcTx;
static std::vector<int> pcmDevEcTxIds;
static int extECRefCnt;
static std::mutex extECMutex;
bool frontEndIdAllocated = false;
public:
bool isMixerEventCbRegd;
bool isPauseRegistrationDone;
virtual ~Session();
static Session* makeSession(const std::shared_ptr<ResourceManager>& rm, const struct pal_stream_attributes *sAttr);
static Session* makeACDBSession(const std::shared_ptr<ResourceManager>& rm, const struct pal_stream_attributes *sAttr);
int handleDeviceRotation(Stream *s, pal_speaker_rotation_type rotation_type,
int device, struct mixer *mixer, PayloadBuilder* builder,
std::vector<std::pair<int32_t, std::string>> rxAifBackEnds);
int setSlotMask(const std::shared_ptr<ResourceManager>& rm, struct pal_stream_attributes &sAttr,
struct pal_device &dAttr, const std::vector<int> &pcmDevIds);
int configureMFC(const std::shared_ptr<ResourceManager>& rm, struct pal_stream_attributes &sAttr,
struct pal_device &dAttr, const std::vector<int> &pcmDevIds, const char* intf);
void setPmQosMixerCtl(pmQosVote vote);
int getCustomPayload(uint8_t **payload, size_t *payloadSize);
int freeCustomPayload();
virtual int open(Stream * s) = 0;
virtual int prepare(Stream * s) = 0;
virtual int setConfig(Stream * s, configType type, int tag) = 0;
virtual int setConfig(Stream * s __unused, configType type __unused, uint32_t tag1 __unused,
uint32_t tag2 __unused, uint32_t tag3 __unused) {return 0;};
virtual int setConfig(Stream * s __unused, configType type __unused, int tag __unused, int dir __unused) {return 0;};
virtual int setTKV(Stream * s __unused, configType type __unused, effect_pal_payload_t *payload __unused) {return 0;};
//virtual int getConfig(Stream * s) = 0;
virtual int start(Stream * s) = 0;
virtual int pause(Stream * s);
virtual int suspend(Stream * s) {return 0;};
virtual int resume(Stream * s);
virtual int stop(Stream * s) = 0;
virtual int close(Stream * s) = 0;
virtual int readBufferInit(Stream *s __unused, size_t noOfBuf __unused, size_t bufSize __unused, int flag __unused) {return 0;};
virtual int writeBufferInit(Stream *s __unused, size_t noOfBuf __unused, size_t bufSize __unused, int flag __unused) {return 0;};
virtual int read(Stream *s __unused, int tag __unused, struct pal_buffer *buf __unused, int * size __unused) {return 0;};
virtual int write(Stream *s __unused, int tag __unused, struct pal_buffer *buf __unused, int * size __unused, int flag __unused) {return 0;};
virtual int getParameters(Stream *s __unused, int tagId __unused, uint32_t param_id __unused, void **payload __unused) {return 0;};
virtual int setParameters(Stream *s __unused, int tagId __unused, uint32_t param_id __unused, void *payload __unused) {return 0;};
virtual int registerCallBack(session_callback cb __unused, uint64_t cookie __unused) {return 0;};
virtual int drain(pal_drain_type_t type __unused) {return 0;};
virtual int flush() {return 0;};
virtual void setEventPayload(uint32_t event_id __unused, void *payload __unused, size_t payload_size __unused) { };
virtual int getTimestamp(struct pal_session_time *stime __unused) {return 0;};
/*TODO need to implement connect/disconnect in basecase*/
virtual int setupSessionDevice(Stream* streamHandle, pal_stream_type_t streamType,
std::shared_ptr<Device> deviceToCconnect) = 0;
virtual int connectSessionDevice(Stream* streamHandle, pal_stream_type_t streamType,
std::shared_ptr<Device> deviceToCconnect) = 0;
virtual int disconnectSessionDevice(Stream* streamHandle, pal_stream_type_t streamType,
std::shared_ptr<Device> deviceToDisconnect) = 0;
virtual int setECRef(Stream *s, std::shared_ptr<Device> rx_dev, bool is_enable) = 0;
void getSamplerateChannelBitwidthTags(struct pal_media_config *config,
uint32_t &sr_tag, uint32_t &ch_tag, uint32_t &bitwidth_tag);
virtual uint32_t getMIID(const char *backendName __unused, uint32_t tagId __unused, uint32_t *miid __unused) { return -EINVAL; }
int getEffectParameters(Stream *s, effect_pal_payload_t *effectPayload);
int setEffectParameters(Stream *s, effect_pal_payload_t *effectPayload);
int rwACDBParameters(void *payload, uint32_t sampleRate, bool isParamWrite);
int rwACDBParamTunnel(void *payload, pal_device_id_t palDeviceId,
pal_stream_type_t palStreamType, uint32_t sampleRate, uint32_t instanceId,
bool isParamWrite, Stream *s);
int NotifyChargerConcurrency(std::shared_ptr<ResourceManager>rm, bool state);
int EnableChargerConcurrency(std::shared_ptr<ResourceManager>rm, Stream *s);
virtual struct mixer_ctl* getFEMixerCtl(const char *controlName __unused, int *device __unused, pal_stream_direction_t dir __unused) {return nullptr;}
virtual int createMmapBuffer(Stream *s __unused, int32_t min_size_frames __unused,
struct pal_mmap_buffer *info __unused) {return -EINVAL;}
virtual int GetMmapPosition(Stream *s __unused, struct pal_mmap_position *position __unused) {return -EINVAL;}
virtual int ResetMmapBuffer(Stream *s __unused) {return -EINVAL;}
virtual int openGraph(Stream *s __unused) { return 0; }
virtual int getTagsWithModuleInfo(Stream *s __unused, size_t *size __unused,
uint8_t *payload __unused) {return -EINVAL;}
virtual int checkAndSetExtEC(const std::shared_ptr<ResourceManager>& rm,
Stream *s, bool is_enable);
virtual void AdmRoutingChange(Stream *s __unused) { };
private:
uint32_t getModuleInfo(const char *control, uint32_t tagId, uint32_t *miid, struct mixer_ctl **ctl, int *device);
int setEffectParametersTKV(Stream *s, effect_pal_payload_t *effectPayload);
int setEffectParametersNonTKV(Stream *s, effect_pal_payload_t *effectPayload);
};
#endif //SESSION_H