From 264056972d753e4018ea46472b5f657c75dc4b8a Mon Sep 17 00:00:00 2001 From: John Peterson Date: Sat, 3 Jan 2009 01:38:44 +0000 Subject: [PATCH] MusicMod: Added music modification, it currently only works in Windows git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1736 8ced0084-cf51-0410-be5f-012b33b47a6e --- Branches/MusicMod/Common/Common.vcproj | 245 ++++++ Branches/MusicMod/Common/Src/Console.cpp | 142 +++ Branches/MusicMod/Common/Src/Console.h | 26 + Branches/MusicMod/Data/win32/Plainamp.ini | 40 + .../Data/win32/PluginsMusic/in_vgmstream.dll | Bin 0 -> 331776 bytes .../Data/win32/PluginsMusic/out_ds.dll | Bin 0 -> 40960 bytes .../Data/win32/PluginsMusic/out_wave_gpl.dll | Bin 0 -> 14336 bytes Branches/MusicMod/Data/x64/Plainamp.ini | 29 + .../Data/x64/PluginsMusic/in_vgmstream.dll | Bin 0 -> 177152 bytes .../Data/x64/PluginsMusic/out_wave_gpl.dll | Bin 0 -> 55296 bytes Branches/MusicMod/Main/Main.vcproj | 294 +++++++ Branches/MusicMod/Main/Src/Frame.cpp | 454 ++++++++++ Branches/MusicMod/Main/Src/Main.cpp | 283 ++++++ Branches/MusicMod/Main/Src/Main.h | 31 + Branches/MusicMod/Main/Src/Setup.h | 23 + Branches/MusicMod/Player/Src/Config.cpp | 98 ++- Branches/MusicMod/Player/Src/Config.h | 7 +- Branches/MusicMod/Player/Src/Console.h | 20 +- Branches/MusicMod/Player/Src/DspPlugin.cpp | 1 + Branches/MusicMod/Player/Src/Emabox/Emabox.h | 5 +- Branches/MusicMod/Player/Src/GenPlugin.cpp | 1 + Branches/MusicMod/Player/Src/Global.h | 52 +- Branches/MusicMod/Player/Src/Input.cpp | 14 +- Branches/MusicMod/Player/Src/Input.h | 20 +- Branches/MusicMod/Player/Src/InputPlugin.cpp | 26 +- Branches/MusicMod/Player/Src/InputPlugin.h | 26 +- Branches/MusicMod/Player/Src/Main.cpp | 161 ++-- Branches/MusicMod/Player/Src/Main.h | 22 +- Branches/MusicMod/Player/Src/Output.cpp | 19 +- Branches/MusicMod/Player/Src/Output.h | 20 +- Branches/MusicMod/Player/Src/OutputPlugin.cpp | 16 + Branches/MusicMod/Player/Src/OutputPlugin.h | 24 +- Branches/MusicMod/Player/Src/Playback.cpp | 194 ++++- Branches/MusicMod/Player/Src/Playback.h | 20 +- Branches/MusicMod/Player/Src/Player.cpp | 408 +++++++++ Branches/MusicMod/Player/Src/PlayerExport.cpp | 162 ++++ Branches/MusicMod/Player/Src/PlayerExport.h | 48 + Branches/MusicMod/Player/Src/Playlist.cpp | 70 +- Branches/MusicMod/Player/Src/Playlist.h | 20 +- .../MusicMod/Player/Src/PlaylistControler.cpp | 22 +- Branches/MusicMod/Player/Src/PlaylistModel.h | 25 +- Branches/MusicMod/Player/Src/PlaylistView.cpp | 184 ++-- Branches/MusicMod/Player/Src/Plugin.cpp | 20 +- Branches/MusicMod/Player/Src/Plugin.h | 20 +- .../MusicMod/Player/Src/PluginManager.cpp | 20 +- Branches/MusicMod/Player/Src/Prefs.cpp | 20 +- Branches/MusicMod/Player/Src/Rebar.cpp | 48 +- .../MusicMod/Player/Src/Resources/resrc1.rc | 2 +- Branches/MusicMod/Player/Src/Timer.cpp | 126 +++ Branches/MusicMod/Player/Src/Unicode.cpp | 20 +- Branches/MusicMod/Player/Src/Unicode.h | 20 +- Branches/MusicMod/Player/Src/VisModule.cpp | 20 +- Branches/MusicMod/Player/Src/VisPlugin.cpp | 21 +- Branches/MusicMod/Player/Src/VisPlugin.h | 20 +- Branches/MusicMod/Player/Src/Winamp.cpp | 31 +- Branches/MusicMod/Player/Src/Winamp.h | 20 +- Branches/MusicMod/Player/Src/afxres.h | 823 ++++++++++++++++++ Branches/MusicMod/TestPlayer/Src/Player.cpp | 37 + .../MusicMod/TestPlayer/TestPlayer.vcproj | 279 ++++++ Externals/wxWidgets/build/msw/wx_adv.vcproj | 12 +- Externals/wxWidgets/include/wx/setup.h | 2 +- Source/Core/DiscIO/Src/FileBlob.cpp | 23 +- Source/Core/DiscIO/Src/FileSystemGCWii.h | 4 +- Source/Core/DolphinWX/Src/BootManager.cpp | 19 +- Source/Core/DolphinWX/Src/Frame.cpp | 48 +- Source/Core/DolphinWX/Src/Frame.h | 44 +- Source/Core/DolphinWX/Src/Globals.h | 97 ++- Source/Core/DolphinWX/resources/Boomy.h | 312 +++++++ Source/MusicMod.sln | 450 ++++++++++ 69 files changed, 5299 insertions(+), 511 deletions(-) create mode 100644 Branches/MusicMod/Common/Common.vcproj create mode 100644 Branches/MusicMod/Common/Src/Console.cpp create mode 100644 Branches/MusicMod/Common/Src/Console.h create mode 100644 Branches/MusicMod/Data/win32/Plainamp.ini create mode 100644 Branches/MusicMod/Data/win32/PluginsMusic/in_vgmstream.dll create mode 100644 Branches/MusicMod/Data/win32/PluginsMusic/out_ds.dll create mode 100644 Branches/MusicMod/Data/win32/PluginsMusic/out_wave_gpl.dll create mode 100644 Branches/MusicMod/Data/x64/Plainamp.ini create mode 100644 Branches/MusicMod/Data/x64/PluginsMusic/in_vgmstream.dll create mode 100644 Branches/MusicMod/Data/x64/PluginsMusic/out_wave_gpl.dll create mode 100644 Branches/MusicMod/Main/Main.vcproj create mode 100644 Branches/MusicMod/Main/Src/Frame.cpp create mode 100644 Branches/MusicMod/Main/Src/Main.cpp create mode 100644 Branches/MusicMod/Main/Src/Main.h create mode 100644 Branches/MusicMod/Main/Src/Setup.h create mode 100644 Branches/MusicMod/Player/Src/Player.cpp create mode 100644 Branches/MusicMod/Player/Src/PlayerExport.cpp create mode 100644 Branches/MusicMod/Player/Src/PlayerExport.h create mode 100644 Branches/MusicMod/Player/Src/Timer.cpp create mode 100644 Branches/MusicMod/Player/Src/afxres.h create mode 100644 Branches/MusicMod/TestPlayer/Src/Player.cpp create mode 100644 Branches/MusicMod/TestPlayer/TestPlayer.vcproj create mode 100644 Source/Core/DolphinWX/resources/Boomy.h create mode 100644 Source/MusicMod.sln diff --git a/Branches/MusicMod/Common/Common.vcproj b/Branches/MusicMod/Common/Common.vcproj new file mode 100644 index 0000000000..ee0fbb43e6 --- /dev/null +++ b/Branches/MusicMod/Common/Common.vcproj @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Branches/MusicMod/Common/Src/Console.cpp b/Branches/MusicMod/Common/Src/Console.cpp new file mode 100644 index 0000000000..0281ed7ad4 --- /dev/null +++ b/Branches/MusicMod/Common/Src/Console.cpp @@ -0,0 +1,142 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Include +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +//#include +#include +//#include "stdafx.h" +#include +#include +//#include + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Declarations and definitions +// ŻŻŻŻŻŻŻŻŻŻ + +// Enable or disable logging to screen and file +#define MM_DEBUG +//#define MM_DEBUG_FILEONLY +// --------------------------------------------------------------------------------------- + +// _T +/* +#ifdef _UNICODE +#define _T(x) L ## x +#else // _UNICODE +#define _T(x) x +#endif // _UNICODE + +To be used with + //wprintf(_T("Please enter a number:")); + //wprintf("Please enter a number"); + //wprintf(L"Please enter a number"); +*/ +// --------------------------------------------------------------------------------------- + +// --------------------------------------------------------------------------------------- +#ifdef MM_DEBUG + FILE* __fStdOut = NULL; +#endif +#ifndef MM_DEBUG_FILEONLY + HANDLE __hStdOut = NULL; +#endif +///////////////////////////// + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Start console window +// ŻŻŻŻŻŻŻŻŻŻ +// Width and height is the size of console window, if you specify fname, +// the output will also be writton to this file. The file pointer is automatically closed +// when you close the app +//void startConsoleWin(int width=80, int height=2225, char* fname = NULL); +void StartConsoleWin(int width, int height, char* fname) +{ +#ifdef MM_DEBUG + +#ifndef MM_DEBUG_FILEONLY + // --------------------------------------------------------------------------------------- + // Allocate console + AllocConsole(); + // --------------------------------------------------------------------------------------- + + //SetConsoleTitle("Debug Window"); + SetConsoleTitle(fname); + __hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + + COORD co = {width,height}; + SetConsoleScreenBufferSize(__hStdOut, co); + + SMALL_RECT coo = {0,0, (width - 1),50}; // Top, left, right, bottom + SetConsoleWindowInfo(__hStdOut, TRUE, &coo); +#endif + + if(fname) + { + // Edit the log file name + std::string FileEnding = ".log"; + std::string FileName = fname; + std::string FullFilename = (FileName + FileEnding); + __fStdOut = fopen(FullFilename.c_str(), "w"); + } + +#endif +} + + +// Use wprintf like TRACE0, TRACE1, ... (The arguments are the same as printf) +//int wprintf(char *fmt, ...) +int wprintf(char *fmt, ...) +{ +#ifdef MM_DEBUG + char s[300]; + va_list argptr; + int cnt; + + va_start(argptr, fmt); + cnt = vsprintf(s, fmt, argptr); + va_end(argptr); + + DWORD cCharsWritten; + + // --------------------------------------------------------------------------------------- +#ifndef MM_DEBUG_FILEONLY + if(__hStdOut) + { + WriteConsole(__hStdOut, s, strlen(s), &cCharsWritten, NULL); + } +#endif + // --------------------------------------------------------------------------------------- + + if(__fStdOut) + { + fprintf(__fStdOut, s); + fflush(__fStdOut); // Write file now + } + + return(cnt); +#else + return 0; +#endif +} \ No newline at end of file diff --git a/Branches/MusicMod/Common/Src/Console.h b/Branches/MusicMod/Common/Src/Console.h new file mode 100644 index 0000000000..8add97756b --- /dev/null +++ b/Branches/MusicMod/Common/Src/Console.h @@ -0,0 +1,26 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +////////////////////////////////////////////////////////////////////////////////////////// +// Declarations and definitions +// ŻŻŻŻŻŻŻŻŻŻ +void StartConsoleWin(int width, int height, char* fname); +int wprintf(char *fmt, ...); +////////////////////////////////// + + diff --git a/Branches/MusicMod/Data/win32/Plainamp.ini b/Branches/MusicMod/Data/win32/Plainamp.ini new file mode 100644 index 0000000000..d82f44952a --- /dev/null +++ b/Branches/MusicMod/Data/win32/Plainamp.ini @@ -0,0 +1,40 @@ +[Plainamp] +OutputPluginActive___out_ds.dll=1 +Volume=255 +Loop=1 +WinPlaceConsole=(1,(62,441,1179,845)) +WinPlaceMain=(1,(274,203,1005,765)) +MinimizeToTray=1 +Panning=0 +CurPresetFixed=-1 +PreventDistortion=1 +Order=3 +PlaylistFollow=1 +PlaylistEntryNumberZeroPadding=1 +CurPlaylistPosition=0 +InfinitePlaylist=0 +ManagerGrid=1 +WinPlaceManager=(1,(500,400,1000,700)) +OrderBand=(0,-2,0,1) +EqBand=(1,-2,0,1) +SeekBand=(2,-2,0,1) +VolBand=(3,-2,0,1) +PanBand=(4,-2,0,1) +ButtonsBand=(5,134,0,1) +VisBand=(6,134,0,1) +InvertPanSlider=0 +CurDir=C:\ +WarnPluginsMissing=1 +[out_wave_gpl] +config=14000000002400000100000000000000FFFFFFFF0100000036 +[out_ds] +cfg_hw_mix=1 +cfg_buf_ms=2000 +cfg_trackhack=0 +cfg_prebuf2=500 +cfg_fade_seek.on=0 +cfg_fade_pause.on=0 +cfg_fadevol=0 +cfg_wait=0 +[Interface] +ShowConsole = False diff --git a/Branches/MusicMod/Data/win32/PluginsMusic/in_vgmstream.dll b/Branches/MusicMod/Data/win32/PluginsMusic/in_vgmstream.dll new file mode 100644 index 0000000000000000000000000000000000000000..f54a9f9e625e99abd495ffe4d883242be3ede0b8 GIT binary patch literal 331776 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ⅅKg33W>5>b`G82ki`Zje)6%+K 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

