~aleteoryx/muditaos

ref: eeafb5f1be091a34446b842dbde1b7d54cc029a7 muditaos/module-audio/Audio/Operation/Operation.cpp -rw-r--r-- 3.8 KiB
eeafb5f1 — Lefucjusz [MOS-783] Moved battery config file to '/user/data' 3 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
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "Operation.hpp"

#include <algorithm>

#include "Audio/AudioDevice.hpp"
#include "Audio/AudioDeviceFactory.hpp"

#include "IdleOperation.hpp"
#include "PlaybackOperation.hpp"
#include "RecorderOperation.hpp"
#include "RouterOperation.hpp"

namespace audio
{
    std::unique_ptr<Operation> Operation::Create(Operation::Type t,
                                                 const std::string &filePath,
                                                 const audio::PlaybackType &playbackType,
                                                 AudioServiceMessage::Callback callback)
    {
        std::unique_ptr<Operation> inst;

        switch (t) {
        case Type::Idle:
            inst = std::make_unique<IdleOperation>(filePath);
            break;
        case Type::Playback:
            inst = std::make_unique<PlaybackOperation>(filePath, playbackType, callback);
            break;
        case Type::Router:
            inst = std::make_unique<RouterOperation>(filePath, callback);
            break;
        case Type::Recorder:
            inst = std::make_unique<RecorderOperation>(filePath, callback);
            break;
        }

        inst->opType   = t;
        inst->filePath = filePath;
        return inst;
    }

    std::shared_ptr<Profile> Operation::GetProfile(const Profile::Type type)
    {
        auto ret = std::find_if(supportedProfiles.begin(), supportedProfiles.end(), [type](const auto &w) {
            return w.isAvailable && w.profile->GetType() == type;
        });
        if (ret != supportedProfiles.end()) {
            return ret->profile;
        }
        return nullptr;
    }

    std::optional<Profile::Type> Operation::GetPriorityProfile() const
    {
        for (auto &p : supportedProfiles) {
            if (p.isAvailable) {
                return p.profile->GetType();
            }
        }
        return {};
    }

    audio::RetCode Operation::SwitchToPriorityProfile()
    {
        if (const auto priorityProfile = GetPriorityProfile(); priorityProfile.has_value()) {
            return SwitchProfile(priorityProfile.value());
        }
        return audio::RetCode::ProfileNotSet;
    }

    audio::RetCode Operation::SwitchToPriorityProfile([[maybe_unused]] audio::PlaybackType playbackType)
    {
        return SwitchToPriorityProfile();
    }

    void Operation::SetProfileAvailability(std::vector<Profile::Type> profiles, bool available)
    {
        for (auto &p : supportedProfiles) {
            if (std::find(profiles.begin(), profiles.end(), p.profile->GetType()) != profiles.end()) {
                p.isAvailable = available;
            }
        }
    }

    void Operation::AddProfile(const Profile::Type &profile, const PlaybackType &playback, bool isAvailable)
    {
        const auto reqVol  = AudioServiceMessage::DbRequest(Setting::Volume, playback, profile);
        const auto reqGain = AudioServiceMessage::DbRequest(Setting::Gain, playback, profile);

        std::optional<audio::Volume> volume;
        std::optional<audio::Gain> gain;

        if (auto val = serviceCallback(&reqVol); val) {
            volume = utils::getNumericValue<audio::Volume>(val.value());
        }

        if (auto val = serviceCallback(&reqGain); val) {
            gain = utils::getNumericValue<audio::Gain>(val.value());
        }

        supportedProfiles.emplace_back(Profile::Create(profile, volume, gain), isAvailable);
    }

    std::shared_ptr<AudioDevice> Operation::CreateDevice(const Profile &profile)
    {
        return factory->CreateDevice(profile);
    }

    std::shared_ptr<AudioDevice> Operation::createCellularAudioDevice()
    {
        return factory->createCellularAudioDevice();
    }
} // namespace audio