📄 asl_audio.h
字号:
//-----------------------------------------------------------------------------
//
// ____ Azure Star Game Engine 蓝星游戏引擎 ____
//
// Copyright (c) 2006, 蓝星工作室
// All rights reserved.
//
// 文件名称: asl_audio.h
// 摘 要: 音频处理类定义
//
// 当前版本: 1.0
// 作 者: 汤 祺
// 创建日期: 2006-8-30
//
//-----------------------------------------------------------------------------
#ifndef ASL_SOUND_INCLUDE
#define ASL_SOUND_INCLUDE
#pragma once
#include "asl_utils.h"
#include <dmusicc.h>
#include <dmusici.h>
#include <dsound.h>
#include <list>
#pragma comment(lib, "dxguid.lib")
//-----------------------------------------------------------------------------
namespace ASL
{
// 取全局唯一实例
#define AUDIO ASLAudio::Instance()
// 声音文件类型枚举
enum SoundType { stWave, stMidi, stMP3 };
// ASLSound类的前向声明
class ASLSound;
//-----------------------------------------------------------------------------
// 类名: ASLCanvas
// 功能: 音频处理类
// 本类是对DirectMusic的一个封装, 提供给用户更加良好易用的接口. 目前只
// 支持Midi和Wav文件, 将来可能会增加对MP3文件的支持. 由于DirectMusic的
// 唯一性,本类用Singleton模式实现, 确保全局只有唯一对象.
//-----------------------------------------------------------------------------
class ASLAudio
{
// 构造、析构函数
private:
ASLAudio(void);
~ASLAudio(void);
// 禁用拷贝构造函数和赋值函数, 无实现
private:
ASLAudio(const ASLAudio&);
ASLAudio& operator=(const ASLAudio&);
// 操作函数
public:
// 取全局唯一实例
static ASLAudio& Instance(void);
// 初始化
void Init(HWND hWnd) throw(ASLDirectMusicException);
// 卸载声音
void DestroySound(ASLSound *pSound);
// 设置文件目录(相对于当前目录)
void SetDirCur(LPCSTR szDir);
// 设置文件目录(相对于可执行文件所在目录)
void SetDirApp(LPCSTR szDir);
// 停止所有声音的播放
void StopAll(void);
// 取Loader对象指针
inline IDirectMusicLoader8* GetLoader(void) const
{ return m_pLoader; }
// 取Performance对象指针
inline IDirectMusicPerformance8* GetPerformance(void) const
{ return m_pPerformance; }
// 音效处理
public:
// 从文件加载音效
inline ASLSound* LoadEffect(LPCSTR szFileName, SoundType st = stWave)
throw(ASLDirectMusicException)
{ return LoadSound(szFileName, st, m_lstEffect); }
// 设置音效音量
inline void SetEffectVolume(float fVolume)
{ return SetGroupVolume(fVolume, m_lstEffect); }
// 设音效有效
void EnableEffect(void)
{ return EnableGroup(m_lstEffect); }
// 设音效无效
void DisableEffect(void)
{ return DisableGroup(m_lstEffect); }
// 音乐处理
public:
// 从文件加载音乐
inline ASLSound* LoadMusic(LPCSTR szFileName, SoundType st = stWave)
throw(ASLDirectMusicException)
{ return LoadSound(szFileName, st, m_lstMusic); }
// 设置音乐音量
inline void SetMusicVolume(float fVolume)
{ return SetGroupVolume(fVolume, m_lstMusic); }
// 设音乐有效
inline void EnableMusic(void)
{ return EnableGroup(m_lstMusic); }
// 设音乐无效
inline void DisableMusic(void)
{ return DisableGroup(m_lstMusic); }
// 私有函数
private:
// 加载声音
ASLSound* LoadSound(LPCSTR szFileName, SoundType st,
std::list<ASLSound*> &group)
throw(ASLDirectMusicException);
// 设置一组声音音量
void SetGroupVolume(float fVolume, std::list<ASLSound*> &group);
// 设一组声音有效
void EnableGroup(std::list<ASLSound*> &group);
// 设一组声音无效
void DisableGroup(std::list<ASLSound*> &group);
// 私有变量
private:
BOOL m_bCleanupCOM; // 对象销毁时是否需要释放COM
IDirectMusicLoader8* m_pLoader; // Loader对象指针
IDirectMusicPerformance8* m_pPerformance; // Performance对象指针
std::list<ASLSound*> m_lstEffect; // 音效链表
std::list<ASLSound*> m_lstMusic; // 音乐链表
}; // ASLAudio类定义结束
//-----------------------------------------------------------------------------
// 类名: ASLSound
// 功能: 声音类
// 本类对DirectMusic组件的Segment对象进行了封装, 代表内存中的一个声音
// 片断. 本类对象通过ASLAuido类创建并由其管理. 本类的每个对象, 都可以
// 单独设置音量, 声道均衡和音调.
//-----------------------------------------------------------------------------
class ASLSound
{
// 设ASLAudio为本类的友员
private:
friend class ASLAudio;
// 构造/析构函数, 必须通过ASLAudio类来创建本类对象
private:
ASLSound(IDirectMusicPerformance8* pPerformance,
IDirectMusicLoader8* pLoader,
IDirectMusicSegment8* pSegment);
~ASLSound(void);
// 禁用拷贝构造函数和赋值函数, 无实现
private:
ASLSound(const ASLSound&);
ASLSound& operator=(const ASLSound&);
// 操作函数
public:
// 播放声音
void Play(void);
// 停止播放
void Stop(void);
// 是否正在播放
bool IsPlaying(void);
// 设置重复次数
void SetRepeats(DWORD dwRepeats);
// 设置音量
void SetVolume(float fVolumn);
// 设置声道均衡
void SetPan(float fPan);
// 设置音调
void SetPitch(float fPitch);
// 使有效
inline void Enable(void) { m_bEnabled = true; }
// 使无效
inline void Disable(void) { m_bEnabled = false; Stop(); }
// 取Segment对象指针
inline IDirectMusicSegment8* GetSegment() const { return m_pSegment; }
// 成员变量
private:
IDirectMusicSegment8* m_pSegment; // Segment对象指针
IDirectMusicLoader8* m_pLoader; // Loader对象指针
IDirectMusicPerformance8* m_pPerformance; // Performance对象指针
IDirectMusicAudioPath8* m_pAudioPath; // AudioPath对象指针
IDirectSoundBuffer8* m_pSoundBuffer; // SoundBuffer对象指针
bool m_bDownloaded; // 是否已下载
DWORD m_dwFrequency; // 原始频率
bool m_bEnabled; // 是否有效
}; // ASLSound类定义结束
} // namespace ASL
#endif // ASL_SOUND_INCLUDE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -