You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.h

124 lines
4.3 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AudioSourceManager.h>
namespace Audio
{
/**
* Base class for audio file parser.
* Any supported audio file types will have a parser implementation
* that will parse header information to extract the audio format.
*/
class AudioFileParser
{
public:
AUDIO_IMPL_CLASS_ALLOCATOR(AudioFileParser)
AudioFileParser() = default;
virtual ~AudioFileParser() = default;
AudioFileParser(const AudioFileParser&) = delete;
AudioFileParser& operator=(const AudioFileParser&) = delete;
/**
* Parse header from a file stream.
* Parses header of an audio file and returns the byte-offset into the file where the audio data begins.
* @param fileStream An opened file stream on the audio file.
* @return Byte-offset into the file where audio data begins.
*/
virtual size_t ParseHeader(AZ::IO::FileIOStream& fileStream) = 0;
/**
* Check validity of the header info.
* This should only return true if the header was parsed and user can expect to see valid format data.
* @return True if the header was parsed without error.
*/
virtual bool IsHeaderValid() const = 0;
virtual AudioInputSampleType GetSampleType() const = 0;
virtual AZ::u32 GetNumChannels() const = 0;
virtual AZ::u32 GetSampleRate() const = 0;
virtual AZ::u32 GetByteRate() const = 0;
virtual AZ::u32 GetBitsPerSample() const = 0;
virtual AZ::u32 GetDataSize() const = 0;
};
/**
* A type of AudioInputSource representing an audio file.
* Contains audio file data, holds a pointer to the raw data and provides methods to read chunks of data at a time
* to an output (AkAudioBuffer).
*/
class AudioInputFile
: public AudioInputSource
{
public:
AUDIO_IMPL_CLASS_ALLOCATOR(AudioInputFile)
AudioInputFile(const SAudioInputConfig& sourceConfig);
~AudioInputFile() override;
/**
* Load file into buffer.
* Use an AudioFileParser if needed to parse header information, then proceed to load the audio data
* to the internal buffer.
* @return True upon successful load, false otherwise.
*/
bool LoadFile();
/**
* Unload the file data.
* Release the internal buffer of file data.
*/
void UnloadFile();
void ReadInput(const AudioStreamData& data) override;
void WriteOutput(AkAudioBuffer* akBuffer) override;
bool IsOk() const override;
void OnDeactivated() override;
/**
* Copy data from the internal buffer to an output buffer.
* Copies a specified number of sample frames to an output buffer. If more frames are requested
* than can be copied, only allowable frames are copied and number of frames that were copied is returned.
* @param numSampleFrames Number of sample frames requested for copy.
* @param toBuffer Output buffer to copy to.
* @return Number of sample frames actually copied.
*/
size_t CopyData(size_t numSampleFrames, void* toBuffer); // frames, not bytes!
private:
/**
* Resets internal bookmarking.
* Bookmarks are used internally to keep track of where we are in the buffer during
* chunk-copying to output.
*/
void ResetBookmarks();
/**
* Checks whether data copying has reached the end of the file data.
* @return True if end of file has been reached, false otherwise.
*/
bool IsEof() const;
AZStd::unique_ptr<AudioFileParser> m_parser = nullptr;
AZ::u8* m_dataPtr = nullptr; ///< The internal data buffer.
size_t m_dataSize = 0; ///< The internal data size.
// Bookmarks
AZ::u8* m_dataCurrentPtr = nullptr; ///< The internal bookmark pointer.
size_t m_dataCurrentReadSize = 0; ///< The internal bookmark indicating how much data has been read so far.
};
} // namespace Audio