[MetaHook] Quake FMOD player demo

CFMOD.h

 1 #ifndef CFMOD_H
 2 #define CFMOD_H
 3
 4 #include "qfmod.h"
 5
 6 struct Sound_t
 7 {
 8     char *pszName;
 9     FMOD_SOUND *pSound;
10     FMOD_CHANNEL *pChannel;
11     Sound_t *pNext;
12 };
13
14 #ifdef PlaySound
15 #undef PlaySound
16 #endif
17
18 class CFmod
19 {
20 public:
21     CFmod();
22     ~CFmod();
23 public:
24     void Init(void);
25     void PlaySound(char *pszFileName);
26     void StopSound(char *pszFileName);
27     void Shutdown(void);
28 private:
29     Sound_t* FindSound(char *pszFileName);
30     bool CacheSound(char *pszFileName);
31 private:
32     FMOD_SYSTEM *m_pSystem;
33     Sound_t *m_pBaseSound;
34 };
35
36 #endif

CFMOD.cpp

  1 #include <metahook.h>
  2
  3 #include "qfmod.h"
  4
  5 #include "cfmod.h"
  6
  7 extern IFileSystem *g_pFileSystem;
  8
  9 CFmod::CFmod()
 10 {
 11     m_pSystem = NULL;
 12     m_pBaseSound = NULL;
 13 }
 14
 15 CFmod::~CFmod()
 16 {
 17     m_pSystem = NULL;
 18     m_pBaseSound = NULL;
 19 }
 20
 21 void CFmod::Init(void)
 22 {
 23     CFmod();
 24
 25     qFMOD_System_Create(&m_pSystem);
 26     qFMOD_System_Init(m_pSystem, 32, FMOD_INIT_NORMAL, NULL);
 27 }
 28
 29 void CFmod::PlaySound(char *pszFileName)
 30 {
 31     if (!m_pSystem)
 32         return;
 33
 34     Sound_t *pSound = FindSound(pszFileName);
 35
 36     if (!pSound)
 37     {
 38         if (!CacheSound(pszFileName))
 39             return;
 40     }
 41
 42     pSound = FindSound(pszFileName);
 43
 44     if (!pSound)
 45         return;
 46
 47     qFMOD_System_PlaySound(m_pSystem, FMOD_CHANNEL_FREE, pSound->pSound, NULL, &pSound->pChannel);
 48 }
 49
 50 void CFmod::StopSound(char *pszFileName)
 51 {
 52     if (!m_pSystem)
 53         return;
 54
 55     if (pszFileName != NULL)
 56     {
 57         Sound_t *pSound = FindSound(pszFileName);
 58
 59         if (!pSound)
 60             return;
 61
 62         if (pSound->pChannel)
 63             qFMOD_Channel_Stop(pSound->pChannel);
 64     }
 65     else
 66     {
 67         for (Sound_t *p = m_pBaseSound; p; p = p->pNext)
 68         {
 69             if (p->pChannel)
 70                 qFMOD_Channel_Stop(p->pChannel);
 71         }
 72     }
 73 }
 74
 75 void CFmod::Shutdown(void)
 76 {
 77     if (!m_pSystem)
 78         return;
 79
 80     Sound_t *p = m_pBaseSound;
 81     Sound_t *t;
 82
 83     while (p)
 84     {
 85         t = p->pNext;
 86
 87         free(p->pszName);
 88         qFMOD_Sound_Release(p->pSound);
 89         delete p;
 90
 91         p = t;
 92     }
 93
 94     qFMOD_System_Close(m_pSystem);
 95     qFMOD_System_Release(m_pSystem);
 96 }
 97
 98 Sound_t* CFmod::FindSound(char *pszFileName)
 99 {
100     if (!m_pSystem)
101         return NULL;
102
103     for (Sound_t *p = m_pBaseSound; p; p = p->pNext)
104     {
105         if (p->pszName && !strcmp(p->pszName, pszFileName))
106             return p;
107     }
108
109     return NULL;
110 }
111
112 bool CFmod::CacheSound(char *pszFileName)
113 {
114     if (!m_pSystem)
115         return false;
116
117     FileHandle_t pFile;
118     uint32 iFileLen;
119     BYTE *pBuffer;
120     FMOD_CREATESOUNDEXINFO ExInfo;
121     FMOD_SOUND *pSound;
122     Sound_t *pCache;
123
124     pFile = g_pFileSystem->Open(pszFileName, "rb");
125
126     if (!pFile)
127     {
128         return false;
129     }
130
131     g_pFileSystem->Seek(pFile, 0, FILESYSTEM_SEEK_TAIL);
132     iFileLen = g_pFileSystem->Tell(pFile);
133     g_pFileSystem->Seek(pFile, 0, FILESYSTEM_SEEK_HEAD);
134
135     pBuffer = (BYTE *)malloc(iFileLen);
136     g_pFileSystem->Read(pBuffer, iFileLen, pFile);
137
138     g_pFileSystem->Close(pFile);
139
140     memset(&ExInfo, 0, sizeof(ExInfo));
141     ExInfo.cbsize = sizeof(ExInfo);
142     ExInfo.length = iFileLen;
143
144     if (qFMOD_System_CreateSound(m_pSystem, (const char *)pBuffer, FMOD_HARDWARE | FMOD_OPENMEMORY, &ExInfo, &pSound) != FMOD_OK)
145     {
146         free(pBuffer);
147         return false;
148     }
149
150     free(pBuffer);
151
152     pCache = new Sound_t;
153     pCache->pszName = (char *)malloc(strlen(pszFileName) * sizeof(char) + 1);
154     strcpy(pCache->pszName, pszFileName);
155     pCache->pSound = pSound;
156     pCache->pChannel = NULL;
157     pCache->pNext = m_pBaseSound;
158     m_pBaseSound = pCache;
159
160     return true;
161 }
时间: 2024-08-05 03:29:52

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

