CFMOD.h

 #ifndef CFMOD_H
#define CFMOD_H #include "qfmod.h" struct Sound_t
{
char *pszName;
FMOD_SOUND *pSound;
FMOD_CHANNEL *pChannel;
Sound_t *pNext;
}; #ifdef PlaySound
#undef PlaySound
#endif class CFmod
{
public:
CFmod();
~CFmod();
public:
void Init(void);
void PlaySound(char *pszFileName);
void StopSound(char *pszFileName);
void Shutdown(void);
private:
Sound_t* FindSound(char *pszFileName);
bool CacheSound(char *pszFileName);
private:
FMOD_SYSTEM *m_pSystem;
Sound_t *m_pBaseSound;
}; #endif

CFMOD.cpp

 #include <metahook.h>

 #include "qfmod.h"

 #include "cfmod.h"

 extern IFileSystem *g_pFileSystem;

 CFmod::CFmod()
{
m_pSystem = NULL;
m_pBaseSound = NULL;
} CFmod::~CFmod()
{
m_pSystem = NULL;
m_pBaseSound = NULL;
} void CFmod::Init(void)
{
CFmod(); qFMOD_System_Create(&m_pSystem);
qFMOD_System_Init(m_pSystem, , FMOD_INIT_NORMAL, NULL);
} void CFmod::PlaySound(char *pszFileName)
{
if (!m_pSystem)
return; Sound_t *pSound = FindSound(pszFileName); if (!pSound)
{
if (!CacheSound(pszFileName))
return;
} pSound = FindSound(pszFileName); if (!pSound)
return; qFMOD_System_PlaySound(m_pSystem, FMOD_CHANNEL_FREE, pSound->pSound, NULL, &pSound->pChannel);
} void CFmod::StopSound(char *pszFileName)
{
if (!m_pSystem)
return; if (pszFileName != NULL)
{
Sound_t *pSound = FindSound(pszFileName); if (!pSound)
return; if (pSound->pChannel)
qFMOD_Channel_Stop(pSound->pChannel);
}
else
{
for (Sound_t *p = m_pBaseSound; p; p = p->pNext)
{
if (p->pChannel)
qFMOD_Channel_Stop(p->pChannel);
}
}
} void CFmod::Shutdown(void)
{
if (!m_pSystem)
return; Sound_t *p = m_pBaseSound;
Sound_t *t; while (p)
{
t = p->pNext; free(p->pszName);
qFMOD_Sound_Release(p->pSound);
delete p; p = t;
} qFMOD_System_Close(m_pSystem);
qFMOD_System_Release(m_pSystem);
} Sound_t* CFmod::FindSound(char *pszFileName)
{
if (!m_pSystem)
return NULL; for (Sound_t *p = m_pBaseSound; p; p = p->pNext)
{
if (p->pszName && !strcmp(p->pszName, pszFileName))
return p;
} return NULL;
} bool CFmod::CacheSound(char *pszFileName)
{
if (!m_pSystem)
return false; FileHandle_t pFile;
uint32 iFileLen;
BYTE *pBuffer;
FMOD_CREATESOUNDEXINFO ExInfo;
FMOD_SOUND *pSound;
Sound_t *pCache; pFile = g_pFileSystem->Open(pszFileName, "rb"); if (!pFile)
{
return false;
} g_pFileSystem->Seek(pFile, , FILESYSTEM_SEEK_TAIL);
iFileLen = g_pFileSystem->Tell(pFile);
g_pFileSystem->Seek(pFile, , FILESYSTEM_SEEK_HEAD); pBuffer = (BYTE *)malloc(iFileLen);
g_pFileSystem->Read(pBuffer, iFileLen, pFile); g_pFileSystem->Close(pFile); memset(&ExInfo, , sizeof(ExInfo));
ExInfo.cbsize = sizeof(ExInfo);
ExInfo.length = iFileLen; if (qFMOD_System_CreateSound(m_pSystem, (const char *)pBuffer, FMOD_HARDWARE | FMOD_OPENMEMORY, &ExInfo, &pSound) != FMOD_OK)
{
free(pBuffer);
return false;
} free(pBuffer); pCache = new Sound_t;
pCache->pszName = (char *)malloc(strlen(pszFileName) * sizeof(char) + );
strcpy(pCache->pszName, pszFileName);
pCache->pSound = pSound;
pCache->pChannel = NULL;
pCache->pNext = m_pBaseSound;
m_pBaseSound = pCache; return true;
}

