summaryrefslogtreecommitdiffhomepage
path: root/nGenEx/DataLoader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'nGenEx/DataLoader.cpp')
-rw-r--r--nGenEx/DataLoader.cpp1042
1 files changed, 0 insertions, 1042 deletions
diff --git a/nGenEx/DataLoader.cpp b/nGenEx/DataLoader.cpp
deleted file mode 100644
index 54e2c15..0000000
--- a/nGenEx/DataLoader.cpp
+++ /dev/null
@@ -1,1042 +0,0 @@
-/* Starshatter OpenSource Distribution
- Copyright (c) 1997-2004, Destroyer Studios LLC.
- All Rights Reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * Neither the name "Destroyer Studios" nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- SUBSYSTEM: nGenEx.lib
- FILE: DataLoader.cpp
- AUTHOR: John DiCamillo
-
-*/
-
-#include "MemDebug.h"
-#include "DataLoader.h"
-#include "Archive.h"
-#include "Color.h"
-#include "D3DXImage.h"
-#include "Bitmap.h"
-#include "Bmp.h"
-#include "PCX.h"
-#include "Sound.h"
-#include "Resource.h"
-#include "Video.h"
-#include "Wave.h"
-
-// +------------------------------------------------------------------+
-
-static DataLoader* def_loader = 0;
-DataLoader* DataLoader::loader = 0;
-
-static List<DataArchive> archives;
-
-// +--------------------------------------------------------------------+
-
-DataLoader::DataLoader()
- : datapath(""), video(0), use_file_system(true), enable_media(true)
-{ }
-
-// +--------------------------------------------------------------------+
-
-void
-DataLoader::UseVideo(Video* v)
-{
- video = v;
-}
-
-// +--------------------------------------------------------------------+
-
-void
-DataLoader::Initialize()
-{
- def_loader = new(__FILE__,__LINE__) DataLoader;
- loader = def_loader;
-
- archives.destroy();
-}
-
-void
-DataLoader::Close()
-{
- archives.destroy();
- Bitmap::ClearCache();
-
- delete def_loader;
- def_loader = 0;
- loader = 0;
-}
-
-void
-DataLoader::Reset()
-{
- Close();
-}
-
-// +--------------------------------------------------------------------+
-
-void
-DataLoader::UseFileSystem(bool use)
-{
- use_file_system = use;
-}
-
-void
-DataLoader::EnableMedia(bool enable)
-{
- enable_media = enable;
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::EnableDatafile(const char* name)
-{
- int status = DATAFILE_NOTEXIST;
-
- FILE* f;
- fopen_s(&f, name, "rb");
-
- if (f) {
- ::fclose(f);
-
- DataArchive* a = new(__FILE__,__LINE__) DataArchive(name);
-
- if (a && a->NumFiles() >= 1) {
- status = DATAFILE_OK;
-
- bool found = false;
- ListIter<DataArchive> iter = archives;
- while (++iter && !found) {
- DataArchive* archive = iter.value();
- if (!strcmp(archive->Name(), name)) {
- found = true;
- }
- }
-
- if (!found)
- archives.append(a);
- }
- else {
- Print(" WARNING: invalid data file '%s'\n", name);
- status = DATAFILE_INVALID;
-
- delete a;
- }
-
- loader = this;
- }
- else {
- Print(" WARNING: could not open datafile '%s'\n", name);
- status = DATAFILE_NOTEXIST;
- }
-
- return status;
-}
-
-int
-DataLoader::DisableDatafile(const char* name)
-{
- ListIter<DataArchive> iter = archives;
- while (++iter) {
- DataArchive* a = iter.value();
- if (!strcmp(a->Name(), name)) {
- delete iter.removeItem();
- return DATAFILE_OK;
- }
- }
-
- return DATAFILE_NOTEXIST;
-}
-
-// +--------------------------------------------------------------------+
-
-void
-DataLoader::SetDataPath(const char* path)
-{
- if (path)
- datapath = path;
- else
- datapath = "";
-}
-
-// +--------------------------------------------------------------------+
-
-bool
-DataLoader::FindFile(const char* name)
-{
- // assemble file name:
- char filename[1024];
- strcpy_s(filename, datapath);
- strcat_s(filename, name);
-
- // first check current directory:
- if (use_file_system) {
- FILE* f;
- ::fopen_s(&f, filename, "rb");
-
- if (f) {
- ::fclose(f);
- return true;
- }
- }
-
- // then check datafiles, from last to first:
- int narchives = archives.size();
- for (int i = 0; i < narchives; i++) {
- DataArchive* a = archives[narchives-1-i];
- if (a->FindEntry(filename) > -1) {
- return true;
- }
- }
-
- return false;
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::ListFiles(const char* filter, List<Text>& list, bool recurse)
-{
- list.destroy();
-
- ListFileSystem(filter, list, datapath, recurse);
-
- // then check datafile(s):
- int narchives = archives.size();
- for (int i = 0; i < narchives; i++) {
- DataArchive* a = archives[narchives-1-i];
- ListArchiveFiles(a->Name(), filter, list);
- }
-
- return list.size();
-}
-
-int
-DataLoader::ListArchiveFiles(const char* archive_name, const char* filter, List<Text> &list)
-{
- int pathlen = datapath.length();
- DataArchive* a = 0;
-
- if (archive_name) {
- int narchives = archives.size();
- for (int i = 0; i < narchives && !a; i++) {
- a = archives[narchives-1-i];
-
- if (_stricmp(a->Name(), archive_name))
- a = 0;
- }
- }
-
- if (!a) {
- ListFileSystem(filter, list, datapath, true);
- return list.size();
- }
-
- if (!strcmp(filter, "*.*")) {
- int count = a->NumFiles();
- for (int n = 0; n < count; n++) {
- DataEntry* entry = a->GetFile(n);
- Text entry_name = entry->name;
- entry_name.setSensitive(false);
-
- if (entry_name.contains(datapath)) {
- Text fname = entry_name(pathlen, 1000);
-
- if (!list.contains(&fname))
- list.append(new Text(fname));
- }
- }
- }
- else {
- char data_filter[256];
- ZeroMemory(data_filter, 256);
-
- const char* pf = filter;
- char* pdf = data_filter;
-
- while (*pf) {
- if (*pf != '*')
- *pdf++ = *pf;
- pf++;
- }
-
- int count = a->NumFiles();
- for (int n = 0; n < count; n++) {
- DataEntry* entry = a->GetFile(n);
- Text entry_name = entry->name;
- entry_name.setSensitive(false);
-
- if (entry_name.contains(datapath) && entry_name.contains(data_filter)) {
- Text fname = entry_name(pathlen, 1000);
-
- if (!list.contains(&fname))
- list.append(new Text(fname));
- }
- }
- }
-
- return list.size();
-}
-
-// +--------------------------------------------------------------------+
-
-void
-DataLoader::ListFileSystem(const char* filter, List<Text>& list, Text base_path, bool recurse)
-{
- if (use_file_system) {
- char data_filter[256];
- ZeroMemory(data_filter, 256);
-
- const char* pf = filter;
- char* pdf = data_filter;
-
- while (*pf) {
- if (*pf != '*')
- *pdf++ = *pf;
- pf++;
- }
-
- int pathlen = base_path.length();
-
- // assemble win32 find filter:
- char win32_filter[1024];
- strcpy_s(win32_filter, datapath);
-
- if (recurse)
- strcat_s(win32_filter, "*.*");
- else
- strcat_s(win32_filter, filter);
-
- // first check current directory:
- WIN32_FIND_DATA data;
- HANDLE hFind = FindFirstFile(win32_filter, &data);
-
- if (hFind != INVALID_HANDLE_VALUE) {
- do {
- if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
- if (recurse && data.cFileName[0] != '.') {
- Text old_datapath = datapath;
-
- Text newpath = datapath;
- newpath += data.cFileName;
- newpath += "/";
- datapath = newpath;
-
- ListFileSystem(filter, list, base_path, recurse);
-
- datapath = old_datapath;
- }
- }
- else {
- if (!strcmp(filter, "*.*") || strstr(data.cFileName, data_filter)) {
- Text full_name = datapath;
- full_name += data.cFileName;
-
- list.append(new Text(full_name(pathlen, 1000)));
- }
- }
- }
- while (FindNextFile(hFind, &data));
- }
- }
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::LoadBuffer(const char* name, BYTE*& buf, bool null_terminate, bool optional)
-{
- buf = 0;
-
- // assemble file name:
- char filename[1024];
- strcpy_s(filename, datapath);
- strcat_s(filename, name);
-
- if (use_file_system) {
- // first check current directory:
- FILE* f;
- ::fopen_s(&f, filename, "rb");
-
- if (f) {
- ::fseek(f, 0, SEEK_END);
- int len = ftell(f);
- ::fseek(f, 0, SEEK_SET);
-
- if (null_terminate) {
- buf = new(__FILE__,__LINE__) BYTE[len+1];
- if (buf)
- buf[len] = 0;
- }
-
- else {
- buf = new(__FILE__,__LINE__) BYTE[len];
- }
-
- if (buf)
- ::fread(buf, len, 1, f);
-
- ::fclose(f);
-
- return len;
- }
- }
-
- // then check datafile(s):
- int narchives = archives.size();
-
- // vox files are usually in their own archive,
- // so check there first
- if (narchives > 1 && strstr(filename, "Vox")) {
- for (int i = 0; i < narchives; i++) {
- DataArchive* a = archives[narchives-1-i];
- if (strstr(a->Name(), "vox")) {
- int index = a->FindEntry(filename);
- if (index > -1)
- return a->ExpandEntry(index, buf, null_terminate);
- }
- }
- }
-
- for (int i = 0; i < narchives; i++) {
- DataArchive* a = archives[narchives-1-i];
- int index = a->FindEntry(filename);
- if (index > -1)
- return a->ExpandEntry(index, buf, null_terminate);
- }
-
- if (!optional)
- Print("WARNING - DataLoader could not load buffer '%s'\n", filename);
- return 0;
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::LoadPartialFile(const char* name, BYTE*& buf, int max_load, bool optional)
-{
- buf = 0;
-
- // assemble file name:
- char filename[1024];
- strcpy_s(filename, datapath);
- strcat_s(filename, name);
-
- // first check current directory:
- FILE* f;
- ::fopen_s(&f, filename, "rb");
-
- if (f) {
- ::fseek(f, 0, SEEK_END);
- int len = ftell(f);
- ::fseek(f, 0, SEEK_SET);
-
- if (len > max_load) {
- len = max_load;
- }
-
- buf = new(__FILE__,__LINE__) BYTE[len];
-
- if (buf)
- ::fread(buf, len, 1, f);
-
- ::fclose(f);
-
- return len;
- }
-
- if (!optional)
- Print("WARNING - DataLoader could not load partial file '%s'\n", filename);
- return 0;
-}
-
-int
-DataLoader::fread(void* buffer, size_t size, size_t count, BYTE*& stream)
-{
- CopyMemory(buffer, stream, size*count);
- stream += size*count;
-
- return size*count;
-}
-
-// +--------------------------------------------------------------------+
-
-void
-DataLoader::ReleaseBuffer(BYTE*& buf)
-{
- delete [] buf;
- buf = 0;
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::CacheBitmap(const char* name, Bitmap*& bitmap, int type, bool optional)
-{
- int result = 0;
-
- // search cache:
- bitmap = Bitmap::CheckCache(name);
- if (bitmap) return 1;
-
- // not in cache yet:
- bitmap = new(__FILE__,__LINE__) Bitmap;
-
- if (bitmap)
- result = LoadBitmap(name, *bitmap, type, optional);
-
- if (result && bitmap)
- Bitmap::AddToCache(bitmap);
-
- return result;
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::LoadBitmap(const char* name, Bitmap& bitmap, int type, bool optional)
-{
- if (!enable_media)
- return 0;
-
- int result = LoadIndexed(name, bitmap, type);
-
- // check for a matching high color bitmap:
- if (result == 1) {
- int hi_result = LoadHiColor(name, bitmap, type);
-
- if (hi_result == 2)
- result = 3;
- }
-
- bitmap.SetFilename(name);
-
- if (!result && !optional)
- Print("WARNING - DataLoader could not load bitmap '%s%s'\n", datapath.data(), name);
-
- return result;
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::LoadTexture(const char* name, Bitmap*& bitmap, int type, bool preload_cache, bool optional)
-{
- if (!enable_media)
- return 0;
-
- int result = 0;
-
- // assemble file name:
- char filename[256];
- strcpy_s(filename, datapath);
- strcat_s(filename, name);
-
- // search cache:
- bitmap = Bitmap::CheckCache(filename);
- if (bitmap) return 1;
-
- // not in cache yet:
- bitmap = new(__FILE__,__LINE__) Bitmap;
-
- if (bitmap) {
- result = LoadHiColor(name, *bitmap, type);
-
- if (!result) {
- result = LoadIndexed(name, *bitmap, type);
- }
-
- bitmap->SetFilename(filename);
-
- if (result) {
- bitmap->MakeTexture();
- Bitmap::AddToCache(bitmap);
- }
- else {
- delete bitmap;
- bitmap = 0;
-
- if (!optional)
- Print("WARNING - DataLoader could not load texture '%s%s'\n", datapath.data(), name);
- }
- }
- else if (!optional) {
- Print("WARNING - DataLoader could not allocate texture '%s%s'\n", datapath.data(), name);
- }
-
- return result;
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::LoadIndexed(const char* name, Bitmap& bitmap, int type)
-{
- if (!enable_media)
- return 0;
-
- int result = 0;
- PcxImage pcx;
- D3DXImage d3dx;
- bool pcx_file = strstr(name, ".pcx") || strstr(name, ".PCX");
-
- // assemble file name:
- char filename[256];
- strcpy_s(filename, datapath);
- strcat_s(filename, name);
-
- // first try to load from current directory:
- bool loaded = false;
-
- if (use_file_system) {
- if (pcx_file)
- loaded = pcx.Load(filename) == PCX_OK;
-
- else
- loaded = d3dx.Load(filename);
- }
-
- if (!loaded) {
- // then check datafile:
- int len = 0;
- BYTE* tmp_buf = 0;
-
- int narchives = archives.size();
- for (int i = 0; i < narchives; i++) {
- DataArchive* a = archives[narchives-1-i];
- int index = a->FindEntry(filename);
- if (index > -1) {
- len = a->ExpandEntry(index, tmp_buf);
-
- if (pcx_file)
- pcx.LoadBuffer(tmp_buf, len);
-
- else
- d3dx.LoadBuffer(tmp_buf, len);
-
- ReleaseBuffer(tmp_buf);
- break;
- }
- }
- }
-
- // now copy the image into the bitmap:
- if (pcx_file) {
- if (pcx.bitmap) {
- bitmap.CopyImage(pcx.width, pcx.height, pcx.bitmap, type);
- result = 1;
- }
-
- else if (pcx.himap) {
- bitmap.CopyHighColorImage(pcx.width, pcx.height, pcx.himap, type);
- result = 2;
- }
-
- if (result == 2)
- LoadAlpha(name, bitmap, type);
- }
-
- else {
- if (d3dx.image) {
- bitmap.CopyHighColorImage(d3dx.width, d3dx.height, d3dx.image, type);
- result = 2;
- }
-
- if (result == 2) {
- LoadAlpha(name, bitmap, type);
- }
- }
-
- return result;
-}
-
-int
-DataLoader::LoadHiColor(const char* name, Bitmap& bitmap, int type)
-{
- if (!enable_media)
- return 0;
-
- int result = 0;
- PcxImage pcx;
- D3DXImage d3dx;
- bool pcx_file = strstr(name, ".pcx") || strstr(name, ".PCX");
- bool bmp_file = strstr(name, ".bmp") || strstr(name, ".BMP");
- bool png_file = strstr(name, ".png") || strstr(name, ".PNG");
-
- // check for a matching high color bitmap:
- char filename[256];
- char name2[256];
- strcpy_s(name2, name);
-
- char* dot = strrchr(name2, '.');
- if (dot && pcx_file)
- strcpy(dot, "+.pcx");
- else if (dot && bmp_file)
- strcpy(dot, "+.bmp");
- else if (dot && png_file)
- strcpy(dot, "+.png");
- else
- return result;
-
- strcpy_s(filename, datapath);
- strcat_s(filename, name2);
-
- // first try to load from current directory:
- bool loaded = false;
-
- if (use_file_system) {
- if (pcx_file)
- loaded = pcx.Load(filename) == PCX_OK;
-
- else
- loaded = d3dx.Load(filename);
- }
-
- if (!loaded) {
- // then check datafile:
- int len = 0;
- BYTE* tmp_buf = 0;
-
- int narchives = archives.size();
- for (int i = 0; i < narchives; i++) {
- DataArchive* a = archives[narchives-1-i];
- int index = a->FindEntry(filename);
- if (index > -1) {
- len = a->ExpandEntry(index, tmp_buf);
-
- if (pcx_file)
- pcx.LoadBuffer(tmp_buf, len);
- else
- d3dx.LoadBuffer(tmp_buf, len);
-
- ReleaseBuffer(tmp_buf);
- break;
- }
- }
- }
-
- // now copy the image into the bitmap:
- if (pcx_file && pcx.himap) {
- bitmap.CopyHighColorImage(pcx.width, pcx.height, pcx.himap, type);
- result = 2;
- }
-
- else if (d3dx.image) {
- bitmap.CopyHighColorImage(d3dx.width, d3dx.height, d3dx.image, type);
- result = 2;
- }
-
- if (result == 2)
- LoadAlpha(name, bitmap, type);
-
- return result;
-}
-
-int
-DataLoader::LoadAlpha(const char* name, Bitmap& bitmap, int type)
-{
- if (!enable_media)
- return 0;
-
- PcxImage pcx;
- D3DXImage d3dx;
- bool pcx_file = strstr(name, ".pcx") || strstr(name, ".PCX");
- bool bmp_file = strstr(name, ".bmp") || strstr(name, ".BMP");
- bool png_file = strstr(name, ".png") || strstr(name, ".PNG");
- bool tga_file = strstr(name, ".tga") || strstr(name, ".TGA");
-
- // check for an associated alpha-only (grayscale) bitmap:
- char filename[256];
- char name2[256];
- strcpy_s(name2, name);
- char* dot = strrchr(name2, '.');
- if (dot && pcx_file)
- strcpy(dot, "@.pcx");
- else if (dot && bmp_file)
- strcpy(dot, "@.bmp");
- else if (dot && png_file)
- strcpy(dot, "@.png");
- else if (dot && tga_file)
- strcpy(dot, "@.tga");
- else
- return 0;
-
- strcpy_s(filename, datapath);
- strcat_s(filename, name2);
-
- // first try to load from current directory:
- bool loaded = false;
-
- if (use_file_system) {
- if (pcx_file)
- loaded = pcx.Load(filename) == PCX_OK;
-
- else
- loaded = d3dx.Load(filename);
- }
-
- if (!loaded) {
- // then check datafile:
- int len = 0;
- BYTE* tmp_buf = 0;
-
- int narchives = archives.size();
- for (int i = 0; i < narchives; i++) {
- DataArchive* a = archives[narchives-1-i];
- int index = a->FindEntry(filename);
- if (index > -1) {
- len = a->ExpandEntry(index, tmp_buf);
-
- if (pcx_file)
- pcx.LoadBuffer(tmp_buf, len);
- else
- d3dx.LoadBuffer(tmp_buf, len);
-
- ReleaseBuffer(tmp_buf);
- break;
- }
- }
- }
-
- // now copy the alpha values into the bitmap:
- if (pcx_file && pcx.bitmap) {
- bitmap.CopyAlphaImage(pcx.width, pcx.height, pcx.bitmap);
- }
- else if (pcx_file && pcx.himap) {
- bitmap.CopyAlphaRedChannel(pcx.width, pcx.height, pcx.himap);
- }
- else if (d3dx.image) {
- bitmap.CopyAlphaRedChannel(d3dx.width, d3dx.height, d3dx.image);
- }
-
- return 0;
-}
-
-// +--------------------------------------------------------------------+
-
-int
-DataLoader::LoadSound(const char* name, Sound*& snd, DWORD flags, bool optional)
-{
- if (!enable_media)
- return 0;
-
- if (strstr(name, ".ogg"))
- return LoadStream(name, snd, optional);
-
- int result = 0;
-
- WAVE_HEADER head;
- WAVE_FMT fmt;
- WAVE_FACT fact;
- WAVE_DATA data;
- WAVEFORMATEX wfex;
- LPBYTE wave;
-
- LPBYTE buf;
- LPBYTE p;
- int len;
-
- ZeroMemory(&head, sizeof(head));
- ZeroMemory(&fmt, sizeof(fmt));
- ZeroMemory(&fact, sizeof(fact));
- ZeroMemory(&data, sizeof(data));
-
- len = LoadBuffer(name, buf, false, optional);
-
- if (len > sizeof(head)) {
- CopyMemory(&head, buf, sizeof(head));
-
- if (head.RIFF == MAKEFOURCC('R', 'I', 'F', 'F') &&
- head.WAVE == MAKEFOURCC('W', 'A', 'V', 'E')) {
-
- p = buf + sizeof(WAVE_HEADER);
-
- do {
- DWORD chunk_id = *((LPDWORD) p);
-
- switch (chunk_id) {
- case MAKEFOURCC('f', 'm', 't', ' '):
- CopyMemory(&fmt, p, sizeof(fmt));
- p += fmt.chunk_size + 8;
- break;
-
- case MAKEFOURCC('f', 'a', 'c', 't'):
- CopyMemory(&fact, p, sizeof(fact));
- p += fact.chunk_size + 8;
- break;
-
- case MAKEFOURCC('s', 'm', 'p', 'l'):
- CopyMemory(&fact, p, sizeof(fact));
- p += fact.chunk_size + 8;
- break;
-
- case MAKEFOURCC('d', 'a', 't', 'a'):
- CopyMemory(&data, p, sizeof(data));
- p += 8;
- break;
-
- default:
- ReleaseBuffer(buf);
- return result;
- }
- }
- while (data.chunk_size == 0);
-
- wfex.wFormatTag = fmt.wFormatTag;
- wfex.nChannels = fmt.nChannels;
- wfex.nSamplesPerSec = fmt.nSamplesPerSec;
- wfex.nAvgBytesPerSec = fmt.nAvgBytesPerSec;
- wfex.nBlockAlign = fmt.nBlockAlign;
- wfex.wBitsPerSample = fmt.wBitsPerSample;
- wfex.cbSize = 0;
- wave = p;
-
- snd = Sound::Create(flags, &wfex, data.chunk_size, wave);
-
- if (snd)
- result = data.chunk_size;
- }
- }
-
- ReleaseBuffer(buf);
- return result;
-}
-
-int
-DataLoader::LoadStream(const char* name, Sound*& snd, bool optional)
-{
- if (!enable_media)
- return 0;
-
- if (!name)
- return 0;
-
- int namelen = strlen(name);
-
- if (namelen < 5)
- return 0;
-
- if ((name[namelen-3] == 'o' || name[namelen-3] == 'O') &&
- (name[namelen-2] == 'g' || name[namelen-2] == 'G') &&
- (name[namelen-1] == 'g' || name[namelen-1] == 'G')) {
-
- return LoadOggStream(name, snd);
- }
-
- int result = 0;
-
- WAVE_HEADER head;
- WAVE_FMT fmt;
- WAVE_FACT fact;
- WAVE_DATA data;
- WAVEFORMATEX wfex;
-
- LPBYTE buf;
- LPBYTE p;
- int len;
-
- ZeroMemory(&head, sizeof(head));
- ZeroMemory(&fmt, sizeof(fmt));
- ZeroMemory(&fact, sizeof(fact));
- ZeroMemory(&data, sizeof(data));
-
- len = LoadPartialFile(name, buf, 4096, optional);
-
- if (len > sizeof(head)) {
- CopyMemory(&head, buf, sizeof(head));
-
- if (head.RIFF == MAKEFOURCC('R', 'I', 'F', 'F') &&
- head.WAVE == MAKEFOURCC('W', 'A', 'V', 'E')) {
-
- p = buf + sizeof(WAVE_HEADER);
-
- do {
- DWORD chunk_id = *((LPDWORD) p);
-
- switch (chunk_id) {
- case MAKEFOURCC('f', 'm', 't', ' '):
- CopyMemory(&fmt, p, sizeof(fmt));
- p += fmt.chunk_size + 8;
- break;
-
- case MAKEFOURCC('f', 'a', 'c', 't'):
- CopyMemory(&fact, p, sizeof(fact));
- p += fact.chunk_size + 8;
- break;
-
- case MAKEFOURCC('s', 'm', 'p', 'l'):
- CopyMemory(&fact, p, sizeof(fact));
- p += fact.chunk_size + 8;
- break;
-
- case MAKEFOURCC('d', 'a', 't', 'a'):
- CopyMemory(&data, p, sizeof(data));
- p += 8;
- break;
-
- default:
- ReleaseBuffer(buf);
- return result;
- }
- }
- while (data.chunk_size == 0);
-
- wfex.wFormatTag = fmt.wFormatTag;
- wfex.nChannels = fmt.nChannels;
- wfex.nSamplesPerSec = fmt.nSamplesPerSec;
- wfex.nAvgBytesPerSec = fmt.nAvgBytesPerSec;
- wfex.nBlockAlign = fmt.nBlockAlign;
- wfex.wBitsPerSample = fmt.wBitsPerSample;
- wfex.cbSize = 0;
-
- snd = Sound::Create(Sound::STREAMED, &wfex);
-
- if (snd) {
- // assemble file name:
- char filename[1024];
- strcpy_s(filename, datapath);
- strcat_s(filename, name);
-
- snd->StreamFile(filename, p - buf);
-
- result = data.chunk_size;
- }
- }
- }
-
- ReleaseBuffer(buf);
- return result;
-}
-
-int
-DataLoader::LoadOggStream(const char* name, Sound*& snd)
-{
- if (!enable_media)
- return 0;
-
- snd = Sound::CreateOggStream(name);
-
- return snd != 0;
-}