/*
**
** Copyright 2014, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

#ifndef ANDROID_ALSA_UTILS_H
#define ANDROID_ALSA_UTILS_H

#include <fcntl.h>
#include <stdint.h>
#include <hardware/audio.h>

#define kHDMI_ALSADeviceName    "IntelHDMI"

#ifdef __cplusplus
extern "C"
#endif
int find_alsa_card_by_name(const char* name);

#ifdef __cplusplus
#include <utils/Vector.h>
#include <utils/Mutex.h>
#include <utils/String8.h>

namespace android {

class HDMIAudioCaps {
  public:
    enum AudFormat {
        kFmtInvalid = 0,
        kFmtLPCM,
        kFmtAC3,
        kFmtMP1,
        kFmtMP1L3,
        kFmtMP2,
        kFmtAACLC,
        kFmtDTS,
        kFmtATRAC,
        kFmtDSD,
        kFmtEAC3,
        kFmtDTSHD,
        kFmtMLP,
        kFmtDST,
        kFmtWMAPRO,
        kFmtRefCxt,
        kFmtHEAAC,
        kFmtHEAAC2,
        kFmtMPGSUR
    };

    enum SRMask {
        kSR_32000 = (1 << 5),
        kSR_44100 = (1 << 6),
        kSR_48000 = (1 << 7),
        kSR_88200 = (1 << 9),
        kSR_96000 = (1 << 10),
        kSR_176400 = (1 << 11),
        kSR_192000 = (1 << 12),
    };

    enum BPSMask {
        kBPS_16bit = (1 << 17),
        kBPS_20bit = (1 << 18),
        kBPS_24bit = (1 << 19),
    };

    enum SAMask {
        kSA_FLFR   = (1 <<  0), // Front Left/Right
        kSA_LFE    = (1 <<  1), // LFE (aka, subwoofer)
        kSA_FC     = (1 <<  2), // Front Center
        kSA_RLRR   = (1 <<  3), // Rear Left/Right
        kSA_RC     = (1 <<  4), // Rear Center
        kSA_FLCFRC = (1 <<  5), // Front Left/Right Center
        kSA_RLCRRC = (1 <<  6), // Rear Left/Right Center
        kSA_FLWFRW = (1 <<  7), // Front Left/Right Wide
        kSA_FLHFRH = (1 <<  8), // Front Left/Right High
        kSA_TC     = (1 <<  9), // Top Center (overhead)
        kSA_FCH    = (1 << 10), // Front Center High
    };

    typedef struct {
        AudFormat fmt;
        uint32_t  max_ch;
        uint32_t  sr_bitmask;
        uint32_t  bps_bitmask;
        uint32_t  comp_bitrate;
    } Mode;

    HDMIAudioCaps();
    ~HDMIAudioCaps() { reset(); }

    bool loadCaps(int ALSADeviceID);
    void reset();
    void getRatesForAF(String8& rates);
    void getFmtsForAF(String8& fmts);
    void getChannelMasksForAF(String8& masks);
    bool supportsFormat(audio_format_t format,
                                      uint32_t sampleRate,
                                      uint32_t channelCount,
                                      bool isIec958NonAudio);

    bool basicAudioSupport() const { return mBasicAudioSupported; }
    uint16_t speakerAllocation() const { return mSpeakerAlloc; }
    size_t modeCnt() const { return mModes.size(); }
    const Mode& getMode(size_t ndx) const { return mModes[ndx]; }

    static const char* fmtToString(AudFormat fmt);
    static uint32_t srMaskToSR(uint32_t mask);
    static uint32_t bpsMaskToBPS(uint32_t mask);
    static const char* saMaskToString(uint32_t mask);

  private:
    Mutex mLock;
    bool mBasicAudioSupported;
    uint16_t mSpeakerAlloc;
    Vector<Mode> mModes;

    void reset_l();
    ssize_t getMaxChModeNdx_l();
    static bool sanityCheckMode(const Mode& m);
};
}  // namespace android
#endif  // __cplusplus
#endif  // ANDROID_ALSA_UTILS_H
