aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2011-06-30 02:15:23 +1000
committerTravis Howell2011-06-30 02:15:23 +1000
commit0be5ba9b0e914d3855f22ea24ac291a157ff86b6 (patch)
tree163db4bb0f1c8f9e862ed80fe5e759d0c7617d77
parent50f28f2c23d72799bf4e415783650320a432ed97 (diff)
parent3385fd37b974088e1cd7117e67c87e935742d729 (diff)
downloadscummvm-rg350-0be5ba9b0e914d3855f22ea24ac291a157ff86b6.tar.gz
scummvm-rg350-0be5ba9b0e914d3855f22ea24ac291a157ff86b6.tar.bz2
scummvm-rg350-0be5ba9b0e914d3855f22ea24ac291a157ff86b6.zip
Merge branch 'master' of github.com:scummvm/scummvm
-rw-r--r--backends/taskbar/win32/win32-taskbar.cpp122
-rw-r--r--backends/taskbar/win32/win32-taskbar.h5
-rwxr-xr-xconfigure2
-rw-r--r--dists/scummvm.rc4
-rw-r--r--engines/lastexpress/data/snd.cpp16
-rw-r--r--engines/lastexpress/data/snd.h8
-rw-r--r--engines/lastexpress/shared.h21
-rw-r--r--engines/lastexpress/sound/entry.cpp459
-rw-r--r--engines/lastexpress/sound/entry.h60
-rw-r--r--engines/lastexpress/sound/queue.cpp444
-rw-r--r--engines/lastexpress/sound/queue.h10
-rw-r--r--engines/lastexpress/sound/sound.cpp3
-rw-r--r--icons/count.icobin0 -> 1150 bytes
13 files changed, 648 insertions, 506 deletions
diff --git a/backends/taskbar/win32/win32-taskbar.cpp b/backends/taskbar/win32/win32-taskbar.cpp
index 18d99d6eca..04889f3dd7 100644
--- a/backends/taskbar/win32/win32-taskbar.cpp
+++ b/backends/taskbar/win32/win32-taskbar.cpp
@@ -66,7 +66,7 @@
// System.Title property key, values taken from http://msdn.microsoft.com/en-us/library/bb787584.aspx
const PROPERTYKEY PKEY_Title = { /* fmtid = */ { 0xF29F85E0, 0x4FF9, 0x1068, { 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9 } }, /* propID = */ 2 };
-Win32TaskbarManager::Win32TaskbarManager() : _taskbar(NULL) {
+Win32TaskbarManager::Win32TaskbarManager() : _taskbar(NULL), _count(0), _icon(NULL) {
// Do nothing if not running on Windows 7 or later
if (!isWin7OrLater())
return;
@@ -96,6 +96,9 @@ Win32TaskbarManager::~Win32TaskbarManager() {
_taskbar->Release();
_taskbar = NULL;
+ if (_icon)
+ DestroyIcon(_icon);
+
CoUninitialize();
}
@@ -144,6 +147,123 @@ void Win32TaskbarManager::setProgressState(TaskbarProgressState state) {
_taskbar->SetProgressState(getHwnd(), (TBPFLAG)state);
}
+void Win32TaskbarManager::setCount(int count) {
+ if (_taskbar == NULL)
+ return;
+
+ if (count == 0) {
+ _taskbar->SetOverlayIcon(getHwnd(), NULL, L"");
+ return;
+ }
+
+ // FIXME: This isn't really nice and could use a cleanup.
+ // The only good thing is that it doesn't use GDI+
+ // and thus does not have a dependancy on it,
+ // with the downside of being a lot more ugly.
+ // Maybe replace it by a Graphic::Surface, use
+ // ScummVM font drawing and extract the contents at
+ // the end?
+
+ if (_count != count || _icon == NULL) {
+ // Cleanup previous icon
+ _count = count;
+ if (_icon)
+ DestroyIcon(_icon);
+
+ Common::String countString = (count < 100 ? Common::String::format("%d", count) : "9+");
+
+ // Create transparent background
+ BITMAPV5HEADER bi;
+ ZeroMemory(&bi, sizeof(BITMAPV5HEADER));
+ bi.bV5Size = sizeof(BITMAPV5HEADER);
+ bi.bV5Width = 16;
+ bi.bV5Height = 16;
+ bi.bV5Planes = 1;
+ bi.bV5BitCount = 32;
+ bi.bV5Compression = BI_RGB;
+ // Set 32 BPP alpha format
+ bi.bV5RedMask = 0x00FF0000;
+ bi.bV5GreenMask = 0x0000FF00;
+ bi.bV5BlueMask = 0x000000FF;
+ bi.bV5AlphaMask = 0xFF000000;
+
+ // Get DC
+ HDC hdc;
+ hdc = GetDC(NULL);
+ HDC hMemDC = CreateCompatibleDC(hdc);
+ ReleaseDC(NULL, hdc);
+
+ // Create a bitmap mask
+ HBITMAP hBitmapMask = CreateBitmap(16, 16, 1, 1, NULL);
+
+ // Create the DIB section with an alpha channel
+ void *lpBits;
+ HBITMAP hBitmap = CreateDIBSection(hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&lpBits, NULL, 0);
+ HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
+
+ // Load the icon background
+ HICON hIconBackground = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1002 /* IDI_COUNT */));
+ DrawIconEx(hMemDC, 0, 0, hIconBackground, 16, 16, 0, 0, DI_NORMAL);
+ DeleteObject(hIconBackground);
+
+ // Draw the count
+ LOGFONT lFont;
+ memset(&lFont, 0, sizeof(LOGFONT));
+ lFont.lfHeight = 10;
+ lFont.lfWeight = FW_BOLD;
+ lFont.lfItalic = 1;
+ strcpy(lFont.lfFaceName, "Arial");
+
+ HFONT hFont = CreateFontIndirect(&lFont);
+ SelectObject(hMemDC, hFont);
+
+ RECT rect;
+ SetRect(&rect, 4, 4, 12, 12);
+ SetTextColor(hMemDC, RGB(48, 48, 48));
+ SetBkMode(hMemDC, TRANSPARENT);
+ DrawText(hMemDC, countString.c_str(), -1, &rect, DT_NOCLIP|DT_CENTER);
+
+ // Set the text alpha to fully opaque (we consider the data inside the text rect)
+ DWORD *lpdwPixel = (DWORD *)lpBits;
+ for (int x = 3; x < 12; x++) {
+ for(int y = 3; y < 12; y++) {
+ unsigned char *p = (unsigned char *)(lpdwPixel + x * 16 + y);
+
+ if (p[0] != 0 && p[1] != 0 && p[2] != 0)
+ p[3] = 255;
+ }
+ }
+
+ // Cleanup DC
+ DeleteObject(hFont);
+ SelectObject(hMemDC, hOldBitmap);
+ DeleteDC(hMemDC);
+
+ // Prepare our new icon
+ ICONINFO ii;
+ ii.fIcon = FALSE;
+ ii.xHotspot = 0;
+ ii.yHotspot = 0;
+ ii.hbmMask = hBitmapMask;
+ ii.hbmColor = hBitmap;
+
+ _icon = CreateIconIndirect(&ii);
+
+ DeleteObject(hBitmap);
+ DeleteObject(hBitmapMask);
+
+ if (!_icon) {
+ warning("[Win32TaskbarManager::setCount] Cannot create icon for count");
+ return;
+ }
+ }
+
+ // Sets the overlay icon
+ LPWSTR desc = ansiToUnicode(Common::String::format("Found games: %d", count).c_str());
+ _taskbar->SetOverlayIcon(getHwnd(), _icon, desc);
+ delete[] desc;
+}
+
void Win32TaskbarManager::addRecent(const Common::String &name, const Common::String &description) {
//warning("[Win32TaskbarManager::addRecent] Adding recent list entry: %s (%s)", name.c_str(), description.c_str());
diff --git a/backends/taskbar/win32/win32-taskbar.h b/backends/taskbar/win32/win32-taskbar.h
index 3415a79bd7..c9d1761017 100644
--- a/backends/taskbar/win32/win32-taskbar.h
+++ b/backends/taskbar/win32/win32-taskbar.h
@@ -41,11 +41,16 @@ public:
virtual void setOverlayIcon(const Common::String &name, const Common::String &description);
virtual void setProgressValue(int completed, int total);
virtual void setProgressState(TaskbarProgressState state);
+ virtual void setCount(int count);
virtual void addRecent(const Common::String &name, const Common::String &description);
private:
ITaskbarList3 *_taskbar;
+ // Count handling
+ HICON _icon;
+ int _count;
+
/**
* Get the path to an icon for the game
*
diff --git a/configure b/configure
index a418091cb7..eb8b4558fa 100755
--- a/configure
+++ b/configure
@@ -1854,7 +1854,7 @@ case $_host_os in
mingw*)
DEFINES="$DEFINES -DWIN32"
DEFINES="$DEFINES -D__USE_MINGW_ANSI_STDIO=0"
- LIBS="$LIBS -lmingw32 -lwinmm"
+ LIBS="$LIBS -lmingw32 -lwinmm -lgdi32"
OBJS="$OBJS scummvmwinres.o"
add_line_to_config_mk 'WIN32 = 1'
;;
diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index d3330045b5..55f9dfbc6c 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -5,9 +5,11 @@
#endif
#define FILE 256
-#define IDI_ICON 1001
+#define IDI_ICON 1001
+#define IDI_COUNT 1002
IDI_ICON ICON DISCARDABLE "icons/scummvm.ico"
+IDI_COUNT ICON DISCARDABLE "icons/count.ico"
scummmodern.zip FILE "gui/themes/scummmodern.zip"
#ifdef USE_TRANSLATION
diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp
index d92ebbc5e3..fa2d8a2e51 100644
--- a/engines/lastexpress/data/snd.cpp
+++ b/engines/lastexpress/data/snd.cpp
@@ -103,7 +103,8 @@ void SimpleSound::play(Audio::AudioStream *as) {
//////////////////////////////////////////////////////////////////////////
// StreamedSound
//////////////////////////////////////////////////////////////////////////
-StreamedSound::StreamedSound() {}
+StreamedSound::StreamedSound() : _loaded(false) {}
+
StreamedSound::~StreamedSound() {}
bool StreamedSound::load(Common::SeekableReadStream *stream) {
@@ -120,9 +121,18 @@ bool StreamedSound::load(Common::SeekableReadStream *stream) {
// Start playing the decoded audio stream
play(as);
+ _loaded = true;
+
return true;
}
+bool StreamedSound::isFinished() {
+ if (!_loaded)
+ return false;
+
+ return !g_system->getMixer()->isSoundHandleActive(_handle);
+}
+
//////////////////////////////////////////////////////////////////////////
// StreamedSound
//////////////////////////////////////////////////////////////////////////
@@ -172,4 +182,8 @@ void AppendableSound::finish() {
_finished = true;
}
+bool AppendableSound::isFinished() {
+ return _as->endOfStream();
+}
+
} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/snd.h b/engines/lastexpress/data/snd.h
index 95a136ee1c..1c34e4f950 100644
--- a/engines/lastexpress/data/snd.h
+++ b/engines/lastexpress/data/snd.h
@@ -55,6 +55,7 @@ public:
virtual ~SimpleSound();
void stop() const;
+ virtual bool isFinished() = 0;
protected:
void loadHeader(Common::SeekableReadStream *in);
@@ -76,6 +77,11 @@ public:
~StreamedSound();
bool load(Common::SeekableReadStream *stream);
+
+ virtual bool isFinished();
+
+private:
+ bool _loaded;
};
class AppendableSound : public SimpleSound {
@@ -87,6 +93,8 @@ public:
void queueBuffer(Common::SeekableReadStream *bufferIn);
void finish();
+ virtual bool isFinished();
+
private:
Audio::QueuingAudioStream *_as;
bool _finished;
diff --git a/engines/lastexpress/shared.h b/engines/lastexpress/shared.h
index 69816a3d6c..b4ced96ee1 100644
--- a/engines/lastexpress/shared.h
+++ b/engines/lastexpress/shared.h
@@ -89,6 +89,27 @@ enum SoundState {
kSoundState2 = 2
};
+enum SoundStatus {
+ kSoundStatus_20 = 0x20,
+ kSoundStatus_40 = 0x40,
+ kSoundStatus_180 = 0x180,
+ kSoundStatusRemoved = 0x200,
+ kSoundStatus_400 = 0x400,
+
+ kSoundStatus_8000 = 0x8000,
+ kSoundStatus_20000 = 0x20000,
+ kSoundStatus_100000 = 0x100000,
+ kSoundStatus_20000000 = 0x20000000,
+ kSoundStatus_40000000 = 0x40000000,
+
+ kSoundStatusClear0 = 0x10,
+ kSoundStatusFilterVariant = 0x1F,
+ kSoundStatusClear2 = 0x80,
+ kSoundStatusClear3 = 0x200,
+ kSoundStatusClear4 = 0x800,
+ kSoundStatusClearAll = 0xFFFFFFE0
+};
+
//////////////////////////////////////////////////////////////////////////
// Time values
//////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp
index c34bb4f0cc..4bdb9f7f96 100644
--- a/engines/lastexpress/sound/entry.cpp
+++ b/engines/lastexpress/sound/entry.cpp
@@ -38,14 +38,17 @@
namespace LastExpress {
+#define SOUNDCACHE_ENTRY_SIZE 92160
+#define FILTER_BUFFER_SIZE 2940
+
//////////////////////////////////////////////////////////////////////////
// SoundEntry
//////////////////////////////////////////////////////////////////////////
SoundEntry::SoundEntry(LastExpressEngine *engine) : _engine(engine) {
_type = kSoundTypeNone;
- _currentDataPtr = 0;
- _soundData = NULL;
+ _currentDataPtr = NULL;
+ _soundBuffer = NULL;
_blockCount = 0;
_time = 0;
@@ -55,7 +58,7 @@ SoundEntry::SoundEntry(LastExpressEngine *engine) : _engine(engine) {
_field_34 = 0;
_field_38 = 0;
_field_3C = 0;
- _field_40 = 0;
+ _variant = 0;
_entity = kEntityPlayer;
_field_48 = 0;
_priority = 0;
@@ -63,15 +66,18 @@ SoundEntry::SoundEntry(LastExpressEngine *engine) : _engine(engine) {
_subtitle = NULL;
_soundStream = NULL;
+
+ _queued = false;
}
SoundEntry::~SoundEntry() {
- // Entries that have been queued would have their streamed disposed automatically
+ // Entries that have been queued will have their streamed disposed automatically
if (!_soundStream)
SAFE_DELETE(_stream);
-
delete _soundStream;
+ free(_soundBuffer);
+
// Zero passed pointers
_engine = NULL;
}
@@ -79,13 +85,10 @@ SoundEntry::~SoundEntry() {
void SoundEntry::open(Common::String name, SoundFlag flag, int priority) {
_priority = priority;
setType(flag);
- setStatus(flag);
-
- // Add entry to sound list
- getSoundQueue()->addToQueue(this);
+ setupStatus(flag);
// Add entry to cache and load sound data
- getSoundQueue()->setupCache(this);
+ setupCache();
loadSoundData(name);
}
@@ -114,6 +117,53 @@ void SoundEntry::close() {
}
}
+void SoundEntry::play() {
+ if (!_stream) {
+ warning("[SoundEntry::play] stream has been disposed");
+ return;
+ }
+
+ if (_queued)
+ return;
+
+ // Apply filter
+ int16 *buffer = (int16 *)malloc(FILTER_BUFFER_SIZE);
+ memset(buffer, 0, FILTER_BUFFER_SIZE);
+
+ applyFilter(buffer);
+
+ // Queue the filtered data
+#if 0
+ if (!_soundStream)
+ _soundStream = new AppendableSound();
+
+ // FIXME: make sure the filtered sound buffer is disposed
+ _soundStream->queueBuffer((const byte *)buffer, FILTER_BUFFER_SIZE /* true */);
+#else
+ free(buffer);
+
+ // DEBUG: unfiltered stream
+ if (!_soundStream)
+ _soundStream = new StreamedSound();
+
+ _stream->seek(0);
+ _soundStream->load(_stream);
+#endif
+
+ _queued = true;
+}
+
+bool SoundEntry::isFinished() {
+ if (!_stream)
+ return true;
+
+ if (!_soundStream || !_queued)
+ return false;
+
+ // TODO check that all data has been queued
+ return _soundStream->isFinished();
+}
+
void SoundEntry::setType(SoundFlag flag) {
switch (flag & kFlagType9) {
default:
@@ -186,9 +236,9 @@ void SoundEntry::setType(SoundFlag flag) {
}
}
-void SoundEntry::setStatus(SoundFlag flag) {
+void SoundEntry::setupStatus(SoundFlag flag) {
SoundStatus statusFlag = (SoundStatus)flag;
- if (!((statusFlag & 0xFF) & kSoundStatusClear1))
+ if (!((statusFlag & 0xFF) & kSoundStatusFilterVariant))
statusFlag = (SoundStatus)(statusFlag | kSoundStatusClear2);
if (((statusFlag & 0xFF00) >> 8) & kSoundStatusClear0)
@@ -197,6 +247,18 @@ void SoundEntry::setStatus(SoundFlag flag) {
_status.status = (statusFlag | kSoundStatusClear4);
}
+void SoundEntry::setupCache() {
+ if (_soundBuffer)
+ return;
+
+ // Original has a priority-based shared buffer (of 6 entries)
+ // We simply allocate a new buffer for each sound entry that needs it
+ _soundBuffer = (byte *)malloc(SOUNDCACHE_ENTRY_SIZE);
+ memset(_soundBuffer, 0, SOUNDCACHE_ENTRY_SIZE);
+
+ setInCache();
+}
+
void SoundEntry::setInCache() {
_status.status |= kSoundStatusClear2;
}
@@ -211,7 +273,8 @@ void SoundEntry::loadSoundData(Common::String name) {
_stream = getArchive("DEFAULT.SND");
if (_stream) {
- warning("[Sound::loadSoundData] Not implemented");
+ _stream->read(_soundBuffer, MIN(SOUNDCACHE_ENTRY_SIZE, _stream->size()));
+ _currentDataPtr = _soundBuffer + 6;
} else {
_status.status = kSoundStatusRemoved;
}
@@ -225,7 +288,7 @@ void SoundEntry::update(uint val) {
if (val) {
if (getSoundQueue()->getFlag() & 32) {
- _field_40 = val;
+ _variant = val;
value2 = val * 2 + 1;
}
@@ -240,12 +303,12 @@ void SoundEntry::update(uint val) {
void SoundEntry::updateState() {
if (getSoundQueue()->getFlag() & 32) {
if (_type != kSoundType9 && _type != kSoundType7 && _type != kSoundType5) {
- uint32 newStatus = _status.status & kSoundStatusClear1;
+ uint32 variant = _status.status & kSoundStatusFilterVariant;
_status.status &= kSoundStatusClearAll;
- _field_40 = newStatus;
- _status.status |= newStatus * 2 + 1;
+ _variant = variant;
+ _status.status |= variant * 2 + 1;
}
}
@@ -260,6 +323,7 @@ void SoundEntry::reset() {
if (!_soundStream) {
SAFE_DELETE(_stream);
} else {
+ // the original stream will be disposed
_soundStream->stop();
SAFE_DELETE(_soundStream);
}
@@ -307,11 +371,364 @@ void SoundEntry::saveLoadWithSerializer(Common::Serializer &s) {
}
}
-void SoundEntry::loadStream() {
- if (!_soundStream)
- _soundStream = new StreamedSound();
+//////////////////////////////////////////////////////////////////////////
+// Sound filters
+//////////////////////////////////////////////////////////////////////////
+static const int filterData[1424] = {
+ 0, 0, 0, 0, 128, 256, 384, 512, 0, 0, 0, 0, 128, 256,
+ 384, 512, 0, 0, 0, 0, 192, 320, 448, 576, 0, 0, 0, 0,
+ 192, 320, 448, 576, 64, 64, 64, 64, 256, 384, 512, 640,
+ 64, 64, 64, 64, 256, 384, 512, 640, 128, 128, 128, 128,
+ 320, 448, 576, 704, 128, 128, 128, 128, 320, 448, 576,
+ 704, 192, 192, 192, 192, 384, 512, 640, 768, 192, 192,
+ 192, 192, 384, 512, 640, 768, 256, 256, 256, 256, 448,
+ 576, 704, 832, 256, 256, 256, 256, 448, 576, 704, 832,
+ 320, 320, 320, 320, 512, 640, 768, 896, 320, 320, 320,
+ 320, 512, 640, 768, 896, 384, 384, 384, 384, 576, 704,
+ 832, 960, 384, 384, 384, 384, 576, 704, 832, 960, 448,
+ 448, 448, 448, 640, 768, 896, 1024, 448, 448, 448, 448,
+ 640, 768, 896, 1024, 512, 512, 512, 512, 704, 832, 960,
+ 1088, 512, 512, 512, 512, 704, 832, 960, 1088, 576,
+ 576, 576, 576, 768, 896, 1024, 1152, 576, 576, 576,
+ 576, 768, 896, 1024, 1152, 640, 640, 640, 640, 832,
+ 960, 1088, 1216, 640, 640, 640, 640, 832, 960, 1088,
+ 1216, 704, 704, 704, 704, 896, 1024, 1152, 1280, 704,
+ 704, 704, 704, 896, 1024, 1152, 1280, 768, 768, 768,
+ 768, 960, 1088, 1216, 1344, 768, 768, 768, 768, 960,
+ 1088, 1216, 1344, 832, 832, 832, 832, 1024, 1152, 1280,
+ 1408, 832, 832, 832, 832, 1024, 1152, 1280, 1408, 896,
+ 896, 896, 896, 1088, 1216, 1344, 1472, 896, 896, 896,
+ 896, 1088, 1216, 1344, 1472, 960, 960, 960, 960, 1152,
+ 1280, 1408, 1536, 960, 960, 960, 960, 1152, 1280, 1408,
+ 1536, 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600,
+ 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600, 1088,
+ 1088, 1088, 1088, 1280, 1408, 1536, 1664, 1088, 1088,
+ 1088, 1088, 1280, 1408, 1536, 1664, 1152, 1152, 1152,
+ 1152, 1344, 1472, 1600, 1728, 1152, 1152, 1152, 1152,
+ 1344, 1472, 1600, 1728, 1216, 1216, 1216, 1216, 1408,
+ 1536, 1664, 1792, 1216, 1216, 1216, 1216, 1408, 1536,
+ 1664, 1792, 1280, 1280, 1280, 1280, 1472, 1600, 1728,
+ 1856, 1280, 1280, 1280, 1280, 1472, 1600, 1728, 1856,
+ 1344, 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1344,
+ 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1408, 1408,
+ 1408, 1408, 1600, 1728, 1856, 1984, 1408, 1408, 1408,
+ 1408, 1600, 1728, 1856, 1984, 1472, 1472, 1472, 1472,
+ 1664, 1792, 1920, 2048, 1472, 1472, 1472, 1472, 1664,
+ 1792, 1920, 2048, 1536, 1536, 1536, 1536, 1728, 1856,
+ 1984, 2112, 1536, 1536, 1536, 1536, 1728, 1856, 1984,
+ 2112, 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176,
+ 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176, 1664,
+ 1664, 1664, 1664, 1856, 1984, 2112, 2240, 1664, 1664,
+ 1664, 1664, 1856, 1984, 2112, 2240, 1728, 1728, 1728,
+ 1728, 1920, 2048, 2176, 2304, 1728, 1728, 1728, 1728,
+ 1920, 2048, 2176, 2304, 1792, 1792, 1792, 1792, 1984,
+ 2112, 2240, 2368, 1792, 1792, 1792, 1792, 1984, 2112,
+ 2240, 2368, 1856, 1856, 1856, 1856, 2048, 2176, 2304,
+ 2432, 1856, 1856, 1856, 1856, 2048, 2176, 2304, 2432,
+ 1920, 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1920,
+ 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1984, 1984,
+ 1984, 1984, 2176, 2304, 2432, 2560, 1984, 1984, 1984,
+ 1984, 2176, 2304, 2432, 2560, 2048, 2048, 2048, 2048,
+ 2240, 2368, 2496, 2624, 2048, 2048, 2048, 2048, 2240,
+ 2368, 2496, 2624, 2112, 2112, 2112, 2112, 2304, 2432,
+ 2560, 2688, 2112, 2112, 2112, 2112, 2304, 2432, 2560,
+ 2688, 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752,
+ 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752, 2240,
+ 2240, 2240, 2240, 2432, 2560, 2688, 2816, 2240, 2240,
+ 2240, 2240, 2432, 2560, 2688, 2816, 2304, 2304, 2304,
+ 2304, 2496, 2624, 2752, 2880, 2304, 2304, 2304, 2304,
+ 2496, 2624, 2752, 2880, 2368, 2368, 2368, 2368, 2560,
+ 2688, 2816, 2944, 2368, 2368, 2368, 2368, 2560, 2688,
+ 2816, 2944, 2432, 2432, 2432, 2432, 2624, 2752, 2880,
+ 3008, 2432, 2432, 2432, 2432, 2624, 2752, 2880, 3008,
+ 2496, 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2496,
+ 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2560, 2560,
+ 2560, 2560, 2752, 2880, 3008, 3136, 2560, 2560, 2560,
+ 2560, 2752, 2880, 3008, 3136, 2624, 2624, 2624, 2624,
+ 2816, 2944, 3072, 3200, 2624, 2624, 2624, 2624, 2816,
+ 2944, 3072, 3200, 2688, 2688, 2688, 2688, 2880, 3008,
+ 3136, 3264, 2688, 2688, 2688, 2688, 2880, 3008, 3136,
+ 3264, 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328,
+ 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328, 2816,
+ 2816, 2816, 2816, 3008, 3136, 3264, 3392, 2816, 2816,
+ 2816, 2816, 3008, 3136, 3264, 3392, 2880, 2880, 2880,
+ 2880, 3072, 3200, 3328, 3456, 2880, 2880, 2880, 2880,
+ 3072, 3200, 3328, 3456, 2944, 2944, 2944, 2944, 3136,
+ 3264, 3392, 3520, 2944, 2944, 2944, 2944, 3136, 3264,
+ 3392, 3520, 3008, 3008, 3008, 3008, 3200, 3328, 3456,
+ 3584, 3008, 3008, 3008, 3008, 3200, 3328, 3456, 3584,
+ 3072, 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3072,
+ 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3136, 3136,
+ 3136, 3136, 3328, 3456, 3584, 3712, 3136, 3136, 3136,
+ 3136, 3328, 3456, 3584, 3712, 3200, 3200, 3200, 3200,
+ 3392, 3520, 3648, 3776, 3200, 3200, 3200, 3200, 3392,
+ 3520, 3648, 3776, 3264, 3264, 3264, 3264, 3456, 3584,
+ 3712, 3840, 3264, 3264, 3264, 3264, 3456, 3584, 3712,
+ 3840, 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904,
+ 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904, 3392,
+ 3392, 3392, 3392, 3584, 3712, 3840, 3968, 3392, 3392,
+ 3392, 3392, 3584, 3712, 3840, 3968, 3456, 3456, 3456,
+ 3456, 3648, 3776, 3904, 4032, 3456, 3456, 3456, 3456,
+ 3648, 3776, 3904, 4032, 3520, 3520, 3520, 3520, 3712,
+ 3840, 3968, 4096, 3520, 3520, 3520, 3520, 3712, 3840,
+ 3968, 4096, 3584, 3584, 3584, 3584, 3776, 3904, 4032,
+ 4160, 3584, 3584, 3584, 3584, 3776, 3904, 4032, 4160,
+ 3648, 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3648,
+ 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3712, 3712,
+ 3712, 3712, 3904, 4032, 4160, 4288, 3712, 3712, 3712,
+ 3712, 3904, 4032, 4160, 4288, 3776, 3776, 3776, 3776,
+ 3968, 4096, 4224, 4352, 3776, 3776, 3776, 3776, 3968,
+ 4096, 4224, 4352, 3840, 3840, 3840, 3840, 4032, 4160,
+ 4288, 4416, 3840, 3840, 3840, 3840, 4032, 4160, 4288,
+ 4416, 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480,
+ 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480, 3968,
+ 3968, 3968, 3968, 4160, 4288, 4416, 4544, 3968, 3968,
+ 3968, 3968, 4160, 4288, 4416, 4544, 4032, 4032, 4032,
+ 4032, 4224, 4352, 4480, 4608, 4032, 4032, 4032, 4032,
+ 4224, 4352, 4480, 4608, 4096, 4096, 4096, 4096, 4288,
+ 4416, 4544, 4672, 4096, 4096, 4096, 4096, 4288, 4416,
+ 4544, 4672, 4160, 4160, 4160, 4160, 4352, 4480, 4608,
+ 4736, 4160, 4160, 4160, 4160, 4352, 4480, 4608, 4736,
+ 4224, 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4224,
+ 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4288, 4288,
+ 4288, 4288, 4480, 4608, 4736, 4864, 4288, 4288, 4288,
+ 4288, 4480, 4608, 4736, 4864, 4352, 4352, 4352, 4352,
+ 4544, 4672, 4800, 4928, 4352, 4352, 4352, 4352, 4544,
+ 4672, 4800, 4928, 4416, 4416, 4416, 4416, 4608, 4736,
+ 4864, 4992, 4416, 4416, 4416, 4416, 4608, 4736, 4864,
+ 4992, 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056,
+ 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056, 4544,
+ 4544, 4544, 4544, 4736, 4864, 4992, 5120, 4544, 4544,
+ 4544, 4544, 4736, 4864, 4992, 5120, 4608, 4608, 4608,
+ 4608, 4800, 4928, 5056, 5184, 4608, 4608, 4608, 4608,
+ 4800, 4928, 5056, 5184, 4672, 4672, 4672, 4672, 4864,
+ 4992, 5120, 5248, 4672, 4672, 4672, 4672, 4864, 4992,
+ 5120, 5248, 4736, 4736, 4736, 4736, 4928, 5056, 5184,
+ 5312, 4736, 4736, 4736, 4736, 4928, 5056, 5184, 5312,
+ 4800, 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4800,
+ 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4864, 4864,
+ 4864, 4864, 5056, 5184, 5312, 5440, 4864, 4864, 4864,
+ 4864, 5056, 5184, 5312, 5440, 4928, 4928, 4928, 4928,
+ 5120, 5248, 5376, 5504, 4928, 4928, 4928, 4928, 5120,
+ 5248, 5376, 5504, 4992, 4992, 4992, 4992, 5184, 5312,
+ 5440, 5568, 4992, 4992, 4992, 4992, 5184, 5312, 5440,
+ 5568, 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632,
+ 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632, 5120,
+ 5120, 5120, 5120, 5312, 5440, 5568, 5632, 5120, 5120,
+ 5120, 5120, 5312, 5440, 5568, 5632, 5184, 5184, 5184,
+ 5184, 5376, 5504, 5632, 5632, 5184, 5184, 5184, 5184,
+ 5376, 5504, 5632, 5632, 5248, 5248, 5248, 5248, 5440,
+ 5568, 5632, 5632, 5248, 5248, 5248, 5248, 5440, 5568,
+ 5632, 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632,
+ 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632, 5632,
+ 5376, 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5376,
+ 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5440, 5440,
+ 5440, 5440, 5632, 5632, 5632, 5632, 5440, 5440, 5440,
+ 5440, 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504,
+ 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504, 5632,
+ 5632, 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632,
+ 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632, 5632,
+ 5632
+};
+
+static const int filterData2[1424] = {
+ 0, 2, 4, 6, 7, 9, 11, 13, 0, -2, -4, -6, -7, -9, -11,
+ -13, 1, 3, 5, 7, 9, 11, 13, 15, -1, -3, -5, -7, -9,
+ -11, -13, -15, 1, 3, 5, 7, 10, 12, 14, 16, -1, -3, -5,
+ -7, -10, -12, -14, -16, 1, 3, 6, 8, 11, 13, 16, 18,
+ -1, -3, -6, -8, -11, -13, -16, -18, 1, 4, 6, 9, 12,
+ 15, 17, 20, -1, -4, -6, -9, -12, -15, -17, -20, 1, 4,
+ 7, 10, 13, 16, 19, 22, -1, -4, -7, -10, -13, -16, -19,
+ -22, 1, 4, 8, 11, 14, 17, 21, 24, -1, -4, -8, -11, -14,
+ -17, -21, -24, 1, 5, 8, 12, 15, 19, 22, 26, -1, -5,
+ -8, -12, -15, -19, -22, -26, 2, 6, 10, 14, 18, 22, 26,
+ 30, -2, -6, -10, -14, -18, -22, -26, -30, 2, 6, 10,
+ 14, 19, 23, 27, 31, -2, -6, -10, -14, -19, -23, -27,
+ -31, 2, 7, 11, 16, 21, 26, 30, 35, -2, -7, -11, -16,
+ -21, -26, -30, -35, 2, 7, 13, 18, 23, 28, 34, 39, -2,
+ -7, -13, -18, -23, -28, -34, -39, 2, 8, 14, 20, 25,
+ 31, 37, 43, -2, -8, -14, -20, -25, -31, -37, -43, 3,
+ 9, 15, 21, 28, 34, 40, 46, -3, -9, -15, -21, -28, -34,
+ -40, -46, 3, 10, 17, 24, 31, 38, 45, 52, -3, -10, -17,
+ -24, -31, -38, -45, -52, 3, 11, 19, 27, 34, 42, 50,
+ 58, -3, -11, -19, -27, -34, -42, -50, -58, 4, 12, 21,
+ 29, 38, 46, 55, 63, -4, -12, -21, -29, -38, -46, -55,
+ -63, 4, 13, 23, 32, 41, 50, 60, 69, -4, -13, -23, -32,
+ -41, -50, -60, -69, 5, 15, 25, 35, 46, 56, 66, 76, -5,
+ -15, -25, -35, -46, -56, -66, -76, 5, 16, 28, 39, 50,
+ 61, 73, 84, -5, -16, -28, -39, -50, -61, -73, -84, 6,
+ 18, 31, 43, 56, 68, 81, 93, -6, -18, -31, -43, -56,
+ -68, -81, -93, 6, 20, 34, 48, 61, 75, 89, 103, -6, -20,
+ -34, -48, -61, -75, -89, -103, 7, 22, 37, 52, 67, 82,
+ 97, 112, -7, -22, -37, -52, -67, -82, -97, -112, 8,
+ 24, 41, 57, 74, 90, 107, 123, -8, -24, -41, -57, -74,
+ -90, -107, -123, 9, 27, 45, 63, 82, 100, 118, 136, -9,
+ -27, -45, -63, -82, -100, -118, -136, 10, 30, 50, 70,
+ 90, 110, 130, 150, -10, -30, -50, -70, -90, -110, -130,
+ -150, 11, 33, 55, 77, 99, 121, 143, 165, -11, -33, -55,
+ -77, -99, -121, -143, -165, 12, 36, 60, 84, 109, 133,
+ 157, 181, -12, -36, -60, -84, -109, -133, -157, -181,
+ 13, 40, 66, 93, 120, 147, 173, 200, -13, -40, -66, -93,
+ -120, -147, -173, -200, 14, 44, 73, 103, 132, 162, 191,
+ 221, -14, -44, -73, -103, -132, -162, -191, -221, 16,
+ 48, 81, 113, 146, 178, 211, 243, -16, -48, -81, -113,
+ -146, -178, -211, -243, 17, 53, 89, 125, 160, 196, 232,
+ 268, -17, -53, -89, -125, -160, -196, -232, -268, 19,
+ 58, 98, 137, 176, 215, 255, 294, -19, -58, -98, -137,
+ -176, -215, -255, -294, 21, 64, 108, 151, 194, 237,
+ 281, 324, -21, -64, -108, -151, -194, -237, -281, -324,
+ 23, 71, 118, 166, 213, 261, 308, 356, -23, -71, -118,
+ -166, -213, -261, -308, -356, 26, 78, 130, 182, 235,
+ 287, 339, 391, -26, -78, -130, -182, -235, -287, -339,
+ -391, 28, 86, 143, 201, 258, 316, 373, 431, -28, -86,
+ -143, -201, -258, -316, -373, -431, 31, 94, 158, 221,
+ 284, 347, 411, 474, -31, -94, -158, -221, -284, -347,
+ -411, -474, 34, 104, 174, 244, 313, 383, 453, 523, -34,
+ -104, -174, -244, -313, -383, -453, -523, 38, 115, 191,
+ 268, 345, 422, 498, 575, -38, -115, -191, -268, -345,
+ -422, -498, -575, 42, 126, 210, 294, 379, 463, 547,
+ 631, -42, -126, -210, -294, -379, -463, -547, -631,
+ 46, 139, 231, 324, 417, 510, 602, 695, -46, -139, -231,
+ -324, -417, -510, -602, -695, 51, 153, 255, 357, 459,
+ 561, 663, 765, -51, -153, -255, -357, -459, -561, -663,
+ -765, 56, 168, 280, 392, 505, 617, 729, 841, -56, -168,
+ -280, -392, -505, -617, -729, -841, 61, 185, 308, 432,
+ 555, 679, 802, 926, -61, -185, -308, -432, -555, -679,
+ -802, -926, 68, 204, 340, 476, 612, 748, 884, 1020,
+ -68, -204, -340, -476, -612, -748, -884, -1020, 74,
+ 224, 373, 523, 672, 822, 971, 1121, -74, -224, -373,
+ -523, -672, -822, -971, -1121, 82, 246, 411, 575, 740,
+ 904, 1069, 1233, -82, -246, -411, -575, -740, -904,
+ -1069, -1233, 90, 271, 452, 633, 814, 995, 1176, 1357,
+ -90, -271, -452, -633, -814, -995, -1176, -1357, 99,
+ 298, 497, 696, 895, 1094, 1293, 1492, -99, -298, -497,
+ -696, -895, -1094, -1293, -1492, 109, 328, 547, 766,
+ 985, 1204, 1423, 1642, -109, -328, -547, -766, -985,
+ -1204, -1423, -1642, 120, 361, 601, 842, 1083, 1324,
+ 1564, 1805, -120, -361, -601, -842, -1083, -1324, -1564,
+ -1805, 132, 397, 662, 927, 1192, 1457, 1722, 1987, -132,
+ -397, -662, -927, -1192, -1457, -1722, -1987, 145, 437,
+ 728, 1020, 1311, 1603, 1894, 2186, -145, -437, -728,
+ -1020, -1311, -1603, -1894, -2186, 160, 480, 801, 1121,
+ 1442, 1762, 2083, 2403, -160, -480, -801, -1121, -1442,
+ -1762, -2083, -2403, 176, 529, 881, 1234, 1587, 1940,
+ 2292, 2645, -176, -529, -881, -1234, -1587, -1940, -2292,
+ -2645, 194, 582, 970, 1358, 1746, 2134, 2522, 2910,
+ -194, -582, -970, -1358, -1746, -2134, -2522, -2910,
+ 213, 640, 1066, 1493, 1920, 2347, 2773, 3200, -213,
+ -640, -1066, -1493, -1920, -2347, -2773, -3200, 234,
+ 704, 1173, 1643, 2112, 2582, 3051, 3521, -234, -704,
+ -1173, -1643, -2112, -2582, -3051, -3521, 258, 774,
+ 1291, 1807, 2324, 2840, 3357, 3873, -258, -774, -1291,
+ -1807, -2324, -2840, -3357, -3873, 284, 852, 1420, 1988,
+ 2556, 3124, 3692, 4260, -284, -852, -1420, -1988, -2556,
+ -3124, -3692, -4260, 312, 937, 1561, 2186, 2811, 3436,
+ 4060, 4685, -312, -937, -1561, -2186, -2811, -3436,
+ -4060, -4685, 343, 1030, 1718, 2405, 3092, 3779, 4467,
+ 5154, -343, -1030, -1718, -2405, -3092, -3779, -4467,
+ -5154, 378, 1134, 1890, 2646, 3402, 4158, 4914, 5670,
+ -378, -1134, -1890, -2646, -3402, -4158, -4914, -5670,
+ 415, 1247, 2079, 2911, 3742, 4574, 5406, 6238, -415,
+ -1247, -2079, -2911, -3742, -4574, -5406, -6238, 457,
+ 1372, 2287, 3202, 4117, 5032, 5947, 6862, -457, -1372,
+ -2287, -3202, -4117, -5032, -5947, -6862, 503, 1509,
+ 2516, 3522, 4529, 5535, 6542, 7548, -503, -1509, -2516,
+ -3522, -4529, -5535, -6542, -7548, 553, 1660, 2767,
+ 3874, 4981, 6088, 7195, 8302, -553, -1660, -2767, -3874,
+ -4981, -6088, -7195, -8302, 608, 1826, 3044, 4262, 5479,
+ 6697, 7915, 9133, -608, -1826, -3044, -4262, -5479,
+ -6697, -7915, -9133, 669, 2009, 3348, 4688, 6027, 7367,
+ 8706, 10046, -669, -2009, -3348, -4688, -6027, -7367,
+ -8706, -10046, 736, 2210, 3683, 5157, 6630, 8104, 9577,
+ 11051, -736, -2210, -3683, -5157, -6630, -8104, -9577,
+ -11051, 810, 2431, 4052, 5673, 7294, 8915, 10536, 12157,
+ -810, -2431, -4052, -5673, -7294, -8915, -10536, -12157,
+ 891, 2674, 4457, 6240, 8023, 9806, 11589, 13372, -891,
+ -2674, -4457, -6240, -8023, -9806, -11589, -13372, 980,
+ 2941, 4903, 6864, 8825, 10786, 12748, 14709, -980, -2941,
+ -4903, -6864, -8825, -10786, -12748, -14709, 1078, 3236,
+ 5393, 7551, 9708, 11866, 14023, 16181, -1078, -3236,
+ -5393, -7551, -9708, -11866, -14023, -16181, 1186, 3559,
+ 5933, 8306, 10679, 13052, 15426, 17799, -1186, -3559,
+ -5933, -8306, -10679, -13052, -15426, -17799, 1305,
+ 3915, 6526, 9136, 11747, 14357, 16968, 19578, -1305,
+ -3915, -6526, -9136, -11747, -14357, -16968, -19578,
+ 1435, 4307, 7179, 10051, 12922, 15794, 18666, 21538,
+ -1435, -4307, -7179, -10051, -12922, -15794, -18666,
+ -21538, 1579, 4738, 7896, 11055, 14214, 17373, 20531,
+ 23690, -1579, -4738, -7896, -11055, -14214, -17373,
+ -20531, -23690, 1737, 5212, 8686, 12161, 15636, 19111,
+ 22585, 26060, -1737, -5212, -8686, -12161, -15636, -19111,
+ -22585, -26060, 1911, 5733, 9555, 13377, 17200, 21022,
+ 24844, 28666, -1911, -5733, -9555, -13377, -17200, -21022,
+ -24844, -28666, 2102, 6306, 10511, 14715, 18920, 23124,
+ 27329, 31533, -2102, -6306, -10511, -14715, -18920,
+ -23124, -27329, -31533, 2312, 6937, 11562, 16187, 20812,
+ 25437, 30062, 32767, -2312, -6937, -11562, -16187, -20812,
+ -25437, -30062, -32767, 2543, 7631, 12718, 17806, 22893,
+ 27981, 32767, 32767, -2543, -7631, -12718, -17806, -22893,
+ -27981, -32767, -32767, 2798, 8394, 13990, 19586, 25183,
+ 30779, 32767, 32767, -2798, -8394, -13990, -19586, -25183,
+ -30779, -32767, -32767, 3077, 9233, 15389, 21545, 27700,
+ 32767, 32767, 32767, -3077, -9233, -15389, -21545, -27700,
+ -32767, -32767, -32767, 3385, 10157, 16928, 23700, 30471,
+ 32767, 32767, 32767, -3385, -10157, -16928, -23700,
+ -30471, -32767, -32767, -32767, 3724, 11172, 18621,
+ 26069, 32767, 32767, 32767, 32767, -3724, -11172, -18621,
+ -26069, -32767, -32767, -32767, -32767, 4095, 12287,
+ 20479, 28671, 32767, 32767, 32767, 32767, -4095, -12287,
+ -20479, -28671, -32767, -32767, -32767, -32767
+};
+
+static const int p1s[17] = { 0, 4, 3, 4, 2, 4, 3, 4, 1, 4, 3, 4, 2, 4, 3, 4, 0 };
+static const int p2s[17] = { 0, 1, 1, 3, 1, 5, 3, 7, 1, 9, 5, 11, 3, 13, 7, 15, 1 };
+
+static void soundFilter(byte *data, int16 *buffer, int p1, int p2);
+
+void SoundEntry::applyFilter(int16 *buffer) {
+ if ((READ_UINT16((int16 *)(_currentDataPtr + 2)) << 6) > 5632) {
+ _status.status |= kSoundStatus_20000000;
+ } else {
+ int variant = _status.status & kSoundStatusFilterVariant;
- _soundStream->load(_stream);
+ soundFilter(_currentDataPtr, buffer, p1s[variant], p2s[variant]);
+ _currentDataPtr += 739;
+ }
+}
+
+static void soundFilter(byte *data, int16 *buffer, int p1, int p2) {
+ int data1, data2, data1p, data2p;
+ byte idx;
+
+ data2 = data[0];
+ data1 = data[1] << 6;
+
+ data += 2;
+
+ for (int count = 0; count < 735; count++) {
+ idx = data[count] >> 4;
+
+ if ((idx + data1) > ARRAYSIZE(filterData)) {
+ warning("Error in sound filter, aborting...");
+ return;
+ }
+
+ data1p = filterData[idx + data1];
+ data2p = CLIP(filterData2[idx + data1] + data2, -32767, 32767);
+
+ buffer[2 * count] = (p2 * data2p) >> p1;
+
+ idx = data[count] & 0xF;
+
+ if ((idx + data1p) > ARRAYSIZE(filterData)) {
+ warning("Error in sound filter, aborting...");
+ return;
+ }
+
+ data1 = filterData[idx + data1p];
+ data2 = CLIP(filterData2[idx + data1p] + data2p, -32767, 32767);
+ buffer[2 * count + 1] = (p2 * data2) >> p1;
+ }
}
//////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/sound/entry.h b/engines/lastexpress/sound/entry.h
index 60795332f8..a466d31b3a 100644
--- a/engines/lastexpress/sound/entry.h
+++ b/engines/lastexpress/sound/entry.h
@@ -76,27 +76,6 @@ namespace LastExpress {
class LastExpressEngine;
class SubtitleEntry;
-enum SoundStatus {
- kSoundStatus_20 = 0x20,
- kSoundStatus_40 = 0x40,
- kSoundStatus_180 = 0x180,
- kSoundStatusRemoved = 0x200,
- kSoundStatus_400 = 0x400,
-
- kSoundStatus_8000 = 0x8000,
- kSoundStatus_20000 = 0x20000,
- kSoundStatus_100000 = 0x100000,
- kSoundStatus_20000000 = 0x20000000,
- kSoundStatus_40000000 = 0x40000000,
-
- kSoundStatusClear0 = 0x10,
- kSoundStatusClear1 = 0x1F,
- kSoundStatusClear2 = 0x80,
- kSoundStatusClear3 = 0x200,
- kSoundStatusClear4 = 0x800,
- kSoundStatusClearAll = 0xFFFFFFE0
-};
-
union SoundStatusUnion {
uint32 status;
byte status1;
@@ -119,16 +98,11 @@ public:
void open(Common::String name, SoundFlag flag, int priority);
void close();
-
- void setStatus(SoundFlag flag);
- void setType(SoundFlag flag);
- void setInCache();
- void loadSoundData(Common::String name);
+ void play();
+ void reset();
+ bool isFinished();
void update(uint val);
void updateState();
- void reset();
-
- void loadStream();
// Subtitles
void showSubtitle(Common::String filename);
@@ -150,12 +124,8 @@ public:
Common::String getName2() { return _name2; }
// Streams
- Common::SeekableReadStream *getStream() { return _stream; }
- StreamedSound *getStreamedSound() { return _soundStream; }
-
-public:
- // TODO replace by on-the-fly allocated buffer
- void *_soundData;
+ SimpleSound *getSoundStream() { return _soundStream; }
+ byte *getSoundBuffer() { return _soundBuffer; }
private:
LastExpressEngine *_engine;
@@ -164,18 +134,18 @@ private:
SoundType _type; // int
//int _data;
//int _endOffset;
- int _currentDataPtr;
+ byte * _currentDataPtr;
//int _currentBufferPtr;
int _blockCount;
uint32 _time;
//int _size;
//int _field_28;
- Common::SeekableReadStream *_stream; // int
+ Common::SeekableReadStream *_stream; // The file stream
//int _field_30;
int _field_34;
int _field_38;
int _field_3C;
- int _field_40;
+ int _variant;
EntityIndex _entity;
int _field_48;
uint32 _priority;
@@ -184,8 +154,18 @@ private:
// original has pointer to the next structure in the list (not used)
SubtitleEntry *_subtitle;
- // Sound stream
- StreamedSound *_soundStream;
+ // Sound buffer & stream
+ bool _queued;
+ byte *_soundBuffer;
+ StreamedSound *_soundStream; // the filtered sound stream
+
+ void setType(SoundFlag flag);
+ void setupStatus(SoundFlag flag);
+ void setupCache();
+ void setInCache();
+ void loadSoundData(Common::String name);
+
+ void applyFilter(int16 *buffer);
};
//////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp
index cbd942f082..ad5c9bf4e3 100644
--- a/engines/lastexpress/sound/queue.cpp
+++ b/engines/lastexpress/sound/queue.cpp
@@ -32,18 +32,11 @@
namespace LastExpress {
-#define SOUNDCACHE_ENTRY_SIZE 92160
-#define SOUNDCACHE_MAX_SIZE 6
-
SoundQueue::SoundQueue(LastExpressEngine *engine) : _engine(engine) {
_state = 0;
_currentType = kSoundType16;
_flag = 0;
- // Cache and filter buffers
- memset(&_buffer, 0, sizeof(_buffer));
- _soundCacheData = malloc(6 * SOUNDCACHE_ENTRY_SIZE);
-
_subtitlesFlag = 0;
_currentSubtitle = NULL;
}
@@ -53,17 +46,12 @@ SoundQueue::~SoundQueue() {
SAFE_DELETE(*i);
_soundList.clear();
- // Entries in the cache are just pointers to sound list entries
- _soundCache.clear();
-
for (Common::List<SubtitleEntry *>::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i)
SAFE_DELETE(*i);
_subtitles.clear();
_currentSubtitle = NULL;
- free(_soundCacheData);
-
// Zero passed pointers
_engine = NULL;
}
@@ -76,14 +64,17 @@ void SoundQueue::handleTimer() {
for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) {
SoundEntry *entry = (*i);
- if (entry->getStream() == NULL) {
- SAFE_DELETE(*i);
+
+ // When the entry has stopped playing, we remove his buffer
+ if (entry->isFinished()) {
+ entry->close();
+ SAFE_DELETE(entry);
i = _soundList.reverse_erase(i);
continue;
- } else if (!entry->getStreamedSound()) {
- // TODO: stream any sound in the queue after filtering
- entry->loadStream();
}
+
+ // Queue the entry data, applying filtering
+ entry->play();
}
}
@@ -111,9 +102,9 @@ void SoundQueue::removeFromQueue(Common::String filename) {
}
void SoundQueue::updateQueue() {
- Common::StackLock locker(_mutex);
+ //Common::StackLock locker(_mutex);
- warning("[Sound::updateQueue] Not implemented");
+ //warning("[Sound::updateQueue] Not implemented");
}
void SoundQueue::resetQueue() {
@@ -301,11 +292,11 @@ void SoundQueue::updateSubtitles() {
if (!(status & kSoundStatus_40)
|| status & kSoundStatus_180
|| soundEntry->getTime() == 0
- || (status & kSoundStatusClear1) < 6
+ || (status & kSoundStatusFilterVariant) < 6
|| ((getFlags()->nis & 0x8000) && soundEntry->getPriority() < 90)) {
current_index = 0;
} else {
- current_index = soundEntry->getPriority() + (status & kSoundStatusClear1);
+ current_index = soundEntry->getPriority() + (status & kSoundStatusFilterVariant);
if (_currentSubtitle == (*i))
current_index += 4;
@@ -334,66 +325,6 @@ void SoundQueue::updateSubtitles() {
}
//////////////////////////////////////////////////////////////////////////
-// Cache
-//////////////////////////////////////////////////////////////////////////
-bool SoundQueue::setupCache(SoundEntry *entry) {
- if (entry->_soundData)
- return true;
-
- if (_soundCache.size() >= SOUNDCACHE_MAX_SIZE) {
-
- SoundEntry *cacheEntry = NULL;
- uint32 size = 1000;
-
- for (Common::List<SoundEntry *>::iterator i = _soundCache.begin(); i != _soundCache.end(); ++i) {
- if (!((*i)->getStatus().status & kSoundStatus_180)) {
- uint32 newSize = (*i)->getPriority() + ((*i)->getStatus().status & kSoundStatusClear1);
-
- if (newSize < size) {
- cacheEntry = (*i);
- size = newSize;
- }
- }
- }
-
- if (entry->getPriority() <= size)
- return false;
-
- if (!cacheEntry)
- error("[SoundManager::setupCache] Cannot find a valid entry");
-
- cacheEntry->setInCache();
-
- // TODO: Wait until the cache entry is ready to be removed
- while (!(cacheEntry->getStatus().status1 & 1))
- ;
-
- if (cacheEntry->_soundData)
- removeFromCache(cacheEntry);
-
- _soundCache.push_back(entry);
- entry->_soundData = (char *)_soundCacheData + SOUNDCACHE_ENTRY_SIZE * (_soundCache.size() - 1);
- } else {
- _soundCache.push_back(entry);
- entry->_soundData = (char *)_soundCacheData + SOUNDCACHE_ENTRY_SIZE * (_soundCache.size() - 1);
- }
-
- return true;
-}
-
-void SoundQueue::removeFromCache(SoundEntry *entry) {
- for (Common::List<SoundEntry *>::iterator i = _soundCache.begin(); i != _soundCache.end(); ++i) {
- if ((*i) == entry) {
- // Remove sound buffer
- entry->_soundData = NULL;
-
- // Remove entry from sound cache
- i = _soundCache.reverse_erase(i);
- }
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
// Savegame
//////////////////////////////////////////////////////////////////////////
void SoundQueue::saveLoadWithSerializer(Common::Serializer &s) {
@@ -432,362 +363,13 @@ uint32 SoundQueue::count() {
}
//////////////////////////////////////////////////////////////////////////
-// Sound filters
-//////////////////////////////////////////////////////////////////////////
-static const int filterData[1424] = {
- 0, 0, 0, 0, 128, 256, 384, 512, 0, 0, 0, 0, 128, 256,
- 384, 512, 0, 0, 0, 0, 192, 320, 448, 576, 0, 0, 0, 0,
- 192, 320, 448, 576, 64, 64, 64, 64, 256, 384, 512, 640,
- 64, 64, 64, 64, 256, 384, 512, 640, 128, 128, 128, 128,
- 320, 448, 576, 704, 128, 128, 128, 128, 320, 448, 576,
- 704, 192, 192, 192, 192, 384, 512, 640, 768, 192, 192,
- 192, 192, 384, 512, 640, 768, 256, 256, 256, 256, 448,
- 576, 704, 832, 256, 256, 256, 256, 448, 576, 704, 832,
- 320, 320, 320, 320, 512, 640, 768, 896, 320, 320, 320,
- 320, 512, 640, 768, 896, 384, 384, 384, 384, 576, 704,
- 832, 960, 384, 384, 384, 384, 576, 704, 832, 960, 448,
- 448, 448, 448, 640, 768, 896, 1024, 448, 448, 448, 448,
- 640, 768, 896, 1024, 512, 512, 512, 512, 704, 832, 960,
- 1088, 512, 512, 512, 512, 704, 832, 960, 1088, 576,
- 576, 576, 576, 768, 896, 1024, 1152, 576, 576, 576,
- 576, 768, 896, 1024, 1152, 640, 640, 640, 640, 832,
- 960, 1088, 1216, 640, 640, 640, 640, 832, 960, 1088,
- 1216, 704, 704, 704, 704, 896, 1024, 1152, 1280, 704,
- 704, 704, 704, 896, 1024, 1152, 1280, 768, 768, 768,
- 768, 960, 1088, 1216, 1344, 768, 768, 768, 768, 960,
- 1088, 1216, 1344, 832, 832, 832, 832, 1024, 1152, 1280,
- 1408, 832, 832, 832, 832, 1024, 1152, 1280, 1408, 896,
- 896, 896, 896, 1088, 1216, 1344, 1472, 896, 896, 896,
- 896, 1088, 1216, 1344, 1472, 960, 960, 960, 960, 1152,
- 1280, 1408, 1536, 960, 960, 960, 960, 1152, 1280, 1408,
- 1536, 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600,
- 1024, 1024, 1024, 1024, 1216, 1344, 1472, 1600, 1088,
- 1088, 1088, 1088, 1280, 1408, 1536, 1664, 1088, 1088,
- 1088, 1088, 1280, 1408, 1536, 1664, 1152, 1152, 1152,
- 1152, 1344, 1472, 1600, 1728, 1152, 1152, 1152, 1152,
- 1344, 1472, 1600, 1728, 1216, 1216, 1216, 1216, 1408,
- 1536, 1664, 1792, 1216, 1216, 1216, 1216, 1408, 1536,
- 1664, 1792, 1280, 1280, 1280, 1280, 1472, 1600, 1728,
- 1856, 1280, 1280, 1280, 1280, 1472, 1600, 1728, 1856,
- 1344, 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1344,
- 1344, 1344, 1344, 1536, 1664, 1792, 1920, 1408, 1408,
- 1408, 1408, 1600, 1728, 1856, 1984, 1408, 1408, 1408,
- 1408, 1600, 1728, 1856, 1984, 1472, 1472, 1472, 1472,
- 1664, 1792, 1920, 2048, 1472, 1472, 1472, 1472, 1664,
- 1792, 1920, 2048, 1536, 1536, 1536, 1536, 1728, 1856,
- 1984, 2112, 1536, 1536, 1536, 1536, 1728, 1856, 1984,
- 2112, 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176,
- 1600, 1600, 1600, 1600, 1792, 1920, 2048, 2176, 1664,
- 1664, 1664, 1664, 1856, 1984, 2112, 2240, 1664, 1664,
- 1664, 1664, 1856, 1984, 2112, 2240, 1728, 1728, 1728,
- 1728, 1920, 2048, 2176, 2304, 1728, 1728, 1728, 1728,
- 1920, 2048, 2176, 2304, 1792, 1792, 1792, 1792, 1984,
- 2112, 2240, 2368, 1792, 1792, 1792, 1792, 1984, 2112,
- 2240, 2368, 1856, 1856, 1856, 1856, 2048, 2176, 2304,
- 2432, 1856, 1856, 1856, 1856, 2048, 2176, 2304, 2432,
- 1920, 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1920,
- 1920, 1920, 1920, 2112, 2240, 2368, 2496, 1984, 1984,
- 1984, 1984, 2176, 2304, 2432, 2560, 1984, 1984, 1984,
- 1984, 2176, 2304, 2432, 2560, 2048, 2048, 2048, 2048,
- 2240, 2368, 2496, 2624, 2048, 2048, 2048, 2048, 2240,
- 2368, 2496, 2624, 2112, 2112, 2112, 2112, 2304, 2432,
- 2560, 2688, 2112, 2112, 2112, 2112, 2304, 2432, 2560,
- 2688, 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752,
- 2176, 2176, 2176, 2176, 2368, 2496, 2624, 2752, 2240,
- 2240, 2240, 2240, 2432, 2560, 2688, 2816, 2240, 2240,
- 2240, 2240, 2432, 2560, 2688, 2816, 2304, 2304, 2304,
- 2304, 2496, 2624, 2752, 2880, 2304, 2304, 2304, 2304,
- 2496, 2624, 2752, 2880, 2368, 2368, 2368, 2368, 2560,
- 2688, 2816, 2944, 2368, 2368, 2368, 2368, 2560, 2688,
- 2816, 2944, 2432, 2432, 2432, 2432, 2624, 2752, 2880,
- 3008, 2432, 2432, 2432, 2432, 2624, 2752, 2880, 3008,
- 2496, 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2496,
- 2496, 2496, 2496, 2688, 2816, 2944, 3072, 2560, 2560,
- 2560, 2560, 2752, 2880, 3008, 3136, 2560, 2560, 2560,
- 2560, 2752, 2880, 3008, 3136, 2624, 2624, 2624, 2624,
- 2816, 2944, 3072, 3200, 2624, 2624, 2624, 2624, 2816,
- 2944, 3072, 3200, 2688, 2688, 2688, 2688, 2880, 3008,
- 3136, 3264, 2688, 2688, 2688, 2688, 2880, 3008, 3136,
- 3264, 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328,
- 2752, 2752, 2752, 2752, 2944, 3072, 3200, 3328, 2816,
- 2816, 2816, 2816, 3008, 3136, 3264, 3392, 2816, 2816,
- 2816, 2816, 3008, 3136, 3264, 3392, 2880, 2880, 2880,
- 2880, 3072, 3200, 3328, 3456, 2880, 2880, 2880, 2880,
- 3072, 3200, 3328, 3456, 2944, 2944, 2944, 2944, 3136,
- 3264, 3392, 3520, 2944, 2944, 2944, 2944, 3136, 3264,
- 3392, 3520, 3008, 3008, 3008, 3008, 3200, 3328, 3456,
- 3584, 3008, 3008, 3008, 3008, 3200, 3328, 3456, 3584,
- 3072, 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3072,
- 3072, 3072, 3072, 3264, 3392, 3520, 3648, 3136, 3136,
- 3136, 3136, 3328, 3456, 3584, 3712, 3136, 3136, 3136,
- 3136, 3328, 3456, 3584, 3712, 3200, 3200, 3200, 3200,
- 3392, 3520, 3648, 3776, 3200, 3200, 3200, 3200, 3392,
- 3520, 3648, 3776, 3264, 3264, 3264, 3264, 3456, 3584,
- 3712, 3840, 3264, 3264, 3264, 3264, 3456, 3584, 3712,
- 3840, 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904,
- 3328, 3328, 3328, 3328, 3520, 3648, 3776, 3904, 3392,
- 3392, 3392, 3392, 3584, 3712, 3840, 3968, 3392, 3392,
- 3392, 3392, 3584, 3712, 3840, 3968, 3456, 3456, 3456,
- 3456, 3648, 3776, 3904, 4032, 3456, 3456, 3456, 3456,
- 3648, 3776, 3904, 4032, 3520, 3520, 3520, 3520, 3712,
- 3840, 3968, 4096, 3520, 3520, 3520, 3520, 3712, 3840,
- 3968, 4096, 3584, 3584, 3584, 3584, 3776, 3904, 4032,
- 4160, 3584, 3584, 3584, 3584, 3776, 3904, 4032, 4160,
- 3648, 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3648,
- 3648, 3648, 3648, 3840, 3968, 4096, 4224, 3712, 3712,
- 3712, 3712, 3904, 4032, 4160, 4288, 3712, 3712, 3712,
- 3712, 3904, 4032, 4160, 4288, 3776, 3776, 3776, 3776,
- 3968, 4096, 4224, 4352, 3776, 3776, 3776, 3776, 3968,
- 4096, 4224, 4352, 3840, 3840, 3840, 3840, 4032, 4160,
- 4288, 4416, 3840, 3840, 3840, 3840, 4032, 4160, 4288,
- 4416, 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480,
- 3904, 3904, 3904, 3904, 4096, 4224, 4352, 4480, 3968,
- 3968, 3968, 3968, 4160, 4288, 4416, 4544, 3968, 3968,
- 3968, 3968, 4160, 4288, 4416, 4544, 4032, 4032, 4032,
- 4032, 4224, 4352, 4480, 4608, 4032, 4032, 4032, 4032,
- 4224, 4352, 4480, 4608, 4096, 4096, 4096, 4096, 4288,
- 4416, 4544, 4672, 4096, 4096, 4096, 4096, 4288, 4416,
- 4544, 4672, 4160, 4160, 4160, 4160, 4352, 4480, 4608,
- 4736, 4160, 4160, 4160, 4160, 4352, 4480, 4608, 4736,
- 4224, 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4224,
- 4224, 4224, 4224, 4416, 4544, 4672, 4800, 4288, 4288,
- 4288, 4288, 4480, 4608, 4736, 4864, 4288, 4288, 4288,
- 4288, 4480, 4608, 4736, 4864, 4352, 4352, 4352, 4352,
- 4544, 4672, 4800, 4928, 4352, 4352, 4352, 4352, 4544,
- 4672, 4800, 4928, 4416, 4416, 4416, 4416, 4608, 4736,
- 4864, 4992, 4416, 4416, 4416, 4416, 4608, 4736, 4864,
- 4992, 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056,
- 4480, 4480, 4480, 4480, 4672, 4800, 4928, 5056, 4544,
- 4544, 4544, 4544, 4736, 4864, 4992, 5120, 4544, 4544,
- 4544, 4544, 4736, 4864, 4992, 5120, 4608, 4608, 4608,
- 4608, 4800, 4928, 5056, 5184, 4608, 4608, 4608, 4608,
- 4800, 4928, 5056, 5184, 4672, 4672, 4672, 4672, 4864,
- 4992, 5120, 5248, 4672, 4672, 4672, 4672, 4864, 4992,
- 5120, 5248, 4736, 4736, 4736, 4736, 4928, 5056, 5184,
- 5312, 4736, 4736, 4736, 4736, 4928, 5056, 5184, 5312,
- 4800, 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4800,
- 4800, 4800, 4800, 4992, 5120, 5248, 5376, 4864, 4864,
- 4864, 4864, 5056, 5184, 5312, 5440, 4864, 4864, 4864,
- 4864, 5056, 5184, 5312, 5440, 4928, 4928, 4928, 4928,
- 5120, 5248, 5376, 5504, 4928, 4928, 4928, 4928, 5120,
- 5248, 5376, 5504, 4992, 4992, 4992, 4992, 5184, 5312,
- 5440, 5568, 4992, 4992, 4992, 4992, 5184, 5312, 5440,
- 5568, 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632,
- 5056, 5056, 5056, 5056, 5248, 5376, 5504, 5632, 5120,
- 5120, 5120, 5120, 5312, 5440, 5568, 5632, 5120, 5120,
- 5120, 5120, 5312, 5440, 5568, 5632, 5184, 5184, 5184,
- 5184, 5376, 5504, 5632, 5632, 5184, 5184, 5184, 5184,
- 5376, 5504, 5632, 5632, 5248, 5248, 5248, 5248, 5440,
- 5568, 5632, 5632, 5248, 5248, 5248, 5248, 5440, 5568,
- 5632, 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632,
- 5632, 5312, 5312, 5312, 5312, 5504, 5632, 5632, 5632,
- 5376, 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5376,
- 5376, 5376, 5376, 5568, 5632, 5632, 5632, 5440, 5440,
- 5440, 5440, 5632, 5632, 5632, 5632, 5440, 5440, 5440,
- 5440, 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504,
- 5632, 5632, 5632, 5632, 5504, 5504, 5504, 5504, 5632,
- 5632, 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632,
- 5632, 5632, 5568, 5568, 5568, 5568, 5632, 5632, 5632,
- 5632
-};
-
-static const int filterData2[1424] = {
- 0, 2, 4, 6, 7, 9, 11, 13, 0, -2, -4, -6, -7, -9, -11,
- -13, 1, 3, 5, 7, 9, 11, 13, 15, -1, -3, -5, -7, -9,
- -11, -13, -15, 1, 3, 5, 7, 10, 12, 14, 16, -1, -3, -5,
- -7, -10, -12, -14, -16, 1, 3, 6, 8, 11, 13, 16, 18,
- -1, -3, -6, -8, -11, -13, -16, -18, 1, 4, 6, 9, 12,
- 15, 17, 20, -1, -4, -6, -9, -12, -15, -17, -20, 1, 4,
- 7, 10, 13, 16, 19, 22, -1, -4, -7, -10, -13, -16, -19,
- -22, 1, 4, 8, 11, 14, 17, 21, 24, -1, -4, -8, -11, -14,
- -17, -21, -24, 1, 5, 8, 12, 15, 19, 22, 26, -1, -5,
- -8, -12, -15, -19, -22, -26, 2, 6, 10, 14, 18, 22, 26,
- 30, -2, -6, -10, -14, -18, -22, -26, -30, 2, 6, 10,
- 14, 19, 23, 27, 31, -2, -6, -10, -14, -19, -23, -27,
- -31, 2, 7, 11, 16, 21, 26, 30, 35, -2, -7, -11, -16,
- -21, -26, -30, -35, 2, 7, 13, 18, 23, 28, 34, 39, -2,
- -7, -13, -18, -23, -28, -34, -39, 2, 8, 14, 20, 25,
- 31, 37, 43, -2, -8, -14, -20, -25, -31, -37, -43, 3,
- 9, 15, 21, 28, 34, 40, 46, -3, -9, -15, -21, -28, -34,
- -40, -46, 3, 10, 17, 24, 31, 38, 45, 52, -3, -10, -17,
- -24, -31, -38, -45, -52, 3, 11, 19, 27, 34, 42, 50,
- 58, -3, -11, -19, -27, -34, -42, -50, -58, 4, 12, 21,
- 29, 38, 46, 55, 63, -4, -12, -21, -29, -38, -46, -55,
- -63, 4, 13, 23, 32, 41, 50, 60, 69, -4, -13, -23, -32,
- -41, -50, -60, -69, 5, 15, 25, 35, 46, 56, 66, 76, -5,
- -15, -25, -35, -46, -56, -66, -76, 5, 16, 28, 39, 50,
- 61, 73, 84, -5, -16, -28, -39, -50, -61, -73, -84, 6,
- 18, 31, 43, 56, 68, 81, 93, -6, -18, -31, -43, -56,
- -68, -81, -93, 6, 20, 34, 48, 61, 75, 89, 103, -6, -20,
- -34, -48, -61, -75, -89, -103, 7, 22, 37, 52, 67, 82,
- 97, 112, -7, -22, -37, -52, -67, -82, -97, -112, 8,
- 24, 41, 57, 74, 90, 107, 123, -8, -24, -41, -57, -74,
- -90, -107, -123, 9, 27, 45, 63, 82, 100, 118, 136, -9,
- -27, -45, -63, -82, -100, -118, -136, 10, 30, 50, 70,
- 90, 110, 130, 150, -10, -30, -50, -70, -90, -110, -130,
- -150, 11, 33, 55, 77, 99, 121, 143, 165, -11, -33, -55,
- -77, -99, -121, -143, -165, 12, 36, 60, 84, 109, 133,
- 157, 181, -12, -36, -60, -84, -109, -133, -157, -181,
- 13, 40, 66, 93, 120, 147, 173, 200, -13, -40, -66, -93,
- -120, -147, -173, -200, 14, 44, 73, 103, 132, 162, 191,
- 221, -14, -44, -73, -103, -132, -162, -191, -221, 16,
- 48, 81, 113, 146, 178, 211, 243, -16, -48, -81, -113,
- -146, -178, -211, -243, 17, 53, 89, 125, 160, 196, 232,
- 268, -17, -53, -89, -125, -160, -196, -232, -268, 19,
- 58, 98, 137, 176, 215, 255, 294, -19, -58, -98, -137,
- -176, -215, -255, -294, 21, 64, 108, 151, 194, 237,
- 281, 324, -21, -64, -108, -151, -194, -237, -281, -324,
- 23, 71, 118, 166, 213, 261, 308, 356, -23, -71, -118,
- -166, -213, -261, -308, -356, 26, 78, 130, 182, 235,
- 287, 339, 391, -26, -78, -130, -182, -235, -287, -339,
- -391, 28, 86, 143, 201, 258, 316, 373, 431, -28, -86,
- -143, -201, -258, -316, -373, -431, 31, 94, 158, 221,
- 284, 347, 411, 474, -31, -94, -158, -221, -284, -347,
- -411, -474, 34, 104, 174, 244, 313, 383, 453, 523, -34,
- -104, -174, -244, -313, -383, -453, -523, 38, 115, 191,
- 268, 345, 422, 498, 575, -38, -115, -191, -268, -345,
- -422, -498, -575, 42, 126, 210, 294, 379, 463, 547,
- 631, -42, -126, -210, -294, -379, -463, -547, -631,
- 46, 139, 231, 324, 417, 510, 602, 695, -46, -139, -231,
- -324, -417, -510, -602, -695, 51, 153, 255, 357, 459,
- 561, 663, 765, -51, -153, -255, -357, -459, -561, -663,
- -765, 56, 168, 280, 392, 505, 617, 729, 841, -56, -168,
- -280, -392, -505, -617, -729, -841, 61, 185, 308, 432,
- 555, 679, 802, 926, -61, -185, -308, -432, -555, -679,
- -802, -926, 68, 204, 340, 476, 612, 748, 884, 1020,
- -68, -204, -340, -476, -612, -748, -884, -1020, 74,
- 224, 373, 523, 672, 822, 971, 1121, -74, -224, -373,
- -523, -672, -822, -971, -1121, 82, 246, 411, 575, 740,
- 904, 1069, 1233, -82, -246, -411, -575, -740, -904,
- -1069, -1233, 90, 271, 452, 633, 814, 995, 1176, 1357,
- -90, -271, -452, -633, -814, -995, -1176, -1357, 99,
- 298, 497, 696, 895, 1094, 1293, 1492, -99, -298, -497,
- -696, -895, -1094, -1293, -1492, 109, 328, 547, 766,
- 985, 1204, 1423, 1642, -109, -328, -547, -766, -985,
- -1204, -1423, -1642, 120, 361, 601, 842, 1083, 1324,
- 1564, 1805, -120, -361, -601, -842, -1083, -1324, -1564,
- -1805, 132, 397, 662, 927, 1192, 1457, 1722, 1987, -132,
- -397, -662, -927, -1192, -1457, -1722, -1987, 145, 437,
- 728, 1020, 1311, 1603, 1894, 2186, -145, -437, -728,
- -1020, -1311, -1603, -1894, -2186, 160, 480, 801, 1121,
- 1442, 1762, 2083, 2403, -160, -480, -801, -1121, -1442,
- -1762, -2083, -2403, 176, 529, 881, 1234, 1587, 1940,
- 2292, 2645, -176, -529, -881, -1234, -1587, -1940, -2292,
- -2645, 194, 582, 970, 1358, 1746, 2134, 2522, 2910,
- -194, -582, -970, -1358, -1746, -2134, -2522, -2910,
- 213, 640, 1066, 1493, 1920, 2347, 2773, 3200, -213,
- -640, -1066, -1493, -1920, -2347, -2773, -3200, 234,
- 704, 1173, 1643, 2112, 2582, 3051, 3521, -234, -704,
- -1173, -1643, -2112, -2582, -3051, -3521, 258, 774,
- 1291, 1807, 2324, 2840, 3357, 3873, -258, -774, -1291,
- -1807, -2324, -2840, -3357, -3873, 284, 852, 1420, 1988,
- 2556, 3124, 3692, 4260, -284, -852, -1420, -1988, -2556,
- -3124, -3692, -4260, 312, 937, 1561, 2186, 2811, 3436,
- 4060, 4685, -312, -937, -1561, -2186, -2811, -3436,
- -4060, -4685, 343, 1030, 1718, 2405, 3092, 3779, 4467,
- 5154, -343, -1030, -1718, -2405, -3092, -3779, -4467,
- -5154, 378, 1134, 1890, 2646, 3402, 4158, 4914, 5670,
- -378, -1134, -1890, -2646, -3402, -4158, -4914, -5670,
- 415, 1247, 2079, 2911, 3742, 4574, 5406, 6238, -415,
- -1247, -2079, -2911, -3742, -4574, -5406, -6238, 457,
- 1372, 2287, 3202, 4117, 5032, 5947, 6862, -457, -1372,
- -2287, -3202, -4117, -5032, -5947, -6862, 503, 1509,
- 2516, 3522, 4529, 5535, 6542, 7548, -503, -1509, -2516,
- -3522, -4529, -5535, -6542, -7548, 553, 1660, 2767,
- 3874, 4981, 6088, 7195, 8302, -553, -1660, -2767, -3874,
- -4981, -6088, -7195, -8302, 608, 1826, 3044, 4262, 5479,
- 6697, 7915, 9133, -608, -1826, -3044, -4262, -5479,
- -6697, -7915, -9133, 669, 2009, 3348, 4688, 6027, 7367,
- 8706, 10046, -669, -2009, -3348, -4688, -6027, -7367,
- -8706, -10046, 736, 2210, 3683, 5157, 6630, 8104, 9577,
- 11051, -736, -2210, -3683, -5157, -6630, -8104, -9577,
- -11051, 810, 2431, 4052, 5673, 7294, 8915, 10536, 12157,
- -810, -2431, -4052, -5673, -7294, -8915, -10536, -12157,
- 891, 2674, 4457, 6240, 8023, 9806, 11589, 13372, -891,
- -2674, -4457, -6240, -8023, -9806, -11589, -13372, 980,
- 2941, 4903, 6864, 8825, 10786, 12748, 14709, -980, -2941,
- -4903, -6864, -8825, -10786, -12748, -14709, 1078, 3236,
- 5393, 7551, 9708, 11866, 14023, 16181, -1078, -3236,
- -5393, -7551, -9708, -11866, -14023, -16181, 1186, 3559,
- 5933, 8306, 10679, 13052, 15426, 17799, -1186, -3559,
- -5933, -8306, -10679, -13052, -15426, -17799, 1305,
- 3915, 6526, 9136, 11747, 14357, 16968, 19578, -1305,
- -3915, -6526, -9136, -11747, -14357, -16968, -19578,
- 1435, 4307, 7179, 10051, 12922, 15794, 18666, 21538,
- -1435, -4307, -7179, -10051, -12922, -15794, -18666,
- -21538, 1579, 4738, 7896, 11055, 14214, 17373, 20531,
- 23690, -1579, -4738, -7896, -11055, -14214, -17373,
- -20531, -23690, 1737, 5212, 8686, 12161, 15636, 19111,
- 22585, 26060, -1737, -5212, -8686, -12161, -15636, -19111,
- -22585, -26060, 1911, 5733, 9555, 13377, 17200, 21022,
- 24844, 28666, -1911, -5733, -9555, -13377, -17200, -21022,
- -24844, -28666, 2102, 6306, 10511, 14715, 18920, 23124,
- 27329, 31533, -2102, -6306, -10511, -14715, -18920,
- -23124, -27329, -31533, 2312, 6937, 11562, 16187, 20812,
- 25437, 30062, 32767, -2312, -6937, -11562, -16187, -20812,
- -25437, -30062, -32767, 2543, 7631, 12718, 17806, 22893,
- 27981, 32767, 32767, -2543, -7631, -12718, -17806, -22893,
- -27981, -32767, -32767, 2798, 8394, 13990, 19586, 25183,
- 30779, 32767, 32767, -2798, -8394, -13990, -19586, -25183,
- -30779, -32767, -32767, 3077, 9233, 15389, 21545, 27700,
- 32767, 32767, 32767, -3077, -9233, -15389, -21545, -27700,
- -32767, -32767, -32767, 3385, 10157, 16928, 23700, 30471,
- 32767, 32767, 32767, -3385, -10157, -16928, -23700,
- -30471, -32767, -32767, -32767, 3724, 11172, 18621,
- 26069, 32767, 32767, 32767, 32767, -3724, -11172, -18621,
- -26069, -32767, -32767, -32767, -32767, 4095, 12287,
- 20479, 28671, 32767, 32767, 32767, 32767, -4095, -12287,
- -20479, -28671, -32767, -32767, -32767, -32767
-};
-
-static const int p1s[17] = { 0, 4, 3, 4, 2, 4, 3, 4, 1, 4, 3, 4, 2, 4, 3, 4, 0 };
-static const int p2s[17] = { 0, 1, 1, 3, 1, 5, 3, 7, 1, 9, 5, 11, 3, 13, 7, 15, 1 };
-
-static void soundFilter(byte *data, int16 *buffer, int p1, int p2);
-
-void SoundQueue::applyFilter(SoundEntry *entry, int16 *buffer) {
- if ((((byte *)entry->_soundData)[1] << 6) > 0x1600) {
- entry->setStatus(entry->getStatus().status | kSoundStatus_20000000);
- } else {
- int variant = entry->getStatus().status & 0x1f;
-
- soundFilter((byte *)entry->_soundData, buffer, p1s[variant], p2s[variant]);
- }
-}
-
-
-static void soundFilter(byte *data, int16 *buffer, int p1, int p2) {
- int data1, data2, data1p, data2p;
- byte idx;
-
- data2 = data[0];
- data1 = data[1] << 6;
-
- data += 2;
-
- for (int count = 0; count < 735; count++) {
- idx = data[count] >> 4;
- data1p = filterData[idx + data1];
- data2p = CLIP(filterData2[idx + data1] + data2, -32767, 32767);
-
- buffer[2 * count] = (p2 * data2p) >> p1;
-
- idx = data[count] & 0xF;
-
- data1 = filterData[idx + data1p];
- data2 = CLIP(filterData2[idx + data1p] + data2p, -32767, 32767);
- buffer[2 * count + 1] = (p2 * data2) >> p1;
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
// Debug
//////////////////////////////////////////////////////////////////////////
void SoundQueue::stopAllSound() {
Common::StackLock locker(_mutex);
for (Common::List<SoundEntry *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i)
- (*i)->getStreamedSound()->stop();
+ (*i)->getSoundStream()->stop();
}
} // End of namespace LastExpress
diff --git a/engines/lastexpress/sound/queue.h b/engines/lastexpress/sound/queue.h
index 3748a266e0..75fe06883a 100644
--- a/engines/lastexpress/sound/queue.h
+++ b/engines/lastexpress/sound/queue.h
@@ -78,9 +78,6 @@ public:
void setCurrentSubtitle(SubtitleEntry *entry) { _currentSubtitle = entry; }
SubtitleEntry *getCurrentSubtitle() { return _currentSubtitle; }
- // Cache
- bool setupCache(SoundEntry *entry);
-
// Serializable
void saveLoadWithSerializer(Common::Serializer &ser);
uint32 count();
@@ -109,7 +106,6 @@ private:
// Entries
Common::List<SoundEntry *> _soundList; ///< List of all sound entries
- Common::List<SoundEntry *> _soundCache; ///< List of entries with a data buffer
void *_soundCacheData;
// Subtitles
@@ -117,12 +113,6 @@ private:
Common::List<SubtitleEntry *> _subtitles;
SubtitleEntry *_currentSubtitle;
- // Filters
- int32 _buffer[2940]; ///< Static sound buffer
-
- void removeFromCache(SoundEntry *entry);
- void applyFilter(SoundEntry *entry, int16 *buffer);
-
friend class Debugger;
};
diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp
index c726769495..ff9e7e5aac 100644
--- a/engines/lastexpress/sound/sound.cpp
+++ b/engines/lastexpress/sound/sound.cpp
@@ -169,6 +169,9 @@ bool SoundManager::playSoundWithSubtitles(Common::String filename, SoundFlag fla
entry->updateState();
}
+ // Add entry to sound list
+ _queue->addToQueue(entry);
+
return (entry->getType() != kSoundTypeNone);
}
diff --git a/icons/count.ico b/icons/count.ico
new file mode 100644
index 0000000000..73e399e394
--- /dev/null
+++ b/icons/count.ico
Binary files differ