Initial revision
[blender.git] / intern / SoundSystem / intern / SND_WaveCache.cpp
1 /*
2  * SND_WaveCache.cpp
3  *
4  * abstract wavecache, a way to organize samples
5  *
6  * $Id$
7  *
8  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version. The Blender
14  * Foundation also sells licenses for use in proprietary software under
15  * the Blender License.  See http://www.blender.org/BL/ for information
16  * about this.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26  *
27  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
28  * All rights reserved.
29  *
30  * The Original Code is: all of this file.
31  *
32  * Contributor(s): none yet.
33  *
34  * ***** END GPL/BL DUAL LICENSE BLOCK *****
35  */
36
37 #ifdef WIN32
38 #pragma warning (disable:4786) // Get rid of stupid stl-visual compiler debug warning
39 #endif //WIN32
40
41 #include "SND_WaveCache.h"
42 #include <stdio.h>
43
44 #ifndef __APPLE__
45 #include <malloc.h>
46 #else // __APPLE__
47 #include <sys/malloc.h>
48 #endif // __APPLE__
49
50
51 SND_WaveCache::SND_WaveCache()
52 {
53         // do the buffer administration
54         for (int i = 0; i < NUM_BUFFERS; i++)
55                 m_bufferList[i] = NULL;
56 }
57
58
59
60 SND_WaveCache::~SND_WaveCache()
61 {
62         // clean up the mess
63         FreeSamples();
64         RemoveAllSamples();
65 }
66
67
68
69 SND_WaveSlot* SND_WaveCache::GetWaveSlot(const STR_String& samplename)
70 {
71         SND_WaveSlot* waveslot = NULL;
72
73         std::map<STR_String, SND_WaveSlot*>::iterator find_result = m_samplecache.find(samplename);
74                 
75         // let's see if we have already loaded this sample
76         if (find_result != m_samplecache.end())
77         {
78                 waveslot = (*find_result).second;
79         }
80         else
81         {
82                 // so the sample wasn't loaded, so do it here
83                 for (int bufnum = 0; bufnum < NUM_BUFFERS; bufnum++)
84                 {
85                         // find an empty buffer
86                         if (m_bufferList[bufnum] == NULL)
87                         {
88                                 waveslot = new SND_WaveSlot();
89                                 waveslot->SetSampleName(samplename);
90                                 waveslot->SetBuffer(bufnum);
91                                 m_bufferList[bufnum] = waveslot;
92                                 break;
93                         }
94                 }
95                 m_samplecache.insert(std::pair<STR_String, SND_WaveSlot*>(samplename, waveslot));
96         }
97
98         return waveslot;
99 }
100
101
102
103 void SND_WaveCache::RemoveAllSamples()
104 {
105         // remove all samples
106         m_samplecache.clear();
107
108         // reset the list of buffers
109         for (int i = 0; i < NUM_BUFFERS; i++)
110                 m_bufferList[i] = NULL;
111 }
112
113
114
115 void SND_WaveCache::RemoveSample(const STR_String& samplename, int buffer)
116 {
117         m_samplecache.erase(samplename);
118         m_bufferList[buffer] = NULL;
119 }
120
121
122
123 void SND_WaveCache::FreeSamples()
124 {
125         // iterate through the bufferlist and delete the waveslot if present
126         for (int i = 0; i < NUM_BUFFERS; i++)
127         {
128                 if (m_bufferList[i])
129                 {
130                         delete m_bufferList[i];
131                         m_bufferList[i] = NULL;
132                 }
133         }
134 }