Commit e7a93a79 authored by Byurrrer's avatar Byurrrer

added Buffer, as well interfaces of audio codecs and sound system

parent 62c343ed
......@@ -76,6 +76,7 @@
<ClInclude Include="..\..\..\source\common\string_utils.h" />
<ClInclude Include="..\..\..\source\core\AsyncFileReader.h" />
<ClInclude Include="..\..\..\source\core\AsyncTaskRunner.h" />
<ClInclude Include="..\..\..\source\core\Buffer.h" />
<ClInclude Include="..\..\..\source\core\FileExtPathsIterator.h" />
<ClInclude Include="..\..\..\source\core\FileExtsIterator.h" />
<ClInclude Include="..\..\..\source\core\FileInMemory.h" />
......@@ -107,11 +108,14 @@
<ClInclude Include="..\..\..\source\xcommon\IAsyncTaskRunner.h" />
<ClInclude Include="..\..\..\source\xcommon\IFileSystem.h" />
<ClInclude Include="..\..\..\source\xcommon\IPluginManager.h" />
<ClInclude Include="..\..\..\source\xcommon\IXAudioCodec.h" />
<ClInclude Include="..\..\..\source\xcommon\IXBuffer.h" />
<ClInclude Include="..\..\..\source\xcommon\IXConfig.h" />
<ClInclude Include="..\..\..\source\xcommon\IXCore.h" />
<ClInclude Include="..\..\..\source\xcommon\IXModelLoader.h" />
<ClInclude Include="..\..\..\source\xcommon\IXPlugin.h" />
<ClInclude Include="..\..\..\source\xcommon\IXRenderable.h" />
<ClInclude Include="..\..\..\source\xcommon\IXSoundSystem.h" />
<ClInclude Include="..\..\..\source\xcommon\IXTextureLoader.h" />
<ClInclude Include="..\..\..\source\xcommon\IXTextureProxy.h" />
<ClInclude Include="..\..\..\source\xcommon\IXUpdatable.h" />
......
......@@ -272,5 +272,17 @@
<ClInclude Include="..\..\..\source\xcommon\IXConfig.h">
<Filter>Header\xcommon</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\xcommon\IXAudioCodec.h">
<Filter>Header\xcommon</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\xcommon\IXSoundSystem.h">
<Filter>Header\xcommon</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\xcommon\IXBuffer.h">
<Filter>Header\xcommon</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\core\Buffer.h">
<Filter>Header</Filter>
</ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
/*****************************************************
Copyright © DogmaNet Team, 2020
Site: dogmanet.ru
See the license in LICENSE
*****************************************************/
#ifndef __BUFFER_H
#define __BUFFER_H
#include <xcommon/IXBuffer.h>
//##########################################################################
//! реализация интерфейса IXBuffer
class CBuffer : public IXBuffer
{
public:
~CBuffer(){ free(); }
virtual void XMETHODCALLTYPE alloc(size_t size) override
{
if (m_size > 0 && m_pBuffer)
free();
m_size = size;
m_pBuffer = new BYTE[m_size];
}
virtual void XMETHODCALLTYPE free() override
{
mem_delete_a(m_pBuffer);
m_size = 0;
}
virtual size_t XMETHODCALLTYPE size() override
{
return m_size;
}
virtual BYTE* XMETHODCALLTYPE get() override
{
return m_pBuffer;
}
protected:
BYTE *m_pBuffer = NULL;
size_t m_size = 0;
};
#endif
#include "Core.h"
#include "Core.h"
#include <common/file_utils.h>
#include "AsyncFileReader.h"
#include "AsyncTaskRunner.h"
......@@ -18,6 +18,7 @@
#include "ResourceTexture.h"
#include "Config.h"
#include "Buffer.h"
extern CTimeManager *g_pTimers;
extern CPerfMon *g_pPerfMon;
......@@ -30,10 +31,10 @@ CCore::CCore(const char *szName)
ConsoleRegisterCmds();
CvarInitSystem(this);
Core_0RegisterCVarBool("g_time_run", true, "Запущено ли игровое время?", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarFloat("g_time_speed", 1.f, "Скорость/соотношение течения игрового времени", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarBool("dbg_config_save", false, "Отладочный вывод процесса сохранения конфига");
Core_0RegisterCVarInt("r_stats", 0, "Показывать ли статистику? 0 - нет, 1 - fps и игровое время, 2 - показать полностью");
Core_0RegisterCVarBool("g_time_run", true, "Запущено ли игровое время?", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarFloat("g_time_speed", 1.f, "Скорость/соотношение течения игрового времени", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarBool("dbg_config_save", false, "Отладочный вывод процесса сохранения конфига");
Core_0RegisterCVarInt("r_stats", 0, "Показывать ли статистику? 0 - нет, 1 - fps и игровое время, 2 - показать полностью");
Core_0RegisterConcmd("on_g_time_run_change", []()
{
......@@ -433,6 +434,11 @@ IXConfig* XMETHODCALLTYPE CCore::newConfig()
return(new CXConfig());
}
IXBuffer* XMETHODCALLTYPE CCore::newBuffer()
{
return(new CBuffer());
}
const char** XMETHODCALLTYPE CCore::getPCVarString(const char *szName)
{
return(GET_PCVAR_STRING(szName));
......
#ifndef __CORE_H
#ifndef __CORE_H
#define __CORE_H
#include "sxcore.h"
......@@ -43,7 +43,8 @@ public:
ID XMETHODCALLTYPE getThreadId() override;
bool XMETHODCALLTYPE isOnMainThread() override;
IXConfig* XMETHODCALLTYPE CCore::newConfig() override;
IXConfig* XMETHODCALLTYPE newConfig() override;
IXBuffer* XMETHODCALLTYPE newBuffer() override;
const char** XMETHODCALLTYPE getPCVarString(const char *szName) override;
const int* XMETHODCALLTYPE getPCVarInt(const char *szName) override;
......
/*****************************************************
Copyright © DogmaNet Team, 2020
Site: dogmanet.ru
See the license in LICENSE
*****************************************************/
#ifndef __IXAUDIOCODEC_H
#define __IXAUDIOCODEC_H
#include <gdefines.h>
#include <xcommon/IXBuffer.h>
#include <xcommon/IXSoundSystem.h>
#include <common/AudioRawDesc.h>
//##########################################################################
// {7D338709-3BC1-4008-8AA0-74305E337D7F}
#define IXAUDIOCODEC_GUID DEFINE_XGUID(0x7d338709, 0x3bc1, 0x4008, 0x8a, 0xa0, 0x74, 0x30, 0x5e, 0x33, 0x7d, 0x7f)
#define IXAUDIOCODEC_VERSION 1
//##########################################################################
class IXAudioCodecTarget;
/*!
* интерфейс аудио кодека выдающего целевой обьект для работы с файлом
*/
class IXAudioCodec: public IXUnknown
{
public:
/*! возвращает формат кодека
@note например ogg-vorbis, wav-pcm
*/
virtual const char* XMETHODCALLTYPE getFormat() const = 0;
//************************************************************************
/*! возвращает расширение файлов кодека
@note кодек может принимать несколько расширений, но это не значит что идентификация формата идет на основании расширения
@param uIndex порядковый номер
@return строку если uIndex корректный (находится в пределах массива расширений), NULL в ином случае
*/
virtual const char* XMETHODCALLTYPE getExt(UINT uIndex=0) const = 0;
//************************************************************************
//! возвращает количество поддерживаемых расширений файлов
virtual UINT XMETHODCALLTYPE getExtCount() const = 0;
/*! возвращает может ли кодек декодировать (прочитать) файл pFile
@param szFile путь до файла
@param szArg аргументы в строке, игнорируется
@param ppTarget указатель на неиницилизированный целевой обьект кодека
@param forSave открыть ли файл для записи
@return true если может открыть (для чтения или записи) и декодировать (для чтения), иначе false
*/
virtual bool XMETHODCALLTYPE open(const char *szFile, const char *szArg, IXAudioCodecTarget **ppTarget, bool forSave = false) = 0;
//************************************************************************
//! возвращает может ли кодек кодировать (записывать)
virtual bool XMETHODCALLTYPE canSave(UINT uIndex=0) const = 0;
};
//##########################################################################
/*!
интерфейс целевого кодека работающего с файлом
*/
class IXAudioCodecTarget: public IXUnknown
{
public:
virtual void getDesc(AudioRawDesc *pDesc) const = 0;
//************************************************************************
/*! возвращает текущую позицию (в байтах) в PCM данных
@return >= 0 в случае успеха, -1 в случае ошибки
*/
virtual int64_t XMETHODCALLTYPE getPos() const = 0;
//************************************************************************
/*! установка позиции в PCM данных
@param uPos позиция в байтах
*/
virtual void XMETHODCALLTYPE setPos(int64_t uPos) = 0;
//************************************************************************
/*! декодирование (считывание) PCM данные из pFile в ppData начиная с iPos длиной в uLen
@param iPos позиция в PCM данных, в байтах
@param uLen сколько PCM данных надо считать, в байтах (является ограничением, а не требованием)
@param pFile указатель на FILE (чтение)
@param ppData указатель на выделенный массив байтов размером не менее uLen
@return размер считанных PCM данных в байтах
*/
virtual size_t XMETHODCALLTYPE decode(int64_t iPos, uint64_t uLen, void **ppData) = 0;
//************************************************************************
/*! кодирование PCM данных pBufferPCM с требуемым описанием в формат кодека
@param pFile указатель на FILE (запись)
@param pBufferPCM буфер с PCM данными
@param pOutDesc описание PCM данных для вывода
@return true в случае успеха, иначе false
*/
virtual bool XMETHODCALLTYPE encode(IXBuffer *pBufferPCM, AudioRawDesc *pOutDesc) = 0;
};
#endif
/*****************************************************
Copyright © DogmaNet Team, 2020
Site: dogmanet.ru
See the license in LICENSE
*****************************************************/
#ifndef __IXBUFFER_H
#define __IXBUFFER_H
#include <gdefines.h>
//##########################################################################
//! интерфейс буфера с выделяемой памятью
class IXBuffer : public IXUnknown
{
public:
/*! выделение памяти размером size
@note если память уже была выделена произойдет ее освобождение и новое выделение
*/
virtual void XMETHODCALLTYPE alloc(size_t size) = 0;
//! очистка ранее выделенной памяти (если была)
virtual void XMETHODCALLTYPE free() = 0;
//! возвращает размер выделенной памяти в байтах
virtual size_t XMETHODCALLTYPE size() = 0;
//! возвращает указатель на выделенную память
virtual BYTE* XMETHODCALLTYPE get() = 0;
};
#endif
#ifndef __IXCORE_H
#ifndef __IXCORE_H
#define __IXCORE_H
#include <gdefines.h>
......@@ -8,6 +8,7 @@
#include "XEvents.h"
#include "IXRenderPipeline.h"
#include "IXConfig.h"
#include "IXBuffer.h"
#include <fcntl.h>
#include <io.h>
......@@ -41,6 +42,7 @@ public:
virtual bool XMETHODCALLTYPE isOnMainThread() = 0;
virtual IXConfig* XMETHODCALLTYPE newConfig() = 0;
virtual IXBuffer* XMETHODCALLTYPE newBuffer() = 0;
virtual const char** XMETHODCALLTYPE getPCVarString(const char *szName) = 0;
virtual const int* XMETHODCALLTYPE getPCVarInt(const char *szName) = 0;
......@@ -112,8 +114,8 @@ class CCoreOutPtr
FILE *m_fOut;
};
/*! Устанавливает поток вывода. Для работы консоли
\warning Должна быть инлайнова, чтобы выполняться в контексте вызывающей библиотеки
/*! Устанавливает поток вывода. Для работы консоли
\warning Должна быть инлайнова, чтобы выполняться в контексте вызывающей библиотеки
*/
__inline void Core_SetOutPtr(IXCore *pCore)
{
......
/*****************************************************
Copyright © DogmaNet Team, 2020
Site: dogmanet.ru
See the license in LICENSE
*****************************************************/
#ifndef __IXSOUNDSYSTEM_H
#define __IXSOUNDSYSTEM_H
#include <gdefines.h>
#include <common/math.h>
#include <common/AudioRawDesc.h>
//##########################################################################
// {8FF4F913-5EA1-4EE6-8C06-73D8A49EBC22}
#define IXSOUNDSYSTEM_GUID DEFINE_XGUID(0x8ff4f913, 0x5ea1, 0x4ee6, 0x8c, 0x6, 0x73, 0xd8, 0xa4, 0x9e, 0xbc, 0x22)
#define IXSOUNDSYSTEM_VERSION 2
//##########################################################################
#define SOUND_CACHE "cache"
enum SOUND_DTYPE
{
SOUND_DTYPE_2D,
SOUND_DTYPE_3D
};
//! тип зацикленности звука
enum SOUND_LOOP
{
SOUND_LOOP_NONE = 0,
SOUND_LOOP_SIMPLE = 1,
SOUND_LOOP_SEAMLESS = 2
};
//##########################################################################
class IXSoundBase: public IXUnknown
{
public:
virtual SOUND_DTYPE XMETHODCALLTYPE getType() = 0;
virtual void XMETHODCALLTYPE play() = 0;
virtual void XMETHODCALLTYPE setVolume(float fVolume) = 0;
virtual float XMETHODCALLTYPE getVolume() const = 0;
virtual void XMETHODCALLTYPE setPan(float fPan) = 0;
virtual float XMETHODCALLTYPE getPan() const = 0;
virtual const float3& XMETHODCALLTYPE getWorldPos() const = 0;
virtual void XMETHODCALLTYPE setWorldPos(const float3 &vPos) = 0;
virtual float XMETHODCALLTYPE getDistance() const = 0;
virtual void XMETHODCALLTYPE setDistance(float fDist) = 0;
};
//**************************************************************************
class IXSoundEmitter: public virtual IXSoundBase
{
};
//**************************************************************************
class IXSoundPlayer: public virtual IXSoundBase
{
public:
virtual void XMETHODCALLTYPE resume() = 0;
virtual void XMETHODCALLTYPE pause() = 0;
virtual void XMETHODCALLTYPE stop() = 0;
virtual bool XMETHODCALLTYPE isPlaying() const = 0;
virtual SOUND_LOOP XMETHODCALLTYPE getLoop() const = 0;
virtual void XMETHODCALLTYPE setLoop(SOUND_LOOP loop) = 0;
virtual float XMETHODCALLTYPE getTime() const = 0;
virtual void XMETHODCALLTYPE setTime(float fTime) = 0;
virtual float XMETHODCALLTYPE getLength() const = 0;
};
//##########################################################################
class IXSoundLayer: public IXUnknown
{
public:
virtual void XMETHODCALLTYPE play(bool canPlay) = 0;
virtual bool XMETHODCALLTYPE isPlaying() const = 0;
virtual const char* XMETHODCALLTYPE getName() const = 0;
virtual IXSoundLayer* XMETHODCALLTYPE findLayer(const char *szName) = 0;
virtual IXSoundLayer* XMETHODCALLTYPE newSoundLayer(const AudioRawDesc *pDesc, const char *szName) = 0;
virtual IXSoundEmitter* XMETHODCALLTYPE newSoundEmitter(const char *szName, SOUND_DTYPE dtype) = 0;
virtual IXSoundPlayer* XMETHODCALLTYPE newSoundPlayer(const char *szName, SOUND_DTYPE dtype) = 0;
virtual void XMETHODCALLTYPE getDesc(AudioRawDesc *pDesc) const = 0;
};
//**************************************************************************
class IXSoundSystem: public IXUnknown
{
public:
virtual IXSoundLayer* XMETHODCALLTYPE createMasterLayer(const AudioRawDesc *pDesc, const char *szName) = 0;
virtual IXSoundLayer* XMETHODCALLTYPE findLayer(const char *szName) = 0;
virtual void XMETHODCALLTYPE update(const float3 &vListenerPos, const float3 &vListenerDir, const float3 &vListenerUp) = 0;
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment