/*---------------------------------------------------------------------------* Project: Horizon File: snd_Voice.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 28627 $ *---------------------------------------------------------------------------*/ #ifndef NN_SND_VOICE_H_ #define NN_SND_VOICE_H_ #include #include #include #ifdef __cplusplus /*! @file @brief Voice に関する関数、およびクラス定義 */ namespace nn { namespace snd { namespace CTR { /*! @brief ライブラリがボイスを解放する際に呼び出すコールバック関数の型定義です。 @param[in] pVoice 解放したボイスオブジェクトへの参照 @param[in] userArg ユーザーパラメータ */ typedef void (*VoiceDropCallbackFunc)(class Voice *, uptr userArg); class VoiceImpl; class VoiceManager; /*! @brief Voice を操作するクラスです。 */ class Voice { friend class VoiceManager; public: /*! @brief ボイスの状態を表す列挙型です。 */ enum State { STATE_PLAY, //!< 再生指令状態を表します。 STATE_STOP, //!< 停止状態を表します。 STATE_PAUSE //!< 一時停止状態を表します。再生を再開する際は、SetState により再生状態を設定して下さい。 }; private: const s32 m_Id; // ボイス番号(管理用) State m_State; // 状態 InterpolationType m_InterpolationType; // 補間方法 NN_PADDING1; FilterType m_FilterType; // フィルタタイプ MonoFilterCoefficients m_MonoFilterCoeffs; // 単極フィルタ係数 BiquadFilterCoefficients m_BiquadFilterCoeffs; // 双極フィルタ係数 NN_PADDING2; s32 m_SampleRate; // 標本化周波数 f32 m_Pitch; // ピッチ(SampleRate に対する比) s32 m_Priority; // 優先度 Voice * m_PriorVoice; // 優先度が高い Voice へのポインタ Voice * m_InferiorVoice; // 優先度が低い Voice へのポインタ VoiceDropCallbackFunc m_Callback; // Voice がシステムにより解放された場合に呼び出されるコールバック関数 uptr m_UserArg; // 上記コールバック呼び出し時のユーザ引数 MixParam m_MixParam; // 各チャンネルへのゲイン f32 m_Volume; // ボリューム VoiceImpl* m_pImpl; void Initialize(); void UpdateStatus(const void* pVars); void UpdateWaveBufferList(); s32 GetId() const { return m_Id; } VoiceImpl* GetImpl() const { return m_pImpl; } public: Voice(s32 id); ~Voice(); /*! @name バッファ追加 @{ */ /*! @brief ボイスに対してサンプルデータ情報を追加します。 @param[in] buffer バッファ情報構造体のポインタ */ void AppendWaveBuffer(WaveBuffer* buffer); /*! @} */ /*! @name パラメータ設定 @{ */ /*! @brief ボイスのチャンネル数を設定します。 @param[in] channelCount チャンネル数 */ void SetChannelCount(s32 channelCount); /*! @brief ボイスにリンクされるサンプルの形式を設定します。 @param[in] format サンプルの形式 */ void SetSampleFormat(SampleFormat format); /*! @brief 3D サラウンドが有効な場合に、フロントチャンネルをバイパスするかを設定します。 @param[in] flag true ならフロントバイパス、false ならフロントにも 3D サラウンドを適用 */ void SetFrontBypassFlag(bool flag); /*! @brief 再生開始時にボリューム 0 からの短いフェードインを用いるかどうかを指定します。 @param[in] flag On/Off フラグ */ void SetStartFrameFadeInFlag(bool flag); /*! @brief ボイスのサンプリングレートを設定します。 @param[in] sampleRate サンプリングレート */ void SetSampleRate(s32 sampleRate); /*! @brief ボイスのピッチを設定します。 @param[in] pitch サンプリングレートに対する再生速度比 */ void SetPitch(f32 pitch); /*! @brief Adpcm の係数を設定します。 @param[in] param Adpcm 係数構造体への参照 */ void SetAdpcmParam(const AdpcmParam& param); /*! @brief ボイスの優先度を設定します。 @param[in] priority 優先度 */ void SetPriority(s32 priority); /*! @brief ボイスの状態を設定します。 @param[in] state 状態 */ void SetState(State state); /*! @brief ボイスの各チャンネルのゲインを設定します。 @param[in] mixParam ゲイン構造体への参照 */ void SetMixParam(const MixParam& mixParam); /*! @brief ボイスのボリュームを設定します。 @param[in] volume ボリューム値 */ void SetVolume(f32 volume); /*! @brief ボイスの補間方法を設定します。 @param[in] type 補間方法 */ void SetInterpolationType(InterpolationType type); /*! @brief フィルタタイプを設定します。 @param[in] type フィルタタイプ */ void SetFilterType(FilterType type); /*! @brief 単極フィルタを有効/無効にします。 @param[in] enable true なら有効、false なら無効 */ void EnableMonoFilter(bool enable); /*! :overload coef_ptr @brief 単極フィルタの係数を設定します。 @param[in] pCoeff 係数バッファ */ void SetMonoFilterCoefficients(const MonoFilterCoefficients* pCoeff); /*! :overload coef_ref @brief 単極フィルタの係数を設定します。 @param[in] coeff 係数バッファ */ void SetMonoFilterCoefficients(const MonoFilterCoefficients& coeff); /*! :overload freq @brief 指定したカットオフ周波数を持つ、単極ローパスフィルタを設定します。 @param[in] cutoff カットオフ周波数 */ void SetMonoFilterCoefficients(u16 cutoff); /*! @brief 双極フィルタを有効/無効にします。 @param[in] enable true なら有効、false なら無効 */ void EnableBiquadFilter(bool enable); /*! :overload coef_ptr @brief 双極フィルタの係数を設定します。 @param[in] pCoeff 係数バッファ */ void SetBiquadFilterCoefficients(const BiquadFilterCoefficients* pCoeff); /*! :overload coef_ref @brief 双極フィルタの係数を設定します。 @param[in] coeff 係数バッファ */ void SetBiquadFilterCoefficients(const BiquadFilterCoefficients& coeff); /*! @} */ /*! @name パラメータ取得 @{ */ /*! @brief ボイスのピッチを取得します。 @return ピッチを返します。 */ inline f32 GetPitch() const { return m_Pitch; } /*! @brief ボイスの優先度を取得します。 @return 優先度を返します。 */ inline s32 GetPriority() const { return m_Priority; } /*! @brief ボイスの状態を取得します。 @return 状態を返します。 */ inline Voice::State GetState() const { return m_State; } /*! @brief ボイスの各チャンネルのゲインを取得します。 @return ゲイン構造体への参照を返します。 */ inline const MixParam& GetMixParam() const { return m_MixParam; } /*! @brief ボイスのボリュームを取得します。 @return ボリューム値を返します。 */ inline f32 GetVolume() const { return m_Volume; } /*! @brief ボイスの補間方法を取得します。 @return 現在の補間方法を返します。 */ inline InterpolationType GetInterpolationType() const { return m_InterpolationType; } /*! @brief フィルタの使用状況を取得します。 @return フィルタタイプ。 */ inline FilterType GetFilterType() const { return m_FilterType; } /*! :overload coef_ptr @brief 単極フィルタの係数を取得します。 @param[out] pCoeff 係数バッファ */ void GetMonoFilterCoefficients(MonoFilterCoefficients* pCoeff); /*! :overload coef_ref @brief 単極フィルタの係数を取得します。 @param[out] coeff 係数バッファ */ void GetMonoFilterCoefficients(MonoFilterCoefficients& coeff); /*! :overload coef_ptr @brief 双極フィルタの係数を取得します。 @param[out] pCoeff 係数バッファ */ void GetBiquadFilterCoefficients(BiquadFilterCoefficients* pCoeff); /*! :overload coef_ref @brief 双極フィルタの係数を取得します。 @param[out] coeff 係数バッファ */ void GetBiquadFilterCoefficients(BiquadFilterCoefficients& coeff); /*! @} */ /*! @name 再生状況取得 @{ */ /*! @brief 使用中のバッファ内での再生位置を取得します。 @return 再生位置をサンプル数で返します。 */ s32 GetPlayPosition() const; /*! @brief ボイスの再生状態を取得します。 @return ボイスの再生状態を返します。 */ bool IsPlaying() const; /*! @} */ /*! @name Bcwav 関連 @{ */ /*! @brief Bcwav ファイルを解釈し、再生準備を行います。 @param[in] addrBcwav Bcwav ファイルの先頭アドレス @param[in] pWaveBuffer0 初回再生時に使用する nn::snd::WaveBuffer へのポインタ @param[in] pWaveBuffer1 ループ再生時に使用する nn::snd::WaveBuffer へのポインタ @param[in] channelIndex 使用するチャンネル @return 成功なら true, 失敗なら false を返します。 */ bool SetupBcwav(uptr addrBcwav, WaveBuffer* pWaveBuffer0, WaveBuffer* pWaveBuffer1, Bcwav::ChannelIndex channelIndex = Bcwav::CHANNEL_INDEX_L); /*! @} */ private: void SetChannelCountCommand(s32 channelCount); void SetSampleFormatCommand(SampleFormat format); void SetFrontBypassFlagCommand(bool flag); void SetStartFrameFadeInFlagCommand(bool flag); void SetSampleRateCommand(s32 sampleRate); void SetPitchCommand(f32 pitch); void SetInterpolationTypeCommand(InterpolationType type); void SetFilterTypeCommand(FilterType type); void EnableMonoFilterCommand(bool enable); void SetMonoFilterCoefficientsCommand(const MonoFilterCoefficients& coeff); void SetMonoFilterCoefficientsCommand(u16 cutoff); void EnableBiquadFilterCommand(bool enable); void SetBiquadFilterCoefficientsCommand(const BiquadFilterCoefficients& coeff); void SetAdpcmParamCommand(const AdpcmParam& param); void SetStateCommand(State state); void SetMixParamCommand(const MixParam& mixParam); void SetVolumeCommand(f32 volume); bool SetupBcwavCommand(uptr addrBcwav, WaveBuffer* pWaveBuffer0, WaveBuffer* pWaveBuffer1, Bcwav::ChannelIndex channelIndex); }; // class Voice /*! @name Voice 操作 @{ */ /*! @brief ボイスを取得します。 @param[in] priority 優先順位 @param[in] callback コールバック関数のアドレス @param[in] userArg ユーザ引数 @return 成功した場合、Voice オブジェクトのアドレスを返します。失敗した場合、NULL を返します。 */ Voice* AllocVoice(s32 priority, VoiceDropCallbackFunc callback, uptr userArg); /*! @brief ボイスを解放します。 @param[in] pVoice ボイスオブジェクトのアドレス。 */ void FreeVoice(Voice* pVoice); /*! @} */ }}} // namespace nn::snd::CTR #endif // __cplusplus #endif //NN_SND_VOICE_H_