1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_MidiSequenceTrackAllocator.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: 19566 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "precompiled.h"
17 
18 #include <nw/snd/snd_MidiSequenceTrackAllocator.h>
19 
20 #include <nw/snd/snd_MidiSequenceTrack.h>
21 
22 namespace nw {
23 namespace snd {
24 namespace internal {
25 namespace driver {
26 
27 class MidiSequenceTrackPool
28 {
29   public:
GetInstance()30     static InstancePool<MidiSequenceTrack>& GetInstance()
31     {
32         static InstancePool<MidiSequenceTrack> instance;
33         return instance;
34     }
35 
36   private:
MidiSequenceTrackPool()37     MidiSequenceTrackPool() {}
38 };
39 
40 
41 /* ========================================================================
42         static member function
43    ======================================================================== */
44 
45 
46 /*---------------------------------------------------------------------------*
47   Name:         AllocTrack
48 
49   Description:  トラックを確保します
50 
51   Arguments:    None.
52 
53   Returns:      確保できたときは、トラックID
54                 確保できなかったときは、-1 を返します
55  *---------------------------------------------------------------------------*/
AllocTrack(SequenceSoundPlayer * player)56 SequenceTrack* MidiSequenceTrackAllocator::AllocTrack( SequenceSoundPlayer* player )
57 {
58     MidiSequenceTrack* track = MidiSequenceTrackPool::GetInstance().Alloc();
59     if ( track != NULL )
60     {
61         track->SetSequenceSoundPlayer( player );
62     }
63     return track;
64 }
65 
66 /*---------------------------------------------------------------------------*
67   Name:         FreeTrack
68 
69   Description:  トラックを開放します
70 
71   Arguments:    trackID - トラックID
72 
73   Returns:      None.
74  *---------------------------------------------------------------------------*/
FreeTrack(SequenceTrack * track)75 void MidiSequenceTrackAllocator::FreeTrack( SequenceTrack* track )
76 {
77     NW_NULL_ASSERT( track );
78 
79     track->SetSequenceSoundPlayer( NULL );
80 
81     MidiSequenceTrackPool::GetInstance().Free( reinterpret_cast<MidiSequenceTrack*>( track ) ); // TODO: 気になるキャスト
82 }
83 
84 /*---------------------------------------------------------------------------*
85   Name:         GetAllocatableTrackCount
86 
87   Description:  確保可能なトラック数を返します
88 
89   Arguments:    なし
90 
91   Returns:      トラック数
92  *---------------------------------------------------------------------------*/
GetAllocatableTrackCount() const93 int MidiSequenceTrackAllocator::GetAllocatableTrackCount() const
94 {
95     return MidiSequenceTrackPool::GetInstance().Count();
96 }
97 
98 /*---------------------------------------------------------------------------*
99   Name:         Create
100 
101   Description:  インスタンスプールを作成します
102 
103   Arguments:    buffer - バッファ
104                 size - バッファサイズ
105 
106   Returns:      作成したプール中のインスタンス数
107  *---------------------------------------------------------------------------*/
Create(void * buffer,unsigned long size)108 unsigned long MidiSequenceTrackAllocator::Create( void* buffer, unsigned long size )
109 {
110     return MidiSequenceTrackPool::GetInstance().Create( buffer, size );
111 }
112 
113 /*---------------------------------------------------------------------------*
114   Name:         Destroy
115 
116   Description:  インスタンスプールを破棄します
117 
118   Arguments:    buffer - バッファ
119                 size - バッファサイズ
120 
121   Returns:      なし
122  *---------------------------------------------------------------------------*/
Destroy(void * buffer,unsigned long size)123 void MidiSequenceTrackAllocator::Destroy( void* buffer, unsigned long size )
124 {
125     MidiSequenceTrackPool::GetInstance().Destroy( buffer, size );
126 }
127 
128 } // namespace nw::snd::internal::driver
129 } // namespace nw::snd::internal
130 } // namespace nw::snd
131 } // namespace nw
132 
133