[MetaHook] Quake OpenGL function

Quake OpenGL function for MetaHook plugin. Thank hzqst :D QGL.h 1 #ifndef QGL_H 2 #define QGL_H 3 4 #include <gl/gl.h> 5 #include <gl/glext.h> 6 7 extern void (APIENTRY *qglAccum)(GLenum op, GLfloat value); 8 extern void (APIENTRY *qglAlphaFun

[MetaHook] Quake Bink function

If you want to play Bink video in game, maybe you need this code. QBink.h 1 #ifndef QBINK_H 2 #define QBINK_H 3 4 #include "bink.h" 5 6 extern void PTR4* (RADEXPLINK *qBinkLogoAddress)(void); 7 extern void (RADEXPLINK *qBinkSetError)(const char

23+ Useful HTML5 Open Source Online Video Players &amp; Libraries,

Akamai's Open Video Player for HTML5 <video> Akamai has released a new Open Video Player for HTML5 <video> developer toolkit, aimed at simplifying the task of creating flexible HTML5-based video player applications for delivery of HTTP content

Qt5官方demo解析集35——Music Player

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集34--Concentric Circles Example 光看标题大家可能觉得我们今天会聊一聊 Qt 中 multimedia 模块的相关内容,确实,该 demo 基于这个模块实现了一个音乐播放器,不过呢,我们今天更侧重于该 demo 中 winextras 模块的使用. 从名字可以猜到,该模块可以用来为我们提供一些W

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

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集34——Concentric Circles Example 光看标题大家可能觉得我们今天会聊一聊 Qt 中 multimedia 模块的相关内容,确实,该 demo 基于这个模块实现了一个音乐播放器,不过呢,我们今天更侧重于该 demo 中 winextras 模块的使用. 从名字可以猜到,该模块可以用来为我们提供一些W

265行JavaScript代码的第一人称3D H5游戏Demo【个人总结1】

本文目的是分解前面的代码.其实,它得逻辑很清楚,只是对于我这种只是用过 Canvas 画线的人来说,这个还是很复杂的.我研究这个背景天空也是搞了一天,下面就是只加载天空的代码. 在线效果点击:http://1.codemo2.sinaapp.com/3d_demo_265line/index.html   [可以用键盘“左右”键控制][手机浏览器触控有些异常] 原理大概就是: 1. 创建主循环 一个无限循环 2. 主循环内重复调用绘制方法 3. 绘制方法: 针对 Player 的位置和方向,绘制

[转载]50个Demo展示HTML5无穷的魅力

Flash和HTML5的比较已经成为现在最热门的主题之一,我们不去争论哪个好哪个不好.和HTML5在很酷的动画和简单的游戏等方面一样,除非HTML5在未来几年有一些重大发展,否则Flash在富内容网页应用和游戏方面永远是不错的选择.下面收集了50个非常酷的HTML5应用实例来展示其无限潜力. 1. Tunneler 2. JuicyDrop 3. Magnetic 4. Trail 5. Sinuous 6. DDD 7. Harmony 8. Lines go all over the pla

Wordpress 音频播放器 Wordpress audio player with jQuery audioplayer.swf

原文地址:http://justcoding.iteye.com/blog/545978 Wordpress audio player with jQuery How to use Wordpress audio player (standalone version) with jQuery and jQuery SWFObject (progressive enhancement). <!-- SECTION "Wordpress audio player with jQuery&quo

untiy 第二个逗比又无聊的跑酷demo

逗比刘真是菜啊,天天就知道写这种无聊的东西,写了也不一定有人看的.看了也不一定有人喜欢.喜欢也没有什么卵用啊.先分享一波图吧. 大家第一眼看见是个什么?(逗比刘第一眼说 是精子小蝌蚪啊,逗比刘好邪恶啊) 做一个这样的demo可以说基本用不到很多素材,最重要的素材就是那个圆圈,这个圆圈对于一个程序员来说画起来应该蛮简单的吧.前天我们讲到如果绘制一个2D的圆环,今天我们就绘制一个3D的圆环,如果我们把一个2D的圆绕着一个轴旋转一周就可以做出一个3D的圆环了. 那么我们首先的建一个基本的类Pipe用来