/*---------------------------------------------------------------------------* Project: NintendoWare File: snd_PlayerHeap.cpp Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. 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. The content herein is highly confidential and should be handled accordingly. $Revision: 31311 $ *---------------------------------------------------------------------------*/ #include "precompiled.h" #include #include #include namespace nw { namespace snd { namespace internal { /*---------------------------------------------------------------------------* Name: SoundHeap Description: コンストラクタ Arguments: 無し Returns: 無し *---------------------------------------------------------------------------*/ PlayerHeap::PlayerHeap() : m_pSound( NULL ), m_pPlayer( NULL ), m_pStartAddress( NULL ), m_pEndAddress( NULL ), m_pAllocAddress( NULL ) { } /*---------------------------------------------------------------------------* Name: ~PlayerHeap Description: デストラクタ Arguments: 無し Returns: 無し *---------------------------------------------------------------------------*/ PlayerHeap::~PlayerHeap() { Destroy(); } /*---------------------------------------------------------------------------* Name: Create Description: Arguments: startAddress - size - Returns: *---------------------------------------------------------------------------*/ bool PlayerHeap::Create( void* startAddress, size_t size ) { void* endAddress = ut::AddOffsetToPtr( startAddress, size ); startAddress = ut::RoundUp( startAddress, 32 ); if ( startAddress > endAddress ) { return false; } m_pStartAddress = startAddress; m_pEndAddress = endAddress; m_pAllocAddress = m_pStartAddress; return true; } /*---------------------------------------------------------------------------* Name: Destroy Description: Arguments: なし Returns: なし *---------------------------------------------------------------------------*/ void PlayerHeap::Destroy() { Clear(); m_pAllocAddress = NULL; } /*---------------------------------------------------------------------------* Name: Alloc Description: Arguments: size - Returns: *---------------------------------------------------------------------------*/ void* PlayerHeap::Alloc( size_t size ) { NW_ALIGN32_ASSERT( m_pAllocAddress ); void* endp = ut::AddOffsetToPtr( m_pAllocAddress, size ); if ( endp > m_pEndAddress ) { return NULL; } void* allocAddress = m_pAllocAddress; m_pAllocAddress = ut::RoundUp( endp, 32 ); return allocAddress; } /*---------------------------------------------------------------------------* Name: Clear Description: Arguments: なし Returns: なし *---------------------------------------------------------------------------*/ void PlayerHeap::Clear() { internal::DriverCommandManager& cmdmgr = internal::DriverCommandManager::GetInstance(); internal::DriverCommandInvalidateData* command = cmdmgr.AllocCommand(); command->id = internal::DRIVER_COMMAND_INVALIDATE_DATA; command->mem = m_pStartAddress; command->size = static_cast( ut::GetOffsetFromPtr( m_pStartAddress, m_pAllocAddress ) ); cmdmgr.PushCommand(command); m_pAllocAddress = m_pStartAddress; } /*---------------------------------------------------------------------------* Name: GetFreeSize Description: Arguments: なし Returns: *---------------------------------------------------------------------------*/ size_t PlayerHeap::GetFreeSize() const { size_t offset = ut::GetOffsetFromPtr( m_pAllocAddress, m_pEndAddress ); NW_ASSERT( offset >= 0 ); // return static_cast( offset ); return offset; } /*---------------------------------------------------------------------------* Name: AttachSound Description: サウンドと結びつける Arguments: sound - 結びつけるサウンド Returns: None. *---------------------------------------------------------------------------*/ void PlayerHeap::AttachSound( BasicSound* sound ) { NW_NULL_ASSERT( sound ); NW_ASSERT( m_pSound == NULL ); m_pSound = sound; } /*---------------------------------------------------------------------------* Name: DetachSound Description: サウンドと切り離す Arguments: sound - 切り離すサウンド Returns: None. *---------------------------------------------------------------------------*/ void PlayerHeap::DetachSound( BasicSound* sound ) { NW_NULL_ASSERT( sound ); NW_ASSERT( sound == m_pSound ); (void)sound; m_pSound = NULL; } } // namespace nw::snd::internal } // namespace nw::snd } // namespace nw