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. C#中==与Equals方法的区别

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  2. Java字符串中常见的10个问题

    下面是Java中10个最常见的关于字符串的问题. 怎样比较字符串?使用==还是equals() 简单的说,“==”用于判断引用是否相等,equals()用于判断值是否相等.除非你要比较两个字符串是否是 ...

  3. Java Gradle入门指南之简介、安装与任务管理

        这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍.    ...

  4. Apache安装

    记录安装Apache的流程,没有进行详细配置,只是记录搭建服务器的流程用于学习Ajax等知识,方便以后重新安装,不用每次都翻别人博客学习安装了,大神看到这里可以关掉这个粗糙简陋的博文了. 1. 官网上 ...

  5. 如何阻止h5body的滑动

    // 禁止 document.body.style.overflow = 'hidden'; function _preventDefault(e) { e.preventDefault(); } w ...

  6. python scrapy+Mongodb爬取蜻蜓FM,酷我及懒人听书

    1.初衷:想在网上批量下载点听书.脱口秀之类,资源匮乏,大家可以一试 2.技术:wireshark scrapy jsonMonogoDB 3.思路:wireshark分析移动APP返回的各种连接分类 ...

  7. js 数组删除指定元素

    Array.prototype.remove = function(obj) { for (var i = 0; i < this.length; i++) { var temp = this[ ...

  8. 烂泥:KVM使用NAT联网并为VM配置iptables端口转发

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在前面的文章中,我们介绍KVM的虚拟机(以下简称VM)都是通过桥接方式进行联网的. 本篇文章我们来介绍KVM的VM通过NAT方式进行联网,并且通过配置I ...

  9. file

    用来测试文件类型 $file [] filename -b列出辨识结果时,但不显示文件名称 -L如果文件是符号链接,那么直接解读其指向的文件 -z:如果文件是压缩文件,尝试去解读压缩文件的内容 $fi ...

  10. windows下socket学习(一)

    关于socket的文章,园子里面有很多,其实无非就是 WSAStartup.socket.bind.listen.accept.recv.send(服务端),WSAStartup.socket.con ...