BaseSoundManager実装例

 

以下に、BaseSoundManagerの具象化クラスを擬似コードで示します。

class SoundManagerImpl : public BaseSoundManager{
public:
	//コンストラクタ
	SoundManagerfD(CSoundSystem* SS){
		m_SS = SS;
	}
private:
	//SEの音量を設定
	void _SetSEVolume(long Volume){
		for(map<string, CSound*>::iterator it=m_SE.begin();it!=m_SE.end();it++){
			it->second->SetVolume(Volume==0 ? -10000 : static_cast<long>((10*log10(static_cast<double>(Volume)/10000))*100));
		}
	}
	//SEを再生
	bool _PlaySE(const char* FileName){
		return(m_SE.find(FileName)->second->Play());
	}
	//SEを停止
	bool _StopSE(const char* FileName){
		return(m_SE.find(FileName)->second->Stop());
	}
	//SEをメモリに読み込む
	bool _LoadSE(const char* FileName){
		//各種チェック
		if(strcmp(FileName, "")==0){
			return(true);
		}
		if(m_SE.find(FileName)!=m_SE.end()){
			return(true);
		}
		m_SE.insert(pair<string, CSound*>(FileName, new CSound(FileName)));
		return(true);
	}
	//SEをメモリから解放する
	bool _UnloadSE(const char* FileName){
		delete(m_SE.find(FileName)->second);
		m_SE.erase(m_SE.find(FileName));
		return(true);
	}
	//SEが再生中かを確認する
	bool _IsPlayingSE(const char* FileName) const{
		return(m_SE.find(FileName)->second->IsPlaying());
	}
	//BGMの音量を設定
	void _SetBGMVolume(long Volume){
		m_BGM.SetVolume(Volume==0 ? -10000 : static_cast<long>((10*log10(static_cast<double>(Volume)/10000))*100));
	}
	//BGMを再生
	bool _PlayBGM(bool IsOnce){
		return(IsOnce ? m_BGM.Play() : m_BGM.LoopPlay());
	}
	//BGMを停止
	bool _StopBGM(){
		return(m_BGM.Stop());
	}
	//BGMをメモリに読み込む
	bool _LoadBGM(const char* FileName){
		//各種チェック
		if(strcmp(FileName, "")==0){
			return(true);
		}
		m_BGM.Load(FileName);
		return(true);
	}
	//BGMをメモリから解放する
	bool _UnloadBGM(){
		m_BGM.Unload();
		return(true);
	}
	//BGMが再生中かを確認する
	bool _IsPlayingBGM() const{
		return(m_BGM.IsPlaying());
	}
	//音声の音量を設定
	void _SetVoiceVolume(long Volume){
		for(map<string, CSound*>::iterator it=m_Voice.begin();it!=m_Voice.end();it++){
			it->second->SetVolume(Volume==0 ? -10000 : static_cast<long>((10*log10(static_cast<double>(Volume)/10000))*100));
		}
	}
	//音声を再生
	bool _PlayVoice(const char* FileName){
		return(m_Voice.find(FileName)->second->Play());
	}
	//音声を停止
	bool _StopVoice(const char* FileName){
		return(m_Voice.find(FileName)->second->Stop());
	}
	//音声をメモリに読み込む
	bool _LoadVoice(const char* FileName){
		//各種チェック
		if(strcmp(FileName, "")==0){
			return(true);
		}
		if(m_Voice.find(FileName)!=m_Voice.end()){
			return(true);
		}
		m_Voice.insert(pair<string, CSound*>(FileName, new CSound(FileName)));
		return(true);
	}
	//音声をメモリから解放する
	bool _UnloadVoice(const char* FileName){
		delete(m_Voice.find(FileName)->second);
		m_Voice.erase(m_Voice.find(FileName));
		return(true);
	}
	//音声が再生中かを確認する
	bool _IsPlayingVoice(const char* FileName) const{
		return(m_Voice.find(FileName)->second->IsPlaying());
	}
	CSoundSystem* m_SS;										//サウンド再生システムクラスへのポインタ
	map<string, CSound*> m_SE;								//SE
	CSound m_BGM;											//BGM
	map<string, CSound*> m_Voice;							//音声

	SoundManagerImpl();										//デフォルトコンストラクタ(禁止)
	SoundManagerImpl(const SoundManagerImpl&);				//コピーコンストラクタ(禁止)
	SoundManagerImpl& operator =(const SoundManagerImpl&);	//代入演算子(禁止)
};

※1:上記擬似コードは、Direct Xベースのライブラリで実装した場合を想定しています。

※2:static_cast<long>((10*log10(static_cast<double>(Volume)/10000))*100))
  上記のコードは、引数として渡される0〜10000をDirectX向けにDb変換する式です。