AUI Framework  master
Cross-platform base for C++ UI apps
Loading...
Searching...
No Matches
ASampleRateConverter.h
    1#pragma once
    2
    3#include <cstddef>
    4#include "AUI/Audio/ISoundInputStream.h"
    5#include "AUI/Util/APimpl.h"
    6#include "AUI/Traits/platform.h"
    7
    8typedef struct soxr * soxr_t;
    9
   10class ASampleRateConverter {
   11public:
   12    ASampleRateConverter(size_t requestedSampleRate, _<ISoundInputStream> stream);
   13
   19    size_t convert(std::span<std::byte> dst);
   20
   24    static constexpr ASampleFormat outputSampleFormat() {
   25        return aui::platform::current::is_mobile() ? ASampleFormat::I16 : ASampleFormat::I32;
   26    }
   27
   28    ~ASampleRateConverter();
   29
   30private:
   31    struct SoxrProcessResult {
   32        size_t bytesInUsed;
   33        size_t bytesOut;
   34    };
   35
   36    SoxrProcessResult soxrProcess(std::span<std::byte> src, std::span<std::byte> dst);
   37
   38    static constexpr size_t BUFFER_SIZE = 0x3000;
   39    static constexpr size_t INT32_BUFFER_SIZE = (BUFFER_SIZE / 3);
   40
   41    struct AuxBuffer {
   42        size_t read(char* dst, size_t size);
   43
   44        void write(const _<IInputStream>& source, size_t bytesToRead = BUFFER_SIZE);
   45
   46        [[nodiscard]]
   47        size_t size() const;
   48
   49        std::span<std::byte> span();
   50
   55        void convertFormatToInt32();
   56
   57        char buffer[BUFFER_SIZE];
   58        size_t begin = 0;
   59        size_t end = 0;
   60    };
   61
   62
   63
   64    soxr_t mContext = nullptr;
   65    _<ISoundInputStream> mSource;
   66    AAudioFormat mInputFormat;
   67    AAudioFormat mOutputFormat;
   68    AuxBuffer mSourceBuffer;
   69};
Definition ASampleRateConverter.h:10
size_t convert(std::span< std::byte > dst)
Performs sample rate converting.
static constexpr ASampleFormat outputSampleFormat()
Definition ASampleRateConverter.h:24
An std::weak_ptr with AUI extensions.
Definition SharedPtrTypes.h:179
ASampleFormat
Sample formats supported for mixing.
Definition ASampleFormat.h:12
@ I16
Signed 16-bit integer.
Definition ASampleFormat.h:16
@ I32
Signed 32-bit integer.
Definition ASampleFormat.h:26