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. php示例代码之 使用PHP的MySQL标准函数

    <?php //连接参数 $host="localhost"; $user="root"; $pwd="111111"; $db=&q ...

  2. linux 学习随笔-文件目录管理

    1:绝对路径:写法一般由'/'根目录引起的 '/'表示根目录 2:相对路径:不是由'/'引起的  需要先进入/ 在进入其它文件 3:mkdir -p  +目录+文件夹 可以用于创建不存在的级联目录 不 ...

  3. SQL Server 2012实施与管理实战指南(笔记)——Ch4数据库连接组件

    4.数据库连接组件 访问数据库有多种不同的技术,包括ADO,ODBC,OLEDB,ADO.NET等这些都有一些共性.首先要建立连接(Connection),然后通过命令(Command)对数据库进行访 ...

  4. 3、eclipse和maven环境安装以及HDFS读写的demo

    安装eclipse和maven环境   $ mkdir /home/beifeng/.m2 $ tar zxf repository.tar.gz -C /home/beifeng/.m2 $ /co ...

  5. PostgreSQL-安装9.2

    一.环境 VM虚拟机 NAME="Ubuntu" VERSION="12.04.4 LTS, Precise Pangolin" 二.过程  1.安装make ...

  6. main()函数的完整形式

    初学C语言都觉得main作为整个程序的入口函数是不需要传递参数的,但事实上,我们完全可以给main()传入参数进而控制整个程序的执行,就像我们使用DOS命令传入的参数一样,这里面argc表示传入的参数 ...

  7. linux时间不同步问题

    怪问题: 时间同步失效 系统: centos 6.6  2.6.32-504.el6.x86_64 情况: 定时任务中写了每分钟同步一次系统时间,定时任务执行成功,时间却未同步,奇怪? 现象: [ro ...

  8. TCMalloc 对MYSQL 性能 优化的分析

    虽然经过研究发现TCMalloc不适合我们现有的游戏框架,但意外收获发现TCMalloc可以大幅度提高MYSQL 性能及内存占用,这里给出配置及测试的结果: 1.配置 关于TCMalloc的安装,在& ...

  9. poj 2278 DNASequnce AC自动机

    地址:http://poj.org/problem?id=2778 题目: DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  10. POJ1849Two[DP|树的直径](扩展HDU4003待办)

    Two Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1390   Accepted: 701 Description Th ...