~aleteoryx/muditaos

muditaos/module-audio/Audio/transcode/MonoToStereo.cpp -rw-r--r-- 1.4 KiB
a405cad6Aleteoryx trim readme 6 days 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
// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md

#include "MonoToStereo.hpp"

#include <Audio/AudioFormat.hpp>

using audio::transcode::MonoToStereo;

auto MonoToStereo::transform(const Span &span, const Span &transformSpace) const -> Span
{
    auto outputSpan   = Span{.data = transformSpace.data, .dataSize = transformBlockSize(span.dataSize)};
    auto outputBuffer = reinterpret_cast<std::uint16_t *>(transformSpace.data);
    auto inputBuffer  = reinterpret_cast<std::uint16_t *>(span.data);

    for (std::size_t i = span.dataSize / sizeof(std::uint16_t); i > 0; i--) {
        outputBuffer[i * 2 - 1] = outputBuffer[i * 2 - 2] = inputBuffer[i - 1];
    }

    return outputSpan;
}

auto MonoToStereo::transformBlockSize(std::size_t inputBufferSize) const noexcept -> std::size_t
{
    return 2 * inputBufferSize;
}

auto MonoToStereo::transformBlockSizeInverted(std::size_t outputBufferSize) const noexcept -> std::size_t
{
    return outputBufferSize / 2;
}

auto MonoToStereo::validateInputFormat(const audio::AudioFormat &inputFormat) const noexcept -> bool
{
    return inputFormat.getChannels() == 1;
}

auto MonoToStereo::transformFormat(const audio::AudioFormat &inputFormat) const noexcept -> audio::AudioFormat
{
    return audio::AudioFormat(inputFormat.getSampleRate(), inputFormat.getBitWidth(), 2);
}