Skip to content

File Amplimix.h

File List > Amplitude > Mixer > Amplimix.h

Go to the documentation of this file

// Copyright (c) 2024-present Sparky Studios. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef _AM_MIXER_AMPLIMIX_H
#define _AM_MIXER_AMPLIMIX_H

#include <SparkyStudios/Audio/Amplitude/Core/AudioBuffer.h>
#include <SparkyStudios/Audio/Amplitude/Core/Common.h>
#include <SparkyStudios/Audio/Amplitude/Core/Device.h>
#include <SparkyStudios/Audio/Amplitude/Core/Entity.h>
#include <SparkyStudios/Audio/Amplitude/Core/Listener.h>
#include <SparkyStudios/Audio/Amplitude/Core/Playback/Bus.h>
#include <SparkyStudios/Audio/Amplitude/Core/Playback/Channel.h>
#include <SparkyStudios/Audio/Amplitude/Core/Playback/ChannelInstance.h>
#include <SparkyStudios/Audio/Amplitude/Core/Room.h>
#include <SparkyStudios/Audio/Amplitude/Sound/Attenuation.h>

namespace SparkyStudios::Audio::Amplitude
{
    class Amplimix;
    class EffectInstance;
    class Event;
    class Sound;

    AM_CALLBACK(void, AfterMixCallback)(const Amplimix* mixer, const AudioBuffer* buffer, AmUInt32 frames);

    class AM_API_PUBLIC AmplimixLayer
    {
    public:
        virtual ~AmplimixLayer() = default;

        virtual AmUInt32 GetId() const = 0;

        virtual AmUInt64 GetStartPosition() const = 0;

        virtual AmUInt64 GetEndPosition() const = 0;

        virtual AmUInt64 GetCurrentPosition() const = 0;

        virtual AmReal32 GetGain() const = 0;

        virtual AmReal32 GetPitch() const = 0;

        virtual AmReal32 GetObstruction() const = 0;

        virtual AmReal32 GetOcclusion() const = 0;

        virtual AmReal32 GetPlaySpeed() const = 0;

        virtual AmVector3 GetLocation() const = 0;

        virtual Entity GetEntity() const = 0;

        virtual Listener GetListener() const = 0;

        virtual Room GetRoom() const = 0;

        virtual Channel GetChannel() const = 0;

        virtual Bus GetBus() const = 0;

        virtual SoundFormat GetSoundFormat() const = 0;

        virtual eSpatialization GetSpatialization() const = 0;

        virtual bool IsLoopEnabled() const = 0;

        virtual bool IsStreamEnabled() const = 0;

        virtual const Sound* GetSound() const = 0;

        virtual const std::shared_ptr<EffectInstance> GetEffect() const = 0;

        virtual const Attenuation* GetAttenuation() const = 0;

        virtual AmUInt32 GetSampleRate() const = 0;

        [[nodiscard]] virtual bool IsMultiPosition() const = 0;

        [[nodiscard]] virtual eChannelInstanceMode GetInstancingMode() const = 0;

        [[nodiscard]] virtual AmSize GetInstanceCount() const = 0;

        [[nodiscard]] virtual AmVector3 GetInstanceLocation(AmSize index) const = 0;

        [[nodiscard]] virtual Room GetInstanceRoom(AmSize index) const = 0;

        [[nodiscard]] virtual AmReal32 GetInstanceWeight(AmSize index) const = 0;

        [[nodiscard]] virtual AmReal32 GetInstanceGain(AmSize index) const = 0;
    };

    class AM_API_PUBLIC Amplimix
    {
    public:
        virtual ~Amplimix() = default;

        virtual void UpdateDevice(
            AmObjectID deviceID,
            AmString deviceName,
            AmUInt32 deviceOutputSampleRate,
            PlaybackOutputChannels deviceOutputChannels,
            PlaybackOutputFormat deviceOutputFormat) = 0;

        [[nodiscard]] virtual bool IsInitialized() const = 0;

        virtual void SetAfterMixCallback(AfterMixCallback callback) = 0;

        virtual AmUInt64 Mix(AudioBuffer** outBuffer, AmUInt64 frameCount) = 0;

        [[nodiscard]] virtual const DeviceDescription& GetDeviceDescription() const = 0;
    };
} // namespace SparkyStudios::Audio::Amplitude

#endif // _AM_MIXER_AMPLIMIX_H