qFhH53F6U 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%0D`n?YBz5$jDQ4s*S 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 S3_J{cKq^5+(kP~52mk;Y@V|io literal 0 HcmV?d00001 diff --git a/Branches/MusicMod/Data/x64/Plainamp.ini b/Branches/MusicMod/Data/x64/Plainamp.ini new file mode 100644 index 0000000000..b1a908bd6d --- /dev/null +++ b/Branches/MusicMod/Data/x64/Plainamp.ini @@ -0,0 +1,29 @@ +[Plainamp] +OutputPluginActive___out_wave_gpl.dll=1 +Volume=100 +Loop=1 +WinPlaceConsole=(1,(62,441,1179,845)) +WinPlaceMain=(1,(274,203,1005,765)) +MinimizeToTray=1 +Panning=0 +CurPresetFixed=-1 +PreventDistortion=1 +Order=3 +PlaylistFollow=1 +PlaylistEntryNumberZeroPadding=1 +CurPlaylistPosition=0 +InfinitePlaylist=1 +ManagerGrid=1 +WinPlaceManager=(1,(500,400,1000,700)) +OrderBand=(0,-2,0,1) +EqBand=(1,-2,0,1) +SeekBand=(2,-2,0,1) +VolBand=(3,-2,0,1) +PanBand=(4,-2,0,1) +ButtonsBand=(5,134,0,1) +VisBand=(6,134,0,1) +InvertPanSlider=0 +CurDir=C:\ +WarnPluginsMissing=1 +[out_wave_gpl] +config=14000000002400000100000000000000FFFFFFFF0100000036 diff --git a/Branches/MusicMod/Data/x64/PluginsMusic/in_vgmstream.dll b/Branches/MusicMod/Data/x64/PluginsMusic/in_vgmstream.dll new file mode 100644 index 0000000000000000000000000000000000000000..bf2af34f79df624d3f71a082582cb2624bc6f187 GIT binary patch literal 177152 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%0D0h;Xe?E&<0`ED^oI!$x}X&)ARj^(WJBl$ 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 Gg#ZBH;>HjF literal 0 HcmV?d00001 diff --git a/Branches/MusicMod/Data/x64/PluginsMusic/out_wave_gpl.dll b/Branches/MusicMod/Data/x64/PluginsMusic/out_wave_gpl.dll new file mode 100644 index 0000000000000000000000000000000000000000..da0ccab700ab8be3018e49fe122c2a8890f59cb8 GIT binary patch literal 55296 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 literal 0 HcmV?d00001 diff --git a/Branches/MusicMod/Main/Main.vcproj b/Branches/MusicMod/Main/Main.vcproj new file mode 100644 index 0000000000..46988cfd9a --- /dev/null +++ b/Branches/MusicMod/Main/Main.vcproj @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Branches/MusicMod/Main/Src/Frame.cpp b/Branches/MusicMod/Main/Src/Frame.cpp new file mode 100644 index 0000000000..7fb08aff3e --- /dev/null +++ b/Branches/MusicMod/Main/Src/Frame.cpp @@ -0,0 +1,454 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +////////////////////////////////////////////////////////////////////////////////////////// +// Include +// ŻŻŻŻŻŻŻŻŻŻ +#include // System + +#include "Core.h" // Core + +#include "IniFile.h" // Common + +#include "../../../../Source/Core/DolphinWX/Src/Globals.h" // DolphinWX +#include "../../../../Source/Core/DolphinWX/Src/Frame.h" + +#include "../../Common/Console.h" // Local +#include "../../Player/Src/PlayerExport.h" // Player +////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Declarations and definitions +// ŻŻŻŻŻŻŻŻŻŻ +namespace MusicMod +{ + bool GlobalMute = false; + bool GlobalPause = false; + bool bShowConsole = false; + int GlobalVolume = 255; + extern bool dllloaded; +} +////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Change the brightness of a wxBitmap +// ŻŻŻŻŻŻŻŻŻŻ +wxBitmap SetBrightness(wxBitmap _Bitmap, int _Brightness, bool Gray) +{ + wxImage _Image = _Bitmap.ConvertToImage(); + wxImage _Image2 = _Bitmap.ConvertToImage(); + + wxString Tmp; + + if(_Brightness < 0) _Brightness = 0; // Limits + if(_Brightness > 255) _Brightness = 255; + + _Brightness = 255 - _Brightness; // Make big values brighter + + // Remove the alpha layer first + for(int y = 0; y < _Bitmap.GetWidth(); y++) + { + for(int x = 0; x < _Bitmap.GetHeight(); x++) + _Image.SetAlpha(x, y, 255); + } + + for(int y = 0; y < _Bitmap.GetWidth(); y++) + { + //Tmp += wxString::Format("\n %i: ", y); + + for(int x = 0; x < _Bitmap.GetHeight(); x++) + { + u8 R = _Image.GetRed(x, y); // Get colors + u8 G = _Image.GetGreen(x, y); + u8 B = _Image.GetBlue(x, y); + + //if((x == 5 | x == 6) && y == 15) Tmp += wxString::Format("%03i %03i %03i", R, G, B); + + if(_Brightness > 128) + { + int Bright = _Brightness - 128; + R = R - Bright * (R - 0) / 128; + G = G - Bright * (G - 0) / 128; + B = B - Bright * (B - 0) / 128; + + // 118 - 72 * 118 / 128 = 118 - 66.3 = 52 + // 119 - = 119 - 66.9 = 52 + } + else + { + int Bright = 128 - _Brightness; + R = R - Bright * (R - 255) / 128; + G = G - Bright * (G - 255) / 128; + B = B - Bright * (B - 255) / 128; + } + + //if((x == 5 | x == 6) && y == 15) Tmp += wxString::Format(" %03i %03i %03i | ", R, G, B); + + _Image.SetRGB(x, y, R, G, B); + } + } + // Return the alpha + _Image.SetAlpha(_Image2.GetAlpha(), true); + + // Update the bitmap + if(Gray) + return wxBitmap(_Image.ConvertToGreyscale()); + else + return wxBitmap(_Image); + + //wxMessageBox(Tmp); +} +////////////////////////////////// + + +void ShowConsole() +{ + StartConsoleWin(100, 2000, "Console"); // Give room for 2000 rows +} + +#ifdef MUSICMOD +void +CFrame::MM_InitBitmaps() +{ + // Gray version + + //m_Bitmaps[Toolbar_PluginDSP_Dis] = wxBitmap(SetBrightness(m_Bitmaps[Toolbar_PluginDSP], 165, true)); + m_Bitmaps[Toolbar_PluginDSP_Dis] = wxBitmap(SetBrightness(m_Bitmaps[Toolbar_PluginDSP], 165, true)); + m_Bitmaps[Toolbar_Log_Dis] = wxBitmap(SetBrightness(m_Bitmaps[Toolbar_Log], 165, true)); +} + + + +void +CFrame::MM_PopulateGUI() +{ + // --------------------------------------- + // Load config + // --------------------- + IniFile file; + file.Load("Plainamp.ini"); + file.Get("Interface", "ShowConsole", &MusicMod::bShowConsole, false); + // ------- + + + // --------------------------------------- + // Make a debugging window + // --------------------- + if(MusicMod::bShowConsole) ShowConsole(); + + // Write version + #ifdef _M_X64 + wprintf("64 bit version\n"); + #else + wprintf("32 bit version\n"); + #endif + // ----------- + + + wxToolBar* toolBar = theToolBar; // Shortcut + + toolBar->AddSeparator(); + + + // --------------------------------------- + // Draw a rotated music label + // --------------------- + wxBitmap m_RotatedText(30, 15); + wxMemoryDC dc; + dc.SelectObject(m_RotatedText); + wxBrush BackgroundGrayBrush(_T("#ece9d8")); // The right color in windows + + // Set outline and fill colors + dc.SetBackground(BackgroundGrayBrush); + dc.Clear(); + + wxFont m_font(8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD); + dc.SetFont(m_font); + dc.SetTextForeground(wxColour(*wxLIGHT_GREY)); + + dc.DrawText(wxT("Music"), 0, 0); + m_RotatedText = wxBitmap(m_RotatedText.ConvertToImage().Rotate90(false)); + + wxStaticBitmap * m_StaticBitmap = new wxStaticBitmap(toolBar, wxID_ANY, m_RotatedText); + + toolBar->AddControl(m_StaticBitmap); + // --------------------------- + + + + mm_ToolMute = toolBar->AddTool(IDM_MUTE, _T("Mute"), m_Bitmaps[Toolbar_Play], _T("Mute music")); + mm_ToolPlay = toolBar->AddTool(IDM_MUSIC_PLAY, _T("Play"), m_Bitmaps[Toolbar_Play], _T("Play or pause music without pausing the game")); + + // This cause the disabled tool bitmap to become some kind of monochrome version + /* + mm_ToolMute = new wxToolBarToolBase(toolBar, IDM_MUTE, _T("Mute"), m_Bitmaps[Toolbar_PluginDSP], + m_Bitmaps[Toolbar_PluginDSP], wxITEM_CHECK, 0, _T("Mute music")); + toolBar->AddTool(mm_ToolMute); + + mm_ToolPlay = new wxToolBarToolBase(toolBar, IDM_MUSIC_PLAY, _T("Play"), m_Bitmaps[Toolbar_Play], + m_Bitmaps[Toolbar_Play], wxITEM_NORMAL, 0, _T("Play or pause music without pausing the game")); + toolBar->AddTool(mm_ToolPlay); + */ + + + // --------------------- + /* Lots of code to get a label for the slider, in 2.9.0 AddControl accepts a label so then + this code can be simplified a lot */ + // --------- + wxPanel * mm_SliderPanel = new wxPanel(toolBar, IDS_VOLUME_PANEL, wxDefaultPosition, wxDefaultSize); + wxSlider * mm_Slider = new wxSlider(mm_SliderPanel, IDS_VOLUME, 125, 0, 255, wxDefaultPosition, wxDefaultSize); + //m_Slider->SetToolTip("Change the music volume"); + wxStaticText * mm_SliderText = new wxStaticText(mm_SliderPanel, IDS_VOLUME_LABEL, _T("Volume"), wxDefaultPosition, wxDefaultSize); + wxBoxSizer * mm_VolSizer = new wxBoxSizer(wxVERTICAL); + mm_VolSizer->Add(mm_Slider, 0, wxEXPAND | wxALL, 0); + mm_VolSizer->Add(mm_SliderText, 0, wxCENTER | wxALL, 0); + + mm_SliderPanel->SetSizer(mm_VolSizer); + mm_SliderPanel->SetSize(mm_VolSizer->GetMinSize().GetWidth(), mm_VolSizer->GetMinSize().GetHeight()); + + toolBar->AddControl((wxControl*)mm_SliderPanel); + // --------- + + mm_ToolLog = toolBar->AddTool(IDT_LOG, _T("Log"), m_Bitmaps[Toolbar_Log], _T("Show or hide log")); +} + + +void +CFrame::MM_UpdateGUI() +{ + // --------------------------------------------------------------------------------------- + if(MusicMod::GlobalMute) + { + //m_pMenuItemMute->SetText(_T("Play")); + //GetToolBar()->SetToolNormalBitmap(IDM_MUTE, m_Bitmaps[Toolbar_Pause]); + mm_ToolMute->SetLabel("Unmute"); + mm_ToolMute->SetNormalBitmap(m_Bitmaps[Toolbar_PluginDSP_Dis]); + //m_ToolMute->SetToggle(true); + } + else + { + //GetToolBar()->SetToolNormalBitmap(IDM_MUTE, m_Bitmaps[Toolbar_PluginDSP]); + mm_ToolMute->SetLabel("Mute"); + mm_ToolMute->SetNormalBitmap(m_Bitmaps[Toolbar_PluginDSP]); + } + + if(MusicMod::GlobalPause) + { + //GetToolBar()->SetToolNormalBitmap(IDM_PAUSE, m_Bitmaps[Toolbar_Pause]); + mm_ToolPlay->SetLabel("Play"); + mm_ToolPlay->SetNormalBitmap(m_Bitmaps[Toolbar_Play]); + } + else + { + //GetToolBar()->SetToolNormalBitmap(IDM_PAUSE, m_Bitmaps[Toolbar_PluginDSP]); + mm_ToolPlay->SetLabel("Pause"); + mm_ToolPlay->SetNormalBitmap(m_Bitmaps[Toolbar_Pause]); + } + + if(MusicMod::bShowConsole) + { + mm_ToolLog->SetNormalBitmap(m_Bitmaps[Toolbar_Log]); + } + else + { + mm_ToolLog->SetNormalBitmap(m_Bitmaps[Toolbar_Log_Dis]); + } + // --------------------------------------------------------------------------------------- +} + + + + +void +CFrame::MM_OnPlay() +{ + //MessageBox(0, "CFrame::OnPlay > Begin", "", 0); + wprintf("\nCFrame::OnPlayMusicMod > Begin\n"); + + + if (Core::GetState() != Core::CORE_UNINITIALIZED) + { + if (Core::GetState() == Core::CORE_RUN) + { + wprintf("CFrame::OnPlayMusicMod > Pause\n"); + if(!MusicMod::GlobalPause) // we may has set this elsewhere + { + MusicMod::GlobalPause = true; + if (MusicMod::dllloaded) + { + Player_Pause(); + } + + } + } + else + { + wprintf("CFrame::OnPlayMusicMod > Play\n"); + if(MusicMod::GlobalPause) // we may has set this elsewhere + { + MusicMod::GlobalPause = false; + if (MusicMod::dllloaded) + { + Player_Unpause(); + } + } + } + } + +} + + + +// ======================================================================================= +// Mute music +// --------------------------------------------------------------------------------------- +void +CFrame::MM_OnMute(wxCommandEvent& WXUNUSED (event)) +{ + wprintf("CFrame::OnMute > Begin\n"); + //MessageBox(0, "", "", 0); + + if(!MusicMod::GlobalMute) + { + if(MusicMod::dllloaded) // avoid crash + { + Player_Mute(); + } + + MusicMod::GlobalMute = true; + //m_ToolMute->Enable(false); + //GetToolBar()->EnableTool(IDT_LOG, false); + UpdateGUI(); + } + else + { + if(MusicMod::dllloaded) // avoid crash + { + Player_Mute(); + } + MusicMod::GlobalMute = false; + //m_ToolMute->Enable(true); + UpdateGUI(); + } +} +// ======================================================================================= + + +// ======================================================================================= +// Pause music +// --------------------------------------------------------------------------------------- +void +CFrame::MM_OnPause(wxCommandEvent& WXUNUSED (event)) +{ + wprintf("CFrame::OnPause > Begin\n"); + //MessageBox(0, "", "", 0); + + if(!MusicMod::GlobalPause) + { + if(MusicMod::dllloaded) // avoid crash + { + Player_Pause(); + } + MusicMod::GlobalPause = true; + UpdateGUI(); + } + else + { + if(MusicMod::dllloaded) // avoid crash + { + Player_Pause(); + } + MusicMod::GlobalPause = false; + UpdateGUI(); + } +} + + + + +// ======================================================================================= +// Change volume +// --------------------------------------------------------------------------------------- +void CFrame::MM_OnVolume(wxScrollEvent& event) +{ + //wprintf("CFrame::OnVolume > Begin <%i>\n", event.GetPosition()); + //MessageBox(0, "", "", 0); + + //if(event.GetEventType() == wxEVT_SCROLL_PAGEUP || event.GetEventType() == wxEVT_SCROLL_PAGEDOWN) + // return; + + if(MusicMod::dllloaded) // avoid crash + { + + Player_Volume(event.GetPosition()); + MusicMod::GlobalVolume = event.GetPosition(); + + MusicMod::GlobalMute = false; // Unmute to + mm_ToolMute->Toggle(false); + + if(event.GetEventType() == wxEVT_SCROLL_CHANGED) + { + // Only update this on release, to avoid major flickering when changing volume + UpdateGUI(); + + /* Use this to avoid that the focus get stuck on the slider when the main + window has been replaced */ + this->SetFocus();} + + } +} +//======================================================================================= + + + +// ======================================================================================= +// Show log +// --------------------------------------------------------------------------------------- +void CFrame::MM_OnLog(wxCommandEvent& event) +{ + //wprintf("CFrame::OnLog > Begin\n"); + //MessageBox(0, "", "", 0); + + if(MusicMod::dllloaded) // Avoid crash + { + } + + MusicMod::bShowConsole = !MusicMod::bShowConsole; + + if(MusicMod::bShowConsole) + { ShowConsole(); Player_Console(true); } + else + { + #if defined (_WIN32) + FreeConsole(); Player_Console(false); + #endif + } + + IniFile file; + file.Load("Plainamp.ini"); + file.Set("Interface", "ShowConsole", MusicMod::bShowConsole); + file.Save("Plainamp.ini"); + + UpdateGUI(); +} +//======================================================================================= +#endif // MUSICMOD diff --git a/Branches/MusicMod/Main/Src/Main.cpp b/Branches/MusicMod/Main/Src/Main.cpp new file mode 100644 index 0000000000..8452833ddf --- /dev/null +++ b/Branches/MusicMod/Main/Src/Main.cpp @@ -0,0 +1,283 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +////////////////////////////////////////////////////////////////////////////////////////// +// Include +// ŻŻŻŻŻŻŻŻŻŻ +#include +#include +#include +#include + +#include "PowerPC/PowerPc.h" // Core + +#include "../../../../Source/Core/DiscIO/Src/FileSystemGCWii.h" // This file has #include "Filesystem.h" +#include "../../../../Source/Core/DiscIO/Src/VolumeCreator.h" + +#include "../../Player/Src/PlayerExport.h" // Local player +#include "../../Common/Console.h" // Local common +////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Declarations and definitions +// ŻŻŻŻŻŻŻŻŻŻ +namespace MusicMod +{ + +struct MyFilesStructure +{ + std::string path; + int offset; // Is int enough, how high does offset go? +}; + +std::vector MyFiles; +void StructSort (std::vector &MyFiles); + + +// Playback +std::string currentfile; +std::string unique_gameid; + +std::string MusicPath; + +DiscIO::CFileSystemGCWii* my_pFileSystem; + +extern bool bShowConsole; +int WritingFile = false; +bool dllloaded = false; +std::string CurrentPlayFile; +////////////////////////////////// + + + +// --------------------------------------------------------------------------------------- +// A function to sort the filelist table after offset +void StructSort (std::vector &MyFiles) +{ + MyFilesStructure temp; + + //wprintf("StructSort > Begin\n"); + + for(int i = 0; i < MyFiles.size() - 1; i++) + { + for (int j = i + 1; j < MyFiles.size(); j++) + { + //if (printerStock[ i ].brand > printerStock[ j ].brand) //comparing brands + if (MyFiles[ i ].offset > MyFiles[ j ].offset) //comparing cost + { + temp = MyFiles[ i ]; // Swapping entire struct + MyFiles[ i ] = MyFiles[ j ]; + MyFiles[ j ] = temp; + } + } + } + + + for (long i=1; i<(long)MyFiles.size(); ++i) + { + //cout << printerStock.at(i).brand.c_str() << printerStock.at(i).cost << "\n"; + std::cout << i << " " << MyFiles[i].path.c_str() << "#" << MyFiles[i].offset << "\n"; + } + + //wprintf("StructSort > Done\n"); +} + + + +// ======================================================================================= +/* This will load Plainamp.dll. It's the original Plainamp.exe with removed GUI and some small + modifications. */ +void Main(std::string FileName) +{ + // + DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(FileName.c_str()); + + // + my_pFileSystem = new DiscIO::CFileSystemGCWii(pVolume); + + /* We have to sort the files according to offset so that out scan in Blob.cpp works. + Because StructSort() only works for MyFilesStructure I copy the offset and filenames + to a new vetor first. */ + MyFiles.resize(my_pFileSystem->m_FileInfoVector.size()); // Set size + for (size_t i = 0; i < my_pFileSystem->m_FileInfoVector.size(); i++) + { + MyFiles.at(i).offset = my_pFileSystem->m_FileInfoVector.at(i).m_Offset; + MyFiles.at(i).path = my_pFileSystem->m_FileInfoVector.at(i).m_FullPath; + } + + StructSort(MyFiles); + + // These things below will not need to be updated after a new game is started + if (dllloaded) return; + + Player_Main(bShowConsole); // Call the DLL for the first time + //play_file("c:\\demo36_02.ast"); + wprintf("DLL loaded\n"); + dllloaded = true; // Do this once + + + // --------------------------------------------------------------------------------------- + // Make Music directory + LPSECURITY_ATTRIBUTES attr; + attr = NULL; + MusicPath = "Music\\"; + wprintf("Created a Music directory\n"); + CreateDirectory(MusicPath.c_str(), attr); + // ---------------------------------------------------------------------------------------- +} + + +// ======================================================================================= +// Supported music files +// --------------------------------------------------------------------------------------- +bool CheckFileEnding(std::string FileName) +{ + if ( + (FileName.find(".adp") != std::string::npos) // 1080 Avalanche, Crash Bandicoot etc + || (FileName.find(".afc") != std::string::npos) // Zelda WW + || (FileName.find(".ast") != std::string::npos) // Zelda TP, Mario Kart + || (FileName.find(".dsp") != std::string::npos) // Metroid Prime + || (FileName.find(".hps") != std::string::npos) // SSB Melee + ) + return true; +} +// ======================================================================================= + + + +// ======================================================================================= +// +void CheckFile(u64 offset, u64 size) +{ + // ======================================================================================= + /* Only do this test: + 1. After boot, not on ISO scan + 2. Not if offset = 0. + 3. Not when WritingFile. We will lead to calls back to here (Read) and it will mess + upp the scanning */ + if(PowerPC::state == PowerPC::CPUState::CPU_RUNNING && offset != 0 && !WritingFile) + { + + + ////////////////////////////////////////////////////////////////////////////////////////// + /* Get the filename. Here we go through all files until we come to the file that has + the matching offset. Before MyFiles has data this loop will go nowhere. We have to + specify (MyFiles.size() - 1) because we will be reading MyFiles.at(i + 1). + MyFiles.size() is the amount of files on the disc, and the last file is + MyFiles.at(MyFiles.size() - 1) */ + // --------------------------------------------------------------------------------------- + for (int i = 0; i < (int)(MyFiles.size() - 1); ++i) + { + // --------------------------------------------------------------------------------------- + /* If we assume that myoffset is the begginning of every file this works. + Suppose there are three files + 1 is 0 to 149 + 2 is 150 to 170 + 3 is 171 to 200 + If the offset is 160 the game is reading file number two, for example + myoffset = 150: (myoffset >= offset) == false + myoffset = 171: (myoffset >= offset) == true, break + + However if the offset is 195 the game is reading the last file and we will get + myoffset = 171: (myoffset >= offset) == false + we therefore need to add the condition (offset > MyFiles[MyFiles.size() - 1].offset) + to. */ + if (MyFiles[i + 1].offset >= offset || offset > MyFiles[MyFiles.size() - 1].offset) + { + // Now we know that the game is reading from MyFiles[i].path + + // Break if we found the same file again + if (currentfile == MyFiles[i].path) break; + + //wprintf(">>>> (%i)Current read %s <%u = %ux%i> \n", i, CurrentFiles[i].path.c_str(), offset, CurrentFiles[i].offset, size); + + if (CheckFileEnding(MyFiles[i].path.c_str())) + { + //u64 myoffset2 = (u32)offset; + wprintf("\n >>> (%i/%i) Match %s <%u = %ux%i> \n\n", i, + MyFiles.size(), MyFiles[i].path.c_str(), offset, MyFiles[i].offset, size); + //wprintf(">>>> [i + 1].offset %i", MyFiles[i + 1].offset); + currentfile = MyFiles[i].path; // save the found file + + // --------------------------------------------------------------------------------------- + // We will now save the file to the PC hard drive + // --------------------------------------------------------------------------------------- + // Get the filename + std::size_t pointer = MyFiles[i].path.find_last_of("\\"); + std::string fragment = MyFiles[i].path.substr (0, (pointer-0)); + int compare = MyFiles[i].path.length() - fragment.length(); // get the length of the filename + fragment = MyFiles[i].path.substr ((pointer+1), compare); // now we have the filename + + // --------------------------------------------------------------------------------------- + // Create the file path + std::string FilePath = (MusicPath + fragment); + // --------------------------------------------------------------------------------------- + WritingFile = true; // Avoid detecting the file we are writing + wprintf("Writing <%s> to <%s>\n", MyFiles[i].path.c_str(), FilePath.c_str()); + my_pFileSystem->ExportFile(MyFiles[i].path.c_str(), FilePath.c_str()); + WritingFile = false; + + // --------------------------------------------------------------------------------------- + // Play the file we found + if(dllloaded) + { + Player_Play((char*)FilePath.c_str()); // retype it from const char* to char* + } else { + wprintf("Warning > Music DLL is not loaded"); + } + + // --------------------------------------------------------------------------------------- + // Remove the last file, if any + if(CurrentPlayFile.length() > 0) + { + if(!remove(CurrentPlayFile.c_str())) + { + wprintf("The program failed to remove <%s>\n", CurrentPlayFile.c_str()); + } else { + wprintf("The program removed <%s>\n", CurrentPlayFile.c_str()); + } + } + + // --------------------------------------------------------------------------------------- + // Save the current playing file + CurrentPlayFile = FilePath; // Save the filename so we can remove it later + break; + // --------------------------------------------------------------------------------------- + + } + + // --------------------------------------------------------------------------------------- + // Tell about the files we ignored + wprintf("(%i/%i) Ignored %s <%u = %ux%i> \n", i, MyFiles.size(), MyFiles[i].path.c_str(), offset, MyFiles[i].offset, size); + currentfile = MyFiles[i].path; + break; + // --------------------------------------------------------------------------------------- + } + } + + //wprintf("Blob.cpp:Read <%i> <%i> <%i> <%i>\n", offset, size, out_ptr); + } // This ends the entire filescan + // ======================================================================================= + + + +} + +} // end of namespace \ No newline at end of file diff --git a/Branches/MusicMod/Main/Src/Main.h b/Branches/MusicMod/Main/Src/Main.h new file mode 100644 index 0000000000..69a9040834 --- /dev/null +++ b/Branches/MusicMod/Main/Src/Main.h @@ -0,0 +1,31 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +#include // System: For std + +#include "Common.h" // Common: For u64 + + +namespace MusicMod +{ + +void Main(std::string FileName); +void CheckFile(u64 offset, u64 size); + + +} \ No newline at end of file diff --git a/Branches/MusicMod/Main/Src/Setup.h b/Branches/MusicMod/Main/Src/Setup.h new file mode 100644 index 0000000000..a1b7f2118f --- /dev/null +++ b/Branches/MusicMod/Main/Src/Setup.h @@ -0,0 +1,23 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +//////////////////////////////////////////////////////////////////////////////////////// +// Build with music modification +// ŻŻŻŻŻŻŻŻŻ +#define MUSICMOD +////////////////////////// \ No newline at end of file diff --git a/Branches/MusicMod/Player/Src/Config.cpp b/Branches/MusicMod/Player/Src/Config.cpp index fcfee0bf63..bc978172ba 100644 --- a/Branches/MusicMod/Player/Src/Config.cpp +++ b/Branches/MusicMod/Player/Src/Config.cpp @@ -34,6 +34,10 @@ ConfVar::ConfVar( TCHAR * szKey, ConfMode mode ) { // MessageBox( 0, TEXT( "no const @ ConfVar" ), TEXT( "" ), 0 ); + // --------------------------------------------------------------------------------------- + //wprintf("ConfVar::ConfVar(TCHAR) > Got <%s>\n", szKey); + // --------------------------------------------------------------------------------------- + // Init const int iLen = ( int )_tcslen( szKey ); m_szKey = new TCHAR[ iLen + 1 ]; @@ -57,6 +61,10 @@ ConfVar::ConfVar( TCHAR * szKey, ConfMode mode ) //////////////////////////////////////////////////////////////////////////////// ConfVar::ConfVar( const TCHAR * szKey, ConfMode mode ) { + // --------------------------------------------------------------------------------------- + //wprintf("ConfVar::ConfVar(const TCHAR) > Got <%s>\n", szKey); + // --------------------------------------------------------------------------------------- + // Init m_szKey = ( TCHAR * )szKey; @@ -68,6 +76,11 @@ ConfVar::ConfVar( const TCHAR * szKey, ConfMode mode ) // Register if( !conf_map ) conf_map = new map; conf_map->insert( pair( m_szKey, this ) ); + + // --------------------------------------------------------------------------------------- + //wprintf("ConfVar::ConfVar(const TCHAR) > Insert <%s>\n", ConfVar::m_szKey); + // --------------------------------------------------------------------------------------- + } @@ -82,6 +95,8 @@ ConfVar::~ConfVar() +// ======================================================================================= +// The line name is collected in ConfVar, then ConfBool gets the boolean //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// @@ -89,11 +104,16 @@ ConfBool::ConfBool( bool * pbData, TCHAR * szKey, ConfMode mode, bool bDefault ) { // MessageBox( 0, TEXT( "no const @ ConfBool" ), TEXT( "" ), 0 ); + // --------------------------------------------------------------------------------------- + wprintf("ConfBool(TCHAR) > Get <%s>\n", szKey); + // --------------------------------------------------------------------------------------- + m_pbData = pbData; m_bDefault = bDefault; // *pbData = bDefault; } +// ======================================================================================= @@ -102,6 +122,10 @@ ConfBool::ConfBool( bool * pbData, TCHAR * szKey, ConfMode mode, bool bDefault ) //////////////////////////////////////////////////////////////////////////////// ConfBool::ConfBool( bool * pbData, const TCHAR * szKey, ConfMode mode, bool bDefault ) : ConfVar( szKey, mode ) { + // --------------------------------------------------------------------------------------- + wprintf("ConfBool(TCHAR) > Get <%s>\n", szKey); + // --------------------------------------------------------------------------------------- + m_pbData = pbData; m_bDefault = bDefault; @@ -115,6 +139,8 @@ ConfBool::ConfBool( bool * pbData, const TCHAR * szKey, ConfMode mode, bool bDef //////////////////////////////////////////////////////////////////////////////// void ConfBool::Read() { + wprintf("ConfBool::Read() > Begin and \n", m_bRead, szIniPath); + if( m_bRead || !szIniPath ) return; *m_pbData = ( GetPrivateProfileInt( SECTION, m_szKey, ( int )m_bDefault, szIniPath ) != 0 ); @@ -493,22 +519,31 @@ ConfString::ConfString( TCHAR * szData, const TCHAR * szKey, ConfMode mode, TCHA //////////////////////////////////////////////////////////////////////////////// void ConfString::Read() { + wprintf( "ConfString::Read() > Begin\n"); + if( m_bRead || !szIniPath ) return; GetPrivateProfileString( SECTION, m_szKey, m_szDefault, m_szData, m_iMaxLen, szIniPath ); + + wprintf( "ConfString::Read() > GetPrivateProfileString <%s> <%s> <%s>\n", m_szKey, m_szData, szIniPath); + m_bRead = true; } - +// ======================================================================================= +// I don't use this //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// void ConfString::Write() { + /* WritePrivateProfileString( SECTION, m_szKey, m_szData, szIniPath ); m_bRead = true; -} + */ +} +// ======================================================================================= @@ -531,7 +566,9 @@ ConfCurDir::ConfCurDir( TCHAR * szData, const TCHAR * szKey ) : ConfString( szDa } - +// ======================================================================================= +// MAJOR FUNCTION: This changes the relative path for the whole application +// ======================================================================================= //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// @@ -542,9 +579,12 @@ void ConfCurDir::Read() // MessageBox( 0, m_szData, TEXT( "CurDir" ), 0 ); // Apply - SetCurrentDirectory( m_szData ); -} + //SetCurrentDirectory( m_szData ); + wprintf("ConfCurDir::Read > End <%s>\n", m_szData); +} +// ======================================================================================= +// ======================================================================================= //////////////////////////////////////////////////////////////////////////////// @@ -556,6 +596,7 @@ void ConfCurDir::Write() GetCurrentDirectory( MAX_PATH, m_szData ); // Note: without trailing slash // MessageBox( 0, m_szData, TEXT( "CurDir" ), 0 ); + //wprintf("ConfCurDir::Read <%s>\n", m_szData); ConfString::Write(); } @@ -565,10 +606,12 @@ void ConfCurDir::Write() //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// -void Conf::Init( HINSTANCE hInstance ) +void Conf::Init() { if( szIniPath ) return; + // ======================================================================================= + // Find the right ini file // Long filename szIniPath = new TCHAR[ _MAX_PATH ]; @@ -578,40 +621,65 @@ void Conf::Init( HINSTANCE hInstance ) TCHAR szDir[ _MAX_DIR ] = TEXT( "" ); - GetModuleFileName( hInstance, szFull, _MAX_PATH ); + // --------------------------------------------------------------------------------------- + // We place the full path in szFull + //GetModuleFileName( hInstance, szFull, _MAX_PATH ); + GetModuleFileName( NULL, szFull, _MAX_PATH ); // No don't use that + // --------------------------------------------------------------------------------------- _tsplitpath( szFull, szDrive, szDir, NULL, NULL ); - + // Convert short to long path GetLongPathName( szDir, szDir, _MAX_DIR ); + + // --------------------------------------------------------------------------------------- + // We place information about the file in fd + // --------------------------------------------------------------------------------------- // Convert short to long file WIN32_FIND_DATA fd; HANDLE h = FindFirstFile( szFull, &fd ); - + // --------------------------------------------------------------------------------------- + + // --------------------------------------------------------------------------------------- + // Convert File.exe to File.ini + // --------------------------------------------------------------------------------------- // Search last dot TCHAR * szSearch = fd.cFileName + _tcslen( fd.cFileName ) - 1; while( ( *szSearch != TEXT( '.' ) ) && ( szSearch > fd.cFileName ) ) { szSearch--; } - + // --------------------------------------------------------------------------------------- // Replace extension _tcscpy( szSearch, TEXT( ".ini" ) ); + // --------------------------------------------------------------------------------------- // Copy full filename - _sntprintf( szIniPath, _MAX_PATH, TEXT( "%s%s%s" ), szDrive, szDir, fd.cFileName ); + //_sntprintf( szIniPath, _MAX_PATH, TEXT( "%s%s%s" ), szDrive, szDir, fd.cFileName ); + _sntprintf( szIniPath, _MAX_PATH, TEXT( "%s%s%s" ), szDrive, szDir, TEXT( "Plainamp.ini" ) ); + + wprintf("DLL > We got the ini path <%s>\n", szIniPath); + // ======================================================================================= - - // Read all + // --------------------------------------------------------------------------------------- + // Read all settings in it + // --------------------------------------------------------------------------------------- + // Read all (original comment) map::iterator iter = conf_map->begin(); + + // ======================================================================================= + // *** Something changes the API relative paths here while( iter != conf_map->end() ) { - iter->second->Read(); - iter++; + iter->second->Read(); // *** This changes the relative path + iter++; } + // ======================================================================================= + // --------------------------------------------------------------------------------------- + } diff --git a/Branches/MusicMod/Player/Src/Config.h b/Branches/MusicMod/Player/Src/Config.h index 30f4c2bae3..c139c120af 100644 --- a/Branches/MusicMod/Player/Src/Config.h +++ b/Branches/MusicMod/Player/Src/Config.h @@ -22,7 +22,8 @@ namespace Conf { - void Init( HINSTANCE hInstance ); + //void Init( HINSTANCE hInstance ); + void Init( ); void Write(); }; @@ -71,7 +72,9 @@ protected: private: bool m_bCopyKey; ///< Keyname is copy (has to be freed on destruction) - friend void Conf::Init( HINSTANCE hInstance ); + //friend void Conf::Init( HINSTANCE hInstance ); + friend void Conf::Init( ); + friend void Conf::Write(); }; diff --git a/Branches/MusicMod/Player/Src/Console.h b/Branches/MusicMod/Player/Src/Console.h index 6c7ae14914..28386af265 100644 --- a/Branches/MusicMod/Player/Src/Console.h +++ b/Branches/MusicMod/Player/Src/Console.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_CONSOLE_H diff --git a/Branches/MusicMod/Player/Src/DspPlugin.cpp b/Branches/MusicMod/Player/Src/DspPlugin.cpp index e7073cda50..40988eb8c8 100644 --- a/Branches/MusicMod/Player/Src/DspPlugin.cpp +++ b/Branches/MusicMod/Player/Src/DspPlugin.cpp @@ -145,6 +145,7 @@ bool DspPlugin::Unload() _stprintf( szBuffer, TEXT( "Unloading <%s>" ), GetFilename() ); Console::Append( szBuffer ); Console::Append( TEXT( " " ) ); + printf( ">>>Unloading <%s>\n" , GetFilename() ); header = NULL; diff --git a/Branches/MusicMod/Player/Src/Emabox/Emabox.h b/Branches/MusicMod/Player/Src/Emabox/Emabox.h index 28c27d8eb2..873ec62f0c 100644 --- a/Branches/MusicMod/Player/Src/Emabox/Emabox.h +++ b/Branches/MusicMod/Player/Src/Emabox/Emabox.h @@ -17,7 +17,10 @@ #include #include - +// ======================================================================================= +// Global declarations +#include "../Global.h" +// ======================================================================================= /* == TYPE ============================================================================= diff --git a/Branches/MusicMod/Player/Src/GenPlugin.cpp b/Branches/MusicMod/Player/Src/GenPlugin.cpp index 53b3d68448..8856229bbe 100644 --- a/Branches/MusicMod/Player/Src/GenPlugin.cpp +++ b/Branches/MusicMod/Player/Src/GenPlugin.cpp @@ -151,6 +151,7 @@ bool GenPlugin::Unload() _stprintf( szBuffer, TEXT( "Unloading <%s>" ), GetFilename() ); Console::Append( szBuffer ); Console::Append( TEXT( " " ) ); + printf( ">>>Unloading <%s>\n" , GetFilename() ); // Quit diff --git a/Branches/MusicMod/Player/Src/Global.h b/Branches/MusicMod/Player/Src/Global.h index 5ac169e1f8..80bdb9a6a6 100644 --- a/Branches/MusicMod/Player/Src/Global.h +++ b/Branches/MusicMod/Player/Src/Global.h @@ -1,15 +1,46 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////////////////// +// Include +// ŻŻŻŻŻŻŻŻŻŻ +#include "../../Common/Src/Console.h" // Local common +///////////////////////// + + +////////////////////////////////////////////////////////////////////////////////////////// +// Declarations and definitions +// ŻŻŻŻŻŻŻŻŻŻ + +// This will build Plainamp without the GUI +#define NOGUI + + +// ======================================================================================= +// Because there are undefined in 64 bit it's easy to redefine them in case we use 64 bit +// --------------------- +#ifdef _M_X64 + #define GWL_WNDPROC (-4) + #define GetWindowLong GetWindowLongPtrA // or GetWindowLongPtr +#endif +// ======================================================================================= + +//////////////////////////////////// + + +// ======================================================================================= +// Back to Plainamp code +// --------------------- #ifndef PA_GLOBAL_H #define PA_GLOBAL_H @@ -115,3 +146,4 @@ struct TextCompare #endif // PA_GLOBAL_H + diff --git a/Branches/MusicMod/Player/Src/Input.cpp b/Branches/MusicMod/Player/Src/Input.cpp index 35b42ea692..9054b3d86f 100644 --- a/Branches/MusicMod/Player/Src/Input.cpp +++ b/Branches/MusicMod/Player/Src/Input.cpp @@ -25,7 +25,9 @@ #include "kiss_fft/kiss_fftr.h" */ -#include "fftw3/fftw3.h" +// ======================================================================================= +//#include "fftw3/fftw3.h" +// ======================================================================================= #include @@ -234,7 +236,8 @@ void VSAAddPCMData( void * PCMData, int nch, int bps, int timestamp ) // TODO: Much to optimize! - + // ======================================================================================= + /* // Spectrum static unsigned char spec_left[ 576 ]; static unsigned char spec_right[ 576 ]; @@ -311,10 +314,13 @@ void VSAAddPCMData( void * PCMData, int nch, int bps, int timestamp ) } VisCache::PutSpecRight( spec_right ); } - + // ======================================================================================= + */ // Cleanup FFT - fftw_destroy_plan( p ); + // ======================================================================================= + //fftw_destroy_plan( p ); + // ======================================================================================= // fftw_free(in); // fftw_free(out); diff --git a/Branches/MusicMod/Player/Src/Input.h b/Branches/MusicMod/Player/Src/Input.h index ff181474f6..f139df901f 100644 --- a/Branches/MusicMod/Player/Src/Input.h +++ b/Branches/MusicMod/Player/Src/Input.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "Global.h" diff --git a/Branches/MusicMod/Player/Src/InputPlugin.cpp b/Branches/MusicMod/Player/Src/InputPlugin.cpp index d6daa31cfe..649b0aa17c 100644 --- a/Branches/MusicMod/Player/Src/InputPlugin.cpp +++ b/Branches/MusicMod/Player/Src/InputPlugin.cpp @@ -9,6 +9,9 @@ // See GPL.txt for details. Any non-GPL usage is strictly forbidden. //////////////////////////////////////////////////////////////////////////////// +// ======================================================================================= +#include "Global.h" +// ======================================================================================= #include "InputPlugin.h" #include "Console.h" @@ -24,9 +27,8 @@ InputPlugin * active_input_plugin = NULL; // extern -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// +// ======================================================================================= +// The InputPlugin class is inherited from the Plugin class InputPlugin::InputPlugin( TCHAR * szDllpath, bool bKeepLoaded ) : Plugin( szDllpath ) { iHookerIndex = -1; @@ -35,6 +37,8 @@ InputPlugin::InputPlugin( TCHAR * szDllpath, bool bKeepLoaded ) : Plugin( szDllp iFiltersLen = 0; plugin = NULL; + wprintf("\InputPlugin::InputPlugin > Begin\n"); + if( !Load() ) { return; @@ -65,6 +69,8 @@ InputPlugin::~InputPlugin() //////////////////////////////////////////////////////////////////////////////// bool InputPlugin::Load() { + printf("InputPlugin::Load() was called. IsLoaded: %i\n", IsLoaded()); + if( IsLoaded() ) return true; @@ -144,13 +150,15 @@ bool InputPlugin::Load() } - +#ifdef NOGUI + printf( "Loading <%s>, %s\n" , GetFilename(), szName ); +#else TCHAR szBuffer[ 5000 ]; _stprintf( szBuffer, TEXT( "Loading <%s>, %s" ), GetFilename(), szName ); Console::Append( szBuffer ); +#endif - - Integrate(); + Integrate(); // This function is just below // Note: Plugins that use a wndproc hook need @@ -226,10 +234,15 @@ bool InputPlugin::Integrate() // Append filter name ToTchar( walk_out, start_display, len_display ); + +// ======================================================================================= +// Print used filetypes TCHAR szBuffer[ 5000 ]; *(walk_out + len_display) = TEXT( '\0' ); _stprintf( szBuffer, TEXT( " %s" ), walk_out ); Console::Append( szBuffer ); + //printf( szBuffer, TEXT( " %s\n" ), walk_out ); +// ======================================================================================= walk_out += len_display; // Convert and append extensions @@ -312,6 +325,7 @@ bool InputPlugin::Unload() _stprintf( szBuffer, TEXT( "Unloading <%s>" ), GetFilename() ); Console::Append( szBuffer ); Console::Append( TEXT( " " ) ); + printf( ">>>Unloading <%s>\n" , GetFilename() ); // Quit if( plugin ) diff --git a/Branches/MusicMod/Player/Src/InputPlugin.h b/Branches/MusicMod/Player/Src/InputPlugin.h index 83e93d511a..2702fbe767 100644 --- a/Branches/MusicMod/Player/Src/InputPlugin.h +++ b/Branches/MusicMod/Player/Src/InputPlugin.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_INPUT_PLUGIN_H @@ -60,10 +60,12 @@ public: bool About( HWND hParent ); bool Config( HWND hParent ); + In_Module * plugin; // I moved this from private to public + private: TCHAR * szFilters; int iFiltersLen; - In_Module * plugin; + bool Integrate(); bool DisIntegrate(); @@ -75,7 +77,7 @@ private: friend bool Playback::Play(); friend bool Playback::Pause(); friend bool Playback::Stop(); - friend bool Playback::UpdateSeek(); + friend bool Playback::UpdateSeek(); // this one calls some plugin-> members friend int Playback::PercentToMs( float fPercent ); friend bool Playback::SeekPercent( float fPercent ); friend bool SeekRelative( int ms ); diff --git a/Branches/MusicMod/Player/Src/Main.cpp b/Branches/MusicMod/Player/Src/Main.cpp index 813bbeb359..afdc1e81fd 100644 --- a/Branches/MusicMod/Player/Src/Main.cpp +++ b/Branches/MusicMod/Player/Src/Main.cpp @@ -10,6 +10,19 @@ //////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +// Documentation +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + +/* ---- The Seekbar ---- + Rebar.cpp handle the progress (playback position) bar. WndprocMain() is called every + second during playback. And several times a second when the cursor is moving over the + main window. If WM_TIMER called WndprocMain it calls Playback::UpdateSeek(); */ + + +/////////////////////////////////// + + #include "Main.h" #include "GlobalVersion.h" #include "Playlist.h" @@ -30,7 +43,6 @@ #include "Config.h" #include - #define CLASSNAME_MAIN TEXT( "Winamp v1.x" ) #define MAIN_TITLE PLAINAMP_LONG_TITLE @@ -87,45 +99,68 @@ ConfBool cbMinimizeToTray( &bMinimizeToTray, TEXT( "MinimizeToTray" ), CONF_MODE //////////////////////////////////////////////////////////////////////////////// bool BuildMainWindow() { - // Register class - WNDCLASS wc = { - 0, // UINT style - WndprocMain, // WNDPROC lpfnWndProc - 0, // int cbClsExtra - 0, // int cbWndExtra - g_hInstance, // HINSTANCE hInstance - LoadIcon( g_hInstance, TEXT( "IDI_ICON1" ) ), // HICON hIcon - LoadCursor( NULL, IDC_ARROW ), // HCURSOR hCursor - ( HBRUSH )COLOR_WINDOW, // HBRUSH hbrBackground - NULL, // LPCTSTR lpszMenuName - CLASSNAME_MAIN // LPCTSTR lpszClassName - }; - - if( !RegisterClass( &wc ) ) return false; - - // Create window - WindowMain = CreateWindowEx( - WS_EX_WINDOWEDGE, // DWORD dwExStyle - CLASSNAME_MAIN, // LPCTSTR lpClassName - MAIN_TITLE, // LPCTSTR lpWindowName - WS_OVERLAPPED | // DWORD dwStyle -// WS_VISIBLE | // - WS_CLIPCHILDREN | // - WS_BORDER | // - WS_SYSMENU | // - WS_THICKFRAME | // - WS_MINIMIZEBOX | // - WS_MAXIMIZEBOX, // - rMainDefault.left, // int x - rMainDefault.top, // int y - rMainDefault.right - rMainDefault.left, // int nWidth - rMainDefault.bottom - rMainDefault.top, // int nHeight - NULL, // HWND hWndParent - NULL, // HMENU hMenu - g_hInstance, // HINSTANCE hInstance - NULL // LPVOID lpParam - ); + + //#ifndef NOGUI + + // ======================================================================================= + /* Disabling this window creation cause continuous "Error setting DirectSound cooperative level" + messages for some reason. So I leave it here for now. */ + + // Register class + WNDCLASS wc = { + 0, // UINT style + WndprocMain, // WNDPROC lpfnWndProc + 0, // int cbClsExtra + 0, // int cbWndExtra + g_hInstance, // HINSTANCE hInstance + LoadIcon( g_hInstance, TEXT( "IDI_ICON1" ) ), // HICON hIcon + LoadCursor( NULL, IDC_ARROW ), // HCURSOR hCursor + ( HBRUSH )COLOR_WINDOW, // HBRUSH hbrBackground + NULL, // LPCTSTR lpszMenuName + CLASSNAME_MAIN // LPCTSTR lpszClassName + }; + + if( !RegisterClass( &wc ) ) return false; + + + // Create WindowMain + WindowMain = CreateWindowEx( + WS_EX_WINDOWEDGE, // DWORD dwExStyle + CLASSNAME_MAIN, // LPCTSTR lpClassName + MAIN_TITLE, // LPCTSTR lpWindowName + WS_OVERLAPPED | // DWORD dwStyle + // WS_VISIBLE | // + WS_CLIPCHILDREN | // + WS_BORDER | // + WS_SYSMENU | // + WS_THICKFRAME | // + WS_MINIMIZEBOX | // + WS_MAXIMIZEBOX, // + rMainDefault.left, // int x + rMainDefault.top, // int y + rMainDefault.right - rMainDefault.left, // int nWidth + rMainDefault.bottom - rMainDefault.top, // int nHeight + NULL, // HWND hWndParent + NULL, // HMENU hMenu + g_hInstance, // HINSTANCE hInstance + NULL // LPVOID lpParam + ); + // ======================================================================================= + //#endif + + // ======================================================================================= + #ifdef NOGUI + + // If this is not called a crash occurs + PlaylistView::Create(); + + // We have now done what we wanted so we skip the rest of the file + return true; + + #else + // ======================================================================================= + if( !WindowMain ) { @@ -143,6 +178,7 @@ bool BuildMainWindow() HMENU playlist_menu = CreatePopupMenu(); HMENU windows_menu = CreatePopupMenu(); + // Plainamp AppendMenu( plainamp_menu, MF_STRING, WINAMP_OPTIONS_PREFS, TEXT( "Preferences \tCtrl+P" ) ); AppendMenu( plainamp_menu, MF_SEPARATOR | MF_DISABLED | MF_GRAYED, ( UINT_PTR )-1, NULL ); @@ -183,7 +219,7 @@ bool BuildMainWindow() SetMenu( WindowMain, main_menu ); -//////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// main_context_menu = CreatePopupMenu(); AppendMenu( main_context_menu, MF_STRING, WINAMP_HELP_ABOUT, TEXT( "Plainamp" ) ); @@ -205,10 +241,11 @@ bool BuildMainWindow() AppendMenu( main_context_menu, MF_STRING, PLAINAMP_TOGGLE_MANAGER, TEXT( "Plugin Manager" ) ); -/* + /* AppendMenu( main_context_menu, MF_STRING | MF_DISABLED | MF_GRAYED, MENU_MAIN_CONTEXT_MANAGER, TEXT( "Plugin Manager" ) ); AppendMenu( main_context_menu, MF_STRING | MF_DISABLED | MF_GRAYED, MENU_MAIN_CONTEXT_CONSOLE, TEXT( "Console" ) ); -*/ + */ + AppendMenu( main_context_menu, MF_SEPARATOR | MF_DISABLED | MF_GRAYED, ( UINT_PTR )-1, NULL ); opts_context_menu = CreatePopupMenu(); @@ -228,8 +265,14 @@ bool BuildMainWindow() AppendMenu( main_context_menu, MF_STRING, WINAMP_FILE_QUIT, TEXT( "Exit" ) ); - Toolbar::Create(); - BuildMainStatus(); + Toolbar::Create(); // This removes all buttons and status bars + //BuildMainStatus(); + + + // ======================================================================================= + // If this is not created a crash occurs + PlaylistView::Create(); + Playlist::Create(); @@ -237,6 +280,7 @@ bool BuildMainWindow() return true; +#endif } @@ -324,11 +368,22 @@ LRESULT CALLBACK WndprocMain( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) // Tool windows are hidden on minimize/re-shown on restore static bool bConsoleTodo = false; static bool bManagerTodo = false; - static bool bRemoveIcon = false; + #ifdef NOGUI + wprintf("DLL > Main.cpp:WndprocMain() was called. But nothing will be done. \n"); + #else + Console::Append( TEXT( "Main.cpp:WndprocMain was called" ) ); + #endif + + switch( message ) { + + #ifdef NOGUI + //printf(" > WndprocMain message: %i\n", message); + #else + case WM_SETFOCUS: // To re-"blue" SetFocus( WindowPlaylist ); @@ -336,8 +391,8 @@ LRESULT CALLBACK WndprocMain( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) case WM_CREATE: // Note: [WindowMain] is not valid yet but [hwnd] is! - Console::Create(); - PluginManager::Build(); + Console::Create(); // make the console window + PluginManager::Build(); // make the plugin window break; case WM_NOTIFY: @@ -496,7 +551,7 @@ LRESULT CALLBACK WndprocMain( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) } break; } - + case WM_SYSKEYDOWN: switch( wp ) // [Alt]+[...] { @@ -636,7 +691,9 @@ LRESULT CALLBACK WndprocMain( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) case WM_DESTROY: { + // ======================================================================================= // Save playlist + /* TCHAR * szPlaylistMind = new TCHAR[ iHomeDirLen + 12 + 1 ]; memcpy( szPlaylistMind, szHomeDir, iHomeDirLen * sizeof( TCHAR ) ); memcpy( szPlaylistMind + iHomeDirLen, TEXT( "Plainamp.m3u" ), 12 * sizeof( TCHAR ) ); @@ -645,7 +702,8 @@ LRESULT CALLBACK WndprocMain( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) Playlist::ExportPlaylistFile( szPlaylistMind ); delete [] szPlaylistMind; - + */ + // ======================================================================================= cwpcWinPlaceMain.TriggerCallback(); cwpcWinPlaceMain.RemoveCallback(); @@ -726,7 +784,7 @@ LRESULT CALLBACK WndprocMain( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) } } break; - + case TRAY_MSG: switch( lp ) { @@ -749,9 +807,10 @@ LRESULT CALLBACK WndprocMain( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) } return 0; - + #endif default: return WndprocWinamp( hwnd, message, wp, lp ); } return DefWindowProc( hwnd, message, wp, lp ); + } diff --git a/Branches/MusicMod/Player/Src/Main.h b/Branches/MusicMod/Player/Src/Main.h index 68fb4bbdee..c8a2b4309c 100644 --- a/Branches/MusicMod/Player/Src/Main.h +++ b/Branches/MusicMod/Player/Src/Main.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_MAIN_H @@ -42,7 +42,7 @@ extern HMENU main_context_menu; -bool BuildMainWindow(); +bool BuildMainWindow(); void About( HWND hParent ); LRESULT CALLBACK WndprocMain( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ); diff --git a/Branches/MusicMod/Player/Src/Output.cpp b/Branches/MusicMod/Player/Src/Output.cpp index d640c0e80d..8c20840dc9 100644 --- a/Branches/MusicMod/Player/Src/Output.cpp +++ b/Branches/MusicMod/Player/Src/Output.cpp @@ -256,10 +256,25 @@ int Output_Pause( int pause ) //////////////////////////////////////////////////////////////////////////////// void Output_SetVolume( int volume ) { - for( int i = 0; i < active_output_count; i++ ) + /* There was a call here with the volume value -666 that I could not see the source of, + so I added this check to see that we got a positive volume. */ + if(volume >= 0) { - active_output_plugins[ i ]->plugin->SetVolume( volume ); + // ======================================================================================= + // The volume goes from 0 to 255 + //TCHAR szBuffer[ 5000 ]; + //_stprintf( szBuffer, TEXT( "DLL > Output_SetVolume <%i>" ), volume ); + //Console::Append( szBuffer ); + //Console::Append( TEXT( " " ) ); + //wprintf( "DLL > Output_SetVolume <%i>\n", volume ); + // ======================================================================================= + + for( int i = 0; i < active_output_count; i++ ) + { + active_output_plugins[ i ]->plugin->SetVolume( volume ); + } } + } diff --git a/Branches/MusicMod/Player/Src/Output.h b/Branches/MusicMod/Player/Src/Output.h index f12803a873..21723f3e73 100644 --- a/Branches/MusicMod/Player/Src/Output.h +++ b/Branches/MusicMod/Player/Src/Output.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_OUTPUT_H diff --git a/Branches/MusicMod/Player/Src/OutputPlugin.cpp b/Branches/MusicMod/Player/Src/OutputPlugin.cpp index b58ce2b1a3..5276eb8481 100644 --- a/Branches/MusicMod/Player/Src/OutputPlugin.cpp +++ b/Branches/MusicMod/Player/Src/OutputPlugin.cpp @@ -42,11 +42,15 @@ OutputPlugin::OutputPlugin( TCHAR * szDllpath, bool bKeepLoaded ) : Plugin( szDl } //////////////////////////////////////////////////////////////////////////////// + // Quick hack!!! TCHAR * szBuffer = new TCHAR[ 500 ]; // NOT LOCAL!!! _stprintf( szBuffer, TEXT( "OutputPluginActive___%s" ), GetFilename() ); ConfBool * cbActive = new ConfBool( &bActive, szBuffer, CONF_MODE_INTERNAL, false ); cbActive->Read(); + printf("OutputPlugin > GetFilename() returned <%s>\n", szBuffer ); + + printf("OutputPlugin > We now have and \n", bActive, bKeepLoaded ); if( bActive ) { @@ -62,6 +66,7 @@ OutputPlugin::OutputPlugin( TCHAR * szDllpath, bool bKeepLoaded ) : Plugin( szDl // So out_ds keeps loaded for now. if( _tcscmp( GetFilename(), TEXT( "out_ds.dll" ) ) ) { + printf("OutputPlugin > Unload called from OutputPlugin::OutputPlugin\n"); Unload(); } } @@ -128,9 +133,15 @@ bool OutputPlugin::Load() _stprintf( szBuffer, TEXT( "Loading <%s>, %s" ), GetFilename(), szName ); Console::Append( szBuffer ); Console::Append( TEXT( " " ) ); + printf( ">>>Loading <%s>, %s\n" , GetFilename(), szName ); if( plugin->Init ) { + // We remove the WNDPROC things +#ifdef NOGUI + plugin->Init(); +#else + // Init const WNDPROC WndprocBefore = ( WNDPROC )GetWindowLong( WindowMain, GWL_WNDPROC ); plugin->Init(); @@ -150,6 +161,7 @@ bool OutputPlugin::Load() { Console::Append( TEXT( "Wndproc hook added (by plugin)" ) ); } +#endif } return true; @@ -169,6 +181,7 @@ bool OutputPlugin::Unload() _stprintf( szBuffer, TEXT( "Unloading <%s>" ), GetFilename() ); Console::Append( szBuffer ); Console::Append( TEXT( " " ) ); + printf( ">>>Unloading <%s>\n" , GetFilename() ); // Quit if( plugin ) @@ -235,6 +248,8 @@ bool OutputPlugin::Config( HWND hParent ) //////////////////////////////////////////////////////////////////////////////// bool OutputPlugin::Start() { + wprintf( "OutputPlugin::Start() > Begin \n" , IsLoaded(), bActive, active_output_count ); + if( !IsLoaded() ) return false; if( bActive ) return true; @@ -257,6 +272,7 @@ bool OutputPlugin::Start() _stprintf( szBuffer, TEXT( "Output plugin <%s> activated" ), GetFilename() ); Console::Append( szBuffer ); Console::Append( TEXT( " " ) ); + wprintf( "\n >>> OutputPlugin::Start() > Output plugin <%s> activated\n\n" , GetFilename() ); bActive = true; diff --git a/Branches/MusicMod/Player/Src/OutputPlugin.h b/Branches/MusicMod/Player/Src/OutputPlugin.h index fbbfce418a..6dc4ca0cb9 100644 --- a/Branches/MusicMod/Player/Src/OutputPlugin.h +++ b/Branches/MusicMod/Player/Src/OutputPlugin.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_OUTPUT_PLUGIN_H @@ -58,10 +58,12 @@ public: bool Start(); bool Stop(); + Out_Module * plugin; // Moved to public + private: bool bActive; int iArrayIndex; - Out_Module * plugin; + // TODO diff --git a/Branches/MusicMod/Player/Src/Playback.cpp b/Branches/MusicMod/Player/Src/Playback.cpp index 9ea3912d4a..36377a8afe 100644 --- a/Branches/MusicMod/Player/Src/Playback.cpp +++ b/Branches/MusicMod/Player/Src/Playback.cpp @@ -50,49 +50,70 @@ TCHAR * szCurrentFilename = NULL; //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// +// ======================================================================================= +// The timer that calls WndprocMain every second void EnableTimer( bool bEnabled ) { + // Return if the timer is already activated if( bEnabled == bTimerRunning ) return; if( bEnabled ) { SetTimer( WindowMain, TIMER_SEEK_UPDATE, 1000, NULL ); + wprintf( "EnableTimer > Activated\n" ); } else { KillTimer( WindowMain, TIMER_SEEK_UPDATE ); StatusReset(); + + wprintf( "EnableTimer > Killed\n" ); } bTimerRunning = bEnabled; } - +// ======================================================================================= //////////////////////////////////////////////////////////////////////////////// -/// +// //////////////////////////////////////////////////////////////////////////////// bool OpenPlay( TCHAR * szFilename, int iNumber ) { - // TODO: cleanup!!! - + // ======================================================================================= + #ifdef NOGUI + wprintf( "Playback.cpp: OpenPlay > Begin <%i> <%s>\n" , iNumber, szFilename ); + #else + TCHAR sszBuffer[ 5000 ]; + _stprintf( sszBuffer, TEXT( "Playback.cpp: OpenPlay was called <%i> <%s>" ), iNumber, szFilename ); + Console::Append( sszBuffer ); + #endif + // ======================================================================================= + + + // ======================================================================================= + // Get the right input plugin + // --------------------------------------------------------------------------------------- if( !szFilename ) return false; szCurrentFilename = szFilename; + // --------------------------------------------------------------------------------------- // TODO: non-file support - - // Get extension + // --------------------------------------------------------------------------------------- + // Get file extension const int iLen = ( int )_tcslen( szFilename ); TCHAR * walk = szFilename + iLen - 1; while( ( walk >= szFilename ) && ( *walk != TEXT( '.' ) ) ) walk--; walk++; + // --------------------------------------------------------------------------------------- const int iExtLen = ( int )_tcslen( walk ); TCHAR * szExt = new TCHAR[ iExtLen + 1 ]; memcpy( szExt, walk, iExtLen * sizeof( TCHAR ) ); szExt[ iExtLen ] = TEXT( '\0' ); - - // Get input plugin from extension map + + // --------------------------------------------------------------------------------------- + // Compare the extension to the supported extension by the current input plugins map ::iterator iter = ext_map.find( szExt ); delete [] szExt; @@ -100,11 +121,15 @@ bool OpenPlay( TCHAR * szFilename, int iNumber ) { Console::Append( TEXT( "ERROR: Extension not supported" ) ); Console::Append( " " ); + wprintf("OpenPlay > ERROR: Extension not supported\n"); return false; - } - - InputPlugin * old_input = active_input_plugin; + } + // --------------------------------------------------------------------------------------- + // Now that we know which input pugin to use we set that one as active + InputPlugin * old_input = active_input_plugin; // Save the last one, if any active_input_plugin = iter->second; + wprintf("OpenPlay > Input plugin '%s' activated\n", active_input_plugin->GetName()); + // ======================================================================================= if( old_input ) { @@ -120,17 +145,21 @@ bool OpenPlay( TCHAR * szFilename, int iNumber ) { Console::Append( TEXT( "ERROR: Input plugin is NULL" ) ); Console::Append( " " ); + wprintf("OpenPlay > ERROR: Input plugin is NULL\n"); return false; } // Connect + wprintf( "OpenPlay > OutMod\n" ); active_input_plugin->plugin->outMod = &output_server; // output->plugin; + // ======================================================================================= // Re-apply volume and panning - active_input_plugin->plugin->SetVolume( iCurVol ); - active_input_plugin->plugin->SetPan( iCurPan ); - Playback::Eq::Reapply(); - + //active_input_plugin->plugin->SetVolume( iCurVol ); + //active_input_plugin->plugin->SetPan( iCurPan ); + //Playback::Eq::Reapply(); + // ======================================================================================= + // Play #ifdef PA_UNICODE @@ -153,31 +182,43 @@ bool OpenPlay( TCHAR * szFilename, int iNumber ) active_input_plugin->plugin->Play( szTemp ); delete [] szTemp; -#else +#else + // ======================================================================================= + // Play the file + // --------------------------------------------------------------------------------------- // Title TCHAR szTitle[ 2000 ] = TEXT( "\0" ); int length_in_ms; + + wprintf( "OpenPlay > GetFileInfo\n" ); active_input_plugin->plugin->GetFileInfo( szFilename, szTitle, &length_in_ms ); + wprintf( "OpenPlay > Play\n" ); active_input_plugin->plugin->Play( szFilename ); + // ======================================================================================= #endif bPlaying = true; bPaused = false; - - // Title - TCHAR szBuffer[ 5000 ]; - _stprintf( szBuffer, TEXT( "%i. %s - Plainamp" ), iNumber, szTitle ); - SetWindowText( WindowMain, szBuffer ); -/* + // ======================================================================================= + // Title + + //TCHAR szBuffer[ 5000 ]; + //_stprintf( szBuffer, TEXT( "%i. %s - Plainamp" ), iNumber, szTitle ); + //SetWindowText( WindowMain, szBuffer ); + // ======================================================================================= + + /* TCHAR * szBasename = szFilename + uLen - 1; while( ( szBasename > szFilename ) && ( *szBasename != TEXT( '\\' ) ) ) szBasename--; szBasename++; -*/ + */ // Timer ON - EnableTimer( true ); + //EnableTimer( true ); + + wprintf( "OpenPlay > End\n" ); return true; } @@ -243,12 +284,23 @@ bool Playback::Prev() //////////////////////////////////////////////////////////////////////////////// -/// +// Play the file //////////////////////////////////////////////////////////////////////////////// bool Playback::Play() { static int iLastIndex = -1; - if( bPlaying ) + + // --------------------------------------------------------------------------------------- + + TCHAR sszBuffer[ 5000 ]; + _stprintf( sszBuffer, TEXT( "Playback::Play() with bPlaying <%i>\n" ), bPlaying ); + Console::Append( sszBuffer ); + Console::Append( TEXT( " " ) ); + wprintf( "Playback::Play() > Begin <%i>\n" , bPlaying ); + // --------------------------------------------------------------------------------------- + + // --------------------------------------------------------------------------------------- + if( bPlaying ) // If we are currently playing a file { if( !active_input_plugin ) return false; if( !active_input_plugin->plugin ) return false; @@ -256,14 +308,14 @@ bool Playback::Play() const int iIndex = playlist->GetCurIndex(); if( iIndex < 0 ) return false; -/* - TCHAR szBuffer[ 5000 ]; - _stprintf( szBuffer, TEXT( "OLD [%i] NEW [%i]" ), iLastIndex, iIndex ); - SetWindowText( WindowMain, szBuffer ); -*/ + /* + TCHAR szBuffer[ 5000 ]; + _stprintf( szBuffer, TEXT( "OLD [%i] NEW [%i]" ), iLastIndex, iIndex ); + SetWindowText( WindowMain, szBuffer ); + */ - // Same track/file as before? - TCHAR * szFilename = Playlist::GetFilename( iIndex ); + // If we are not playing the same track/file as before + TCHAR * szFilename = Playlist::GetFilename( iIndex ); if( szFilename != szCurrentFilename ) { // New track! @@ -272,7 +324,7 @@ bool Playback::Play() // NOT TWICE active_input_plugin->plugin->Stop(); // Timer OFF - EnableTimer( false ); + //EnableTimer( false ); // Get filename if( !szFilename ) @@ -297,7 +349,7 @@ bool Playback::Play() bPaused = false; // Timer ON - EnableTimer( true ); + //EnableTimer( true ); } else { @@ -306,13 +358,26 @@ bool Playback::Play() } } } - else + // ======================================================================================= + else // we are not currently playing { const int iIndex = playlist->GetCurIndex(); if( iIndex < 0 ) return false; // Get filename TCHAR * szFilename = Playlist::GetFilename( iIndex ); + + // ======================================================================================= + + + //bool bPlaying = false; + //TCHAR * szFilename = TEXT("C:\Files\Spel och spelfusk\Console\Gamecube\Code\vgmstream (isolate ast)\Music\demo36_02.ast"); + //bPlaying = OpenPlay( szFilename, 1 ); + //bPlaying = OpenPlay( szFilename, iIndex + 1 ); + //Console::Append( TEXT( "Playback.cpp:Playback::Play() called OpenPlay" ) ); + + // ======================================================================================= + if( !szFilename ) { Console::Append( TEXT( "ERROR: Could not resolve filename" ) ); @@ -320,6 +385,12 @@ bool Playback::Play() return false; } + TCHAR szBuffer[ 5000 ]; + _stprintf( szBuffer, TEXT( "Playback.cpp: Play() got the filename <%s>" ), szFilename); + Console::Append( szBuffer ); + // Console::Append( TEXT( " " ) ); + wprintf( "Playback::Play() > Filename <%s>\n", szFilename); + // Play iLastIndex = iIndex; bPlaying = OpenPlay( szFilename, iIndex + 1 ); @@ -327,7 +398,7 @@ bool Playback::Play() } return true; } - +// ======================================================================================= //////////////////////////////////////////////////////////////////////////////// @@ -346,7 +417,7 @@ bool Playback::Pause() bPaused = false; // Timer ON - EnableTimer( true ); + //EnableTimer( true ); } else { @@ -355,7 +426,7 @@ bool Playback::Pause() bPaused = true; // Timer OFF - EnableTimer( false ); + //EnableTimer( false ); } // Console::Append( TEXT( "Playback::Pause" ) ); @@ -371,21 +442,23 @@ bool Playback::Stop() { if( !bPlaying ) return false; + // --------------------------------------------------------------------------------------- // Stop if( active_input_plugin && active_input_plugin->plugin ) { active_input_plugin->plugin->Stop(); } active_input_plugin = NULL; // QUICK FIX + // --------------------------------------------------------------------------------------- bPlaying = false; bPaused = false; - // Timer OFF - EnableTimer( false ); + // Timer OFF > It was never turned on + //EnableTimer( false ); - // Reset seekbar - Playback::UpdateSeek(); + // Reset seekbar > We don't need this + //Playback::UpdateSeek(); return true; } @@ -425,15 +498,35 @@ bool Playback::IsPaused() //////////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////////////////////////////////////////// +//int getlength(); +//int getoutputtime(); + bool Playback::UpdateSeek() { +#ifdef NOGUI + printf( "Playback::UpdateSeek > Begin\n" ); + if( active_input_plugin ) + { + printf( "GetLength() > Begin\n" ); + const int ms_len = active_input_plugin->plugin->GetLength(); + //const int ms_cur = active_input_plugin->plugin->GetOutputTime(); + + //const int ms_len = getlength(); + //const int ms_cur = getoutputtime(); + + //printf( "Current position is <%i of %i>\n", ms_cur, ms_len ); + } + return true; +#else static bool bSliderEnabledBefore = false; bool bSliderEnabledAfter; - - if( !WindowSeek ) return false; + + + //if( !WindowSeek ) return false; int iVal = 0; + // If it has not been set if( !active_input_plugin || !active_input_plugin->plugin ) { if( bSliderEnabledBefore ) @@ -455,8 +548,18 @@ bool Playback::UpdateSeek() iVal = ( ms_cur * 1000 ) / ms_len; if( iVal > 1000 ) iVal = 0; + +// ======================================================================================= +//TCHAR szBuffer[ 5000 ]; +//_stprintf( szBuffer, TEXT( "Current position is <%i of %i>" ), ms_cur, ms_len ); +//Console::Append( szBuffer ); +//Console::Append( TEXT( " " ) ); +printf( "Current position is <%i of %i>\n", ms_cur, ms_len ); +// ======================================================================================= } + + if( !bSliderEnabledBefore ) { EnableWindow( WindowSeek, TRUE ); @@ -468,6 +571,7 @@ bool Playback::UpdateSeek() } return true; +#endif } diff --git a/Branches/MusicMod/Player/Src/Playback.h b/Branches/MusicMod/Player/Src/Playback.h index 86c3f11cb3..558b191d1d 100644 --- a/Branches/MusicMod/Player/Src/Playback.h +++ b/Branches/MusicMod/Player/Src/Playback.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_PLAYBACK_H diff --git a/Branches/MusicMod/Player/Src/Player.cpp b/Branches/MusicMod/Player/Src/Player.cpp new file mode 100644 index 0000000000..d124e3fae1 --- /dev/null +++ b/Branches/MusicMod/Player/Src/Player.cpp @@ -0,0 +1,408 @@ +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Usage instructions +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + +// ======================================================================================= +// Plugins +// --------------------------------------------------------------------------------------- +// Plainamp setup > The output plugin must be manually loaded and activated the first time it's used. +// After that the ini saves OutputPluginActive___out_wave_gpl.dll=1. Input plugins are automatically +// found, loaded and activated. +// ======================================================================================= + + +// ======================================================================================= +// The ini path szIniPath +// --------------------------------------------------------------------------------------- +/* We will get problems if the program can't find the ini settings. Plugins will not be loaded, + or loadedand then unloaded before activated, or not working. */ +// ======================================================================================= + +/////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Include +// ŻŻŻŻŻŻŻŻŻŻ +#include +//#include "Unicode.h" +//#include "Output.h" +#include +#include + +#include "Global.h" // Local +#include "Font.h" +#include "InputPlugin.h" +#include "OutputPlugin.h" +#include "VisPlugin.h" +#include "DspPlugin.h" +#include "GenPlugin.h" +#include "Main.h" +#include "Rebar.h" +#include "Playlist.h" +#include "Status.h" +#include "PluginManager.h" +#include "Prefs.h" +#include "Config.h" +#include "Emabox/Emabox.h" +#include "Console.h" + +#include "PlayerExport.h" // DLL Player +///////////////////////// + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Declarations and definitions +// ŻŻŻŻŻŻŻŻŻŻ + + +// ------------------------- +// Keys +// --------- +#define PLUS_ALT ( FVIRTKEY | FALT ) +#define PLUS_CONTROL ( FVIRTKEY | FCONTROL ) +#define PLUS_CONTROL_ALT ( FVIRTKEY | FCONTROL | FALT ) +#define PLUS_CONTROL_SHIFT ( FVIRTKEY | FCONTROL | FSHIFT ) +#define PLUS_SHIFT ( FVIRTKEY | FSHIFT ) +// ------------- + + +HINSTANCE g_hInstance = NULL; // extern +HINSTANCE hInstance = NULL; // extern + +TCHAR * szHomeDir = NULL; // extern +int iHomeDirLen = 0; // extern + +TCHAR * szPluginDir = NULL; // extern +int iPluginDirLen = 0; // extern + + +// ------------------------- +/* Read global settings from the ini file. They are read from the ini file through Config.h. + Usage: ( &where to place it, the option name, public or private, default value) */ +// --------- +TCHAR szCurDir[ MAX_PATH + 1 ] = TEXT( "" ); +ConfCurDir ccdCurDir( szCurDir, TEXT( "CurDir" ) ); +// ------------------------- + +bool bWarnPluginsMissing; +ConfBool cbWarnPluginsMissing( &bWarnPluginsMissing, TEXT( "WarnPluginsMissing" ), CONF_MODE_PUBLIC, false ); + +bool bLoop; +ConfBool cbLoop( &bLoop, TEXT( "Loop" ), CONF_MODE_PUBLIC, false ); +///////////////////////// + + + + +//////////////////////////////////////////////////////////////////////////////// +// +//////////////////////////////////////////////////////////////////////////////// +//int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow ) +void Player_Main(bool Console) +{ + // ======================================================================================= + // Set variables + //g_hInstance = hInstance; + // ======================================================================================= + + //printf( "DLL > main_dll() opened\n" ); + + if (Console) Player_Console(true); + + //MessageBox(0, "main() opened", "", 0); + //printf( "main() opened\n" ); + wprintf( "DLL > main_dll() > Begin\n" ); + + + // ======================================================================================= + // Load full config from ini file + //Conf::Init( hInstance ); + Conf::Init( ); + + // --------------------------------------------------------------------------------------- + wprintf( "DLL > bLoop <%i>\n", bLoop); + wprintf( "DLL > bWarnPluginsMissing <%i>\n", bWarnPluginsMissing); + // --------------------------------------------------------------------------------------- + + // ======================================================================================= + + + // ======================================================================================= + /* Get home dir. We use the TCHAR type for the dirname to insure us against foreign letters + in the dirnames */ + szHomeDir = new TCHAR[ MAX_PATH + 1 ]; + iHomeDirLen = GetModuleFileName( NULL, szHomeDir, MAX_PATH ); + //if( !iHomeDirLen ) return 1; + + // --------------------------------------------------------------------------------------- + // Walk through the pathname and look for backslashes + TCHAR * walk = szHomeDir + iHomeDirLen - 1; + while( ( walk > szHomeDir ) && ( *walk != TEXT( '\\' ) ) ) walk--; + // --------------------------------------------------------------------------------------- + + walk++; + *walk = TEXT( '\0' ); + iHomeDirLen = walk - szHomeDir; + // ======================================================================================= + + + // ======================================================================================= + /* Get plugins dir. Notice to change the number 8 in two places below if the dir name + is changed */ + szPluginDir = new TCHAR[ MAX_PATH + 1 ]; + memcpy( szPluginDir, szHomeDir, iHomeDirLen * sizeof( TCHAR ) ); + memcpy( szPluginDir + iHomeDirLen, TEXT( "PluginsMusic" ), 12 * sizeof( TCHAR ) ); + szPluginDir[ iHomeDirLen + 12 ] = TEXT( '\0' ); + wprintf("DLL > Plugindir: %s\n\n", szPluginDir); + // ======================================================================================= + #ifndef NOGUI + Font::Create(); + //Console::Append( TEXT( "Winmain.cpp called Font::Create()" ) ); + #endif + + // ======================================================================================= + // The only thing this function currently does is creating the Playlist. + // ======================================================================================= + BuildMainWindow(); + + //addfiletoplaylist("c:\\zelda\\demo37_01.ast"); + //addfiletoplaylist("c:\\zelda\\demo36_02.ast"); + //Console::Append( TEXT( "Winmain.cpp called BuildMainWindow()" ) ); + + //Prefs::Create(); // This creates windows preferences + //Console::Append( TEXT( "Winmain.cpp called Prefs::Create()" ) ); + + // Show window + + Plugin::FindAll ( szPluginDir, TEXT( "in_*.dll" ), true ); + Plugin::FindAll( szPluginDir, TEXT( "out_*.dll" ), false ); + Plugin::FindAll ( szPluginDir, TEXT( "vis_*.dll" ), false ); + Plugin::FindAll ( szPluginDir, TEXT( "dsp_*.dll" ), false ); + Plugin::FindAll ( szPluginDir, TEXT( "gen_*.dll" ), true ); + + PluginManager::Fill(); + + wprintf( "Winmain.cpp > PluginManager::Fill()\n" ); + + // --------------------------------------------------------------------------------------- + // Set volume. This must probably be done after the dll is loaded. + GlobalVolume = Playback::Volume::Get(); + GlobalCurrentVolume = GlobalVolume; + Output_SetVolume( GlobalVolume ); + wprintf("\n >>> Volume(%i)\n\n", GlobalVolume); + // --------------------------------------------------------------------------------------- + + + // ======================================================================================= + + // Check plugin presence + // ======================================================================================= + + + // ======================================================================================= + + // Todo: all the rest... + // ACCEL accels[] = { + + // ======================================================================================= + + + + // ======================================================================================= + + //Playback::Play(); + //play_file("C:\\opening.hps"); + //play_file("C:\\Files\\Spel och spelfusk\\Console\\Gamecube\\Code\\Dolphin\\Binary\\win32\\evt_x_event_00.dsp"); + //printf("Winmain.cpp called Playback.cpp:Playback::Play()\n"); + + // ======================================================================================= + // ---- Set volume and get current location ---- + // Somehow we don't have access to active_input_plugin->plugin->GetLength() from here so + // we have to call it in Playback::UpdateSeek() instead + //Sleep(1000); + + //Playback::UpdateSeek(); + //Output_SetVolume( 100 ); // volume is better set from the ini file + // --------------------------------------------------------------------------------------- + // ======================================================================================= + + + // ======================================================================================= + // Check the plugins + if( input_plugins.empty() ) + { + wprintf("\n***Warning: The input plugin is not working\n\n"); + } + + if( !active_input_plugin || !active_input_plugin->plugin ) + { + wprintf("The input plugin is not activated yet\n"); + } + else + { + //const int ms_len = active_input_plugin->plugin->GetLength(); + //const int ms_cur = active_input_plugin->plugin->GetOutputTime(); + //wprintf("We are at <%i of %i>\n", ms_cur, ms_len); + } + // --------------------------------------------------------------------------------------- + if( active_output_count > 0 ) + { + // Minimum + int res_temp; + for( int i = 0; i < active_output_count; i++ ) + { + res_temp = active_output_plugins[ i ]->plugin->GetOutputTime(); + } + wprintf("Playback progress <%i>\n", res_temp); + } + else + { + wprintf("\n***Warning: The output plugin is not working\n\n"); + } + // ======================================================================================= + + + // ======================================================================================= + // Current playlist items + wprintf("Size & index <%i> <%i>\n", playlist->GetSize(), playlist->GetCurIndex()); + // ======================================================================================= + + + // ======================================================================================= + //This worked + //Sleep(2000); + //Playback::Stop(); + //playlist->RemoveAll(); + //play_file("C:\\demo36_02.ast"); + // ======================================================================================= + + // ======================================================================================= + // Current playlist items + wprintf("Size & index <%i> <%i>\n", playlist->GetSize(), playlist->GetCurIndex()); + // ======================================================================================= + + + // ======================================================================================= + // This worked + //Sleep(5000); + //Playback::Stop(); + //Playback::Play(); + // ======================================================================================= + + + // ======================================================================================= + + //bool bPlaying = false; + //TCHAR * szFilename = TEXT("C:\Files\Spel och spelfusk\Console\Gamecube\Code\vgmstream (isolate ast)\Music\demo36_02.ast"); + + //bPlaying = OpenPlay( szFilename, 1 ); + //bPlaying = OpenPlay( szFilename, iIndex + 1 ); + //Console::Append( TEXT( "Playback.cpp:Playback::Play() called OpenPlay" ) ); + + // ======================================================================================= + + + // ======================================================================================= + // Start the timer + if(!TimerCreated && bLoop) // Only create this the first time + { + wprintf("Created the timer\n"); + MakeTime(); + TimerCreated = true; + } + // ======================================================================================= + + wprintf( "DLL > main_dll() > End\n\n\n" ); + + //std::cin.get(); +} + + + + + + +// ======================================================================================= +// Should I use this? +void close() +{ + + printf( "The Winmain.cpp message loop was reached\n" ); + + // Message loop + //std::cin.get(); + + Playback::Stop(); // If we don't call this before we unload the dll we get a crash + + printf("We are now past the message loop\n" ); + + //DestroyAcceleratorTable( hAccel ); + + + // ======================================================================================= + // Input + vector ::iterator iter_input = input_plugins.begin(); + while( iter_input != input_plugins.end() ) + { + ( *iter_input )->Unload(); + iter_input++; + } + + // Output + vector ::iterator iter_output = output_plugins.begin(); + while( iter_output != output_plugins.end() ) + { + ( *iter_output )->Unload(); + iter_output++; + } + + // General + vector ::iterator iter_gen = gen_plugins.begin(); + while( iter_gen != gen_plugins.end() ) + { + ( *iter_gen )->Unload(); + iter_gen++; + } + // ======================================================================================= + + + // TODO: create main::destroy + // UnregisterClass( PA_CLASSNAME, g_hInstance ); + + //Prefs::Destroy(); + + //Font::Destroy(); + +/* + delete [] szPluginDir; + delete [] szHomeDir; +*/ + + // --------------------------------------------------------------------------------------- + // We don't save any changes + //Conf::Write(); + + //printf("Winmain.cpp called Conf::Write(), the last function\n"); + // --------------------------------------------------------------------------------------- + + //std::cin.get(); // Let use see all messages + + //return 0; +} +// ======================================================================================= \ No newline at end of file diff --git a/Branches/MusicMod/Player/Src/PlayerExport.cpp b/Branches/MusicMod/Player/Src/PlayerExport.cpp new file mode 100644 index 0000000000..52954bd723 --- /dev/null +++ b/Branches/MusicMod/Player/Src/PlayerExport.cpp @@ -0,0 +1,162 @@ + +////////////////////////////////////////////////////////////////////////////////////////// +// Include +// ŻŻŻŻŻŻŻŻŻŻ +#include // System + +#include "../../Common/Src/Console.h" // Local common + +#include "OutputPlugin.h" // Local +#include "Playback.h" +#include "Playlist.h" + +#define _DLL_PLAYER_H_ +#include "PlayerExport.h" // DLL Player +////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////////////////// +// Declarations and definitions +// ŻŻŻŻŻŻŻŻŻŻ +std::string CurrentlyPlayingFile; +int GlobalVolume; +int GlobalCurrentVolume; +bool GlobalPause; +bool TimerCreated = false; +bool Initialized = false; +///////////////////////////////// + + +// ------------------------- +/* We keep the file in the playlist, even though we currently only every have one file here + at a time */ +// --------- +void AddFileToPlaylist(char * a) +{ + //playlist->RemoveAll(); + + #include "unicode.h" + const int iLen = strlen(a); // I can't do this because I don't + + printf( "iLen <%i>\n", iLen ); + + // --------------------------------------------------------------------------------------- + // Do some string conversion + TCHAR * szKeep; + szKeep = new TCHAR[ iLen + 1 ]; + ToTchar( szKeep, a, iLen ); + szKeep[ iLen ] = TEXT( '\0' ); + playlist->PushBack( szKeep ); + // --------------------------------------------------------------------------------------- + + // If we added a second file the current index = -1 so we have to change that back + playlist->SetCurIndex( 0 ); +} + + + +void Player_Play(char * FileName) +{ + wprintf("Play file <%s>\n", FileName); + + // Check if the file exists + if(GetFileAttributes(FileName) == INVALID_FILE_ATTRIBUTES) + { + wprintf("Warning: The file <%s> does not exist. Something is wrong.\n", FileName); + return; + } + + Playback::Stop(); + //wprintf("Stop\n"); + playlist->RemoveAll(); + //wprintf("RemoveAll\n"); + AddFileToPlaylist(FileName); + //wprintf("addfiletoplaylist\n"); + + // Play the file + Playback::Play(); + + CurrentlyPlayingFile = FileName; + + // --------------------------------------------------------------------------------------- + // Set volume. This must probably be done after the dll is loaded. + //Output_SetVolume( Playback::Volume::Get() ); + //wprintf("Volume(%i)\n", Playback::Volume::Get()); + // --------------------------------------------------------------------------------------- + + GlobalPause = false; +} + +void Player_Pause() +{ + if (!GlobalPause) + { + wprintf("DLL > Pause\n"); + Playback::Pause(); + GlobalPause = true; + } + else + { + wprintf("DLL > UnPause from Pause\n"); + Player_Unpause(); + GlobalPause = false; + } +} + +void Player_Unpause() +{ + wprintf("DLL > UnPause\n"); + Playback::Play(); + GlobalPause = false; +} + +void Player_Mute() +{ + wprintf("DLL > Mute <%i> <%i>\n", GlobalVolume, GlobalCurrentVolume); + + // --------------------------------------------------------------------------------------- + // Set volume. For some reason Playback::Volume::Get() is not updated when we run Output_SetVolume() + // I probably disabled it by mistake, so we only keep track of the volume with GlobalVolume from now on + if(GlobalCurrentVolume > 0) + { + Output_SetVolume( 0 ); + GlobalCurrentVolume = 0; + wprintf("DLL > Volume <%i>\n", GlobalCurrentVolume); + } + else + { + //Output_SetVolume( GlobalVolume ); + Output_SetVolume( GlobalVolume ); + GlobalCurrentVolume = GlobalVolume; + wprintf("DLL > Volume <%i>\n", GlobalCurrentVolume); + } + + //wprintf("Volume(%i)\n", Playback::Volume::Get()); + // --------------------------------------------------------------------------------------- +} + + + +void Player_Volume(int a) +{ + GlobalVolume = a; + Output_SetVolume( GlobalVolume ); + wprintf("DLL > Volume <%i> <%i>\n", GlobalVolume, GlobalCurrentVolume); +} + +void ShowConsole() +{ + //startConsoleWin(130, 10000, "Console Window"); // give room for 2000 rows + StartConsoleWin(100, 2000, "ConsoleDLL"); // give room for 2000 rows +} + + +void Player_Console(bool Console) +{ + if(Console) + ShowConsole(); + else + #if defined (_WIN32) + FreeConsole(); + #endif +} \ No newline at end of file diff --git a/Branches/MusicMod/Player/Src/PlayerExport.h b/Branches/MusicMod/Player/Src/PlayerExport.h new file mode 100644 index 0000000000..0f1b63ad02 --- /dev/null +++ b/Branches/MusicMod/Player/Src/PlayerExport.h @@ -0,0 +1,48 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + + +////////////////////////////////////////////////////////////////////////////////////////// +// Include +// ŻŻŻŻŻŻŻŻŻŻ + +////////////////////////////////// + + +// ------------------------- +// DLL Player +// --------- +void MakeTime(); +#ifndef _DLL_PLAYER_H_ + extern int GlobalVolume; + extern int GlobalCurrentVolume; + extern bool GlobalPause; + extern bool TimerCreated; +#endif + + +// Dll export +#define EXPORT __declspec(dllexport) +EXPORT void Player_Main(bool Console); +EXPORT void Player_Console(bool Console); +EXPORT void Player_Play(char *); +EXPORT void Player_Pause(); +EXPORT void Player_Unpause(); +EXPORT void Player_Mute(); +EXPORT void Player_Volume(int); + diff --git a/Branches/MusicMod/Player/Src/Playlist.cpp b/Branches/MusicMod/Player/Src/Playlist.cpp index bdfdf9e4a1..68060b72b4 100644 --- a/Branches/MusicMod/Player/Src/Playlist.cpp +++ b/Branches/MusicMod/Player/Src/Playlist.cpp @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "Playlist.h" @@ -96,9 +96,12 @@ bool Playlist::Create() { if( WindowPlaylist ) return false; + // If this is not called a crash occurs PlaylistView::Create(); - -/* + + + #ifndef NOGUI + RECT ClientMain; GetClientRect( WindowMain, &ClientMain ); @@ -134,15 +137,22 @@ bool Playlist::Create() { SetWindowLong( WindowPlaylist, GWL_WNDPROC, ( LONG )WndprocPlaylist ); } -*/ + Font::Apply( WindowPlaylist ); + #endif NOGUI + + TCHAR * szPlaylistMind = new TCHAR[ iHomeDirLen + 12 + 1 ]; memcpy( szPlaylistMind, szHomeDir, iHomeDirLen * sizeof( TCHAR ) ); memcpy( szPlaylistMind + iHomeDirLen, TEXT( "Plainamp.m3u" ), 12 * sizeof( TCHAR ) ); + + + szPlaylistMind[ iHomeDirLen + 12 ] = TEXT( '\0' ); + Playlist::AppendPlaylistFile( szPlaylistMind ); return true; @@ -920,6 +930,10 @@ bool Playlist_DialogBoth( bool bOpenOrSave ) playlist->RemoveAll(); Playlist::AppendPlaylistFile( szFilename ); Playback::Play(); + + + Console::Append( TEXT( "Playlist.cpp:Playlist_DialogBoth() called Playback::Play()" ) ); + Console::Append( TEXT( " " ) ); } } else @@ -960,6 +974,9 @@ bool Playlist::DialogSaveAs() //////////////////////////////////////////////////////////////////////////////// bool Playlist::AppendPlaylistFile( TCHAR * szFilename ) { + + + // Open playlist file HANDLE hFile = CreateFile( szFilename, // LPCTSTR lpFileName @@ -971,15 +988,20 @@ bool Playlist::AppendPlaylistFile( TCHAR * szFilename ) NULL // HANDLE hTemplateFile ); + // This will happen if there is no Playlist.m3u + /* if( hFile == INVALID_HANDLE_VALUE ) { // MessageBox( 0, TEXT( "Could not read playlist file" ), TEXT( "Error" ), MB_ICONERROR ); + //Console::Append( "We got INVALID_HANDLE_VALUE" ); return false; } - - const bool bEmptyBefore = ( playlist->GetSize() == 0 ); + */ + // Disable this + //const bool bEmptyBefore = ( playlist->GetSize() == 0 ); +// ======================================================================================= // Remove filename from so we can // use it as relative directory root TCHAR * szWalk = szFilename + _tcslen( szFilename ) - 1; @@ -1002,6 +1024,7 @@ bool Playlist::AppendPlaylistFile( TCHAR * szFilename ) char * rawdata = new char[ iSizeBytes + 1 ]; // One more so we can write '\0' on EOF DWORD iBytesRead; + // ======================================================================================= // Read whole file ReadFile( hFile, // HANDLE hFile @@ -1040,20 +1063,32 @@ bool Playlist::AppendPlaylistFile( TCHAR * szFilename ) if( ( end - beg > 2 ) && ( *beg != '#' ) ) { + TCHAR * szKeep; if( beg[ 1 ] == ':' ) { // TODO: Better detection, network path? - // Absolute path + // Absolute path, skip this + /* const int iLen = end - beg; + + TCHAR szBuffer[ 5000 ]; + _stprintf( szBuffer, TEXT( "iLen <%i>" ), iLen ); + Console::Append( szBuffer ); + szKeep = new TCHAR[ iLen + 1 ]; ToTchar( szKeep, beg, iLen ); szKeep[ iLen ] = TEXT( '\0' ); + */ + } else { // Skip initial so we don't get a double backslash in between + + + while( ( beg[ 0 ] == '\\' ) && ( beg < end ) ) beg++; // Relative path @@ -1220,7 +1255,8 @@ TCHAR * Playlist::GetFilename( int iIndex ) return ( entry ? entry->szFilename : NULL ); */ - + //TCHAR * szFilename = "C:\Files\Spel och spelfusk\Console\Gamecube\Code\vgmstream (isolate ast)\Music\demo36_02.ast"; + //return szFilename; return ( TCHAR * )playlist->Get( iIndex ); } diff --git a/Branches/MusicMod/Player/Src/Playlist.h b/Branches/MusicMod/Player/Src/Playlist.h index a56ffe373d..82aaab7952 100644 --- a/Branches/MusicMod/Player/Src/Playlist.h +++ b/Branches/MusicMod/Player/Src/Playlist.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_PLAYLIST_H diff --git a/Branches/MusicMod/Player/Src/PlaylistControler.cpp b/Branches/MusicMod/Player/Src/PlaylistControler.cpp index f0a67d5a4e..a3b0f17a68 100644 --- a/Branches/MusicMod/Player/Src/PlaylistControler.cpp +++ b/Branches/MusicMod/Player/Src/PlaylistControler.cpp @@ -13,6 +13,7 @@ #include "PlaylistControler.h" #include "Config.h" #include "Font.h" +#include "Console.h" bool bPlaylistFollow; ConfBool cbPlaylistFollow( &bPlaylistFollow, TEXT( "PlaylistFollow" ), CONF_MODE_PUBLIC, true ); @@ -131,6 +132,9 @@ void PlaylistControler::SetCurIndex( int iIndex ) const int iCurIndexBefore = _database.GetCurIndex(); _database.SetCurIndex( iIndex ); + // --------------------------------------------------------------------------------------- + // We disable the windows management + /* if( bPlaylistFollow ) { ListView_SetItemState( _hView, ( UINT )-1, 0, LVIS_SELECTED | LVIS_FOCUSED ); @@ -140,6 +144,8 @@ void PlaylistControler::SetCurIndex( int iIndex ) if( iCurIndexBefore != -1 ) ListView_RedrawItems( _hView, iCurIndexBefore, iCurIndexBefore ); ListView_RedrawItems( _hView, iIndex, iIndex ); + */ + // --------------------------------------------------------------------------------------- } // Returns on digit count change @@ -196,6 +202,8 @@ PlaylistControler::PlaylistControler( HWND hView, bool bEnableZeroPadding, int * _database.SetCurIndexSlave( piIndexSlave ); + printf("PlaylistControler::PlaylistControler was called\n"); + Refresh(); // TODO clear list view here??? @@ -207,9 +215,13 @@ void PlaylistControler::PushBack( TCHAR * szText ) const int iSize = _database.GetMaxIndex(); _database.PushBack( szText ); - ListView_SetItemCount( _hView, _database.GetSize() ); + + // --------------------------------------------------------------------------------------- + // Disabled windows function + //ListView_SetItemCount( _hView, _database.GetSize() ); - if( FixDigitsMore() ) Refresh(); + //if( FixDigitsMore() ) Refresh(); + // --------------------------------------------------------------------------------------- } void PlaylistControler::Insert( int i, TCHAR * szText ) @@ -225,7 +237,9 @@ void PlaylistControler::Insert( int i, TCHAR * szText ) void PlaylistControler::RemoveAll() { _database.Clear(); - ListView_DeleteAllItems( _hView ); + + // This is for the windows playlist, we don't use that + //ListView_DeleteAllItems( _hView ); if( FixDigitsLess() ) Refresh(); } @@ -333,6 +347,8 @@ void PlaylistControler::SelectInvert() const TCHAR * PlaylistControler::Get( int i ) { + Console::Append( TEXT("We are in PlaylistControler::Get()") ); + return _database.Get( i ); } diff --git a/Branches/MusicMod/Player/Src/PlaylistModel.h b/Branches/MusicMod/Player/Src/PlaylistModel.h index c850772e20..76d28fb96f 100644 --- a/Branches/MusicMod/Player/Src/PlaylistModel.h +++ b/Branches/MusicMod/Player/Src/PlaylistModel.h @@ -9,6 +9,11 @@ // See GPL.txt for details. Any non-GPL usage is strictly forbidden. //////////////////////////////////////////////////////////////////////////////// +// ======================================================================================= +#include "Console.h" +#include "Global.h" +// ======================================================================================= + #ifndef PLAYLIST_MODEL_H #define PLAYLIST_MODEL_H 1 @@ -19,7 +24,6 @@ using namespace std; - class PlaylistModel { vector _database; @@ -43,13 +47,20 @@ public: _piCurIndex = piIndexSlave; } + // ======================================================================================= + // This is where the _database is populated + // ======================================================================================= void PushBack( TCHAR * szText ) { - _database.push_back( szText ); + Console::Append( TEXT( "PlaylistModel.h:_database.PushBack() was called " ) ); + + _database.push_back( szText ); // this is a API call } void Insert( int i, TCHAR * szText ) { + Console::Append( TEXT( "PlaylistModel.h:_database.Insert() was called " ) ); + if( i <= *_piCurIndex ) ( *_piCurIndex )++; _database.insert( _database.begin() + i, szText ); } @@ -62,6 +73,8 @@ public: const TCHAR * Get( int i ) { + //Console::Append( TEXT( "PlaylistModel.h:_database.Get() was called " ) ); + if( 0 > i || i >= ( int )_database.size() ) { static const TCHAR * szError = TEXT( "INDEX OUT OF RANGE" ); @@ -89,7 +102,13 @@ public: void SetCurIndex( int iIndex ) { - if( 0 > iIndex || iIndex >= ( int )_database.size() ) return; + + if( 0 > iIndex || iIndex >= ( int )_database.size() ) + { + wprintf("SetCurIndex > Return"); + return; + } + *_piCurIndex = iIndex; } diff --git a/Branches/MusicMod/Player/Src/PlaylistView.cpp b/Branches/MusicMod/Player/Src/PlaylistView.cpp index db3fec3cee..f2ba322d8d 100644 --- a/Branches/MusicMod/Player/Src/PlaylistView.cpp +++ b/Branches/MusicMod/Player/Src/PlaylistView.cpp @@ -9,7 +9,7 @@ // See GPL.txt for details. Any non-GPL usage is strictly forbidden. //////////////////////////////////////////////////////////////////////////////// - +// ======================================================================================= #include "Playlist.h" #include "Main.h" #include "Status.h" @@ -20,8 +20,12 @@ WNDPROC WndprocPlaylistBackup = NULL; LRESULT CALLBACK WndprocPlaylist( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ); +// ======================================================================================= +// ======================================================================================= +// This gives the values from the ini file. +// ConfBool = class PlaylistControler * playlist = NULL; // extern bool bPlaylistEntryNumberZeroPadding; @@ -32,10 +36,15 @@ ConfInt ciCurPlaylistPosition( &iCurPlaylistPosition, TEXT( "CurPlaylistPosition bool bInfinitePlaylist; ConfBool cbInfinitePlaylist( &bInfinitePlaylist, TEXT( "InfinitePlaylist" ), CONF_MODE_PUBLIC, false ); +// ======================================================================================= +// ======================================================================================= + void PlaylistView::Create() { + #ifndef NOGUI + RECT ClientMain; GetClientRect( WindowMain, &ClientMain ); @@ -44,8 +53,7 @@ void PlaylistView::Create() const int iPlaylistHeight = iClientHeight - iRebarHeight - iStatusHeight; - - LoadCommonControls(); + //LoadCommonControls(); DWORD dwStyle; @@ -65,10 +73,10 @@ void PlaylistView::Create() WC_LISTVIEW, // class name - defined in commctrl.h TEXT( "" ), // dummy text dwStyle, // style - 0, - iRebarHeight, // + -2, - iClientWidth, - iPlaylistHeight, + 0, + iRebarHeight, // + -2, + iClientWidth, + iPlaylistHeight, WindowMain, // parent NULL, // ID g_hInstance, // instance @@ -76,89 +84,95 @@ void PlaylistView::Create() if(!WindowPlaylist) return; // TODO - -playlist = new PlaylistControler( WindowPlaylist, bPlaylistEntryNumberZeroPadding, &iCurPlaylistPosition ); + // This calls PlaylistControler::PlaylistControler() + playlist = new PlaylistControler( WindowPlaylist, bPlaylistEntryNumberZeroPadding, &iCurPlaylistPosition ); + #else + + HWND WindowPlaylist = NULL; + playlist = new PlaylistControler( WindowPlaylist, bPlaylistEntryNumberZeroPadding, &iCurPlaylistPosition ); + + #endif // Exchange window procedure - WndprocPlaylistBackup = ( WNDPROC )GetWindowLong( WindowPlaylist, GWL_WNDPROC ); - if( WndprocPlaylistBackup != NULL ) + //WndprocPlaylistBackup = ( WNDPROC )GetWindowLong( WindowPlaylist, GWL_WNDPROC ); + //if( WndprocPlaylistBackup != NULL ) + //{ + // SetWindowLong( WindowPlaylist, GWL_WNDPROC, ( LONG )WndprocPlaylist ); + //} + + + //ListView_SetExtendedListViewStyle( WindowPlaylist, LVS_EX_FULLROWSELECT ); // | LVS_EX_GRIDLINES ); + //playlist->Resize( WindowMain ); + + /* + * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp + * + * Remarks: + * If a column is added to a list-view control with index 0 (the leftmost column) + * and with LVCFMT_RIGHT or LVCFMT_CENTER specified, the text is not right-aligned + * or centered. The text in the index 0 column is left-aligned. Therefore if you + * keep inserting columns with index 0, the text in all columns are left-aligned. + * If you want the first column to be right-aligned or centered you can make a dummy + * column, then insert one or more columns with index 1 or higher and specify the + * alignment you require. Finally delete the dummy column. + */ + + //LV_COLUMN lvColumn; + //memset( &lvColumn, 0, sizeof( LV_COLUMN ) ); + //lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; + // + //// Number column (with dummy hack) + //lvColumn.fmt = LVCFMT_LEFT; + //lvColumn.cx = 0; + //lvColumn.pszText = TEXT( "" ); + //ListView_InsertColumn( WindowPlaylist, 0, &lvColumn ); + //lvColumn.fmt = LVCFMT_RIGHT; + //lvColumn.cx = 120; + //lvColumn.pszText = TEXT( "" ); + //ListView_InsertColumn( WindowPlaylist, 1, &lvColumn ); + //ListView_DeleteColumn( WindowPlaylist, 0 ); + + // Entry + //lvColumn.fmt = LVCFMT_LEFT; + //lvColumn.cx = 120; + //lvColumn.pszText = TEXT( "Filename" ); + //ListView_InsertColumn(WindowPlaylist, 1, &lvColumn); + + + + /* + stupid test code + + SCROLLINFO scrollinfo; + ZeroMemory( &scrollinfo, sizeof( SCROLLINFO ) ); + scrollinfo.cbSize = sizeof( SCROLLINFO ); + scrollinfo.fMask = 0; // SIF_DISABLENOSCROLL; + + if( !GetScrollInfo( WindowPlaylist, SB_VERT, &scrollinfo ) ) { - SetWindowLong( WindowPlaylist, GWL_WNDPROC, ( LONG )WndprocPlaylist ); + MessageBox( 0, "ERROR", "", 0 ); + } + else + { + MessageBox( 0, "OKAY", "", 0 ); + scrollinfo.fMask = SIF_DISABLENOSCROLL; + SetScrollInfo( WindowPlaylist, SB_VERT, &scrollinfo, TRUE ); + } + + if( !ShowScrollBar( WindowPlaylist, SB_VERT, TRUE ) ) + { + MessageBox( 0, "ERROR ShowScrollBar", "", 0 ); } - ListView_SetExtendedListViewStyle( WindowPlaylist, LVS_EX_FULLROWSELECT ); // | LVS_EX_GRIDLINES ); - playlist->Resize( WindowMain ); - -/* - * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp - * - * Remarks: - * If a column is added to a list-view control with index 0 (the leftmost column) - * and with LVCFMT_RIGHT or LVCFMT_CENTER specified, the text is not right-aligned - * or centered. The text in the index 0 column is left-aligned. Therefore if you - * keep inserting columns with index 0, the text in all columns are left-aligned. - * If you want the first column to be right-aligned or centered you can make a dummy - * column, then insert one or more columns with index 1 or higher and specify the - * alignment you require. Finally delete the dummy column. - */ - -LV_COLUMN lvColumn; -memset( &lvColumn, 0, sizeof( LV_COLUMN ) ); -lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; - -// Number column (with dummy hack) -lvColumn.fmt = LVCFMT_LEFT; -lvColumn.cx = 0; -lvColumn.pszText = TEXT( "" ); -ListView_InsertColumn( WindowPlaylist, 0, &lvColumn ); -lvColumn.fmt = LVCFMT_RIGHT; -lvColumn.cx = 120; -lvColumn.pszText = TEXT( "" ); -ListView_InsertColumn( WindowPlaylist, 1, &lvColumn ); -ListView_DeleteColumn( WindowPlaylist, 0 ); - -// Entry -lvColumn.fmt = LVCFMT_LEFT; -lvColumn.cx = 120; -lvColumn.pszText = TEXT( "Filename" ); -ListView_InsertColumn(WindowPlaylist, 1, &lvColumn); - - - -/* -stupid test code - -SCROLLINFO scrollinfo; -ZeroMemory( &scrollinfo, sizeof( SCROLLINFO ) ); -scrollinfo.cbSize = sizeof( SCROLLINFO ); -scrollinfo.fMask = 0; // SIF_DISABLENOSCROLL; - -if( !GetScrollInfo( WindowPlaylist, SB_VERT, &scrollinfo ) ) -{ - MessageBox( 0, "ERROR", "", 0 ); -} -else -{ - MessageBox( 0, "OKAY", "", 0 ); - scrollinfo.fMask = SIF_DISABLENOSCROLL; - SetScrollInfo( WindowPlaylist, SB_VERT, &scrollinfo, TRUE ); -} - -if( !ShowScrollBar( WindowPlaylist, SB_VERT, TRUE ) ) -{ - MessageBox( 0, "ERROR ShowScrollBar", "", 0 ); -} - - -SCROLLBARINFO scrollbarinfo; -scrollbarinfo.cbSize = sizeof( SCROLLBARINFO ); -if( !GetScrollBarInfo( WindowPlaylist, OBJID_VSCROLL, &scrollbarinfo ) ) -{ - MessageBox( 0, "ERROR GetScrollBarInfo", "", 0 ); -} -*/ + SCROLLBARINFO scrollbarinfo; + scrollbarinfo.cbSize = sizeof( SCROLLBARINFO ); + if( !GetScrollBarInfo( WindowPlaylist, OBJID_VSCROLL, &scrollbarinfo ) ) + { + MessageBox( 0, "ERROR GetScrollBarInfo", "", 0 ); + } + */ } @@ -166,10 +180,6 @@ if( !GetScrollBarInfo( WindowPlaylist, OBJID_VSCROLL, &scrollbarinfo ) ) - - - - // Dragging static int iItemHeight = 15; static int iDragStartY = 0; diff --git a/Branches/MusicMod/Player/Src/Plugin.cpp b/Branches/MusicMod/Player/Src/Plugin.cpp index f6c9c31080..fcad94bb74 100644 --- a/Branches/MusicMod/Player/Src/Plugin.cpp +++ b/Branches/MusicMod/Player/Src/Plugin.cpp @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "Plugin.h" diff --git a/Branches/MusicMod/Player/Src/Plugin.h b/Branches/MusicMod/Player/Src/Plugin.h index 4caed22ea2..eab9cff84c 100644 --- a/Branches/MusicMod/Player/Src/Plugin.h +++ b/Branches/MusicMod/Player/Src/Plugin.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_PLUGIN_H diff --git a/Branches/MusicMod/Player/Src/PluginManager.cpp b/Branches/MusicMod/Player/Src/PluginManager.cpp index 432fc33130..ab5ac603fe 100644 --- a/Branches/MusicMod/Player/Src/PluginManager.cpp +++ b/Branches/MusicMod/Player/Src/PluginManager.cpp @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "PluginManager.h" diff --git a/Branches/MusicMod/Player/Src/Prefs.cpp b/Branches/MusicMod/Player/Src/Prefs.cpp index 79f85b7c6f..359fa40b5f 100644 --- a/Branches/MusicMod/Player/Src/Prefs.cpp +++ b/Branches/MusicMod/Player/Src/Prefs.cpp @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "Prefs.h" diff --git a/Branches/MusicMod/Player/Src/Rebar.cpp b/Branches/MusicMod/Player/Src/Rebar.cpp index 572b2baff9..b4c62ebeaf 100644 --- a/Branches/MusicMod/Player/Src/Rebar.cpp +++ b/Branches/MusicMod/Player/Src/Rebar.cpp @@ -1,13 +1,23 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// + + +// ======================================================================================= +// WndprocRebar is called once every second during playback +// ======================================================================================= +// In Toolbar::Create() the progress bar is called the Seekbar + + + + +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "Rebar.h" @@ -20,7 +30,7 @@ #include "Config.h" #include "Winamp/wa_ipc.h" -#include "resrc1.h" +#include "Resources/resrc1.h" @@ -240,10 +250,12 @@ bool Toolbar::Create() } // Exchange window procedure - WndprocRebarBackup = ( WNDPROC )GetWindowLong( WindowRebar, GWL_WNDPROC ); + WndprocRebarBackup = ( WNDPROC )GetWindowLong( WindowRebar, GWL_WNDPROC ); + //WndprocRebarBackup = ( WNDPROC )GetWindowLongPtr( WindowRebar, GWLP_WNDPROC ); // 64 bit if( WndprocRebarBackup != NULL ) { SetWindowLong( WindowRebar, GWL_WNDPROC, ( LONG )WndprocRebar ); + //SetWindowLongPtr( WindowRebar, GWLP_WNDPROC, ( LONG )WndprocRebar ); } rebar_menu = CreatePopupMenu(); @@ -1030,13 +1042,15 @@ void ContextMenuRebar( POINT * p ) //////////////////////////////////////////////////////////////////////////////// LRESULT CALLBACK WndprocRebar( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) { + //Console::Append( TEXT("Rebar.cpp: WndprocRebar called") ); + switch( message ) { - case WM_CONTEXTMENU: + case WM_CONTEXTMENU: // This affects the placement of the progress bar { - POINT p; - GetCursorPos( &p ); - ContextMenuRebar( &p ); + //POINT p; + //GetCursorPos( &p ); + //ContextMenuRebar( &p ); return 0; } @@ -1071,6 +1085,8 @@ LRESULT CALLBACK WndprocSeek( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) static bool bDown = false; static int iLastVal = 0; + //Console::Append( TEXT("Rebar.cpp: WndprocSeek called") ); + switch( message ) { case WM_LBUTTONDOWN: diff --git a/Branches/MusicMod/Player/Src/Resources/resrc1.rc b/Branches/MusicMod/Player/Src/Resources/resrc1.rc index 70e368093b..83bbad7f33 100644 --- a/Branches/MusicMod/Player/Src/Resources/resrc1.rc +++ b/Branches/MusicMod/Player/Src/Resources/resrc1.rc @@ -7,7 +7,7 @@ // // Generated from the TEXTINCLUDE 2 resource. // -#include "resource.h" +//#include "resource.h" #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// diff --git a/Branches/MusicMod/Player/Src/Timer.cpp b/Branches/MusicMod/Player/Src/Timer.cpp new file mode 100644 index 0000000000..91081d98bb --- /dev/null +++ b/Branches/MusicMod/Player/Src/Timer.cpp @@ -0,0 +1,126 @@ +// ================================================================================================ +// File description +// ---------------- +/* In the GUI build there is a timer that is initiated with SetTimer() that will setup a timer that + calls the lpTimerFunc function pointer as long as your program is running a message loop. If it + doesn't run one, like in a console application (the NOGUI build), you'll have to use a different + kind of timer API, like timeSetEvent() or CreateThreadPoolTimer(). These timers use a different + thread to make the callback so be careful to properly lock and synchronize. */ +// ================================================================================================ + +// ================================================================================================ +// Library requirements +// ---------------- +// This program needs winmm.lib. There's no simpler or better way to make a timer withouth it. +// ================================================================================================ + +// ================================================================================================ +// Includes +// ---------------- +#include +//using namespace std; +#include +#include +#include "Global.h" +#include "PlayerExport.h" + +#include "InputPlugin.h" +// ================================================================================================ + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Declarations and definitions +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + +void MakeTime(); + +int g_Stop = 0; +extern std::string CurrentlyPlayingFile; +extern bool GlobalPause; +/////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////// +// Manage restart when playback for a file has reached the end of the file +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +#ifdef _M_X64 + void CALLBACK Update() +#else + void CALLBACK Update(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long) +#endif +{ + //wprintf("DLL > Update() > Begin (%i)\n", active_input_plugin); + + // -------------------------------- + // Manage restart when playback for a file has reached the end of the file + // -------------- + // Check if the input plugin is activated + if(!active_input_plugin || !active_input_plugin->plugin) + { + wprintf("The input plugin is not activated yet\n"); + } + else + { + const int ms_len = active_input_plugin->plugin->GetLength(); + const int ms_cur = active_input_plugin->plugin->GetOutputTime(); + + // Get the current playback progress + float progress; + if(ms_len > 0) + progress = (float)ms_cur / ms_len; + else + progress = 0; + + if ( progress > 0.7 ) // Only show this if we are getting close to the end, for bugtesting + // basically + { + wprintf("Playback progress <%i of %i>\n", ms_cur, ms_len); + } + + // Because cur never go all the way to len we can't use a == comparison. Insted of this + // we could also check if the location is the same as right before. + if(ms_cur > ms_len - 1000 && !GlobalPause) // avoid restarting in cases where we just pressed pause + { + wprintf("Restart <%s>\n", CurrentlyPlayingFile.c_str()); + Player_Play((char *)CurrentlyPlayingFile.c_str()); + } + } + // -------------- + + //wprintf("Make new time\n"); + MakeTime(); // Make a new one +} + +void MakeTime() +{ + timeSetEvent( + 2000, // Interval in ms + 0, + #ifdef _M_X64 + (LPTIMECALLBACK) Update, // The function + #else + Update, + #endif + 0, + 0); +} +/////////////////////////// + + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Start the timer +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +int MainTimer() +{ + MakeTime(); + + //while( g_Stop == 0 ) + //{ + // cout << "."; + //} + + //wprintf("MakeTime\n"); + + return 0; +} +/////////////////////////// \ No newline at end of file diff --git a/Branches/MusicMod/Player/Src/Unicode.cpp b/Branches/MusicMod/Player/Src/Unicode.cpp index e332100b3d..820895d93e 100644 --- a/Branches/MusicMod/Player/Src/Unicode.cpp +++ b/Branches/MusicMod/Player/Src/Unicode.cpp @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "Unicode.h" diff --git a/Branches/MusicMod/Player/Src/Unicode.h b/Branches/MusicMod/Player/Src/Unicode.h index 55a1770e49..10a53e873c 100644 --- a/Branches/MusicMod/Player/Src/Unicode.h +++ b/Branches/MusicMod/Player/Src/Unicode.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_UNICODE_H diff --git a/Branches/MusicMod/Player/Src/VisModule.cpp b/Branches/MusicMod/Player/Src/VisModule.cpp index fce981a0f7..b171ed7b3f 100644 --- a/Branches/MusicMod/Player/Src/VisModule.cpp +++ b/Branches/MusicMod/Player/Src/VisModule.cpp @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "VisModule.h" diff --git a/Branches/MusicMod/Player/Src/VisPlugin.cpp b/Branches/MusicMod/Player/Src/VisPlugin.cpp index af86f41861..c25262e715 100644 --- a/Branches/MusicMod/Player/Src/VisPlugin.cpp +++ b/Branches/MusicMod/Player/Src/VisPlugin.cpp @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "VisPlugin.h" @@ -148,6 +148,7 @@ bool VisPlugin::Unload() _stprintf( szBuffer, TEXT( "Unloading <%s>" ), GetFilename() ); Console::Append( szBuffer ); Console::Append( TEXT( " " ) ); + printf( ">>>Unloading <%s>\n" , GetFilename() ); header = NULL; diff --git a/Branches/MusicMod/Player/Src/VisPlugin.h b/Branches/MusicMod/Player/Src/VisPlugin.h index 92cfdc5a40..d28b1a5f8e 100644 --- a/Branches/MusicMod/Player/Src/VisPlugin.h +++ b/Branches/MusicMod/Player/Src/VisPlugin.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_VIS_PLUGIN_H diff --git a/Branches/MusicMod/Player/Src/Winamp.cpp b/Branches/MusicMod/Player/Src/Winamp.cpp index a5bc06060f..6e123b6355 100644 --- a/Branches/MusicMod/Player/Src/Winamp.cpp +++ b/Branches/MusicMod/Player/Src/Winamp.cpp @@ -1,13 +1,17 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +// ======================================================================================= +// WndprocWinamp is called repeatedly when the cursor is moved over the main window +// ======================================================================================= + +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #include "Winamp.h" @@ -39,6 +43,8 @@ int IPC_GETPLAINBARTARGET = 0; //////////////////////////////////////////////////////////////////////////////// LRESULT CALLBACK WndprocWinamp( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) { + //Console::Append( TEXT( "Winamp.cc:WndprocWinamp was called" ) ); + switch( message ) { case WM_COMMAND: @@ -648,6 +654,9 @@ LRESULT CALLBACK WndprocWinamp( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) case IPC_WRITE_EXTENDED_FILE_INFO: break; case IPC_FORMAT_TITLE: break; */ +// ======================================================================================= +// Let's remove this +/* case IPC_GETUNCOMPRESSINTERFACE: if( wp == 0x10100000 ) { @@ -662,6 +671,8 @@ LRESULT CALLBACK WndprocWinamp( HWND hwnd, UINT message, WPARAM wp, LPARAM lp ) return ( LRESULT )uncompress; } break; +*/ +// ======================================================================================= case IPC_ADD_PREFS_DLG: Prefs::AddPage( ( prefsDlgRec * )wp ); diff --git a/Branches/MusicMod/Player/Src/Winamp.h b/Branches/MusicMod/Player/Src/Winamp.h index 288880174a..7ef4344c69 100644 --- a/Branches/MusicMod/Player/Src/Winamp.h +++ b/Branches/MusicMod/Player/Src/Winamp.h @@ -1,13 +1,13 @@ -//////////////////////////////////////////////////////////////////////////////// -// Plainamp, Open source Winamp core -// -// Copyright İ 2005 Sebastian Pipping -// -// --> http://www.hartwork.org -// -// This source code is released under the GNU General Public License (GPL). -// See GPL.txt for details. Any non-GPL usage is strictly forbidden. -//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// Plainamp, Open source Winamp core +// +// Copyright İ 2005 Sebastian Pipping +// +// --> http://www.hartwork.org +// +// This source code is released under the GNU General Public License (GPL). +// See GPL.txt for details. Any non-GPL usage is strictly forbidden. +//////////////////////////////////////////////////////////////////////////////// #ifndef PA_WINAMP_H diff --git a/Branches/MusicMod/Player/Src/afxres.h b/Branches/MusicMod/Player/Src/afxres.h new file mode 100644 index 0000000000..7eb4900177 --- /dev/null +++ b/Branches/MusicMod/Player/Src/afxres.h @@ -0,0 +1,823 @@ +// This is a part of the Microsoft Foundation Classes C++ library. +// Copyright (C) Microsoft Corporation +// All rights reserved. +// +// This source code is only intended as a supplement to the +// Microsoft Foundation Classes Reference and related +// electronic documentation provided with the library. +// See these sources for detailed information regarding the +// Microsoft Foundation Classes product. + +#ifndef __AFXRES_H__ +#define __AFXRES_H__ + +#ifdef RC_INVOKED +#ifndef _INC_WINDOWS +#define _INC_WINDOWS + #include "winres.h" // extract from windows header +#endif +#endif + +#ifdef _AFX_MINREBUILD +#pragma component(minrebuild, off) +#endif + +#ifdef RC_INVOKED + #if defined(_VC80_UPGRADE) && (_VC80_UPGRADE >= 0x0700) && (_VC80_UPGRADE < 0x0800) && defined(IDR_MANIFEST) + // Handle project upgrade from VC7/VC7.1 for projects with manifest + #define IDR_MANIFEST 1024 + #endif +#endif // RC_INVOKED + +#ifdef APSTUDIO_INVOKED +#define APSTUDIO_HIDDEN_SYMBOLS +#endif + +///////////////////////////////////////////////////////////////////////////// +// MFC resource types (see Technical note TN024 for implementation details) + +#ifndef RC_INVOKED +#define RT_DLGINIT MAKEINTRESOURCE(240) +#define RT_TOOLBAR MAKEINTRESOURCE(241) +#endif + +///////////////////////////////////////////////////////////////////////////// + +#ifdef APSTUDIO_INVOKED +#undef APSTUDIO_HIDDEN_SYMBOLS +#endif + +///////////////////////////////////////////////////////////////////////////// +// General style bits etc + +// ControlBar styles +#define CBRS_ALIGN_LEFT 0x1000L +#define CBRS_ALIGN_TOP 0x2000L +#define CBRS_ALIGN_RIGHT 0x4000L +#define CBRS_ALIGN_BOTTOM 0x8000L +#define CBRS_ALIGN_ANY 0xF000L + +#define CBRS_BORDER_LEFT 0x0100L +#define CBRS_BORDER_TOP 0x0200L +#define CBRS_BORDER_RIGHT 0x0400L +#define CBRS_BORDER_BOTTOM 0x0800L +#define CBRS_BORDER_ANY 0x0F00L + +#define CBRS_TOOLTIPS 0x0010L +#define CBRS_FLYBY 0x0020L +#define CBRS_FLOAT_MULTI 0x0040L +#define CBRS_BORDER_3D 0x0080L +#define CBRS_HIDE_INPLACE 0x0008L +#define CBRS_SIZE_DYNAMIC 0x0004L +#define CBRS_SIZE_FIXED 0x0002L +#define CBRS_FLOATING 0x0001L + +#define CBRS_GRIPPER 0x00400000L + +#define CBRS_ORIENT_HORZ (CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM) +#define CBRS_ORIENT_VERT (CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT) +#define CBRS_ORIENT_ANY (CBRS_ORIENT_HORZ|CBRS_ORIENT_VERT) + +#define CBRS_ALL 0x0040FFFFL + +// the CBRS_ style is made up of an alignment style and a draw border style +// the alignment styles are mutually exclusive +// the draw border styles may be combined +#define CBRS_NOALIGN 0x00000000L +#define CBRS_LEFT (CBRS_ALIGN_LEFT|CBRS_BORDER_RIGHT) +#define CBRS_TOP (CBRS_ALIGN_TOP|CBRS_BORDER_BOTTOM) +#define CBRS_RIGHT (CBRS_ALIGN_RIGHT|CBRS_BORDER_LEFT) +#define CBRS_BOTTOM (CBRS_ALIGN_BOTTOM|CBRS_BORDER_TOP) + +///////////////////////////////////////////////////////////////////////////// +// Manifest Resource ID of manifest containing Localized DLL information +#define ID_MFCLOC_MANIFEST 1000 + +///////////////////////////////////////////////////////////////////////////// +// Standard window components + +// Mode indicators in status bar - these are routed like commands +#define ID_INDICATOR_EXT 0xE700 // extended selection indicator +#define ID_INDICATOR_CAPS 0xE701 // cap lock indicator +#define ID_INDICATOR_NUM 0xE702 // num lock indicator +#define ID_INDICATOR_SCRL 0xE703 // scroll lock indicator +#define ID_INDICATOR_OVR 0xE704 // overtype mode indicator +#define ID_INDICATOR_REC 0xE705 // record mode indicator +#define ID_INDICATOR_KANA 0xE706 // kana lock indicator + +#define ID_SEPARATOR 0 // special separator value + +#ifndef RC_INVOKED // code only +// Standard control bars (IDW = window ID) +#define AFX_IDW_CONTROLBAR_FIRST 0xE800 +#define AFX_IDW_CONTROLBAR_LAST 0xE8FF + +#define AFX_IDW_TOOLBAR 0xE800 // main Toolbar for window +#define AFX_IDW_STATUS_BAR 0xE801 // Status bar window +#define AFX_IDW_PREVIEW_BAR 0xE802 // PrintPreview Dialog Bar +#define AFX_IDW_RESIZE_BAR 0xE803 // OLE in-place resize bar +#define AFX_IDW_REBAR 0xE804 // COMCTL32 "rebar" Bar +#define AFX_IDW_DIALOGBAR 0xE805 // CDialogBar + +// Note: If your application supports docking toolbars, you should +// not use the following IDs for your own toolbars. The IDs chosen +// are at the top of the first 32 such that the bars will be hidden +// while in print preview mode, and are not likely to conflict with +// IDs your application may have used succesfully in the past. + +#define AFX_IDW_DOCKBAR_TOP 0xE81B +#define AFX_IDW_DOCKBAR_LEFT 0xE81C +#define AFX_IDW_DOCKBAR_RIGHT 0xE81D +#define AFX_IDW_DOCKBAR_BOTTOM 0xE81E +#define AFX_IDW_DOCKBAR_FLOAT 0xE81F + +// Macro for mapping standard control bars to bitmask (limit of 32) +#define AFX_CONTROLBAR_MASK(nIDC) (1L << (nIDC - AFX_IDW_CONTROLBAR_FIRST)) + +// parts of Main Frame +#define AFX_IDW_PANE_FIRST 0xE900 // first pane (256 max) +#define AFX_IDW_PANE_LAST 0xE9ff +#define AFX_IDW_HSCROLL_FIRST 0xEA00 // first Horz scrollbar (16 max) +#define AFX_IDW_VSCROLL_FIRST 0xEA10 // first Vert scrollbar (16 max) + +#define AFX_IDW_SIZE_BOX 0xEA20 // size box for splitters +#define AFX_IDW_PANE_SAVE 0xEA21 // to shift AFX_IDW_PANE_FIRST +#endif //!RC_INVOKED + +#ifndef APSTUDIO_INVOKED + +// common style for form views +#define AFX_WS_DEFAULT_VIEW (WS_CHILD | WS_VISIBLE | WS_BORDER) + +#endif //!APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// Standard app configurable strings + +// for application title (defaults to EXE name or name in constructor) +#define AFX_IDS_APP_TITLE 0xE000 +// idle message bar line +#define AFX_IDS_IDLEMESSAGE 0xE001 +// message bar line when in shift-F1 help mode +#define AFX_IDS_HELPMODEMESSAGE 0xE002 +// document title when editing OLE embedding +#define AFX_IDS_APP_TITLE_EMBEDDING 0xE003 +// company name +#define AFX_IDS_COMPANY_NAME 0xE004 +// object name when server is inplace +#define AFX_IDS_OBJ_TITLE_INPLACE 0xE005 + +///////////////////////////////////////////////////////////////////////////// +// Standard Commands + +// File commands +#define ID_FILE_NEW 0xE100 +#define ID_FILE_OPEN 0xE101 +#define ID_FILE_CLOSE 0xE102 +#define ID_FILE_SAVE 0xE103 +#define ID_FILE_SAVE_AS 0xE104 +#define ID_FILE_PAGE_SETUP 0xE105 +#define ID_FILE_PRINT_SETUP 0xE106 +#define ID_FILE_PRINT 0xE107 +#define ID_FILE_PRINT_DIRECT 0xE108 +#define ID_FILE_PRINT_PREVIEW 0xE109 +#define ID_FILE_UPDATE 0xE10A +#define ID_FILE_SAVE_COPY_AS 0xE10B +#define ID_FILE_SEND_MAIL 0xE10C +#define ID_FILE_NEW_FRAME 0xE10D + +#define ID_FILE_MRU_FIRST 0xE110 +#define ID_FILE_MRU_FILE1 0xE110 // range - 16 max +#define ID_FILE_MRU_FILE2 0xE111 +#define ID_FILE_MRU_FILE3 0xE112 +#define ID_FILE_MRU_FILE4 0xE113 +#define ID_FILE_MRU_FILE5 0xE114 +#define ID_FILE_MRU_FILE6 0xE115 +#define ID_FILE_MRU_FILE7 0xE116 +#define ID_FILE_MRU_FILE8 0xE117 +#define ID_FILE_MRU_FILE9 0xE118 +#define ID_FILE_MRU_FILE10 0xE119 +#define ID_FILE_MRU_FILE11 0xE11A +#define ID_FILE_MRU_FILE12 0xE11B +#define ID_FILE_MRU_FILE13 0xE11C +#define ID_FILE_MRU_FILE14 0xE11D +#define ID_FILE_MRU_FILE15 0xE11E +#define ID_FILE_MRU_FILE16 0xE11F +#define ID_FILE_MRU_LAST 0xE11F + +// Edit commands +#define ID_EDIT_CLEAR 0xE120 +#define ID_EDIT_CLEAR_ALL 0xE121 +#define ID_EDIT_COPY 0xE122 +#define ID_EDIT_CUT 0xE123 +#define ID_EDIT_FIND 0xE124 +#define ID_EDIT_PASTE 0xE125 +#define ID_EDIT_PASTE_LINK 0xE126 +#define ID_EDIT_PASTE_SPECIAL 0xE127 +#define ID_EDIT_REPEAT 0xE128 +#define ID_EDIT_REPLACE 0xE129 +#define ID_EDIT_SELECT_ALL 0xE12A +#define ID_EDIT_UNDO 0xE12B +#define ID_EDIT_REDO 0xE12C + +// Window commands +#define ID_WINDOW_NEW 0xE130 +#define ID_WINDOW_ARRANGE 0xE131 +#define ID_WINDOW_CASCADE 0xE132 +#define ID_WINDOW_TILE_HORZ 0xE133 +#define ID_WINDOW_TILE_VERT 0xE134 +#define ID_WINDOW_SPLIT 0xE135 +#ifndef RC_INVOKED // code only +#define AFX_IDM_WINDOW_FIRST 0xE130 +#define AFX_IDM_WINDOW_LAST 0xE13F +#define AFX_IDM_FIRST_MDICHILD 0xFF00 // window list starts here +#endif //!RC_INVOKED + +// Help and App commands +#define ID_APP_ABOUT 0xE140 +#define ID_APP_EXIT 0xE141 +#define ID_HELP_INDEX 0xE142 +#define ID_HELP_FINDER 0xE143 +#define ID_HELP_USING 0xE144 +#define ID_CONTEXT_HELP 0xE145 // shift-F1 +// special commands for processing help +#define ID_HELP 0xE146 // first attempt for F1 +#define ID_DEFAULT_HELP 0xE147 // last attempt + +// Misc +#define ID_NEXT_PANE 0xE150 +#define ID_PREV_PANE 0xE151 + +// Format +#define ID_FORMAT_FONT 0xE160 + +// OLE commands +#define ID_OLE_INSERT_NEW 0xE200 +#define ID_OLE_EDIT_LINKS 0xE201 +#define ID_OLE_EDIT_CONVERT 0xE202 +#define ID_OLE_EDIT_CHANGE_ICON 0xE203 +#define ID_OLE_EDIT_PROPERTIES 0xE204 +#define ID_OLE_VERB_FIRST 0xE210 // range - 16 max +#ifndef RC_INVOKED // code only +#define ID_OLE_VERB_LAST 0xE21F +#endif //!RC_INVOKED + +// for print preview dialog bar +#define AFX_ID_PREVIEW_CLOSE 0xE300 +#define AFX_ID_PREVIEW_NUMPAGE 0xE301 // One/Two Page button +#define AFX_ID_PREVIEW_NEXT 0xE302 +#define AFX_ID_PREVIEW_PREV 0xE303 +#define AFX_ID_PREVIEW_PRINT 0xE304 +#define AFX_ID_PREVIEW_ZOOMIN 0xE305 +#define AFX_ID_PREVIEW_ZOOMOUT 0xE306 + +// View commands (same number used as IDW used for control bar) +#define ID_VIEW_TOOLBAR 0xE800 +#define ID_VIEW_STATUS_BAR 0xE801 +#define ID_VIEW_REBAR 0xE804 +#define ID_VIEW_AUTOARRANGE 0xE805 + // E810 -> E81F must be kept in order for RANGE macros +#define ID_VIEW_SMALLICON 0xE810 +#define ID_VIEW_LARGEICON 0xE811 +#define ID_VIEW_LIST 0xE812 +#define ID_VIEW_DETAILS 0xE813 +#define ID_VIEW_LINEUP 0xE814 +#define ID_VIEW_BYNAME 0xE815 +#define AFX_ID_VIEW_MINIMUM ID_VIEW_SMALLICON +#define AFX_ID_VIEW_MAXIMUM ID_VIEW_BYNAME + // E800 -> E8FF reserved for other control bar commands + +// RecordForm commands +#define ID_RECORD_FIRST 0xE900 +#define ID_RECORD_LAST 0xE901 +#define ID_RECORD_NEXT 0xE902 +#define ID_RECORD_PREV 0xE903 + +///////////////////////////////////////////////////////////////////////////// +// Standard control IDs + +#ifdef IDC_STATIC +#undef IDC_STATIC +#endif +#define IDC_STATIC (-1) // all static controls + +///////////////////////////////////////////////////////////////////////////// +// Standard string error/warnings + +#ifndef RC_INVOKED // code only +#define AFX_IDS_SCFIRST 0xEF00 +#endif //!RC_INVOKED + +#define AFX_IDS_SCSIZE 0xEF00 +#define AFX_IDS_SCMOVE 0xEF01 +#define AFX_IDS_SCMINIMIZE 0xEF02 +#define AFX_IDS_SCMAXIMIZE 0xEF03 +#define AFX_IDS_SCNEXTWINDOW 0xEF04 +#define AFX_IDS_SCPREVWINDOW 0xEF05 +#define AFX_IDS_SCCLOSE 0xEF06 +#define AFX_IDS_SCRESTORE 0xEF12 +#define AFX_IDS_SCTASKLIST 0xEF13 + +#define AFX_IDS_MDICHILD 0xEF1F + +#define AFX_IDS_DESKACCESSORY 0xEFDA + +// General strings +#define AFX_IDS_OPENFILE 0xF000 +#define AFX_IDS_SAVEFILE 0xF001 +#define AFX_IDS_ALLFILTER 0xF002 +#define AFX_IDS_UNTITLED 0xF003 +#define AFX_IDS_SAVEFILECOPY 0xF004 +#define AFX_IDS_PREVIEW_CLOSE 0xF005 +#define AFX_IDS_UNNAMED_FILE 0xF006 +#define AFX_IDS_HIDE 0xF011 + +// MFC Standard Exception Error messages +#define AFX_IDP_NO_ERROR_AVAILABLE 0xF020 +#define AFX_IDS_NOT_SUPPORTED_EXCEPTION 0xF021 +#define AFX_IDS_RESOURCE_EXCEPTION 0xF022 +#define AFX_IDS_MEMORY_EXCEPTION 0xF023 +#define AFX_IDS_USER_EXCEPTION 0xF024 +#define AFX_IDS_INVALID_ARG_EXCEPTION 0xF025 + +// Printing and print preview strings +#define AFX_IDS_PRINTONPORT 0xF040 +#define AFX_IDS_ONEPAGE 0xF041 +#define AFX_IDS_TWOPAGE 0xF042 +#define AFX_IDS_PRINTPAGENUM 0xF043 +#define AFX_IDS_PREVIEWPAGEDESC 0xF044 +#define AFX_IDS_PRINTDEFAULTEXT 0xF045 +#define AFX_IDS_PRINTDEFAULT 0xF046 +#define AFX_IDS_PRINTFILTER 0xF047 +#define AFX_IDS_PRINTCAPTION 0xF048 +#define AFX_IDS_PRINTTOFILE 0xF049 + + +// OLE strings +#define AFX_IDS_OBJECT_MENUITEM 0xF080 +#define AFX_IDS_EDIT_VERB 0xF081 +#define AFX_IDS_ACTIVATE_VERB 0xF082 +#define AFX_IDS_CHANGE_LINK 0xF083 +#define AFX_IDS_AUTO 0xF084 +#define AFX_IDS_MANUAL 0xF085 +#define AFX_IDS_FROZEN 0xF086 +#define AFX_IDS_ALL_FILES 0xF087 +// dynamically changing menu items +#define AFX_IDS_SAVE_MENU 0xF088 +#define AFX_IDS_UPDATE_MENU 0xF089 +#define AFX_IDS_SAVE_AS_MENU 0xF08A +#define AFX_IDS_SAVE_COPY_AS_MENU 0xF08B +#define AFX_IDS_EXIT_MENU 0xF08C +#define AFX_IDS_UPDATING_ITEMS 0xF08D +// COlePasteSpecialDialog defines +#define AFX_IDS_METAFILE_FORMAT 0xF08E +#define AFX_IDS_DIB_FORMAT 0xF08F +#define AFX_IDS_BITMAP_FORMAT 0xF090 +#define AFX_IDS_LINKSOURCE_FORMAT 0xF091 +#define AFX_IDS_EMBED_FORMAT 0xF092 +// other OLE utility strings +#define AFX_IDS_PASTELINKEDTYPE 0xF094 +#define AFX_IDS_UNKNOWNTYPE 0xF095 +#define AFX_IDS_RTF_FORMAT 0xF096 +#define AFX_IDS_TEXT_FORMAT 0xF097 +// OLE datatype format error strings +#define AFX_IDS_INVALID_CURRENCY 0xF098 +#define AFX_IDS_INVALID_DATETIME 0xF099 +#define AFX_IDS_INVALID_DATETIMESPAN 0xF09A + +// General error / prompt strings +#define AFX_IDP_INVALID_FILENAME 0xF100 +#define AFX_IDP_FAILED_TO_OPEN_DOC 0xF101 +#define AFX_IDP_FAILED_TO_SAVE_DOC 0xF102 +#define AFX_IDP_ASK_TO_SAVE 0xF103 +#define AFX_IDP_FAILED_TO_CREATE_DOC 0xF104 +#define AFX_IDP_FILE_TOO_LARGE 0xF105 +#define AFX_IDP_FAILED_TO_START_PRINT 0xF106 +#define AFX_IDP_FAILED_TO_LAUNCH_HELP 0xF107 +#define AFX_IDP_INTERNAL_FAILURE 0xF108 // general failure +#define AFX_IDP_COMMAND_FAILURE 0xF109 // command failure +#define AFX_IDP_FAILED_MEMORY_ALLOC 0xF10A +#define AFX_IDP_UNREG_DONE 0xF10B +#define AFX_IDP_UNREG_FAILURE 0xF10C +#define AFX_IDP_DLL_LOAD_FAILED 0xF10D +#define AFX_IDP_DLL_BAD_VERSION 0xF10E + +// DDV parse errors +#define AFX_IDP_PARSE_INT 0xF110 +#define AFX_IDP_PARSE_REAL 0xF111 +#define AFX_IDP_PARSE_INT_RANGE 0xF112 +#define AFX_IDP_PARSE_REAL_RANGE 0xF113 +#define AFX_IDP_PARSE_STRING_SIZE 0xF114 +#define AFX_IDP_PARSE_RADIO_BUTTON 0xF115 +#define AFX_IDP_PARSE_BYTE 0xF116 +#define AFX_IDP_PARSE_UINT 0xF117 +#define AFX_IDP_PARSE_DATETIME 0xF118 +#define AFX_IDP_PARSE_CURRENCY 0xF119 +#define AFX_IDP_PARSE_GUID 0xF11A +#define AFX_IDP_PARSE_TIME 0xF11B +#define AFX_IDP_PARSE_DATE 0xF11C + +// CFile/CArchive error strings for user failure +#define AFX_IDP_FAILED_INVALID_FORMAT 0xF120 +#define AFX_IDP_FAILED_INVALID_PATH 0xF121 +#define AFX_IDP_FAILED_DISK_FULL 0xF122 +#define AFX_IDP_FAILED_ACCESS_READ 0xF123 +#define AFX_IDP_FAILED_ACCESS_WRITE 0xF124 +#define AFX_IDP_FAILED_IO_ERROR_READ 0xF125 +#define AFX_IDP_FAILED_IO_ERROR_WRITE 0xF126 + +// Script errors / prompt strings +#define AFX_IDP_SCRIPT_ERROR 0xF130 +#define AFX_IDP_SCRIPT_DISPATCH_EXCEPTION 0xF131 + +// OLE errors / prompt strings +#define AFX_IDP_STATIC_OBJECT 0xF180 +#define AFX_IDP_FAILED_TO_CONNECT 0xF181 +#define AFX_IDP_SERVER_BUSY 0xF182 +#define AFX_IDP_BAD_VERB 0xF183 +#define AFX_IDS_NOT_DOCOBJECT 0xF184 +#define AFX_IDP_FAILED_TO_NOTIFY 0xF185 +#define AFX_IDP_FAILED_TO_LAUNCH 0xF186 +#define AFX_IDP_ASK_TO_UPDATE 0xF187 +#define AFX_IDP_FAILED_TO_UPDATE 0xF188 +#define AFX_IDP_FAILED_TO_REGISTER 0xF189 +#define AFX_IDP_FAILED_TO_AUTO_REGISTER 0xF18A +#define AFX_IDP_FAILED_TO_CONVERT 0xF18B +#define AFX_IDP_GET_NOT_SUPPORTED 0xF18C +#define AFX_IDP_SET_NOT_SUPPORTED 0xF18D +#define AFX_IDP_ASK_TO_DISCARD 0xF18E +#define AFX_IDP_FAILED_TO_CREATE 0xF18F + +// MAPI errors / prompt strings +#define AFX_IDP_FAILED_MAPI_LOAD 0xF190 +#define AFX_IDP_INVALID_MAPI_DLL 0xF191 +#define AFX_IDP_FAILED_MAPI_SEND 0xF192 + +#define AFX_IDP_FILE_NONE 0xF1A0 +#define AFX_IDP_FILE_GENERIC 0xF1A1 +#define AFX_IDP_FILE_NOT_FOUND 0xF1A2 +#define AFX_IDP_FILE_BAD_PATH 0xF1A3 +#define AFX_IDP_FILE_TOO_MANY_OPEN 0xF1A4 +#define AFX_IDP_FILE_ACCESS_DENIED 0xF1A5 +#define AFX_IDP_FILE_INVALID_FILE 0xF1A6 +#define AFX_IDP_FILE_REMOVE_CURRENT 0xF1A7 +#define AFX_IDP_FILE_DIR_FULL 0xF1A8 +#define AFX_IDP_FILE_BAD_SEEK 0xF1A9 +#define AFX_IDP_FILE_HARD_IO 0xF1AA +#define AFX_IDP_FILE_SHARING 0xF1AB +#define AFX_IDP_FILE_LOCKING 0xF1AC +#define AFX_IDP_FILE_DISKFULL 0xF1AD +#define AFX_IDP_FILE_EOF 0xF1AE + +#define AFX_IDP_ARCH_NONE 0xF1B0 +#define AFX_IDP_ARCH_GENERIC 0xF1B1 +#define AFX_IDP_ARCH_READONLY 0xF1B2 +#define AFX_IDP_ARCH_ENDOFFILE 0xF1B3 +#define AFX_IDP_ARCH_WRITEONLY 0xF1B4 +#define AFX_IDP_ARCH_BADINDEX 0xF1B5 +#define AFX_IDP_ARCH_BADCLASS 0xF1B6 +#define AFX_IDP_ARCH_BADSCHEMA 0xF1B7 + +#define AFX_IDS_OCC_SCALEUNITS_PIXELS 0xF1C0 + +// 0xf200-0xf20f reserved + +// font names and point sizes +#define AFX_IDS_STATUS_FONT 0xF230 +#define AFX_IDS_TOOLTIP_FONT 0xF231 +#define AFX_IDS_UNICODE_FONT 0xF232 +#define AFX_IDS_MINI_FONT 0xF233 + +// ODBC Database errors / prompt strings +#ifndef RC_INVOKED // code only +#define AFX_IDP_SQL_FIRST 0xF280 +#endif //!RC_INVOKED +#define AFX_IDP_SQL_CONNECT_FAIL 0xF281 +#define AFX_IDP_SQL_RECORDSET_FORWARD_ONLY 0xF282 +#define AFX_IDP_SQL_EMPTY_COLUMN_LIST 0xF283 +#define AFX_IDP_SQL_FIELD_SCHEMA_MISMATCH 0xF284 +#define AFX_IDP_SQL_ILLEGAL_MODE 0xF285 +#define AFX_IDP_SQL_MULTIPLE_ROWS_AFFECTED 0xF286 +#define AFX_IDP_SQL_NO_CURRENT_RECORD 0xF287 +#define AFX_IDP_SQL_NO_ROWS_AFFECTED 0xF288 +#define AFX_IDP_SQL_RECORDSET_READONLY 0xF289 +#define AFX_IDP_SQL_SQL_NO_TOTAL 0xF28A +#define AFX_IDP_SQL_ODBC_LOAD_FAILED 0xF28B +#define AFX_IDP_SQL_DYNASET_NOT_SUPPORTED 0xF28C +#define AFX_IDP_SQL_SNAPSHOT_NOT_SUPPORTED 0xF28D +#define AFX_IDP_SQL_API_CONFORMANCE 0xF28E +#define AFX_IDP_SQL_SQL_CONFORMANCE 0xF28F +#define AFX_IDP_SQL_NO_DATA_FOUND 0xF290 +#define AFX_IDP_SQL_ROW_UPDATE_NOT_SUPPORTED 0xF291 +#define AFX_IDP_SQL_ODBC_V2_REQUIRED 0xF292 +#define AFX_IDP_SQL_NO_POSITIONED_UPDATES 0xF293 +#define AFX_IDP_SQL_LOCK_MODE_NOT_SUPPORTED 0xF294 +#define AFX_IDP_SQL_DATA_TRUNCATED 0xF295 +#define AFX_IDP_SQL_ROW_FETCH 0xF296 +#define AFX_IDP_SQL_INCORRECT_ODBC 0xF297 +#define AFX_IDP_SQL_UPDATE_DELETE_FAILED 0xF298 +#define AFX_IDP_SQL_DYNAMIC_CURSOR_NOT_SUPPORTED 0xF299 +#define AFX_IDP_SQL_FIELD_NOT_FOUND 0xF29A +#define AFX_IDP_SQL_BOOKMARKS_NOT_SUPPORTED 0xF29B +#define AFX_IDP_SQL_BOOKMARKS_NOT_ENABLED 0xF29C + +// ODBC Database strings +#define AFX_IDS_DELETED 0xF29D + +// DAO Database errors / prompt strings +#ifndef RC_INVOKED // code only +#define AFX_IDP_DAO_FIRST 0xF2B0 +#endif //!RC_INVOKED +#define AFX_IDP_DAO_ENGINE_INITIALIZATION 0xF2B0 +#define AFX_IDP_DAO_DFX_BIND 0xF2B1 +#define AFX_IDP_DAO_OBJECT_NOT_OPEN 0xF2B2 + +// ICDAORecordset::GetRows Errors +// These are not placed in DAO Errors collection +// and must be handled directly by MFC. +#define AFX_IDP_DAO_ROWTOOSHORT 0xF2B3 +#define AFX_IDP_DAO_BADBINDINFO 0xF2B4 +#define AFX_IDP_DAO_COLUMNUNAVAILABLE 0xF2B5 + +///////////////////////////////////////////////////////////////////////////// +// Strings for ISAPI support + +#define AFX_IDS_HTTP_TITLE 0xF2D1 +#define AFX_IDS_HTTP_NO_TEXT 0xF2D2 +#define AFX_IDS_HTTP_BAD_REQUEST 0xF2D3 +#define AFX_IDS_HTTP_AUTH_REQUIRED 0xF2D4 +#define AFX_IDS_HTTP_FORBIDDEN 0xF2D5 +#define AFX_IDS_HTTP_NOT_FOUND 0xF2D6 +#define AFX_IDS_HTTP_SERVER_ERROR 0xF2D7 +#define AFX_IDS_HTTP_NOT_IMPLEMENTED 0xF2D8 + +///////////////////////////////////////////////////////////////////////////// +// Strings for Accessibility support for CCheckListBox +#define AFX_IDS_CHECKLISTBOX_UNCHECK 0xF2E1 +#define AFX_IDS_CHECKLISTBOX_CHECK 0xF2E2 +#define AFX_IDS_CHECKLISTBOX_MIXED 0xF2E3 + +///////////////////////////////////////////////////////////////////////////// +// AFX implementation - control IDs (AFX_IDC) + +// Parts of dialogs +#define AFX_IDC_LISTBOX 100 +#define AFX_IDC_CHANGE 101 +#define AFX_IDC_BROWSER 102 + +// for print dialog +#define AFX_IDC_PRINT_DOCNAME 201 +#define AFX_IDC_PRINT_PRINTERNAME 202 +#define AFX_IDC_PRINT_PORTNAME 203 +#define AFX_IDC_PRINT_PAGENUM 204 + +// Property Sheet control id's (determined with Spy++) +#define ID_APPLY_NOW 0x3021 +#define ID_WIZBACK 0x3023 +#define ID_WIZNEXT 0x3024 +#define ID_WIZFINISH 0x3025 +#define AFX_IDC_TAB_CONTROL 0x3020 + +///////////////////////////////////////////////////////////////////////////// +// IDRs for standard components + +#ifndef RC_INVOKED // code only +// These are really COMMDLG dialogs, so there usually isn't a resource +// for them, but these IDs are used as help IDs. +#define AFX_IDD_FILEOPEN 28676 +#define AFX_IDD_FILESAVE 28677 +#define AFX_IDD_FONT 28678 +#define AFX_IDD_COLOR 28679 +#define AFX_IDD_PRINT 28680 +#define AFX_IDD_PRINTSETUP 28681 +#define AFX_IDD_FIND 28682 +#define AFX_IDD_REPLACE 28683 +#endif //!RC_INVOKED + +// Standard dialogs app should leave alone (0x7801->) +#define AFX_IDD_NEWTYPEDLG 30721 +#define AFX_IDD_PRINTDLG 30722 +#define AFX_IDD_PREVIEW_TOOLBAR 30723 + +// Dialogs defined for OLE2UI library +#define AFX_IDD_INSERTOBJECT 30724 +#define AFX_IDD_CHANGEICON 30725 +#define AFX_IDD_CONVERT 30726 +#define AFX_IDD_PASTESPECIAL 30727 +#define AFX_IDD_EDITLINKS 30728 +#define AFX_IDD_FILEBROWSE 30729 +#define AFX_IDD_BUSY 30730 + +#define AFX_IDD_OBJECTPROPERTIES 30732 +#define AFX_IDD_CHANGESOURCE 30733 + +//WinForms +#define AFX_IDD_EMPTYDIALOG 30734 + +// Standard cursors (0x7901->) + // AFX_IDC = Cursor resources +#define AFX_IDC_CONTEXTHELP 30977 // context sensitive help +#define AFX_IDC_MAGNIFY 30978 // print preview zoom +#define AFX_IDC_SMALLARROWS 30979 // splitter +#define AFX_IDC_HSPLITBAR 30980 // splitter +#define AFX_IDC_VSPLITBAR 30981 // splitter +#define AFX_IDC_NODROPCRSR 30982 // No Drop Cursor +#define AFX_IDC_TRACKNWSE 30983 // tracker +#define AFX_IDC_TRACKNESW 30984 // tracker +#define AFX_IDC_TRACKNS 30985 // tracker +#define AFX_IDC_TRACKWE 30986 // tracker +#define AFX_IDC_TRACK4WAY 30987 // tracker +#define AFX_IDC_MOVE4WAY 30988 // resize bar (server only) + +// Wheel mouse cursors +// NOTE: values must be in this order! See CScrollView::OnTimer() +#define AFX_IDC_MOUSE_PAN_NW 30998 // pan east +#define AFX_IDC_MOUSE_PAN_N 30999 // pan northeast +#define AFX_IDC_MOUSE_PAN_NE 31000 // pan north +#define AFX_IDC_MOUSE_PAN_W 31001 // pan northwest +#define AFX_IDC_MOUSE_PAN_HV 31002 // pan both axis +#define AFX_IDC_MOUSE_PAN_E 31003 // pan west +#define AFX_IDC_MOUSE_PAN_SW 31004 // pan south-west +#define AFX_IDC_MOUSE_PAN_S 31005 // pan south +#define AFX_IDC_MOUSE_PAN_SE 31006 // pan south-east +#define AFX_IDC_MOUSE_PAN_HORZ 31007 // pan X-axis +#define AFX_IDC_MOUSE_PAN_VERT 31008 // pan Y-axis + +// Wheel mouse bitmaps +#define AFX_IDC_MOUSE_ORG_HORZ 31009 // anchor for horz only +#define AFX_IDC_MOUSE_ORG_VERT 31010 // anchor for vert only +#define AFX_IDC_MOUSE_ORG_HV 31011 // anchor for horz/vert +#define AFX_IDC_MOUSE_MASK 31012 + +// Mini frame window bitmap ID +#define AFX_IDB_MINIFRAME_MENU 30994 + +// CheckListBox checks bitmap ID +#define AFX_IDB_CHECKLISTBOX_95 30996 + +// AFX standard accelerator resources +#define AFX_IDR_PREVIEW_ACCEL 30997 + +// AFX standard ICON IDs (for MFC V1 apps) (0x7A01->) +#define AFX_IDI_STD_MDIFRAME 31233 +#define AFX_IDI_STD_FRAME 31234 + +///////////////////////////////////////////////////////////////////////////// +// AFX OLE control implementation - control IDs (AFX_IDC) + +// Font property page +#define AFX_IDC_FONTPROP 1000 +#define AFX_IDC_FONTNAMES 1001 +#define AFX_IDC_FONTSTYLES 1002 +#define AFX_IDC_FONTSIZES 1003 +#define AFX_IDC_STRIKEOUT 1004 +#define AFX_IDC_UNDERLINE 1005 +#define AFX_IDC_SAMPLEBOX 1006 + +// Color property page +#define AFX_IDC_COLOR_BLACK 1100 +#define AFX_IDC_COLOR_WHITE 1101 +#define AFX_IDC_COLOR_RED 1102 +#define AFX_IDC_COLOR_GREEN 1103 +#define AFX_IDC_COLOR_BLUE 1104 +#define AFX_IDC_COLOR_YELLOW 1105 +#define AFX_IDC_COLOR_MAGENTA 1106 +#define AFX_IDC_COLOR_CYAN 1107 +#define AFX_IDC_COLOR_GRAY 1108 +#define AFX_IDC_COLOR_LIGHTGRAY 1109 +#define AFX_IDC_COLOR_DARKRED 1110 +#define AFX_IDC_COLOR_DARKGREEN 1111 +#define AFX_IDC_COLOR_DARKBLUE 1112 +#define AFX_IDC_COLOR_LIGHTBROWN 1113 +#define AFX_IDC_COLOR_DARKMAGENTA 1114 +#define AFX_IDC_COLOR_DARKCYAN 1115 +#define AFX_IDC_COLORPROP 1116 +#define AFX_IDC_SYSTEMCOLORS 1117 + +// Picture porperty page +#define AFX_IDC_PROPNAME 1201 +#define AFX_IDC_PICTURE 1202 +#define AFX_IDC_BROWSE 1203 +#define AFX_IDC_CLEAR 1204 + +///////////////////////////////////////////////////////////////////////////// +// IDRs for OLE control standard components + +// Standard propery page dialogs app should leave alone (0x7E01->) +#define AFX_IDD_PROPPAGE_COLOR 32257 +#define AFX_IDD_PROPPAGE_FONT 32258 +#define AFX_IDD_PROPPAGE_PICTURE 32259 + +#define AFX_IDB_TRUETYPE 32384 + +///////////////////////////////////////////////////////////////////////////// +// Standard OLE control strings + +// OLE Control page strings +#define AFX_IDS_PROPPAGE_UNKNOWN 0xFE01 +#define AFX_IDS_COLOR_DESKTOP 0xFE04 +#define AFX_IDS_COLOR_APPWORKSPACE 0xFE05 +#define AFX_IDS_COLOR_WNDBACKGND 0xFE06 +#define AFX_IDS_COLOR_WNDTEXT 0xFE07 +#define AFX_IDS_COLOR_MENUBAR 0xFE08 +#define AFX_IDS_COLOR_MENUTEXT 0xFE09 +#define AFX_IDS_COLOR_ACTIVEBAR 0xFE0A +#define AFX_IDS_COLOR_INACTIVEBAR 0xFE0B +#define AFX_IDS_COLOR_ACTIVETEXT 0xFE0C +#define AFX_IDS_COLOR_INACTIVETEXT 0xFE0D +#define AFX_IDS_COLOR_ACTIVEBORDER 0xFE0E +#define AFX_IDS_COLOR_INACTIVEBORDER 0xFE0F +#define AFX_IDS_COLOR_WNDFRAME 0xFE10 +#define AFX_IDS_COLOR_SCROLLBARS 0xFE11 +#define AFX_IDS_COLOR_BTNFACE 0xFE12 +#define AFX_IDS_COLOR_BTNSHADOW 0xFE13 +#define AFX_IDS_COLOR_BTNTEXT 0xFE14 +#define AFX_IDS_COLOR_BTNHIGHLIGHT 0xFE15 +#define AFX_IDS_COLOR_DISABLEDTEXT 0xFE16 +#define AFX_IDS_COLOR_HIGHLIGHT 0xFE17 +#define AFX_IDS_COLOR_HIGHLIGHTTEXT 0xFE18 +#define AFX_IDS_REGULAR 0xFE19 +#define AFX_IDS_BOLD 0xFE1A +#define AFX_IDS_ITALIC 0xFE1B +#define AFX_IDS_BOLDITALIC 0xFE1C +#define AFX_IDS_SAMPLETEXT 0xFE1D +#define AFX_IDS_DISPLAYSTRING_FONT 0xFE1E +#define AFX_IDS_DISPLAYSTRING_COLOR 0xFE1F +#define AFX_IDS_DISPLAYSTRING_PICTURE 0xFE20 +#define AFX_IDS_PICTUREFILTER 0xFE21 +#define AFX_IDS_PICTYPE_UNKNOWN 0xFE22 +#define AFX_IDS_PICTYPE_NONE 0xFE23 +#define AFX_IDS_PICTYPE_BITMAP 0xFE24 +#define AFX_IDS_PICTYPE_METAFILE 0xFE25 +#define AFX_IDS_PICTYPE_ICON 0xFE26 +#define AFX_IDS_COLOR_PPG 0xFE28 +#define AFX_IDS_COLOR_PPG_CAPTION 0xFE29 +#define AFX_IDS_FONT_PPG 0xFE2A +#define AFX_IDS_FONT_PPG_CAPTION 0xFE2B +#define AFX_IDS_PICTURE_PPG 0xFE2C +#define AFX_IDS_PICTURE_PPG_CAPTION 0xFE2D +#define AFX_IDS_PICTUREBROWSETITLE 0xFE30 +#define AFX_IDS_BORDERSTYLE_0 0xFE31 +#define AFX_IDS_BORDERSTYLE_1 0xFE32 + +// OLE Control verb names +#define AFX_IDS_VERB_EDIT 0xFE40 +#define AFX_IDS_VERB_PROPERTIES 0xFE41 + +// OLE Control internal error messages +#define AFX_IDP_PICTURECANTOPEN 0xFE83 +#define AFX_IDP_PICTURECANTLOAD 0xFE84 +#define AFX_IDP_PICTURETOOLARGE 0xFE85 +#define AFX_IDP_PICTUREREADFAILED 0xFE86 + +// Standard OLE Control error strings +#define AFX_IDP_E_ILLEGALFUNCTIONCALL 0xFEA0 +#define AFX_IDP_E_OVERFLOW 0xFEA1 +#define AFX_IDP_E_OUTOFMEMORY 0xFEA2 +#define AFX_IDP_E_DIVISIONBYZERO 0xFEA3 +#define AFX_IDP_E_OUTOFSTRINGSPACE 0xFEA4 +#define AFX_IDP_E_OUTOFSTACKSPACE 0xFEA5 +#define AFX_IDP_E_BADFILENAMEORNUMBER 0xFEA6 +#define AFX_IDP_E_FILENOTFOUND 0xFEA7 +#define AFX_IDP_E_BADFILEMODE 0xFEA8 +#define AFX_IDP_E_FILEALREADYOPEN 0xFEA9 +#define AFX_IDP_E_DEVICEIOERROR 0xFEAA +#define AFX_IDP_E_FILEALREADYEXISTS 0xFEAB +#define AFX_IDP_E_BADRECORDLENGTH 0xFEAC +#define AFX_IDP_E_DISKFULL 0xFEAD +#define AFX_IDP_E_BADRECORDNUMBER 0xFEAE +#define AFX_IDP_E_BADFILENAME 0xFEAF +#define AFX_IDP_E_TOOMANYFILES 0xFEB0 +#define AFX_IDP_E_DEVICEUNAVAILABLE 0xFEB1 +#define AFX_IDP_E_PERMISSIONDENIED 0xFEB2 +#define AFX_IDP_E_DISKNOTREADY 0xFEB3 +#define AFX_IDP_E_PATHFILEACCESSERROR 0xFEB4 +#define AFX_IDP_E_PATHNOTFOUND 0xFEB5 +#define AFX_IDP_E_INVALIDPATTERNSTRING 0xFEB6 +#define AFX_IDP_E_INVALIDUSEOFNULL 0xFEB7 +#define AFX_IDP_E_INVALIDFILEFORMAT 0xFEB8 +#define AFX_IDP_E_INVALIDPROPERTYVALUE 0xFEB9 +#define AFX_IDP_E_INVALIDPROPERTYARRAYINDEX 0xFEBA +#define AFX_IDP_E_SETNOTSUPPORTEDATRUNTIME 0xFEBB +#define AFX_IDP_E_SETNOTSUPPORTED 0xFEBC +#define AFX_IDP_E_NEEDPROPERTYARRAYINDEX 0xFEBD +#define AFX_IDP_E_SETNOTPERMITTED 0xFEBE +#define AFX_IDP_E_GETNOTSUPPORTEDATRUNTIME 0xFEBF +#define AFX_IDP_E_GETNOTSUPPORTED 0xFEC0 +#define AFX_IDP_E_PROPERTYNOTFOUND 0xFEC1 +#define AFX_IDP_E_INVALIDCLIPBOARDFORMAT 0xFEC2 +#define AFX_IDP_E_INVALIDPICTURE 0xFEC3 +#define AFX_IDP_E_PRINTERERROR 0xFEC4 +#define AFX_IDP_E_CANTSAVEFILETOTEMP 0xFEC5 +#define AFX_IDP_E_SEARCHTEXTNOTFOUND 0xFEC6 +#define AFX_IDP_E_REPLACEMENTSTOOLONG 0xFEC7 + +///////////////////////////////////////////////////////////////////////////// + +#ifdef _AFX_MINREBUILD +#pragma component(minrebuild, on) +#endif + +#endif //__AFXRES_H__ + +///////////////////////////////////////////////////////////////////////////// diff --git a/Branches/MusicMod/TestPlayer/Src/Player.cpp b/Branches/MusicMod/TestPlayer/Src/Player.cpp new file mode 100644 index 0000000000..017460b3a5 --- /dev/null +++ b/Branches/MusicMod/TestPlayer/Src/Player.cpp @@ -0,0 +1,37 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + + +////////////////////////////////////////////////////////////////////////////////////////// +// File description +/* ŻŻŻŻŻŻŻŻŻŻ +// This project loads the dll */ +/////////////////////////////////// + + +#include // System + +#include "../Player/Src/PlayerExport.h" // Local player + + +void main() +{ + Player_Main(true); + + std::cin.get(); // Keep the window open +} \ No newline at end of file diff --git a/Branches/MusicMod/TestPlayer/TestPlayer.vcproj b/Branches/MusicMod/TestPlayer/TestPlayer.vcproj new file mode 100644 index 0000000000..9aa9cb994b --- /dev/null +++ b/Branches/MusicMod/TestPlayer/TestPlayer.vcproj @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Externals/wxWidgets/build/msw/wx_adv.vcproj b/Externals/wxWidgets/build/msw/wx_adv.vcproj index 7353c65426..f1f2187e94 100644 --- a/Externals/wxWidgets/build/msw/wx_adv.vcproj +++ b/Externals/wxWidgets/build/msw/wx_adv.vcproj @@ -1,7 +1,7 @@ + + @@ -2193,10 +2197,6 @@ /> - - + #include #endif namespace DiscIO @@ -55,6 +67,15 @@ PlainFileReader::~PlainFileReader() bool PlainFileReader::Read(u64 offset, u64 nbytes, u8* out_ptr) { + ////////////////////////////////////////////////// + // Music mod + // ŻŻŻŻŻŻŻŻŻŻ + #ifdef MUSICMOD + MusicMod::CheckFile(offset, size); + #endif + /////////////////////// + + LONG offset_high = (LONG)(offset >> 32); SetFilePointer(hFile, (DWORD)(offset & 0xFFFFFFFF), &offset_high, FILE_BEGIN); diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.h b/Source/Core/DiscIO/Src/FileSystemGCWii.h index 3cb1359c01..dded1c17e1 100644 --- a/Source/Core/DiscIO/Src/FileSystemGCWii.h +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.h @@ -37,9 +37,9 @@ public: virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const; virtual bool ExportAllFiles(const char* _rFullPath) const; + std::vector m_FileInfoVector; // Public for the music modification -private: - std::vector m_FileInfoVector; +private: bool m_Initialized; u32 m_OffsetShift; // WII offsets are all shifted diff --git a/Source/Core/DolphinWX/Src/BootManager.cpp b/Source/Core/DolphinWX/Src/BootManager.cpp index e165c7741b..4d56b61f5c 100644 --- a/Source/Core/DolphinWX/Src/BootManager.cpp +++ b/Source/Core/DolphinWX/Src/BootManager.cpp @@ -51,9 +51,12 @@ #include "Config.h" #include "Core.h" #if defined(HAVE_WX) && HAVE_WX -#include "ConfigMain.h" -#include "Frame.h" -#include "CodeWindow.h" + #include "ConfigMain.h" + #include "Frame.h" + #include "CodeWindow.h" + #ifdef MUSICMOD + #include "../../../Branches/MusicMod/Main/Src/Main.h" // MusicMod + #endif #endif static std::string s_DataBasePath_EUR = "Data_EUR"; @@ -204,6 +207,16 @@ bool BootCore(const std::string& _rFilename) #else Core::SetState(Core::CORE_RUN); #endif + + ////////////////////////////////////////////////////////////////////////////////////////// + // Music mod + // ŻŻŻŻŻŻŻŻŻŻ + #ifdef MUSICMOD + MusicMod::Main(StartUp.m_strFilename); + #endif + /////////////////////////////////// + + return true; } diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 3eb124a549..12482f68cf 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -55,6 +55,7 @@ extern "C" { #include "../resources/toolbar_plugin_pad.c" #include "../resources/toolbar_refresh.c" #include "../resources/toolbar_stop.c" +#include "../resources/Boomy.h" }; @@ -96,6 +97,14 @@ EVT_MENU(IDM_CONFIG_GFX_PLUGIN, CFrame::OnPluginGFX) EVT_MENU(IDM_CONFIG_DSP_PLUGIN, CFrame::OnPluginDSP) EVT_MENU(IDM_CONFIG_PAD_PLUGIN, CFrame::OnPluginPAD) EVT_MENU(IDM_CONFIG_WIIMOTE_PLUGIN, CFrame::OnPluginWiimote) + +#ifdef MUSICMOD +EVT_MENU(IDM_MUTE, CFrame::MM_OnMute) +EVT_MENU(IDM_MUSIC_PLAY, CFrame::MM_OnPause) +EVT_COMMAND_SCROLL(IDS_VOLUME, CFrame::MM_OnVolume) +EVT_MENU(IDT_LOG, CFrame::MM_OnLog) +#endif + EVT_MENU(IDM_BROWSE, CFrame::OnBrowse) EVT_MENU(IDM_MEMCARD, CFrame::OnMemcard) EVT_MENU(IDM_CHEATS, CFrame::OnShow_CheatsWindow) @@ -283,8 +292,10 @@ void CFrame::PopulateToolbar(wxToolBar* toolBar) toolBar->AddTool(wxID_REFRESH, _T("Refresh"), m_Bitmaps[Toolbar_Refresh], _T("Refresh")); toolBar->AddTool(IDM_BROWSE, _T("Browse"), m_Bitmaps[Toolbar_Browse], _T("Browse for an ISO directory...")); toolBar->AddSeparator(); + m_pToolPlay = toolBar->AddTool(IDM_PLAY, _T("Play"), m_Bitmaps[Toolbar_Play], _T("Play")); + toolBar->AddTool(IDM_STOP, _T("Stop"), m_Bitmaps[Toolbar_Stop], _T("Stop")); #ifdef _WIN32 toolBar->AddTool(IDM_TOGGLE_FULLSCREEN, _T("Fullscr."), m_Bitmaps[Toolbar_FullScreen], _T("Toggle Fullscreen")); @@ -298,6 +309,16 @@ void CFrame::PopulateToolbar(wxToolBar* toolBar) toolBar->AddSeparator(); toolBar->AddTool(IDM_HELPABOUT, _T("About"), m_Bitmaps[Toolbar_Help], _T("About Dolphin")); + + ////////////////////////////////////////////////// + // Music mod + // ŻŻŻŻŻŻŻŻŻŻ + #ifdef MUSICMOD + MM_PopulateGUI(); + #endif + /////////////////////// + + // after adding the buttons to the toolbar, must call Realize() to reflect // the changes toolBar->Realize(); @@ -314,7 +335,7 @@ void CFrame::RecreateToolbar() SetToolBar(NULL); style &= ~(wxTB_HORIZONTAL | wxTB_VERTICAL | wxTB_BOTTOM | wxTB_RIGHT | wxTB_HORZ_LAYOUT | wxTB_TOP); - wxToolBar* theToolBar = CreateToolBar(style, ID_TOOLBAR); + theToolBar = CreateToolBar(style, ID_TOOLBAR); PopulateToolbar(theToolBar); SetToolBar(theToolBar); @@ -322,6 +343,7 @@ void CFrame::RecreateToolbar() } + void CFrame::InitBitmaps() { // load orignal size 48x48 @@ -337,12 +359,17 @@ void CFrame::InitBitmaps() m_Bitmaps[Toolbar_PluginPAD] = wxGetBitmapFromMemory(toolbar_plugin_pad_png); m_Bitmaps[Toolbar_FullScreen] = wxGetBitmapFromMemory(toolbar_fullscreen_png); m_Bitmaps[Toolbar_Help] = wxGetBitmapFromMemory(toolbar_help_png); + + #ifdef MUSICMOD + m_Bitmaps[Toolbar_Log] = wxGetBitmapFromMemory(Toolbar_Log_png); + MM_InitBitmaps(); + #endif - // scale to 24x24 for toolbar - for (size_t n = Toolbar_FileOpen; n < WXSIZEOF(m_Bitmaps); n++) + // Scale to 24x24 for toolbar. Toolbar_Log is already 24x24 + for (size_t n = Toolbar_FileOpen; n <= Toolbar_Help; n++) { m_Bitmaps[n] = wxBitmap(m_Bitmaps[n].ConvertToImage().Scale(24, 24)); - } + } } @@ -468,6 +495,11 @@ void CFrame::OnHelp(wxCommandEvent& event) // ------------- void CFrame::OnPlay(wxCommandEvent& WXUNUSED (event)) { + #ifdef MUSICMOD // Music modification + MM_OnPlay(); + #endif + + // shuffle2: wxBusyInfo is meant to be created on the stack // and only stay around for the life of the scope it's in. // If that is not what we want, find another solution. I don't @@ -715,6 +747,10 @@ void CFrame::OnKeyUp(wxKeyEvent& event) // ------------- void CFrame::UpdateGUI() { + #ifdef MUSICMOD + MM_UpdateGUI(); + #endif + // Save status bool initialized = Core::GetState() != Core::CORE_UNINITIALIZED; bool running = Core::GetState() == Core::CORE_RUN; @@ -750,6 +786,7 @@ void CFrame::UpdateGUI() m_pToolPlay->SetLabel(_("Pause")); } m_pMenuItemPlay->SetText(_("&Pause")); + } else { @@ -760,6 +797,7 @@ void CFrame::UpdateGUI() m_pToolPlay->SetLabel(_("Play")); } m_pMenuItemPlay->SetText(_("&Play")); + } if (GetToolBar() != NULL) GetToolBar()->Realize(); @@ -781,5 +819,7 @@ void CFrame::UpdateGUI() m_GameListCtrl->Hide(); } } + + theToolBar->Realize(); } diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h index e884eef89c..07e15b9ee5 100644 --- a/Source/Core/DolphinWX/Src/Frame.h +++ b/Source/Core/DolphinWX/Src/Frame.h @@ -1,3 +1,21 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + #ifndef __FRAME_H_ #define __FRAME_H_ @@ -50,6 +68,25 @@ class CFrame : public wxFrame wxBoxSizer* sizerPanel; CGameListCtrl* m_GameListCtrl; wxPanel* m_Panel; + wxToolBar* theToolBar; + wxToolBarToolBase* m_ToolPlay; + + + ////////////////////////////////////////////////////////////////////////////////////////// + // Music mod + // ŻŻŻŻŻŻŻŻŻŻ + #ifdef MUSICMOD + wxToolBarToolBase* mm_ToolMute, * mm_ToolPlay, * mm_ToolLog; + + void MM_UpdateGUI(); void MM_PopulateGUI(); void MM_InitBitmaps(); + void MM_OnPlay(); + void MM_OnMute(wxCommandEvent& event); + void MM_OnPause(wxCommandEvent& event); + void MM_OnVolume(wxScrollEvent& event); + void MM_OnLog(wxCommandEvent& event); + #endif + /////////////////////////////////// + enum EBitmaps { @@ -57,14 +94,17 @@ class CFrame : public wxFrame Toolbar_Refresh, Toolbar_Browse, Toolbar_Play, - Toolbar_Stop, + Toolbar_Stop, Toolbar_Stop_Dis, Toolbar_Pause, Toolbar_PluginOptions, Toolbar_PluginGFX, - Toolbar_PluginDSP, + Toolbar_PluginDSP, Toolbar_PluginDSP_Dis, Toolbar_PluginPAD, Toolbar_FullScreen, Toolbar_Help, + #ifdef MUSICMOD + Toolbar_Log, Toolbar_Log_Dis, + #endif Bitmaps_Max, END }; diff --git a/Source/Core/DolphinWX/Src/Globals.h b/Source/Core/DolphinWX/Src/Globals.h index d0b4d56e1e..fee977ca4b 100644 --- a/Source/Core/DolphinWX/Src/Globals.h +++ b/Source/Core/DolphinWX/Src/Globals.h @@ -15,10 +15,31 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ + + +//////////////////////////////////////////////////////////////////////////////////////// +// File description +/* ŻŻŻŻŻŻŻŻŻ + + This file is global in the DolphinWX and DebuggerWX projects. + +////////////////////////*/ + + + #ifndef _GLOBALS_H #define _GLOBALS_H #include "Common.h" + + +//////////////////////////////////////////////////////////////////////////////////////// +// Build with music modification +// ŻŻŻŻŻŻŻŻŻ +#include "../../../Branches/MusicMod/Main/Src/Setup.h" // Define MUSICMOD here +////////////////////////// + + enum { IDM_LOADSTATE = 200, // File @@ -56,6 +77,13 @@ enum IDM_HELPWEBSITE, IDM_HELPGOOGLECODE, + #ifdef MUSICMOD // Music modification + IDM_MUTE, + IDM_MUSIC_PLAY, + IDS_VOLUME, IDS_VOLUME_LABEL, IDS_VOLUME_PANEL, + IDT_LOG, + #endif + IDM_CONFIG_MAIN, IDM_CONFIG_GFX_PLUGIN, IDM_CONFIG_DSP_PLUGIN, @@ -93,44 +121,43 @@ enum //#ifndef WX_PRECOMP #if defined(HAVE_WX) && HAVE_WX -#include -//#endif + #include + //#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include -// define this to use XPMs everywhere (by default, BMPs are used under Win) -// BMPs use less space, but aren't compiled into the executable on other platforms - -#if USE_XPM_BITMAPS && defined (__WXMSW__) && !wxUSE_XPM_IN_MSW -#error You need to enable XPM support to use XPM bitmaps with toolbar! -#endif // USE_XPM_BITMAPS + // Define this to use XPMs everywhere (by default, BMPs are used under Win) + // BMPs use less space, but aren't compiled into the executable on other platforms + #if USE_XPM_BITMAPS && defined (__WXMSW__) && !wxUSE_XPM_IN_MSW + #error You need to enable XPM support to use XPM bitmaps with toolbar! + #endif // USE_XPM_BITMAPS -// -// custom message macro -// + // + // custom message macro + // + #define EVT_HOST_COMMAND(id, fn) \ + DECLARE_EVENT_TABLE_ENTRY(\ + wxEVT_HOST_COMMAND, id, wxID_ANY, \ + (wxObjectEventFunction)(wxEventFunction) wxStaticCastEvent(wxCommandEventFunction, &fn), \ + (wxObject*) NULL \ + ), -#define EVT_HOST_COMMAND(id, fn) \ - DECLARE_EVENT_TABLE_ENTRY(\ - wxEVT_HOST_COMMAND, id, wxID_ANY, \ - (wxObjectEventFunction)(wxEventFunction) wxStaticCastEvent(wxCommandEventFunction, &fn), \ - (wxObject*) NULL \ - ), + extern const wxEventType wxEVT_HOST_COMMAND; -extern const wxEventType wxEVT_HOST_COMMAND; -#endif -#endif +#endif // HAVE_WX +#endif // _GLOBALS_H diff --git a/Source/Core/DolphinWX/resources/Boomy.h b/Source/Core/DolphinWX/resources/Boomy.h new file mode 100644 index 0000000000..bb40c53ef9 --- /dev/null +++ b/Source/Core/DolphinWX/resources/Boomy.h @@ -0,0 +1,312 @@ +/* + Automatic generated header by: + + wxInclude by Kim De Deyn, use --help for more information. + Version 1.0, compiled at Sep 12 2007 17:26:17 + + Header: myheader + Macros: no + Const: yes +*/ + +#ifndef _WXINCLUDE_MYHEADER_H_ +#define _WXINCLUDE_MYHEADER_H_ + +static const unsigned char Toolbar_Log_png[] = { +0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, +0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, +0x00, 0x00, 0x00, 0x18, 0x08, 0x06, 0x00, 0x00, 0x00, 0xE0, +0x77, 0x3D, 0xF8, 0x00, 0x00, 0x05, 0xC0, 0x49, 0x44, 0x41, +0x54, 0x78, 0x9C, 0xB5, 0x56, 0x79, 0x6C, 0x14, 0x75, 0x14, +0xFE, 0x66, 0xF6, 0xE8, 0x5E, 0xED, 0x1E, 0x6D, 0x77, 0xDB, +0xED, 0x1E, 0x3D, 0x96, 0x5E, 0x58, 0x5A, 0xDA, 0xD2, 0x42, +0xA5, 0x35, 0x6D, 0x38, 0x24, 0xB6, 0x85, 0x42, 0x29, 0x06, +0xAD, 0x78, 0x80, 0x5A, 0xA2, 0x26, 0x42, 0x62, 0x48, 0x10, +0x83, 0x09, 0x68, 0x8C, 0x4D, 0x4A, 0x0C, 0x12, 0x45, 0x12, +0x30, 0x2A, 0x04, 0xFF, 0x30, 0x8A, 0x04, 0x08, 0x06, 0x91, +0x48, 0xC2, 0x65, 0x15, 0xA5, 0x45, 0x10, 0x28, 0x45, 0xE9, +0x96, 0x76, 0xDB, 0xED, 0x76, 0x69, 0xF7, 0x9A, 0x99, 0x1D, +0xDF, 0x0C, 0x52, 0xA9, 0x85, 0xF8, 0x8F, 0xFE, 0x92, 0x97, +0xDF, 0xCC, 0xFC, 0x66, 0xBE, 0xF7, 0xDE, 0xF7, 0xBE, 0xF7, +0x76, 0x81, 0xFF, 0x79, 0x29, 0x1E, 0x74, 0xF0, 0x7D, 0x3B, +0xD8, 0xD6, 0x1A, 0x68, 0x1F, 0xAF, 0x41, 0xC6, 0x8A, 0xB9, +0x28, 0x6D, 0xAE, 0xC2, 0xFC, 0xE6, 0xB9, 0x58, 0xD5, 0x34, +0x1B, 0xF5, 0x8D, 0x15, 0xA8, 0xAF, 0x2F, 0xC7, 0x63, 0x0D, +0x95, 0xC8, 0x6F, 0xAC, 0x82, 0x50, 0x3F, 0x0B, 0x03, 0x07, +0xCF, 0x22, 0x7E, 0x3F, 0x1C, 0xF6, 0x9F, 0x0F, 0x7E, 0xDC, +0x05, 0xC5, 0xD9, 0x1D, 0xC8, 0x65, 0x95, 0x78, 0x95, 0x51, +0x33, 0xFB, 0x35, 0x49, 0xAA, 0xD3, 0x46, 0x9B, 0xF6, 0x98, +0x35, 0x2B, 0xF9, 0x43, 0x6B, 0x66, 0xF2, 0xCB, 0x36, 0x97, +0x69, 0xAD, 0xCD, 0x95, 0xD4, 0x96, 0xEE, 0x32, 0xB4, 0xE9, +0x0D, 0xCA, 0xF6, 0x38, 0x8F, 0x13, 0xA2, 0x88, 0x77, 0xB6, +0xBF, 0x08, 0xFD, 0xBF, 0x66, 0x70, 0x66, 0x27, 0x98, 0x78, +0x0C, 0xAB, 0xE8, 0x72, 0x4F, 0x82, 0xD1, 0xD4, 0x9C, 0x9A, +0x5F, 0x99, 0x9B, 0x51, 0xD2, 0x68, 0x70, 0x96, 0xAC, 0x80, +0xBB, 0x74, 0x99, 0x6C, 0xAE, 0xE2, 0x7A, 0x64, 0xCE, 0x5C, +0x00, 0x77, 0x51, 0x05, 0x12, 0x8D, 0x2C, 0xFA, 0x7B, 0xAE, +0x29, 0xA3, 0x51, 0x71, 0x8E, 0x08, 0xE4, 0x2E, 0x2C, 0xC5, +0xA1, 0x23, 0x9D, 0xE0, 0x1E, 0x98, 0x01, 0x17, 0x85, 0x9B, +0xE3, 0xD0, 0x9E, 0xE8, 0x9C, 0xE6, 0xC8, 0x6B, 0x78, 0x0F, +0x9E, 0xBA, 0x03, 0xB0, 0x15, 0x6E, 0x81, 0xDE, 0x3A, 0x1F, +0x50, 0xA7, 0x22, 0x16, 0x19, 0x05, 0x17, 0x19, 0x02, 0x37, +0xDE, 0x8B, 0x38, 0x1F, 0x40, 0xB2, 0x23, 0x1B, 0x6A, 0x8D, +0x06, 0xE2, 0x1D, 0x72, 0x9A, 0x29, 0x93, 0x8E, 0xF6, 0xA7, +0xA1, 0xBA, 0x17, 0x53, 0x79, 0xEF, 0x8D, 0xC0, 0xE1, 0x51, +0x85, 0x4A, 0x61, 0x71, 0xCE, 0x5E, 0x07, 0x9D, 0xB9, 0x15, +0xC1, 0xC1, 0x93, 0xB8, 0xDE, 0xF9, 0x11, 0x46, 0xFB, 0x4F, +0x93, 0x73, 0x3F, 0x44, 0x21, 0x0E, 0x96, 0xB8, 0xD3, 0xEA, +0x75, 0x30, 0x5B, 0x53, 0xA0, 0xD2, 0x6A, 0x11, 0x8B, 0xF1, +0x88, 0x93, 0x03, 0x81, 0x52, 0xA0, 0x7D, 0x8D, 0x08, 0xE6, +0xCC, 0xD6, 0x95, 0xE2, 0x9E, 0x8D, 0x7B, 0x21, 0x4C, 0xCA, +0xE0, 0xC8, 0x5B, 0x60, 0x29, 0x83, 0x6A, 0xBD, 0xD5, 0x01, +0x7D, 0x6A, 0x3D, 0xC6, 0x03, 0x9D, 0x38, 0xB5, 0xBF, 0x01, +0x17, 0x8E, 0xEE, 0x85, 0xAF, 0x77, 0x18, 0xB1, 0x28, 0x8B, +0xB8, 0xA0, 0x42, 0x34, 0x22, 0xC0, 0xD7, 0x37, 0x8C, 0xEB, +0x17, 0x7B, 0x10, 0x1A, 0x8F, 0x41, 0xA3, 0xD3, 0x41, 0xA9, +0x52, 0x41, 0xA5, 0x56, 0x42, 0xA1, 0x60, 0x40, 0x7E, 0xB6, +0x12, 0x5C, 0xDA, 0x14, 0x8A, 0x14, 0x2A, 0x18, 0x63, 0x31, +0x94, 0x19, 0x6C, 0xB9, 0x60, 0x60, 0x06, 0x17, 0x3E, 0x8D, +0x9C, 0xB2, 0x2A, 0x34, 0xBC, 0xB6, 0x1E, 0x8B, 0x37, 0xAC, +0xC3, 0xBC, 0x67, 0xDB, 0x50, 0xBD, 0xB2, 0x15, 0xD5, 0x2D, +0x2D, 0x64, 0x4B, 0x51, 0x5C, 0x57, 0x8B, 0x14, 0x67, 0x16, +0x8A, 0xAA, 0x2B, 0x51, 0x51, 0x37, 0x13, 0xE5, 0x55, 0x39, +0x30, 0x99, 0xB5, 0x10, 0x04, 0x91, 0x23, 0xAA, 0xC4, 0x29, +0x45, 0x7E, 0xA2, 0x0E, 0x56, 0xA2, 0x68, 0x63, 0xC6, 0x8C, +0x79, 0x2A, 0x63, 0xFA, 0x2C, 0xA8, 0x54, 0x97, 0xA0, 0x37, +0x25, 0xC1, 0xEF, 0xED, 0x43, 0xDF, 0xAF, 0x5D, 0x18, 0xB8, +0x72, 0x89, 0x32, 0xE9, 0xC1, 0x60, 0x6F, 0x2F, 0x3D, 0xF3, +0x82, 0xE7, 0x62, 0x14, 0xB9, 0x06, 0xA9, 0x0E, 0x3B, 0x2C, +0xE9, 0x16, 0xE8, 0x35, 0x3C, 0x2E, 0x77, 0x7B, 0x31, 0x16, +0xE4, 0xBE, 0x7D, 0x7D, 0x1F, 0x76, 0xDD, 0xC5, 0x65, 0xEE, +0x5E, 0x7C, 0xB9, 0x09, 0x0F, 0xAB, 0x13, 0x70, 0xB2, 0xA4, +0x69, 0x03, 0xD2, 0xF2, 0x9F, 0xC4, 0x85, 0x23, 0x2F, 0xE0, +0xF2, 0xA9, 0x73, 0x08, 0x07, 0x63, 0x60, 0x29, 0x0C, 0x25, +0x55, 0x8B, 0xE8, 0x87, 0x42, 0xA9, 0x90, 0x3F, 0x63, 0x88, +0x0E, 0xA9, 0x1E, 0x46, 0x5B, 0x1A, 0xB2, 0x4B, 0x1E, 0x42, +0x68, 0xB8, 0x1F, 0xDF, 0x7C, 0xFD, 0x93, 0x18, 0x0C, 0x08, +0x9B, 0x36, 0xED, 0x93, 0x69, 0x9A, 0x9C, 0x41, 0x4B, 0x35, +0x6A, 0x59, 0x15, 0x9A, 0xEC, 0x05, 0x73, 0xA0, 0xD1, 0x9B, +0x70, 0xE9, 0xC4, 0x6E, 0xA8, 0xB5, 0x66, 0x38, 0x0B, 0x33, +0xE1, 0x29, 0x2B, 0x86, 0x7B, 0x7A, 0x1E, 0x9C, 0x05, 0xB9, +0xC8, 0x2A, 0x2A, 0xA0, 0x3D, 0x1F, 0x69, 0x59, 0xD3, 0xA0, +0x33, 0x9A, 0x21, 0xB1, 0x91, 0x98, 0xA4, 0xC5, 0xF0, 0xAD, +0x21, 0xF4, 0x5E, 0xF5, 0x89, 0x3C, 0x87, 0x9D, 0xC7, 0xBB, +0xD0, 0x3D, 0xC5, 0xC1, 0xF2, 0x1A, 0xCC, 0x20, 0xE2, 0x9A, +0xEC, 0x79, 0x95, 0xD0, 0x9B, 0x2D, 0xA4, 0xF1, 0x30, 0x3C, +0x14, 0x99, 0x39, 0x3D, 0x8D, 0x0A, 0xA8, 0xA2, 0x02, 0x82, +0xE4, 0xC8, 0x43, 0x14, 0x49, 0x1C, 0xF4, 0xA2, 0x96, 0xC0, +0xD3, 0x3C, 0x79, 0x70, 0x14, 0x4C, 0x87, 0x42, 0x8C, 0xE2, +0x5A, 0xD7, 0x55, 0xDC, 0xBC, 0x31, 0x1A, 0x27, 0xFE, 0x3F, +0x25, 0x07, 0xBF, 0x4D, 0x91, 0x69, 0x5C, 0xB8, 0x23, 0x2B, +0x46, 0xA9, 0x25, 0x2A, 0x18, 0x84, 0x03, 0xC3, 0xE8, 0xE9, +0xFC, 0x19, 0xC3, 0xDE, 0x01, 0x84, 0xC7, 0x23, 0x04, 0x1E, +0x27, 0x13, 0x26, 0x48, 0x4D, 0xD0, 0x69, 0x60, 0xB2, 0xDA, +0x60, 0xCD, 0xCA, 0x41, 0xAA, 0x4D, 0x8F, 0x70, 0x58, 0xA0, +0xBA, 0x40, 0x64, 0xD8, 0xC9, 0xBD, 0x35, 0x91, 0x41, 0x53, +0x15, 0x8A, 0xE8, 0x70, 0x99, 0x3D, 0xB7, 0x00, 0x1A, 0x83, +0x11, 0xE7, 0xBE, 0xDA, 0x83, 0xBE, 0x6B, 0x03, 0x60, 0x18, +0x1E, 0xBA, 0x44, 0x03, 0x0C, 0xA6, 0x44, 0x24, 0x59, 0x92, +0x64, 0xFD, 0x27, 0xA6, 0x58, 0xA0, 0x35, 0x18, 0xC8, 0xF1, +0x18, 0xC9, 0xD9, 0x4F, 0xD9, 0xEA, 0xE0, 0xBB, 0x35, 0x02, +0x6F, 0xDF, 0x6D, 0x49, 0x3D, 0x9F, 0x7D, 0xD7, 0x85, 0x2B, +0x53, 0x1C, 0x2C, 0xAE, 0x42, 0x09, 0x05, 0xD7, 0x94, 0xEE, +0xC9, 0x96, 0xB9, 0x8D, 0xF8, 0xAF, 0xC0, 0x55, 0x98, 0x8D, +0x9C, 0xE2, 0x42, 0x38, 0x72, 0xB3, 0x90, 0x96, 0x99, 0x81, +0x14, 0x07, 0x45, 0xEC, 0x76, 0xC2, 0xEE, 0xC9, 0x81, 0xA3, +0x70, 0x06, 0x5C, 0x25, 0x15, 0xF4, 0x2C, 0x13, 0x52, 0xDD, +0x47, 0x7D, 0x3E, 0x78, 0x6F, 0x8E, 0x30, 0x1C, 0x8F, 0x63, +0x27, 0xBA, 0x71, 0x7E, 0x0A, 0x45, 0xC4, 0x2B, 0x1F, 0x8D, +0x00, 0xD1, 0x31, 0x3F, 0xF1, 0xCD, 0x13, 0xA0, 0x83, 0x64, +0x93, 0x00, 0xFF, 0xA0, 0x1F, 0x63, 0x23, 0x41, 0x70, 0xD4, +0x24, 0x02, 0x59, 0x9C, 0x62, 0x54, 0x25, 0x68, 0xA0, 0xD4, +0xE8, 0x69, 0x54, 0xB8, 0x61, 0xC9, 0xC8, 0x84, 0x36, 0xD9, +0x0E, 0x9B, 0xFD, 0x06, 0xD5, 0xEA, 0x0F, 0x26, 0x1C, 0xE2, +0x2A, 0x09, 0x6D, 0xF7, 0x14, 0x99, 0x7E, 0xBC, 0x1E, 0x65, +0x34, 0x87, 0x7E, 0x98, 0x5E, 0xEE, 0x41, 0x45, 0xF3, 0x1A, +0x5C, 0x3C, 0xFA, 0x09, 0x7A, 0xBA, 0x7B, 0x30, 0x16, 0x08, +0xC9, 0x45, 0x65, 0x64, 0xA9, 0xB2, 0x44, 0x5F, 0xA2, 0xFC, +0xBE, 0x20, 0x08, 0x34, 0x97, 0x42, 0xD4, 0xC9, 0x66, 0xD8, +0x49, 0x5D, 0x0E, 0x97, 0x19, 0x07, 0xF6, 0x9E, 0xC4, 0xEF, +0xBD, 0xC1, 0xAB, 0x24, 0x88, 0xCA, 0x37, 0x3F, 0x87, 0x5F, +0x7A, 0x6F, 0xA2, 0x20, 0x14, 0x9C, 0x8F, 0xB6, 0xC8, 0x50, +0x1F, 0x35, 0x51, 0x6C, 0x0C, 0x42, 0x9C, 0x81, 0x92, 0x1A, +0x23, 0xBB, 0x38, 0x1F, 0x45, 0x35, 0x95, 0x98, 0xD3, 0x30, +0x9F, 0x6C, 0x21, 0xCA, 0x17, 0xD4, 0x62, 0xD6, 0x22, 0xBA, +0x5E, 0xB2, 0x04, 0x55, 0x2D, 0xAD, 0xC8, 0x9B, 0xFB, 0x08, +0xF5, 0x42, 0x3A, 0x05, 0xA0, 0x86, 0xCB, 0x65, 0xA0, 0xDE, +0x60, 0xB2, 0x09, 0xA7, 0xEE, 0x2E, 0xEE, 0x84, 0x03, 0x12, +0xC9, 0x30, 0x05, 0x7A, 0xDE, 0x37, 0x18, 0x42, 0x7F, 0xF7, +0x59, 0x64, 0x78, 0x3C, 0x28, 0x9C, 0x99, 0x05, 0xB7, 0x27, +0x05, 0x46, 0x93, 0x02, 0x91, 0xE0, 0x08, 0x82, 0x43, 0x03, +0x08, 0xDC, 0xBA, 0x29, 0x5B, 0xC8, 0xEF, 0x85, 0x96, 0x1D, +0x43, 0xBA, 0x83, 0xA8, 0x4A, 0x4E, 0x80, 0xC8, 0x85, 0x60, +0xB3, 0x4A, 0x72, 0x66, 0x58, 0xA2, 0xA5, 0x6D, 0xF3, 0x8A, +0x3B, 0x53, 0x75, 0x82, 0x22, 0x69, 0x7D, 0xF0, 0x12, 0xDE, +0x27, 0x47, 0x6B, 0x1D, 0x6E, 0x13, 0xF2, 0x8B, 0x5C, 0x08, +0x0C, 0x0C, 0x60, 0xD0, 0xC7, 0xE1, 0xF6, 0xED, 0x18, 0x22, +0x61, 0x0E, 0x3C, 0x8D, 0x4C, 0x51, 0x9A, 0x9A, 0x22, 0x75, +0x31, 0xF1, 0xA0, 0x54, 0xAB, 0x61, 0xB6, 0xE8, 0x61, 0x49, +0xD6, 0xC0, 0x9C, 0x24, 0x22, 0xE0, 0x1B, 0xA1, 0x0A, 0x07, +0x08, 0x54, 0xE4, 0x09, 0xAE, 0x71, 0xF3, 0x7E, 0x1C, 0x9E, +0xE4, 0x60, 0x47, 0x1B, 0x16, 0xD1, 0xF7, 0x87, 0x24, 0xB7, +0x4A, 0x92, 0x46, 0x9C, 0x2A, 0xCA, 0xF3, 0x71, 0xA9, 0x47, +0x64, 0x60, 0x9A, 0xD6, 0xF2, 0xEC, 0xE7, 0xFF, 0xDA, 0xA5, +0x7B, 0xD9, 0x19, 0x2B, 0x39, 0x64, 0xA4, 0x41, 0x07, 0x81, +0x17, 0x65, 0xC5, 0xD0, 0x6A, 0x20, 0x07, 0x07, 0x27, 0xFD, +0x1E, 0xF0, 0x02, 0x8E, 0x33, 0x0C, 0xBE, 0x20, 0xB0, 0xA5, +0x3C, 0x27, 0x48, 0xAF, 0xF5, 0x92, 0xB3, 0xC3, 0x74, 0xF4, +0x0B, 0xF9, 0xF2, 0xD2, 0x1E, 0x26, 0x3C, 0x29, 0x28, 0x03, +0x9D, 0x25, 0xD3, 0x5E, 0x40, 0xA0, 0xA5, 0x04, 0x5A, 0x44, +0xD7, 0x16, 0xE9, 0x84, 0x91, 0x27, 0xB6, 0x3C, 0x8B, 0x8E, +0xE2, 0x7E, 0xAB, 0x63, 0x35, 0x52, 0xC9, 0xB6, 0x6D, 0x5B, +0x8D, 0x57, 0x3A, 0x9E, 0x83, 0xB3, 0xE3, 0x79, 0x28, 0x3B, +0xD6, 0x80, 0x7D, 0xF7, 0x99, 0xBF, 0xE9, 0x7C, 0xBB, 0x15, +0xCC, 0xD6, 0xA7, 0xC0, 0x6E, 0x59, 0x09, 0xE5, 0x1B, 0xCB, +0x61, 0x22, 0xBE, 0xB3, 0xC9, 0x6A, 0xC9, 0x5A, 0xC9, 0x4A, +0xC8, 0x1E, 0xF8, 0x67, 0xE2, 0x3F, 0x5F, 0x7F, 0x02, 0x1C, +0xAC, 0x2A, 0x6C, 0xAB, 0x0A, 0x12, 0x89, 0x00, 0x00, 0x00, +0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; + +static const unsigned char Toolbar_Zoom_png[] = { +0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, +0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, +0x00, 0x00, 0x00, 0x18, 0x08, 0x06, 0x00, 0x00, 0x00, 0xE0, +0x77, 0x3D, 0xF8, 0x00, 0x00, 0x05, 0x1C, 0x49, 0x44, 0x41, +0x54, 0x78, 0x9C, 0xB5, 0x95, 0x6B, 0x6C, 0x14, 0x55, 0x18, +0x86, 0x9F, 0x99, 0x9D, 0x9D, 0xBD, 0x74, 0x77, 0xBB, 0xDB, +0x42, 0x8B, 0xF4, 0x4A, 0x57, 0x28, 0x2D, 0xA4, 0x14, 0xB0, +0x96, 0x0A, 0x04, 0xA1, 0x5C, 0x02, 0x96, 0x4B, 0x81, 0x6A, +0x55, 0xAE, 0x82, 0xA0, 0x09, 0xC4, 0x00, 0x11, 0x03, 0x14, +0x02, 0x05, 0x6F, 0x44, 0x40, 0x91, 0x10, 0xF1, 0x8F, 0x11, +0x83, 0x31, 0x11, 0x0D, 0x04, 0x7E, 0x48, 0x10, 0x2C, 0x06, +0x68, 0x2B, 0x77, 0xCB, 0x45, 0x2A, 0x45, 0xB1, 0xD4, 0x2D, +0xDB, 0xB2, 0xD0, 0x6E, 0x69, 0x77, 0xBB, 0x97, 0xF1, 0x2C, +0x0A, 0x88, 0x52, 0x08, 0x18, 0xDF, 0xE4, 0xCC, 0xEC, 0x9C, +0xB3, 0xF9, 0x9E, 0xF3, 0x7D, 0xDF, 0x7B, 0x66, 0xE0, 0x7F, +0x96, 0xAE, 0xC3, 0x95, 0xA5, 0x7B, 0x65, 0x06, 0x3C, 0x97, +0x44, 0xCE, 0xE4, 0x71, 0xE4, 0x14, 0x2E, 0xA2, 0xFF, 0xB8, +0xC5, 0xF4, 0x1B, 0x5B, 0x48, 0xDF, 0x31, 0x09, 0xF4, 0x1D, +0xDD, 0x42, 0xF6, 0x48, 0x0F, 0x27, 0xBF, 0x09, 0x3F, 0x08, +0x20, 0xDF, 0x73, 0xB6, 0xF4, 0x60, 0x8C, 0x58, 0x5A, 0x20, +0x85, 0xE5, 0xC3, 0x06, 0x83, 0x69, 0x6B, 0x54, 0xB4, 0x63, +0x9A, 0x2D, 0x36, 0x2E, 0xCF, 0x6C, 0xB5, 0x3F, 0xA3, 0xC8, +0xCA, 0x5A, 0x42, 0xDA, 0x31, 0x34, 0x79, 0x0B, 0xD3, 0xD6, +0xA7, 0x32, 0x73, 0xB3, 0xF4, 0x70, 0x80, 0xD2, 0xF2, 0x24, +0x82, 0xDA, 0x97, 0x66, 0xA3, 0xF1, 0xBD, 0xFC, 0xAC, 0xB4, +0x84, 0x35, 0xE3, 0x9F, 0x64, 0x4B, 0xF1, 0x20, 0xD6, 0x4D, +0x1A, 0xC2, 0xA2, 0x82, 0x7C, 0x46, 0x3D, 0x3D, 0x8C, 0xCE, +0x89, 0x69, 0x8A, 0x4E, 0x92, 0x66, 0x12, 0x0E, 0x95, 0xE1, +0xF7, 0x0E, 0x66, 0xFA, 0x86, 0x0E, 0x21, 0x77, 0x03, 0x56, +0x57, 0xD8, 0x09, 0x6B, 0x5B, 0x1C, 0x16, 0xCB, 0xB0, 0x95, +0xC3, 0x33, 0xD9, 0x33, 0x35, 0x9D, 0x57, 0x72, 0x62, 0x68, +0xBE, 0xD1, 0xC6, 0x96, 0x7D, 0x95, 0x54, 0xD4, 0x5C, 0xA2, +0x57, 0x42, 0x02, 0xE3, 0x87, 0xE6, 0x93, 0xDC, 0x3B, 0x17, +0xD9, 0x10, 0x95, 0x82, 0x16, 0xFE, 0x9C, 0xB6, 0x1B, 0xD9, +0x0F, 0x06, 0xAC, 0xA9, 0x90, 0x68, 0xF7, 0x4F, 0x32, 0xC8, +0xD2, 0xE8, 0x79, 0xB9, 0x29, 0xBC, 0x9E, 0x67, 0xA7, 0xB1, +0x0D, 0x36, 0x1E, 0xF1, 0xB3, 0x6A, 0xCF, 0x39, 0x8E, 0x1E, +0x3B, 0xC7, 0x81, 0xD3, 0xE7, 0xD9, 0x75, 0xB6, 0x86, 0x93, +0xEE, 0x6B, 0x58, 0x92, 0xD3, 0xE8, 0x94, 0xD9, 0x0F, 0xBD, +0xC9, 0x94, 0x20, 0x32, 0x59, 0xCE, 0xB8, 0x92, 0xE8, 0xFB, +0x03, 0x9A, 0xAF, 0x5B, 0xA5, 0x80, 0x7F, 0x4E, 0x66, 0xBC, +0x8D, 0x59, 0xD9, 0x0E, 0x7E, 0x69, 0x82, 0x4D, 0xC7, 0x42, +0xE2, 0x1E, 0xC4, 0x6A, 0x10, 0xEB, 0x26, 0x15, 0x55, 0xD5, +0xA3, 0x97, 0x25, 0x7C, 0xC1, 0x20, 0x61, 0x25, 0x84, 0xA3, +0xBB, 0x13, 0x5B, 0x62, 0x0A, 0x92, 0x2C, 0x15, 0xA2, 0x85, +0xEE, 0x99, 0xC5, 0x9D, 0xDA, 0x2D, 0xDC, 0x99, 0xA7, 0xE8, +0xD5, 0xC3, 0xAF, 0x0E, 0xC9, 0x66, 0xE1, 0xC0, 0x78, 0x36, +0x1C, 0x6A, 0xE4, 0xD0, 0xC5, 0x06, 0x11, 0x34, 0x4C, 0x75, +0x6D, 0x1D, 0x57, 0xAF, 0xB8, 0x50, 0x4D, 0x26, 0xEC, 0xB1, +0x9D, 0xD1, 0x24, 0x0D, 0x4B, 0xAC, 0x8D, 0x4E, 0xE9, 0x3D, +0x68, 0xAC, 0xA9, 0xA1, 0xB6, 0x6C, 0x0F, 0x41, 0x6F, 0xF3, +0x2A, 0x11, 0xEE, 0x2D, 0x76, 0xBD, 0xDD, 0xFE, 0x77, 0x80, +0x72, 0xFB, 0x57, 0x28, 0x90, 0xA9, 0xE8, 0x14, 0x3A, 0x99, +0x55, 0x4E, 0xB8, 0xFC, 0x6C, 0xDC, 0x7F, 0x04, 0x3C, 0x0D, +0xA0, 0x0A, 0x27, 0x2B, 0x62, 0x18, 0x55, 0xDA, 0x7D, 0xAD, +0xB8, 0x6B, 0xCE, 0x40, 0x4B, 0x33, 0x0D, 0xED, 0xED, 0x58, +0xE3, 0x67, 0x10, 0xE5, 0x70, 0xA0, 0xD3, 0xE9, 0x08, 0x42, +0x26, 0xB2, 0x2E, 0x92, 0xEB, 0x5D, 0x80, 0x3B, 0x25, 0x0A, +0xF9, 0xD1, 0x82, 0x7E, 0x9A, 0xFC, 0x41, 0x5C, 0x2D, 0x22, +0x9E, 0x4E, 0x42, 0x31, 0x1B, 0xD0, 0xEB, 0x15, 0x24, 0x4D, +0x83, 0x40, 0x00, 0xD1, 0x50, 0x51, 0x0E, 0x3D, 0x18, 0xCC, +0x98, 0x6C, 0x16, 0x8C, 0x46, 0x3D, 0x9A, 0x16, 0x12, 0xD3, +0x62, 0x5D, 0x92, 0xA2, 0xC4, 0xF8, 0x97, 0x2B, 0xEF, 0x4C, +0x84, 0x83, 0xEE, 0xA0, 0xBF, 0x95, 0x73, 0xEE, 0x66, 0x51, +0x5F, 0x23, 0xBD, 0x7B, 0x74, 0x27, 0x3D, 0xBD, 0x27, 0xCE, +0xB4, 0xEE, 0x58, 0xCC, 0xA6, 0x9B, 0xBB, 0x56, 0xC4, 0x4E, +0xE3, 0xD2, 0x33, 0x48, 0x1F, 0x36, 0x84, 0x01, 0x33, 0x8B, +0x70, 0x24, 0x74, 0xA1, 0xB5, 0xD1, 0x4D, 0x28, 0x18, 0x88, +0x00, 0xAA, 0xFF, 0xB9, 0xFB, 0x88, 0xEE, 0x9C, 0xE4, 0xAC, +0xD1, 0xCD, 0x9A, 0x14, 0x9E, 0xD1, 0x26, 0xF6, 0x9D, 0x9A, +0x94, 0x48, 0xAB, 0xA2, 0x60, 0x16, 0xE9, 0x47, 0xEA, 0x7E, +0xB5, 0xFE, 0x77, 0x7C, 0xF5, 0x97, 0x51, 0xAC, 0x56, 0x32, +0x9E, 0xEA, 0x4F, 0xD6, 0xA0, 0x9E, 0xD8, 0xE2, 0xED, 0xB8, +0x5C, 0xAD, 0xD4, 0x55, 0x1E, 0xA4, 0xD5, 0xED, 0x85, 0xB6, +0x2E, 0xCB, 0x38, 0x5E, 0x78, 0x81, 0x96, 0x0F, 0x3B, 0x68, +0xF2, 0xF3, 0xEB, 0x74, 0x44, 0x45, 0x6D, 0x96, 0x8D, 0xC6, +0x39, 0x39, 0x39, 0xB9, 0x24, 0x39, 0xBB, 0xE1, 0x11, 0x25, +0x93, 0x45, 0x09, 0x7E, 0xDC, 0x5F, 0x86, 0xFB, 0xDB, 0xEF, +0x30, 0x67, 0x65, 0x30, 0x62, 0xD6, 0xB3, 0x38, 0x12, 0x63, +0xB9, 0x54, 0x17, 0xE4, 0x42, 0x65, 0x39, 0x75, 0x07, 0x2A, +0xB1, 0xF8, 0x7F, 0x63, 0xAC, 0xE3, 0x68, 0xBF, 0x6D, 0x9F, +0x96, 0x9F, 0xE8, 0xD8, 0x45, 0x11, 0x4D, 0xDF, 0xD8, 0x07, +0x59, 0x2A, 0x37, 0xD8, 0x1D, 0xA6, 0x9E, 0xFD, 0xFB, 0x13, +0x9D, 0x9A, 0x8C, 0xCD, 0x66, 0xC2, 0x73, 0xB9, 0x96, 0xFA, +0x53, 0x55, 0xD8, 0x53, 0x13, 0x49, 0xCA, 0xCE, 0xE2, 0xDA, +0x75, 0x1F, 0xBF, 0x1E, 0x3F, 0x8E, 0xEB, 0xF0, 0x0F, 0x04, +0x3C, 0x7A, 0x66, 0x24, 0x7F, 0xC4, 0x84, 0xE8, 0x33, 0x15, +0xAA, 0x89, 0x97, 0xC6, 0xAC, 0xE2, 0x5C, 0xC7, 0x80, 0x88, +0xA6, 0xAC, 0x9F, 0x2F, 0x1A, 0xB2, 0x51, 0x1F, 0x6D, 0x25, +0x3E, 0xAD, 0x07, 0xD1, 0x09, 0x89, 0x44, 0x75, 0x72, 0xA0, +0x18, 0x0D, 0x04, 0xDB, 0x7C, 0x34, 0xB9, 0xEA, 0xB9, 0x7A, +0xF1, 0x3C, 0xD7, 0xCE, 0xFE, 0x4C, 0xA8, 0xDA, 0x4B, 0xFE, +0x58, 0x2B, 0x1F, 0xBF, 0x70, 0x84, 0x86, 0xEF, 0xBF, 0xC6, +0x5D, 0xC7, 0x01, 0xA2, 0x18, 0x33, 0xEE, 0x0D, 0x5A, 0x3B, +0x06, 0x30, 0x50, 0xA2, 0x78, 0xEC, 0x42, 0x71, 0x70, 0xDE, +0x95, 0x84, 0xFF, 0x54, 0x8B, 0x45, 0x98, 0xC6, 0x84, 0x22, +0xAC, 0x1A, 0xF0, 0xF9, 0xF1, 0x79, 0x5B, 0x08, 0xD4, 0xDF, +0x80, 0x1B, 0x32, 0xA3, 0x72, 0x3D, 0x7C, 0x30, 0x75, 0x27, +0xE9, 0x7D, 0x26, 0xE2, 0xBD, 0xE2, 0xE1, 0xC8, 0xB6, 0x4F, +0xF0, 0x36, 0x85, 0x97, 0x4C, 0x28, 0xE5, 0x9D, 0xFB, 0x00, +0xFE, 0xD2, 0xE4, 0xD5, 0x05, 0xC2, 0x59, 0xF3, 0xC5, 0x6B, +0x60, 0x24, 0x11, 0x9B, 0x12, 0x12, 0x36, 0x15, 0x9E, 0x68, +0x57, 0x48, 0x89, 0xF1, 0x33, 0x77, 0xB8, 0x9D, 0x19, 0x43, +0x9B, 0xE8, 0xA2, 0x6C, 0xA5, 0x45, 0x0E, 0x61, 0xED, 0xFA, +0x26, 0xD5, 0x7B, 0x37, 0x71, 0xBA, 0xEC, 0x64, 0x53, 0x5B, +0x50, 0x1B, 0x3C, 0x65, 0x2D, 0x55, 0x91, 0x30, 0x4A, 0x87, +0x80, 0xED, 0xCB, 0x77, 0x33, 0xA1, 0x44, 0xBC, 0x96, 0x49, +0x17, 0x16, 0xEC, 0x01, 0x71, 0xBA, 0xC7, 0xB4, 0xD3, 0xDD, +0x9E, 0x50, 0x0E, 0xCD, 0x1D, 0x9C, 0x6C, 0xB3, 0xBD, 0x9C, +0x37, 0x42, 0x9C, 0xEA, 0x38, 0x3C, 0xAE, 0x01, 0x22, 0xAB, +0xAF, 0xC4, 0xDF, 0x3E, 0xA3, 0xB3, 0xB3, 0x1F, 0x4A, 0xC5, +0xD9, 0x68, 0x9F, 0xDB, 0x3F, 0x4F, 0x44, 0x98, 0x7B, 0x7F, +0x40, 0x44, 0x3B, 0xD6, 0xB8, 0xC4, 0x35, 0x32, 0xCA, 0x22, +0x8F, 0xAF, 0x0D, 0xC7, 0x18, 0xB4, 0x10, 0xA3, 0xB8, 0xAD, +0xB3, 0xCE, 0x57, 0x25, 0xD1, 0xCB, 0x6C, 0x17, 0x87, 0x37, +0x4D, 0xF4, 0x26, 0x03, 0x4F, 0xF5, 0x29, 0xEC, 0x09, 0x71, +0xE8, 0x2D, 0x66, 0x7C, 0xB5, 0xFE, 0x89, 0xB7, 0x00, 0xF7, +0xFD, 0x58, 0xDC, 0x4B, 0x25, 0x05, 0xF4, 0x96, 0x54, 0x69, +0x47, 0x97, 0xD4, 0x14, 0x67, 0x7E, 0xC1, 0x30, 0xBA, 0x26, +0x77, 0xE5, 0xBA, 0xEB, 0x0C, 0x5E, 0xF7, 0x31, 0xE2, 0xBA, +0xA5, 0x51, 0xBE, 0xEF, 0x0C, 0x3F, 0x55, 0x35, 0xB0, 0x78, +0xEB, 0x9F, 0xB1, 0x1F, 0x1A, 0x70, 0x13, 0x52, 0xC8, 0x6C, +0x9D, 0x41, 0xDD, 0x94, 0xF2, 0xB8, 0xD3, 0x90, 0x93, 0x97, +0x81, 0xC3, 0xDA, 0x26, 0xAA, 0xD8, 0x4C, 0x93, 0xD7, 0x4F, +0xD9, 0xEE, 0x2A, 0x1A, 0x3D, 0xFE, 0xC0, 0x8A, 0x2F, 0x50, +0x1F, 0x19, 0xB0, 0x6C, 0x22, 0xAA, 0x2C, 0x53, 0xA2, 0xA8, +0xA6, 0x92, 0x98, 0xCE, 0x31, 0x52, 0x9A, 0xD3, 0x8E, 0x6A, +0x94, 0x38, 0x7F, 0xEA, 0x22, 0x0D, 0x57, 0x5A, 0x45, 0x3F, +0x58, 0x50, 0xBA, 0x9D, 0xF7, 0x1F, 0x25, 0xF6, 0x6D, 0xAD, +0x28, 0x42, 0x5D, 0x59, 0x24, 0xBD, 0x58, 0x5A, 0xAC, 0xBF, +0xB8, 0xAA, 0xD8, 0xA8, 0xAD, 0x28, 0x52, 0xB4, 0xE5, 0x93, +0xA8, 0x5B, 0x31, 0x89, 0xD9, 0xE2, 0xAE, 0xFE, 0xA7, 0xE0, +0xB7, 0x54, 0x3A, 0x19, 0x69, 0x49, 0x01, 0xCE, 0xA5, 0xE3, +0x99, 0xB2, 0xAC, 0x90, 0xA9, 0x25, 0x13, 0x71, 0xAE, 0x2C, +0xBA, 0xFB, 0x33, 0xFC, 0x07, 0x07, 0x66, 0xCF, 0x92, 0x85, +0x17, 0xB4, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, +0x44, 0xAE, 0x42, 0x60, 0x82 +}; + +#endif + diff --git a/Source/MusicMod.sln b/Source/MusicMod.sln new file mode 100644 index 0000000000..c74659bd6d --- /dev/null +++ b/Source/MusicMod.sln @@ -0,0 +1,450 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Core", "Core\Core\Core.vcproj", "{F0B874CB-4476-4199-9315-8343D05AE684}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_VideoDX9", "Plugins\Plugin_VideoDX9\Plugin_VideoDX9.vcproj", "{636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}" + ProjectSection(ProjectDependencies) = postProject + {3E03C179-8251-46E4-81F4-466F114BAC63} = {3E03C179-8251-46E4-81F4-466F114BAC63} + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA} = {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_PadSimple", "Plugins\Plugin_PadSimple\Plugin_PadSimple.vcproj", "{9A183B48-ECC2-4121-876A-9B3793686073}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Bochs_disasm", "..\Externals\Bochs_disasm\Bochs_disasm.vcproj", "{29C2ABC1-ADA5-42CD-A5FC-96022D52A510}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\Externals\zlib\zlib.vcproj", "{3E03C179-8251-46E4-81F4-466F114BAC63}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_DSP_LLE", "Plugins\Plugin_DSP_LLE\Plugin_DSP_LLE.vcproj", "{C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DiscIO", "Core\DiscIO\DiscIO.vcproj", "{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_VideoOGL", "Plugins\Plugin_VideoOGL\Plugin_VideoOGL.vcproj", "{CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA} = {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "Core\Common\Common.vcproj", "{C573CAF7-EE6A-458E-8049-16C0BF34C2E9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DolphinWX", "Core\DolphinWX\DolphinWX.vcproj", "{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {33546D62-7F34-4EA6-A88E-D538B36E16BF} = {33546D62-7F34-4EA6-A88E-D538B36E16BF} + {DE7C596C-CBC4-4278-8909-146D63990803} = {DE7C596C-CBC4-4278-8909-146D63990803} + {3E03C179-8251-46E4-81F4-466F114BAC63} = {3E03C179-8251-46E4-81F4-466F114BAC63} + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF} = {95CCAABC-7062-47C4-B8C1-A064DD5F16FF} + {521498BE-6089-4780-8223-E67C22F4E068} = {521498BE-6089-4780-8223-E67C22F4E068} + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} = {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} + {F0B874CB-4476-4199-9315-8343D05AE684} = {F0B874CB-4476-4199-9315-8343D05AE684} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxBase28", "..\Externals\wxWidgets\build\msw\wx_base.vcproj", "{48AD7E0A-25B1-4974-A1E3-03F8C438D34F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxCore28", "..\Externals\wxWidgets\build\msw\wx_core.vcproj", "{0318BA30-EF48-441A-9E10-DC85EFAE39F0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DebuggerWX", "Core\DebuggerWX\DebuggerWX.vcproj", "{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} + {F0B874CB-4476-4199-9315-8343D05AE684} = {F0B874CB-4476-4199-9315-8343D05AE684} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoCommon", "Core\VideoCommon\VideoCommon.vcproj", "{E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_DSP_HLE", "Plugins\Plugin_DSP_HLE\Plugin_DSP_HLE.vcproj", "{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LZO", "..\Externals\LZO\LZO.vcproj", "{33546D62-7F34-4EA6-A88E-D538B36E16BF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_Wiimote", "Plugins\Plugin_Wiimote\Plugin_Wiimote.vcproj", "{8D612734-FAA5-4B8A-804F-4DEA2367D495}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_DSP_NULL", "Plugins\Plugin_DSP_NULL\Plugin_DSP_NULL.vcproj", "{C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_nJoy_SDL_Test", "Plugins\Plugin_nJoy_Testing\Plugin_nJoy_SDL_Test.vcproj", "{ADF64291-57ED-4B7A-AB76-37B4A991504B}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxAdv28", "..\Externals\wxWidgets\build\msw\wx_adv.vcproj", "{71B16F46-0B00-4EDA-B253-D6D9D03A215C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_nJoy_SDL", "Plugins\Plugin_nJoy_SDL\Plugin_nJoy_SDL.vcproj", "{521498BE-6089-4780-8223-E67C22F4E068}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MusicMod", "MusicMod", "{77CF6E34-3038-4B23-A2E7-90AD17801609}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{5C17B1EB-6C76-438A-A503-8F3C7831023B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Externals", "Externals", "{4F427D1B-8C90-4D9C-B23D-A51493A1C471}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Player", "..\Branches\MusicMod\Player\Player.vcproj", "{0B72B5D6-5D72-4391-84A7-9CCA5392668A}" + ProjectSection(ProjectDependencies) = postProject + {DE7C596C-CBC4-4278-8909-146D63990803} = {DE7C596C-CBC4-4278-8909-146D63990803} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestPlayer", "..\Branches\MusicMod\TestPlayer\TestPlayer.vcproj", "{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}" + ProjectSection(ProjectDependencies) = postProject + {0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {0B72B5D6-5D72-4391-84A7-9CCA5392668A} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dolphin", "Dolphin", "{61C7F431-0623-4A8D-9C4B-EDE35696554A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\Branches\MusicMod\Common\Common.vcproj", "{DE7C596C-CBC4-4278-8909-146D63990803}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Main", "..\Branches\MusicMod\Main\Main.vcproj", "{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}" + ProjectSection(ProjectDependencies) = postProject + {DE7C596C-CBC4-4278-8909-146D63990803} = {DE7C596C-CBC4-4278-8909-146D63990803} + {0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {0B72B5D6-5D72-4391-84A7-9CCA5392668A} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + DebugFast|Win32 = DebugFast|Win32 + DebugFast|x64 = DebugFast|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F0B874CB-4476-4199-9315-8343D05AE684}.Debug|Win32.ActiveCfg = Debug|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.Debug|Win32.Build.0 = Debug|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.Debug|x64.ActiveCfg = Debug|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.Debug|x64.Build.0 = Debug|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|x64.Build.0 = DebugFast|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.Release|Win32.ActiveCfg = Release|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.Release|Win32.Build.0 = Release|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.Release|x64.ActiveCfg = Release|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.Release|x64.Build.0 = Release|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Debug|Win32.ActiveCfg = Debug|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Debug|x64.ActiveCfg = Debug|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|Win32.ActiveCfg = Release|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|Win32.Build.0 = Release|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|x64.ActiveCfg = Release|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|x64.Build.0 = Release|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.Debug|x64.ActiveCfg = Debug|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.ActiveCfg = Release|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.Build.0 = Release|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.ActiveCfg = Release|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.Build.0 = Release|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|Win32.ActiveCfg = Debug|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|Win32.Build.0 = Debug|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|x64.ActiveCfg = Debug|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|x64.Build.0 = Debug|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|x64.Build.0 = DebugFast|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|Win32.ActiveCfg = Release|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|Win32.Build.0 = Release|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|x64.ActiveCfg = Release|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|x64.Build.0 = Release|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Debug|Win32.ActiveCfg = Debug|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Debug|Win32.Build.0 = Debug|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Debug|x64.ActiveCfg = Debug|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Debug|x64.Build.0 = Debug|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|Win32.ActiveCfg = Release|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|Win32.Build.0 = Release|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|x64.ActiveCfg = Release|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|x64.Build.0 = Release|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Debug|Win32.ActiveCfg = Debug|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Debug|x64.ActiveCfg = Debug|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.DebugFast|x64.Build.0 = DebugFast|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Release|Win32.ActiveCfg = Release|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Release|Win32.Build.0 = Release|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Release|x64.ActiveCfg = Release|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Debug|Win32.ActiveCfg = Debug|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Debug|Win32.Build.0 = Debug|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Debug|x64.ActiveCfg = Debug|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Debug|x64.Build.0 = Debug|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|x64.Build.0 = DebugFast|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|Win32.ActiveCfg = Release|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|Win32.Build.0 = Release|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|x64.ActiveCfg = Release|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|x64.Build.0 = Release|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Debug|Win32.ActiveCfg = Debug|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Debug|x64.ActiveCfg = Debug|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|Win32.ActiveCfg = Release|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|Win32.Build.0 = Release|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|x64.ActiveCfg = Release|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|x64.Build.0 = Release|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Debug|Win32.ActiveCfg = Debug|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Debug|Win32.Build.0 = Debug|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Debug|x64.ActiveCfg = Debug|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Debug|x64.Build.0 = Debug|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|x64.Build.0 = DebugFast|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|Win32.ActiveCfg = Release|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|Win32.Build.0 = Release|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|x64.ActiveCfg = Release|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|x64.Build.0 = Release|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Debug|Win32.ActiveCfg = Debug|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Debug|Win32.Build.0 = Debug|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Debug|x64.ActiveCfg = Debug|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Debug|x64.Build.0 = Debug|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|x64.Build.0 = DebugFast|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|Win32.ActiveCfg = Release|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|Win32.Build.0 = Release|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|x64.ActiveCfg = Release|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|x64.Build.0 = Release|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Debug|Win32.ActiveCfg = Debug|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Debug|Win32.Build.0 = Debug|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Debug|x64.ActiveCfg = Debug|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Debug|x64.Build.0 = Debug|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Release|Win32.ActiveCfg = Release|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Release|Win32.Build.0 = Release|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Release|x64.ActiveCfg = Release|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Debug|Win32.ActiveCfg = Debug|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Debug|Win32.Build.0 = Debug|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Debug|x64.ActiveCfg = Debug|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Debug|x64.Build.0 = Debug|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Release|Win32.ActiveCfg = Release|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Release|Win32.Build.0 = Release|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Release|x64.ActiveCfg = Release|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Debug|Win32.ActiveCfg = Debug|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Debug|Win32.Build.0 = Debug|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Debug|x64.ActiveCfg = Debug|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Debug|x64.Build.0 = Debug|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|x64.Build.0 = DebugFast|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|Win32.ActiveCfg = Release|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|Win32.Build.0 = Release|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|x64.ActiveCfg = Release|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|x64.Build.0 = Release|x64 + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Debug|Win32.ActiveCfg = Debug|Win32 + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Debug|x64.ActiveCfg = Debug|x64 + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|Win32.ActiveCfg = Release|Win32 + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|Win32.Build.0 = Release|Win32 + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|x64.ActiveCfg = Release|x64 + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA}.Release|x64.Build.0 = Release|x64 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|Win32.ActiveCfg = Debug|Win32 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|x64.ActiveCfg = Debug|x64 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.DebugFast|x64.Build.0 = DebugFast|x64 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|Win32.ActiveCfg = Release|Win32 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|Win32.Build.0 = Release|Win32 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|x64.ActiveCfg = Release|x64 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Debug|Win32.ActiveCfg = Debug|Win32 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Debug|x64.ActiveCfg = Debug|x64 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Debug|x64.Build.0 = Debug|x64 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.DebugFast|x64.Build.0 = DebugFast|x64 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|Win32.ActiveCfg = Release|Win32 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|Win32.Build.0 = Release|Win32 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|x64.ActiveCfg = Release|x64 + {33546D62-7F34-4EA6-A88E-D538B36E16BF}.Release|x64.Build.0 = Release|x64 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Debug|Win32.ActiveCfg = Debug|Win32 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Debug|x64.ActiveCfg = Debug|x64 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|Win32.ActiveCfg = Release|Win32 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|Win32.Build.0 = Release|Win32 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|x64.ActiveCfg = Release|x64 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|x64.Build.0 = Release|x64 + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}.Debug|Win32.ActiveCfg = Debug|Win32 + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}.Debug|x64.ActiveCfg = Debug|x64 + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}.DebugFast|x64.Build.0 = DebugFast|x64 + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}.Release|Win32.ActiveCfg = Release|Win32 + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}.Release|Win32.Build.0 = Release|Win32 + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807}.Release|x64.ActiveCfg = Release|x64 + {ADF64291-57ED-4B7A-AB76-37B4A991504B}.Debug|Win32.ActiveCfg = Debug|Win32 + {ADF64291-57ED-4B7A-AB76-37B4A991504B}.Debug|x64.ActiveCfg = Debug|x64 + {ADF64291-57ED-4B7A-AB76-37B4A991504B}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {ADF64291-57ED-4B7A-AB76-37B4A991504B}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {ADF64291-57ED-4B7A-AB76-37B4A991504B}.Release|Win32.ActiveCfg = Release|Win32 + {ADF64291-57ED-4B7A-AB76-37B4A991504B}.Release|Win32.Build.0 = Release|Win32 + {ADF64291-57ED-4B7A-AB76-37B4A991504B}.Release|x64.ActiveCfg = Release|x64 + {ADF64291-57ED-4B7A-AB76-37B4A991504B}.Release|x64.Build.0 = Release|x64 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.Debug|Win32.ActiveCfg = Debug|Win32 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.Debug|Win32.Build.0 = Debug|Win32 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.Debug|x64.ActiveCfg = Debug|x64 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.Debug|x64.Build.0 = Debug|x64 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.Release|Win32.ActiveCfg = Release|Win32 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.Release|Win32.Build.0 = Release|Win32 + {71B16F46-0B00-4EDA-B253-D6D9D03A215C}.Release|x64.ActiveCfg = Release|x64 + {521498BE-6089-4780-8223-E67C22F4E068}.Debug|Win32.ActiveCfg = Debug|Win32 + {521498BE-6089-4780-8223-E67C22F4E068}.Debug|Win32.Build.0 = Debug|Win32 + {521498BE-6089-4780-8223-E67C22F4E068}.Debug|x64.ActiveCfg = Debug|x64 + {521498BE-6089-4780-8223-E67C22F4E068}.Debug|x64.Build.0 = Debug|x64 + {521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {521498BE-6089-4780-8223-E67C22F4E068}.DebugFast|x64.Build.0 = DebugFast|x64 + {521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.ActiveCfg = Release|Win32 + {521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.Build.0 = Release|Win32 + {521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.ActiveCfg = Release|x64 + {521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.Build.0 = Release|x64 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|Win32.ActiveCfg = Debug|Win32 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|Win32.Build.0 = Debug|Win32 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|x64.ActiveCfg = Debug|x64 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|x64.Build.0 = Debug|x64 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|Win32.ActiveCfg = Debug|Win32 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|Win32.Build.0 = Debug|Win32 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|x64.ActiveCfg = Debug|x64 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|x64.Build.0 = Debug|x64 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|Win32.ActiveCfg = Release|Win32 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|Win32.Build.0 = Release|Win32 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|x64.ActiveCfg = Release|x64 + {0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|x64.Build.0 = Release|x64 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|Win32.ActiveCfg = Debug|Win32 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|Win32.Build.0 = Debug|Win32 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|x64.ActiveCfg = Debug|x64 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|x64.Build.0 = Debug|x64 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|Win32.ActiveCfg = Debug|Win32 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|Win32.Build.0 = Debug|Win32 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|x64.ActiveCfg = Debug|x64 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|x64.Build.0 = Debug|x64 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|Win32.ActiveCfg = Release|Win32 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|Win32.Build.0 = Release|Win32 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|x64.ActiveCfg = Release|x64 + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|x64.Build.0 = Release|x64 + {DE7C596C-CBC4-4278-8909-146D63990803}.Debug|Win32.ActiveCfg = Debug|Win32 + {DE7C596C-CBC4-4278-8909-146D63990803}.Debug|Win32.Build.0 = Debug|Win32 + {DE7C596C-CBC4-4278-8909-146D63990803}.Debug|x64.ActiveCfg = Debug|Win32 + {DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|Win32.ActiveCfg = Debug|Win32 + {DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|Win32.Build.0 = Debug|Win32 + {DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|x64.ActiveCfg = Debug|Win32 + {DE7C596C-CBC4-4278-8909-146D63990803}.Release|Win32.ActiveCfg = Release|Win32 + {DE7C596C-CBC4-4278-8909-146D63990803}.Release|Win32.Build.0 = Release|Win32 + {DE7C596C-CBC4-4278-8909-146D63990803}.Release|x64.ActiveCfg = Release|x64 + {DE7C596C-CBC4-4278-8909-146D63990803}.Release|x64.Build.0 = Release|x64 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|Win32.ActiveCfg = Debug|Win32 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|Win32.Build.0 = Debug|Win32 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|x64.ActiveCfg = Debug|Win32 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|Win32.ActiveCfg = Debug|Win32 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|Win32.Build.0 = Debug|Win32 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|x64.ActiveCfg = Debug|Win32 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|Win32.ActiveCfg = Release|Win32 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|Win32.Build.0 = Release|Win32 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|x64.ActiveCfg = Release|x64 + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {61C7F431-0623-4A8D-9C4B-EDE35696554A} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {61C7F431-0623-4A8D-9C4B-EDE35696554A} + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9} = {61C7F431-0623-4A8D-9C4B-EDE35696554A} + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} = {61C7F431-0623-4A8D-9C4B-EDE35696554A} + {F0B874CB-4476-4199-9315-8343D05AE684} = {61C7F431-0623-4A8D-9C4B-EDE35696554A} + {9A183B48-ECC2-4121-876A-9B3793686073} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {8D612734-FAA5-4B8A-804F-4DEA2367D495} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {C6CC7A52-0FDD-433A-B2CF-9C6F187DA807} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {ADF64291-57ED-4B7A-AB76-37B4A991504B} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {521498BE-6089-4780-8223-E67C22F4E068} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18} = {5C17B1EB-6C76-438A-A503-8F3C7831023B} + {3E03C179-8251-46E4-81F4-466F114BAC63} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} + {E5D1F0C0-AA07-4841-A4EB-4CF4DAA6B0FA} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} + {33546D62-7F34-4EA6-A88E-D538B36E16BF} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} + {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} + {0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {77CF6E34-3038-4B23-A2E7-90AD17801609} + {0D14F1E9-490B-4A2D-A4EF-0535E8B3C718} = {77CF6E34-3038-4B23-A2E7-90AD17801609} + {DE7C596C-CBC4-4278-8909-146D63990803} = {77CF6E34-3038-4B23-A2E7-90AD17801609} + {95CCAABC-7062-47C4-B8C1-A064DD5F16FF} = {77CF6E34-3038-4B23-A2E7-90AD17801609} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + AMDCaProjectFile = D:\Dev\Dolphin\trunk\Source\CodeAnalyst\Dolphin.caw + EndGlobalSection + GlobalSection(DPCodeReviewSolutionGUID) = preSolution + DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} + EndGlobalSection +EndGlobal