⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asl_audio.h

📁 泡泡堂单机版(含ASL游戏引擎源码 泡泡堂单机版(含ASL游戏引擎源码
💻 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 + -