~aleteoryx/muditaos

ref: b64f8283a7342b5362fded7c68706ea5ea961ee5 muditaos/module-bsp/board/rt1051/bellpx/bsp/audio/CodecAW8898.hpp -rw-r--r-- 2.7 KiB
b64f8283 — Przemyslaw Brudny Merge remote-tracking branch 'origin/stable' 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
// 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 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;
        }
    }

    MonoStereo monoStereo = MonoStereo::Mono;
};

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();
};