omni/audio/experimental/IAudioCapture.h
File members: omni/audio/experimental/IAudioCapture.h
// Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved.
//
// NVIDIA CORPORATION and its licensors retain all intellectual property
// and proprietary rights in and to this software, related documentation
// and any modifications thereto. Any use, reproduction, disclosure or
// distribution of this software and related documentation without an express
// license agreement from NVIDIA CORPORATION is strictly prohibited.
//
#pragma once
#include <omni/core/BuiltIn.h>
#include <omni/core/IObject.h>
#include <omni/core/Api.h>
#include <omni/log/ILog.h>
#include <carb/audio/AudioTypes.h>
namespace omni
{
namespace audio
{
namespace experimental
{
/******************************** renamed carb::audio types **************************************/
using AudioResult = carb::audio::AudioResult;
using SpeakerMode = carb::audio::SpeakerMode;
using SampleFormat = carb::audio::SampleFormat;
using SoundFormat = carb::audio::SoundFormat;
/******************************** typedefs, enums, & macros **************************************/
struct Format
{
    size_t frameRate = 0;
    size_t channels = 0;
    SpeakerMode channelMask = carb::audio::kSpeakerModeDefault;
    SampleFormat format = SampleFormat::eDefault;
};
using CaptureDeviceFlags = uint32_t;
struct CaptureDeviceDesc
{
    CaptureDeviceFlags flags = 0;
    size_t index = 0;
    Format format = {};
    size_t bufferLength = 0;
    size_t bufferFragments = 0;
};
class ICaptureStream;
using CaptureDataCallback = void (*)(ICaptureStream* stream, const void* buffer, size_t frames, void* context);
enum class CaptureInfoType
{
    eOverrun,
    eDeviceLost,
};
union CaptureInfoData
{
    struct
    {
    } overrun;
    struct
    {
    } deviceLost;
    struct
    {
        OMNI_ATTR("no_py") uint8_t x[256];
    } reserved;
};
using CaptureInfoCallback = void (*)(ICaptureStream* stream,
                                     CaptureInfoType type,
                                     const CaptureInfoData* data,
                                     void* context);
using CaptureStreamFlags = uint32_t;
constexpr CaptureStreamFlags fCaptureStreamFlagLowLatency = 0x1;
struct CaptureStreamDesc
{
    CaptureStreamFlags flags = 0;
    CaptureDataCallback dataCallback = nullptr;
    CaptureInfoCallback errorCallback = nullptr;
    void* callbackContext = nullptr;
    CaptureDeviceDesc device;
};
using CaptureStreamStartFlags = uint32_t;
constexpr CaptureStreamStartFlags fCaptureStreamStartFlagOneShot = 0x1;
using CaptureStreamStopFlags = uint32_t;
constexpr CaptureStreamStopFlags fCaptureStreamStopFlagSync = 0x1;
/********************************** IAudioCapture Interface **************************************/
class ICaptureStream_abi : public omni::core::Inherits<omni::core::IObject, OMNI_TYPE_ID("omni.audio.ICaptureStream")>
{
protected:
    virtual AudioResult start_abi(CaptureStreamStartFlags flags) noexcept = 0;
    virtual AudioResult stop_abi(CaptureStreamStopFlags flags) noexcept = 0;
    virtual bool isCapturing_abi() noexcept = 0;
    virtual AudioResult getAvailableFrames_abi(OMNI_ATTR("out") size_t* available) noexcept = 0;
    virtual AudioResult lock_abi(size_t request,
                                 OMNI_ATTR("*in, out") const void** region,
                                 OMNI_ATTR("out") size_t* received) noexcept = 0;
    virtual AudioResult unlock_abi(size_t consumed) noexcept = 0;
    virtual size_t getBufferSize_abi() noexcept = 0;
    virtual size_t getFragmentCount_abi() noexcept = 0;
    virtual void getSoundFormat_abi(OMNI_ATTR("out") SoundFormat* format) noexcept = 0;
    virtual AudioResult reset_abi() noexcept = 0;
};
class IAudioCapture
{
public:
    CARB_PLUGIN_INTERFACE("omni::audio::IAudioCapture", 0, 0)
    AudioResult (*internalCreateStream)(const CaptureStreamDesc* desc, ICaptureStream** stream);
    inline AudioResult createStream(const CaptureStreamDesc* desc, omni::core::ObjectPtr<ICaptureStream>* stream)
    {
        if (stream == nullptr)
        {
            OMNI_LOG_ERROR("stream was null");
            return carb::audio::AudioResult::eInvalidParameter;
        }
        ICaptureStream* raw = nullptr;
        AudioResult res = internalCreateStream(desc, &raw);
        *stream = omni::core::steal(raw);
        return res;
    }
};
} // namespace experimental
} // namespace audio
} // namespace omni
#define OMNI_BIND_INCLUDE_INTERFACE_DECL
#include "IAudioCapture.gen.h"
class omni::audio::experimental::ICaptureStream
    : public omni::core::Generated<omni::audio::experimental::ICaptureStream_abi>
{
};
#define OMNI_BIND_INCLUDE_INTERFACE_IMPL
#include "IAudioCapture.gen.h"