carb/audio/IAudioCapture.h
File members: carb/audio/IAudioCapture.h
// Copyright (c) 2018-2023, 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 "../Interface.h"
#include "../assets/IAssets.h"
#include "AudioTypes.h"
namespace carb
{
namespace audio
{
/******************************** typedefs, enums, & macros **************************************/
typedef void(CARB_ABI* DeviceChangeCallback)(Context* context, void* userData);
typedef uint32_t CaptureDeviceFlags;
constexpr CaptureDeviceFlags fCaptureDeviceFlagIgnoreOverruns = 0x1;
struct CaptureDeviceDesc
{
    CaptureDeviceFlags flags = 0;
    size_t deviceIndex = 0;
    size_t frameRate = 0;
    size_t channels = 0;
    SampleFormat sampleFormat = SampleFormat::eDefault;
    size_t bufferLength = 0;
    UnitType lengthType = UnitType::eFrames;
    size_t bufferFragments = 8;
    void* ext = nullptr;
};
typedef uint32_t CaptureContextFlags;
struct CaptureContextDesc
{
    CaptureContextFlags flags = 0;
    DeviceChangeCallback changeCallback = nullptr;
    void* callbackContext = nullptr;
    CaptureDeviceDesc device;
    void* ext = nullptr;
};
struct LockRegion
{
    void* ptr1;
    size_t len1;
    void* ptr2;
    size_t len2;
};
/********************************** IAudioCapture Interface **************************************/
struct IAudioCapture
{
    CARB_PLUGIN_INTERFACE("carb::audio::IAudioCapture", 1, 0)
    /************************ device and context management functions ****************************/
    size_t(CARB_ABI* getDeviceCount)();
    AudioResult(CARB_ABI* getDeviceCaps)(size_t deviceIndex, DeviceCaps* caps);
    Context*(CARB_ABI* createContext)(const CaptureContextDesc* desc);
    AudioResult(CARB_ABI* destroyContext)(Context* context);
    AudioResult(CARB_ABI* setSource)(Context* context, const CaptureDeviceDesc* desc);
    bool(CARB_ABI* isSourceValid)(Context* context);
    /**************************** capture state management functions *****************************/
    AudioResult(CARB_ABI* captureStart)(Context* context, bool looping);
    AudioResult(CARB_ABI* captureStop)(Context* context);
    AudioResult(CARB_ABI* getCaptureCursor)(Context* context, UnitType type, size_t* position);
    bool(CARB_ABI* isCapturing)(Context* context);
    /********************************* data management functions *********************************/
    AudioResult(CARB_ABI* lock)(Context* context, size_t length, LockRegion* region);
    AudioResult(CARB_ABI* unlock)(Context* context);
    size_t(CARB_ABI* calculateReadBufferSize)(Context* context, size_t frameCount);
    AudioResult(CARB_ABI* read)(Context* context, void* buffer, size_t lengthInFrames, size_t* framesRead);
    size_t(CARB_ABI* getBufferSize)(Context* context, UnitType type);
    AudioResult(CARB_ABI* getSoundFormat)(Context* context, SoundFormat* format);
    AudioResult(CARB_ABI* clear)(Context* context);
    AudioResult(CARB_ABI* getAvailableFrames)(Context* context, size_t* available);
};
} // namespace audio
} // namespace carb