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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 z 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 M$Zvpx!_A)gJ^;`G6XCV3)`BVM@ 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

    lfg7``g=We3QK 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 z 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 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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

    ak4-ObO2c_um0!oJ#`&v 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≫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 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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 IlO^!~09~ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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