[MetaHook] Quake FMOD player demo的更多相关文章

  1. [MetaHook] Quake FMOD function

    QFMOD.h #ifndef QFMOD_H #define QFMOD_H #include "fmod.h" extern FMOD_RESULT (F_API *qFMOD ...

  2. [MetaHook] Quake OpenGL function

    Quake OpenGL function for MetaHook plugin. Thank hzqst :D QGL.h #ifndef QGL_H #define QGL_H #include ...

  3. [MetaHook] Quake Bink function

    If you want to play Bink video in game, maybe you need this code. QBink.h #ifndef QBINK_H #define QB ...

  4. 20款jQuery 的音频和视频插件

    分享 20 款jQuery的音频和视频插件 Blueimp Gallery: DEMO || DOWNLOAD Blueimp gallery 主要为移动设备而设计,同时也支持桌面浏览器.可定制视频和 ...

  5. 23+ Useful HTML5 Open Source Online Video Players & Libraries,

    Akamai’s Open Video Player for HTML5 <video> Akamai has released a new Open Video Player for H ...

  6. Ubuntu启动自动登录并启动程序

    最近在研究Ubuntu,需要在系统启动之后自动登录,并且启动某个程序. 手上拿到的系统只有一个空桌面,其他嘛也没有,鼠标右键也不管用.于是借助自己的虚拟机研究发现,自动启动程序配置文件在: /home ...

  7. Qt5官方demo解析集35——Music Player(使用winextras模块)

    本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集34——Concentr ...

  8. Composer Player 属性设置

    /// <summary> /// 设置选中名称 /// </summary> /// <param name="name"></para ...

  9. HTML5打造的炫酷本地音乐播放器-喵喵Player

    将之前捣腾的音乐频谱效果加上一个播放列表就成了现在的喵喵播放器(Meow meow Player,额知道这名字很二很装萌~),全HTML5打造的网页程序,可本地运行也可以挂服务器上用. 在线Demo及 ...

随机推荐

  1. partproble在RHEL 6下无法更新分区信息

    在RHEL5.x版本下面,在添加磁盘分区等操作后,一直使用partproble命令使内核重新读取分区表信息,从而不用重新启动.但是最近在RHEL 6(Red Hat Enterprise Linux ...

  2. HTML基础(三)——css样式表

    CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控制精确, ...

  3. SSRS 的简单使用(二)

    经过上一篇的初始,我们已经做好了报表的准备工作,接下来我们进行报表的展示和其他一下操作,并且给出一些使用RS的方法方便大家日后能灵活使用. 步骤:        1.首先拖拽表格等进入到设计模板 点击 ...

  4. 【SQL篇章--基于MySQL5.7--创建用户】

    SQL:   创建用户:>=MySQL5.7.6 查看用户: mysql> select user,host,authentication_string from mysql.user; ...

  5. 【转】ETL增量抽取——通过时间戳方式实现

    这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表 tt1 和表 tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新 ...

  6. 小说一下case ~

    case 这个关键词,用的地方不少~大部分的用途都通过以下的方式去应用 SELECT CASE @i END AS 测试1; 测试1 ----------- DECLARE @Hour INT = D ...

  7. Java api 入门教程 之 JAVA的Date类与Calendar类

    在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理. 一.这里简单介绍一下Date类的使 ...

  8. 理解 OpenStack + Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  9. 中午游泳很海皮-linux&php

    hi 中午又去游泳了,其实本来打算是昨天去的,谁知天公不作美,周一都下雨.今天其实也一样的,有点小雨,不过游得到泳,比什么都好 1.PHP&MySQL -----PHP内置MySQL函数学习( ...

  10. C#学习笔记-Windows窗体基本功能(Login登录界面)

    本菜鸟由于实习工作的原因,不得不快速接触C#语言,刚刚好又要做毕业设计,所以就通过自学的方式一举两得地完成这两件事情. 故此文字记录或代码中的各种文件名之类均是以毕业设计为模版记录的,看着不方便之处请 ...