使用音频引擎MITA制作自己的解码器的源代码


#include "../../include/mita.h" /**< @brief MITA SDK Header */
#ifdef _DEBUG
#pragma comment(lib, "../../library/mitaD.lib")
#else
#pragma comment(lib, "../../library/mita.lib")
#endif

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

#define _IID_Example MITA_UUID_Make(AAAABBBB,5059,11E0,8000,0B15,00000A15)

typedef struct MITA_TAG_MODULEHEADER
{
MITA_IDecoder base;
//
//TODO: 添加额外的模块数据
}MITA_MODULEHEADER;

#pragma warning(push)
#pragma warning(disable:4996)

MITA_STATIC
MITA_INLINE
MITA_VOID
MITA_CheckError(MITA_VOID)
{
MITA_ERROR lastError = MITA_GetLastError();
if (lastError != MITA_ERROR_OK)
{
printf("ERROR: MITA Framework error with %u codes\n", lastError);
exit(lastError);
}
}

MITA_STATIC
MITA_INLINE
MITA_BYTE
MITA_EnterKey(MITA_VOID)
{
MITA_INT32 key = 0xFF;
do
{
if (kbhit())
{
key = getch();
break;
}
} while (1);
if (key >= 'a' && key <= 'z')
key -= 32;
return key;
}

//

MITA_STATIC
MITA_VOID
MITA_CALLBACK
Example_Release(MITA_MODULEHEADER *pThis)
{
//
//TODO: 释放资源
if (pThis)
MITA_Free(pThis);
}

MITA_STATIC
MITA_BOOL
MITA_CALLBACK
Example_SetParam(MITA_MODULEHEADER *pThis, MITA_UINT32 nParamID, MITA_LPCVOID lpParam)
{
//
//TODO: 添加参数设置
return MITA_FALSE;
}

MITA_STATIC
MITA_BOOL
MITA_CALLBACK
Example_GetParam(MITA_MODULEHEADER *pThis, MITA_UINT32 nParamID, MITA_LPVOID lpParam)
{
//
//TODO: 添加参数获取
return MITA_FALSE;
}

MITA_SIZE
MITA_CALLBACK
Example_GetFileDescribeNums(MITA_MODULEHEADER *pThis)
{
//
//TODO: 获取所支持的文件列表长度
return MITA_NULL;
}

MITA_LPCAFD
MITA_CALLBACK
Example_GetFileDescribe(MITA_MODULEHEADER *pThis, MITA_SIZE nIndex)
{
//
//TODO: 获取所支持的文件列表
// 请参见 MITA_AFD 结构体
// 这里允许用户添加自定义数据
return MITA_NULL;
}

MITA_DWORD
MITA_CALLBACK
Example_GetFlags(MITA_MODULEHEADER *pThis)
{
//
//TODO: 获取解码的支持标签
// 参见MITA_DF_XXXX
//注意:如果不支持seek的话,一定不能添加 MITA_DF_SEEKABLE
return MITA_DF_DEFAULT;
}

MITA_BOOL
MITA_CALLBACK
Example_IsOpen(MITA_MODULEHEADER *pThis)
{
//
//TODO: 判断当前解码器是否已经初始化完毕
return MITA_FALSE;
}

MITA_BOOL
MITA_CALLBACK
Example_IsEof(MITA_MODULEHEADER *pThis)
{
//
//TODO: 判断是否已经解码结束
return MITA_FALSE;
}

MITA_LPCTIMEPOS
MITA_CALLBACK
Example_GetCurPos(MITA_MODULEHEADER *pThis)
{
//
//TODO: 获取当前解码位置
return MITA_NULL;
}

MITA_LPCCHANNELFORMAT
MITA_CALLBACK
Example_GetChannelInfo(MITA_MODULEHEADER* pThis)
{
//
//TODO: 获取当前播放源的通道格式信息
return MITA_NULL;
}

MITA_STATIC
MITA_INLINE
MITA_HSTREAM
getStream(MITA_HINSTANCE Instance, MITA_DWORD flag, MITA_LPCFILEPARAM lpParam, MITA_LPBOOL pNeedDelete)
{
MITA_HSTREAM hStream;
if (!MITA_ParseFileParam(Instance, (MITA_LPCFILEPARAM)lpParam, flag, (MITA_LPBOOL)pNeedDelete, &hStream))
return MITA_NULL;
return hStream;
}

MITA_BOOL
MITA_CALLBACK
Example_IsSupport(MITA_MODULEHEADER *pThis, MITA_LPCFILEPARAM lpParam)
{
MITA_HSTREAM hStream = MITA_NULL;
MITA_BOOL bDelete = MITA_FALSE;

//
//1. Get the stream of audio source.
hStream = getStream(pThis->base.base._instance, MITA_PFPF_READ, lpParam, &bDelete);
if (hStream == MITA_NULL)
return MITA_FALSE;

//
//TODO: 检测你自己的格式信息

if (bDelete)
MITA_CloseHandle(hStream);

return MITA_FALSE;
}

