2 fegdk: FE Game Development Kit
3 Copyright (C) 2001-2008 Alexey "waker" Yakovenko
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 keltar@users.sourceforge.net
25 #include "f_helpers.h"
26 #include "basesounddriver.h"
32 wavFeeder::wavFeeder (wavFile
*file
)
37 void wavFeeder::call (void *data
)
42 wavFile::wavFile (const char *name
)
59 mpFile
= g_engine
->getFileSystem ()->openFile (mName
, FS_MODE_READ
);
61 fprintf (stderr
, "loading %s from disk....\n", this->name ());
66 if (!mpFile
->read (&mWavHeader
, sizeof (wavHeader
)))
68 fprintf (stderr
, "WAV header not found in %s\n", this->name ());
77 if (mWavHeader
.size
< 2000000)
80 mpBuffer
= g_engine
->getSoundDriver ()->createBuffer (mWavHeader
.samplesPerSecond
, 16, mWavHeader
.channels
== 1 ? false : true, mWavHeader
.dataSize
, false);
81 mpPCMOut
= new char[mWavHeader
.dataSize
];
82 mHaveBytes
= mpFile
->read (mpPCMOut
, mWavHeader
.dataSize
);
83 mpBuffer
->write (mpPCMOut
, mWavHeader
.dataSize
, (mWavHeader
.channels
== 1) ? baseSoundDriver::fmt_mono16
: baseSoundDriver::fmt_stereo16
, mWavHeader
.samplesPerSecond
);
96 mpPCMOut
= new char[buffer_size
* 2];
97 mpBuffer
= g_engine
->getSoundDriver ()->createBuffer (mWavHeader
.samplesPerSecond
, 16, mWavHeader
.channels
== 1 ? false : true, buffer_size
, true);
98 mpBuffer
->setFeeder (&mFeeder
);
103 wavFile::~wavFile (void)
109 mpBuffer
->release ();
125 void wavFile::play (bool looping
)
136 mpFile
->seek (sizeof (wavHeader
), SEEK_SET
);
143 mpBuffer
->setLooping (mbLooping
);
149 void wavFile::stop (void)
165 void wavFile::pause (bool onoff
)
169 mpBuffer
->pause (onoff
);
174 void wavFile::setVolume (float volume
)
178 mpBuffer
->setVolume (volume
);
181 bool wavFile::isPlaying (void) const
186 int wavFile::getChannelsCount (void) const
188 return mpBuffer
->getChannelsCount ();
191 void wavFile::open ()
194 mCurrentSection
= -1;
196 mpFile
= g_engine
->getFileSystem ()->openFile (mName
, FS_MODE_READ
);
197 mpFile
->read (&mWavHeader
, sizeof (wavHeader
));
198 mpBuffer
->setFeeder (&mFeeder
);
201 void wavFile::update (void)
213 while (!mbEOF
&& mHaveBytes
< buffer_size
)
216 long ret
= mpFile
->read (mpPCMOut
+ mHaveBytes
, buffer_size
- mHaveBytes
);
222 mpFile
->seek (sizeof (wavHeader
), SEEK_SET
);
238 if (mbEOF
&& !mbLooping
)
245 if (mHaveBytes
|| mbEOF
)
249 DWORD signStop = WaitForSingleObject (mEventStop, 10);
250 if (signStop == WAIT_OBJECT_0 && mbEOF && !mHaveBytes)
257 if (mbEOF
&& !mHaveBytes
)
262 bool updated
= false;
264 if (mHaveBytes
< buffer_size
)
266 memset (mpPCMOut
+ buffer_size
, 0, buffer_size
- mHaveBytes
);
267 mHaveBytes
= buffer_size
;
269 int copybytes
= min ((int)buffer_size
, (int)mHaveBytes
);
271 mpBuffer
->write (mpPCMOut
, copybytes
, baseSoundDriver::fmt_stereo16
, mWavHeader
.samplesPerSecond
);
275 if (updated
&& mHaveBytes
> buffer_size
)
277 memmove (mpPCMOut
, &mpPCMOut
[buffer_size
], mHaveBytes
- buffer_size
);
278 mHaveBytes
-= buffer_size
;
287 smartPtr
<baseSound
> wavFile::duplicate (void)
289 return new wavFile (name ());