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