1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_PlayerHeapDataManager.cpp
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: $
14  *---------------------------------------------------------------------------*/
15 
16 #include "precompiled.h"
17 
18 #include <nw/snd/snd_PlayerHeapDataManager.h>
19 
20 namespace nw {
21 namespace snd {
22 namespace internal {
23 
PlayerHeapDataManager()24 PlayerHeapDataManager::PlayerHeapDataManager()
25 : m_IsInitialized( false ),
26   m_IsFinalized ( true )
27 {
28 }
29 
~PlayerHeapDataManager()30 PlayerHeapDataManager::~PlayerHeapDataManager()
31 {
32     Finalize();
33 }
34 
Initialize(const SoundArchive * arc)35 void PlayerHeapDataManager::Initialize( const SoundArchive* arc )
36 {
37     if ( m_IsInitialized )
38     {
39         return;
40     }
41     m_IsInitialized = true;
42     m_IsFinalized = false;
43 
44     for ( int i = 0; i < FILE_ADDRESS_COUNT; i++ )
45     {
46         m_FileAddress[i].fileId = SoundArchive::INVALID_ID;
47         m_FileAddress[i].address = NULL;
48     }
49     SetSoundArchive( arc );
50 }
51 
Finalize()52 void PlayerHeapDataManager::Finalize()
53 {
54     if ( m_IsFinalized )
55     {
56         return;
57     }
58     m_IsInitialized = false;
59     m_IsFinalized = true;
60     SetSoundArchive( NULL );
61 }
62 
SetFileAddress(SoundArchive::FileId fileId,const void * address)63 const void* PlayerHeapDataManager::SetFileAddress(
64         SoundArchive::FileId fileId, const void* address )
65 {
66     return SetFileAddressToTable( fileId, address );
67 }
GetFileAddress(SoundArchive::FileId fileId) const68 const void* PlayerHeapDataManager::GetFileAddress( SoundArchive::FileId fileId ) const
69 {
70     // ファイルの検索順は、SoundDataManager → PlayerHeapDataManager。
71     // サウンドアーカイブ内からの検索は、SoundDataManager で行っているので、
72     // ここでは、PlayerHeapDataManager 内の検索だけでよい。
73     return GetFileAddressFromTable( fileId );
74 }
75 
InvalidateData(const void *,const void *)76 void PlayerHeapDataManager::InvalidateData( const void* /*start*/, const void* /*end*/ )
77 {
78     // ファイルアドレステーブルから破棄
79     for ( int i = 0; i < FILE_ADDRESS_COUNT; i++ )
80     {
81         m_FileAddress[i].fileId = SoundArchive::INVALID_ID;
82         m_FileAddress[i].address = NULL;
83     }
84 }
85 
SetFileAddressToTable(SoundArchive::FileId fileId,const void * address)86 const void* PlayerHeapDataManager::SetFileAddressToTable(
87         SoundArchive::FileId fileId, const void* address )
88 {
89     // 同じ fileId がある場合
90     for ( int i = 0; i< FILE_ADDRESS_COUNT; i++ )
91     {
92         if ( m_FileAddress[i].fileId == fileId )
93         {
94             const void* prev = m_FileAddress[i].address;
95             m_FileAddress[i].address = address;
96             return prev;
97         }
98     }
99 
100     // ない場合
101     for ( int i = 0; i< FILE_ADDRESS_COUNT; i++ )
102     {
103         if ( m_FileAddress[i].fileId == SoundArchive::INVALID_ID )
104         {
105             m_FileAddress[i].fileId = fileId;
106             m_FileAddress[i].address = address;
107             return NULL;
108         }
109     }
110 
111     // ここにくることは無いはず
112     NW_ASSERTMSG( false, "invalid PlayerHeap" );
113     return NULL;
114 }
115 
GetFileAddressFromTable(SoundArchive::FileId fileId) const116 const void* PlayerHeapDataManager::GetFileAddressFromTable( SoundArchive::FileId fileId ) const
117 {
118     for ( int i = 0; i< FILE_ADDRESS_COUNT; i++ )
119     {
120         if ( m_FileAddress[i].fileId == fileId )
121         {
122             return m_FileAddress[i].address;
123         }
124     }
125     return NULL;
126 }
127 
GetFileAddressImpl(SoundArchive::FileId fileId) const128 const void* PlayerHeapDataManager::GetFileAddressImpl( SoundArchive::FileId fileId ) const
129 {
130     return GetFileAddressFromTable( fileId );
131 }
132 
133 
134 } // namespace nw::snd::internal
135 } // namespace nw::snd
136 } // namespace nw
137 
138