~aleteoryx/muditaos

ref: 6888e44c329cee239730f0caa00ec907e3e22053 muditaos/module-bsp/board/rt1051/bellpx/bsp/audio/CodecAW8898.hpp -rw-r--r-- 3.2 KiB
6888e44c — Tigran Soghbatyan [BH-1025] Fix timer callbacks in switches 4 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "AW8898driver.hpp"

#include <bsp/audio/Codec.hpp>

extern "C"
{
#include "fsl_common.h"
}

#include <cstdint>

class CodecParamsAW8898 : public CodecParams
{
  public:
    enum class Cmd
    {
        SetOutVolume,
        SetInGain,
        SetMute,
        SetOutput,
        SetInput,
        Reset,
        MicBiasCtrl,
        None
    };

    enum class SampleRate
    {
        Rate8KHz   = 8000,
        Rate16KHz  = 16000,
        Rate44K1Hz = 44100,
        Rate48KHz  = 48000,
        Rate32KHz  = 32000,
        Rate96KHz  = 96000,
        Invalid
    };

    enum class MonoStereo
    {
        Left,
        Right,
        Mono
    };

    bsp::audio::AW8898::aw_i2s_channel MonoStereoToCodecChsel() const
    {
        switch (monoStereo) {
        case MonoStereo::Left:
            return bsp::audio::AW8898::aw_i2s_channel::CHSEL_LEFT;
        case MonoStereo::Right:
            return bsp::audio::AW8898::aw_i2s_channel::CHSEL_RIGHT;
        default:
            return bsp::audio::AW8898::aw_i2s_channel::CHSEL_MONO;
        }
    }

    bsp::audio::AW8898::aw_i2s_frequency SampleRateToCodecFreq() const
    {
        switch (sampleRate) {
        case SampleRate::Rate8KHz:
            return bsp::audio::AW8898::aw_i2s_frequency::FREQUENCY_08K;
        case SampleRate::Rate16KHz:
            return bsp::audio::AW8898::aw_i2s_frequency::FREQUENCY_16K;
        case SampleRate::Rate32KHz:
            return bsp::audio::AW8898::aw_i2s_frequency::FREQUENCY_32K;
        case SampleRate::Rate44K1Hz:
            return bsp::audio::AW8898::aw_i2s_frequency::FREQUENCY_44K;
        case SampleRate::Rate48KHz:
            return bsp::audio::AW8898::aw_i2s_frequency::FREQUENCY_48K;
        default:
            return bsp::audio::AW8898::aw_i2s_frequency::FREQUENCY_44K;
        }
    }

    uint32_t GetSampleRateVal()
    {
        switch (sampleRate) {
        case SampleRate::Rate8KHz:
            return 8000;
        case SampleRate::Rate16KHz:
            return 16000;
        case SampleRate::Rate32KHz:
            return 32000;
        case SampleRate::Rate44K1Hz:
            return 44100;
        case SampleRate::Rate48KHz:
            return 48000;
        case SampleRate::Rate96KHz:
            return 96000;
        default:
            return 0;
        }
    }

    Cmd opCmd             = Cmd::None;
    float outVolume       = 0;
    MonoStereo monoStereo = MonoStereo::Mono;
    SampleRate sampleRate = SampleRate ::Rate44K1Hz;
};

class CodecAW8898 : public Codec
{
  public:
    CodecAW8898();
    ~CodecAW8898();

    std::optional<uint32_t> Probe() override final;

    CodecRetCode Start(const CodecParams &param) override final;

    CodecRetCode Pause() override final;

    CodecRetCode Resume() override final;

    CodecRetCode Stop() override final;

    CodecRetCode Ioctrl(const CodecParams &param) override final;

  private:
    CodecParamsAW8898 currentParams;

    std::uint8_t VolumeTo8Bit(const float vol);
    CodecRetCode SetOutputVolume(const float vol);
    CodecRetCode SetMute(const bool enable);
    CodecRetCode Reset();
};