Program Listing for File stdstream.hpp — sudio documentation

# Program Listing for File stdstream.hpp

↰ Return to documentation for file (`sudio\io\inc\stdstream.hpp`)

    /*
     -- W.T.A
     -- SUDIO (https://github.com/MrZahaki/sudio)
     -- The Audio Processing Platform
     -- Mail: mrzahaki@gmail.com
     -- Software license: "Apache License 2.0".
     -- file stdstream.hpp
    */
    #pragma once

    #include <portaudio.h>
    #include <string>
    #include <vector>
    #include <functional>
    #include <memory>
    #include <atomic>

    namespace stdstream {

    struct AudioDeviceInfo {
        int index;
        std::string name;
        int maxInputChannels;
        int maxOutputChannels;
        double defaultSampleRate;
        bool isDefaultInput;
        bool isDefaultOutput;
    };

    class AudioStream {
    public:
        AudioStream();
        ~AudioStream();

        using InputCallback = std::function<bool(const char*, unsigned long, PaSampleFormat)>;
        using OutputCallback = std::function<bool(char*, unsigned long, PaSampleFormat)>;

        void open(int inputDeviceIndex = -1, int outputDeviceIndex = -1,
                  double sampleRate = 0, PaSampleFormat format = paFloat32,
                  int inputChannels = 0, int outputChannels = 0,
                  unsigned long framesPerBuffer = paFramesPerBufferUnspecified,
                  bool enableInput = true, bool enableOutput = true,
                  PaStreamFlags streamFlags = paNoFlag,
                  InputCallback inputCallback = nullptr,
                  OutputCallback outputCallback = nullptr);
        void start();
        void stop();
        void close();

        std::vector<AudioDeviceInfo> getInputDevices();
        std::vector<AudioDeviceInfo> getOutputDevices();
        AudioDeviceInfo getDefaultInputDevice();
        AudioDeviceInfo getDefaultOutputDevice();
        int getDeviceCount();
        AudioDeviceInfo getDeviceInfoByIndex(int index);

        long readStream(uint8_t* buffer, unsigned long frames);
        long writeStream(const uint8_t* buffer, unsigned long frames);
        long getStreamReadAvailable();
        long getStreamWriteAvailable();
        int outputChannels;
        int inputChannels;
        PaSampleFormat streamFormat;

    private:
        PaStream* stream;
        std::atomic<bool> continueStreaming;
        InputCallback userInputCallback;
        OutputCallback userOutputCallback;
        static int paCallback(const void* inputBuffer, void* outputBuffer,
                              unsigned long framesPerBuffer,
                              const PaStreamCallbackTimeInfo* timeInfo,
                              PaStreamCallbackFlags statusFlags,
                              void* userData);
        int handleCallback(const void* inputBuffer, void* outputBuffer,
                           unsigned long framesPerBuffer,
                           const PaStreamCallbackTimeInfo* timeInfo,
                           PaStreamCallbackFlags statusFlags);
        bool isBlockingMode;
        bool inputEnabled;
        bool outputEnabled;
    };

    void writeToDefaultOutput(const std::vector<uint8_t>& data, PaSampleFormat sampleFormat,
                              int channels, double sampleRate);

    } // namespace stdstream