?? 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 + -