/*---------------------------------------------------------------------------* Project: NintendoWare File: snd_HardwareManagerDSP.cppi Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. 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. $Revision:$ *---------------------------------------------------------------------------*/ #define DSP_32BIT_TO_ARM(value) (u32)(((u32)(value) >> 16) | ((u32)(value) << 16)) namespace nw { namespace snd { namespace internal { namespace driver { namespace { class Perf { private: static const int LOG_BUF_SIZE = 7; #ifdef NW_PLATFORM_CTR nn::os::Tick m_Ticks[ LOG_BUF_SIZE ]; nn::os::Tick m_TmpTick; #endif int m_Counter; public: Perf() : m_Counter( 0 ) {} void Begin() { m_TmpTick = nn::os::Tick::GetSystemCurrent(); } void End() { m_Ticks[m_Counter] = nn::os::Tick::GetSystemCurrent() - m_TmpTick; m_Counter += 1; if ( m_Counter == LOG_BUF_SIZE ) { char str[300]; str[0] = '\0'; for ( int i = 0; i < LOG_BUF_SIZE; i++ ) { std::snprintf( str, 300, "%s %5lld,", str, m_Ticks[i].ToTimeSpan().GetMicroSeconds() ); } NN_LOG("%s\n", str ); m_Counter = 0; } } }; Perf s_Perf; } // // 関数 // /*---------------------------------------------------------------------------* Name: HardwareManager Description: コンストラクタ Arguments: なし Returns: なし *---------------------------------------------------------------------------*/ HardwareManager::HardwareManager() : m_IsInitialized( false ), m_OutputMode( OUTPUT_MODE_STEREO ), m_SrcType( SRC_TYPE_4TAP ) { m_MasterVolume.InitValue( 1.0f ); m_VolumeForReset.InitValue( 1.0f ); for ( int i=0; i( busId ), &m_AuxCallback[ busId ], &m_AuxCallbackContext[ busId ] ); nn::snd::RegisterAuxCallback( static_cast(busId), NULL, NULL ); #endif } // biquadフィルタテーブル初期化 for ( int i = 0; i < BIQUAD_FILTER_TYPE_USER_MAX + 1; i++ ) { m_BiquadFilterCallbackTable[i] = NULL; } SetBiquadFilterCallback( BIQUAD_FILTER_TYPE_LPF, &BIQUAD_FILTER_LPF ); SetBiquadFilterCallback( BIQUAD_FILTER_TYPE_HPF, &BIQUAD_FILTER_HPF ); SetBiquadFilterCallback( BIQUAD_FILTER_TYPE_BPF512, &BIQUAD_FILTER_BPF_512 ); SetBiquadFilterCallback( BIQUAD_FILTER_TYPE_BPF1024, &BIQUAD_FILTER_BPF_1024 ); SetBiquadFilterCallback( BIQUAD_FILTER_TYPE_BPF2048, &BIQUAD_FILTER_BPF_2048 ); // マスターボリューム設定 nn::snd::SetMasterVolume( 1.0f ); // サウンド出力モード設定 nn::snd::OutputMode mode = nn::snd::GetSoundOutputMode(); switch ( mode ) { case nn::snd::OUTPUT_MODE_MONO: m_OutputMode = OUTPUT_MODE_MONO; break; case nn::snd::OUTPUT_MODE_STEREO: m_OutputMode = OUTPUT_MODE_STEREO; break; case nn::snd::OUTPUT_MODE_3DSURROUND: m_OutputMode = OUTPUT_MODE_SURROUND; break; default: NW_ASSERT( false ); break; } m_IsInitialized = true; } void HardwareManager::Finalize() { if ( !m_IsInitialized ) return; // エフェクトクリア for ( int id = AUX_BUS_A; id < AUX_BUS_NUM; id++ ) { FinalizeEffect( static_cast( id ) ); #ifndef NW_SND_DEBUG_NOUSE_CTRSDK nn::snd::RegisterAuxCallback( static_cast( id ), m_AuxCallback[ id ], static_cast( m_AuxCallbackContext[ id ] ) ); #endif m_AuxCallback[ id ] = NULL; m_AuxCallbackContext[ id ] = NULL; } m_IsInitialized = false; } void HardwareManager::Update() { // ClearEffect のフェード処理。フェードが完了したらエフェクトをクリア for ( int i=0; i( i ) ); } updateFlag = true; } if ( updateFlag ) { f32 returnVolume = 1.0f; returnVolume *= ut::Clamp( m_AuxUserVolume[ i ].GetValue(), 0.0f, 1.0f ); returnVolume *= ut::Clamp( m_AuxFadeVolume[ i ].GetValue(), 0.0f, 1.0f ); #ifndef NW_SND_DEBUG_NOUSE_CTRSDK nn::snd::SetAuxReturnVolume( static_cast(i), returnVolume ); #endif } } // 音量のアップデート if ( ! m_MasterVolume.IsFinished() ) { m_MasterVolume.Update(); VoiceManager::GetInstance().UpdateAllVoicesSync( Voice::UPDATE_VE ); } if ( ! m_VolumeForReset.IsFinished() ) { m_VolumeForReset.Update(); VoiceManager::GetInstance().UpdateAllVoicesSync( Voice::UPDATE_VE ); } // ( SDK 層の ) マスターボリュームの調整 { f32 volume = 1.0f; volume *= m_VolumeForReset.GetValue(); volume = ut::Clamp( volume, 0.0f, 1.0f ); #ifndef NW_SND_DEBUG_NOUSE_CTRSDK nn::snd::SetMasterVolume( volume ); #endif } } // RVL は計96ch中、マージン16だった u32 HardwareManager::GetChannelCount() const { return SOUND_VOICE_COUNT; } /* ======================================================================== リセット前準備 ======================================================================== */ void HardwareManager::PrepareReset() { // if ( m_OldAidCallback != NULL ) return; m_VolumeForReset.SetTarget( 0.0f, 3 ); // 3オーディオフレームかけてフェードアウト // m_ResetReadyCounter = -1; // m_OldAidCallback = ::AI_RegisterDMACallback( AiDmaCallbackFunc ); } bool HardwareManager::IsResetReady() const { return true; // m_ResetReadyCounter == 0 ? true : false; } } /* namespace nw::snd::internal::driver */ } /* namespace nw::snd::internal */ } /* namespace nw::snd */ } /* namespace nw */