MITA_BOOL
MITA_CALLBACK
Example_DecodeInfo(MITA_MODULEHEADER *pThis, MITA_LPCFILEPARAM lpParam, MITA_WORD nFlag, MITA_HARRAY hItemArray)
{
MITA_BOOL bNeedDelete = MITA_FALSE;
MITA_HSOUND hSound;
MITA_HSTREAM hStream = getStream(pThis->base.base._instance, MITA_PFPF_READ, lpParam, &bNeedDelete);
if (hStream == MITA_NULL)
return MITA_FALSE;
//
//1. 创建 MITA_HSOUND 对象
if (!MITA_Sound_Create(pThis->base.base._instance, 0, &hSound))
{
if (bNeedDelete)
MITA_CloseHandle(hStream);
return MITA_FALSE;
}
//
//2. 判断 解码标签
if (nFlag&MITA_DIF_GETTAG)
{
//
//TODO: Read Tag
// 未来将会开放 MITA_HSOUND, MITA_HTAG 的接口
}
//
//3. 判断 是否只解码标签信息
if (!(nFlag&MITA_DIF_GETINFO))
{
//
MITA_Array_PushTop(hItemArray, &hSound);
//
if (bNeedDelete)
MITA_CloseHandle(hStream);
return MITA_TRUE;
}
//
//TODO: Fill hSound information
//
//4. 释放资源
if (bNeedDelete)
MITA_CloseHandle(hStream);
//
//5. 将MITA_HSOUND对象添加到队列中
MITA_Array_PushTop(hItemArray, &hSound);
//

return MITA_TRUE;
}

MITA_BOOL
MITA_CALLBACK
Example_Seek(MITA_MODULEHEADER *pThis, MITA_LPCTIME pCurTime)
{
//
//TODO: Seek audio source.
return MITA_TRUE;
}

MITA_BOOL
MITA_CALLBACK
Example_Startup(MITA_MODULEHEADER *pThis, MITA_LPCFILEPARAM lpParam, MITA_HSOUND hSound)
{
//
//TODO: 添加你的初始化代码
return MITA_TRUE;
}

MITA_SIZE
MITA_CALLBACK
Example_Decode(MITA_MODULEHEADER *pThis, void *pFrames, MITA_SIZE nFrames)
{
//
//TODO: 添加您的解码代码
return (-1);
}

MITA_BOOL
MITA_CALLBACK
Example_Terminate(MITA_MODULEHEADER *pThis, MITA_BOOL bAbort)
{
//
//TODO: 添加你的结束代码
return MITA_FALSE;
}

MITA_STATIC
MITA_LPCMODULEINFO
MITA_CALLBACK
Example_GetModuleInfo(MITA_IModule* pThis)
{
return pThis->PlusObject->getModuleInfo(pThis->PlusObject);
}

MITA_STATIC
MITA_BOOL
MITA_CALLBACK
Example_HasWindow(MITA_IModule* pThis, MITA_DWORD dwType)
{
return pThis->PlusObject->hasWindow(pThis->PlusObject, dwType);
}

MITA_STATIC
MITA_BOOL
MITA_CALLBACK
Example_ShowWindow(MITA_IModule* pThis, MITA_DWORD dwType, MITA_HANDLE hParent, MITA_BOOL bShow)
{
return pThis->PlusObject->showWindow(pThis->PlusObject, dwType, hParent, bShow);
}

MITA_STATIC
MITA_IModule*
MITA_CALLBACK
Example_CreateObject(MITA_IStaticPlus *pThis, MITA_HINSTANCE hInstance)
{
MITA_MODULEHEADER *pExample = (MITA_MODULEHEADER *)MITA_Malloc(sizeof(MITA_MODULEHEADER));
if (pExample == MITA_NULL)
return MITA_NULL;

pExample->base.base.PlusObject = &pThis->base;
pExample->base.base._instance = hInstance;
pExample->base.base._resverd = MITA_MODULE_RESVERD_DECODER;
pExample->base.base.release = Example_Release;
pExample->base.base.getModuleInfo = Example_GetModuleInfo;
pExample->base.base.hasWindow = Example_HasWindow;
pExample->base.base.showWindow = Example_ShowWindow;
pExample->base.setParam = Example_SetParam;
pExample->base.getParam = Example_GetParam;
pExample->base.getFileDescribeNums = Example_GetFileDescribeNums;
pExample->base.getFileDescribe = Example_GetFileDescribe;
pExample->base.getFlags = Example_GetFlags;
pExample->base.isSupport = Example_IsSupport;
pExample->base.seek = Example_Seek;
pExample->base.decodeInfo = Example_DecodeInfo;
pExample->base.startup = Example_Startup;
pExample->base.decode = Example_Decode;
pExample->base.terminate = Example_Terminate;
pExample->base.isEof = Example_IsEof;
pExample->base.isOpen = Example_IsOpen;
pExample->base.getCurPos = Example_GetCurPos;
pExample->base.getChannelInfo = Example_GetChannelInfo;
//
//TODO: 添加额外的初始化操作。

return (MITA_IModule*)pExample;
}

MITA_STATIC
MITA_LPCMODULEINFO
MITA_CALLBACK
Plus_GetModuleInfo(MITA_IStaticPlus *pThis)
{
return &pThis->moduleInfo;
}
MITA_STATIC
MITA_BOOL
MITA_CALLBACK
Plus_HasWindow(MITA_IStaticPlus *pThis, MITA_DWORD dwType)
{
return MITA_FALSE;
}
MITA_STATIC
MITA_BOOL
MITA_CALLBACK
Plus_ShowWindow(MITA_IStaticPlus *pThis, MITA_DWORD dwType, MITA_HANDLE hParent, MITA_BOOL bShow)
{
return MITA_FALSE;
}

MITA_STATIC
MITA_IStaticPlus
gExamplePlugin =
{
Plus_GetModuleInfo,
Plus_HasWindow,
Plus_ShowWindow,
Example_CreateObject,
{
MITA_MT_DECODER,
_IID_Example,
1,
L"MITA Plugin Example",
L"MITA Plugin Example Module",
L"Copyright(C) Hangzhou Migan Technology 2008-2011. All rights reserved.",
MITA_NULL
}
};

MITA_STATIC
MITA_HPLUSOBJECT
MITA_CALL
Example_ModuleMain(void)
{
return (MITA_HPLUSOBJECT)&gExamplePlugin;
}

//
//如果你想要导出dll的话,那么还需要添加一个接口函数
// MITA_GetPlusMains, nIndex 为模块的序号
_declspec(dllexport)
MITA_MODULEMAIN
MITA_CALL
MITA_GetPlusMains(MITA_SIZE nIndex)
{
switch (nIndex)
{
case 0:
return Example_ModuleMain;
}
return MITA_NULL;
}

void main(void)
{
MITA_HINSTANCE hInstance;
MITA_HPLUGIN hExamplePlugin;
MITA_HMODULE hExampleModule;
MITA_HOBJECT hExampleObject;
MITA_UUID RegGuid;
MITA_MODULEINFO moduleInfo;
MITA_BYTE Key;

printf(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");
printf(";;Copyright(C) 杭州蜜柑科技有限公司 2008 - 2010. 保留所有权利。;;\n");
printf(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");
printf(";;Plugin Decoder Example ;;\n");
printf(";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");

//
//1. Create a global instance handle.
hInstance = MITA_Initialize(MITA_NULL);
MITA_CheckError();

printf("Press A use static module loader.\n");
printf("Press B use export module loader.\n");
Key = MITA_EnterKey() - 'A';

if (Key == 0)
{
//
//2. Register Module
MITA_Ins_RegisterModule(hInstance, Example_ModuleMain, &RegGuid, &hExampleModule);
MITA_CheckError();
}
else
{
//
//2. Load Plugin, just this exe file.
MITA_Ins_LoadPlugin(hInstance, L"make_your_decoder.exe", &hExamplePlugin);
MITA_CheckError();
MITA_Ins_GetModuleByIndex(hInstance, 0, &hExampleModule);
MITA_CheckError();
}

//
//3. Create Module Object
MITA_Module_CreateModuleObject(hExampleModule, &hExampleObject);
MITA_CheckError();

//
MITA_Object_GetModuleInfo(hExampleObject, &moduleInfo);
MITA_CheckError();

printf("\n");
printf("Name: %s\n", MITA_Text_ToSystemS(moduleInfo.name, MITA_TCT_DEFAULT));
printf("Vers: %08X\n", moduleInfo.version);
printf("Desc: %s\n", MITA_Text_ToSystemS(moduleInfo.describe, MITA_TCT_DEFAULT));
printf("Copy: %s\n", MITA_Text_ToSystemS(moduleInfo.copyright, MITA_TCT_DEFAULT));
printf("\n");

/*
use MITA_Decoder_XXXX operations.
*/

//
//4. Delete Module Object
MITA_CloseHandle(hExampleObject);
MITA_CheckError();

//
//*: 这一步不是必须的
if (Key == 0)
{
//
//5*. Unregister Module,这一步不是必须的,在释放“实例句柄”的时候,会自动
// 进行移除操作。
MITA_Ins_UnregisterModule(hInstance, &RegGuid);
MITA_CheckError();
}
else
{
MITA_Ins_UnregisterPluginModule(hInstance, hExamplePlugin, MITA_NULL);
MITA_CheckError();
}

//
//6. Delete global instance handle.
MITA_CloseHandle(hInstance);
}

#pragma warning(pop)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值