From 544ea05dd772e737ad5d6704f36bb6a0fb824131 Mon Sep 17 00:00:00 2001
From: Nomango <569629550@qq.com>
Date: Sun, 31 Mar 2019 01:37:06 +0800
Subject: [PATCH] add HttpClient & AsyncTask
case sensitive
---
.gitignore | 6 +-
Easy2D-Audio/Easy2D-Audio.vcxproj | 162 +
Easy2D-Audio/Easy2D-Audio.vcxproj.filters | 20 +
Easy2D-Audio/Music.cpp | 177 +
Easy2D-Audio/Music.h | 81 +
Easy2D-Audio/Player.cpp | 141 +
Easy2D-Audio/Player.h | 93 +
Easy2D-Audio/Transcoder.cpp | 267 +
Easy2D-Audio/Transcoder.h | 57 +
Easy2D-Audio/Voice.cpp | 148 +
Easy2D-Audio/Voice.h | 72 +
Easy2D-Audio/audio-modules.cpp | 97 +
Easy2D-Audio/audio-modules.h | 83 +
Easy2D-Audio/audio.cpp | 115 +
Easy2D-Audio/audio.h | 66 +
Easy2D-Audio/easy2d-audio.h | 26 +
Easy2D-ImGui/Easy2D-ImGui.vcxproj | 166 +
Easy2D-ImGui/Easy2D-ImGui.vcxproj.filters | 49 +
Easy2D-ImGui/ImGuiLayer.cpp | 183 +
Easy2D-ImGui/ImGuiLayer.h | 71 +
Easy2D-ImGui/ImGuiView.cpp | 83 +
Easy2D-ImGui/ImGuiView.h | 44 +
Easy2D-ImGui/easy2d-imgui.h | 27 +
Easy2D-ImGui/imgui_impl_dx11.cpp | 493 +
Easy2D-ImGui/imgui_impl_dx11.h | 15 +
Easy2D-ImGui/libs/ImGui/LICENSE.txt | 21 +
Easy2D-ImGui/libs/ImGui/imconfig.h | 73 +
Easy2D-ImGui/libs/ImGui/imgui.cpp | 9459 +++++++++++++++++
Easy2D-ImGui/libs/ImGui/imgui.h | 2137 ++++
Easy2D-ImGui/libs/ImGui/imgui_demo.cpp | 4234 ++++++++
Easy2D-ImGui/libs/ImGui/imgui_draw.cpp | 3287 ++++++
Easy2D-ImGui/libs/ImGui/imgui_internal.h | 1490 +++
Easy2D-ImGui/libs/ImGui/imgui_widgets.cpp | 6572 ++++++++++++
Easy2D-ImGui/libs/ImGui/imstb_rectpack.h | 623 ++
Easy2D-ImGui/libs/ImGui/imstb_textedit.h | 1408 +++
Easy2D-ImGui/libs/ImGui/imstb_truetype.h | 4860 +++++++++
Easy2D-Network/Easy2D-Network.vcxproj | 147 +
Easy2D-Network/Easy2D-Network.vcxproj.filters | 13 +
Easy2D-Network/HttpClient.cpp | 311 +
Easy2D-Network/HttpClient.h | 104 +
Easy2D-Network/HttpRequest.h | 116 +
Easy2D-Network/HttpResponse.h | 118 +
Easy2D-Network/curl/curl.h | 2528 +++++
Easy2D-Network/curl/curlbuild.h | 586 +
Easy2D-Network/curl/curlrules.h | 262 +
Easy2D-Network/curl/curlver.h | 77 +
Easy2D-Network/curl/easy.h | 102 +
Easy2D-Network/curl/mprintf.h | 50 +
Easy2D-Network/curl/multi.h | 439 +
Easy2D-Network/curl/stdcheaders.h | 33 +
Easy2D-Network/curl/typecheck-gcc.h | 623 ++
Easy2D-Network/easy2d-network.h | 27 +
Easy2D-Network/helper.h | 30 +
Easy2D.sln | 74 +-
Easy2D/2d/Action.cpp | 102 +
Easy2D/2d/Action.h | 124 +
Easy2D/2d/ActionGroup.cpp | 147 +
Easy2D/2d/ActionGroup.h | 103 +
Easy2D/2d/ActionHelper.h | 232 +
Easy2D/2d/ActionManager.cpp | 103 +
Easy2D/2d/ActionManager.h | 59 +
Easy2D/2d/ActionTween.cpp | 480 +
Easy2D/2d/ActionTween.h | 478 +
Easy2D/2d/Animation.cpp | 104 +
Easy2D/2d/Animation.h | 63 +
Easy2D/2d/Canvas.cpp | 505 +
Easy2D/2d/Canvas.h | 243 +
Easy2D/2d/Color.cpp | 75 +
Easy2D/2d/Color.h | 110 +
Easy2D/2d/DebugNode.cpp | 92 +
Easy2D/2d/DebugNode.h | 42 +
Easy2D/2d/Font.hpp | 63 +
Easy2D/2d/Frames.cpp | 94 +
Easy2D/2d/Frames.h | 61 +
Easy2D/2d/Geometry.cpp | 442 +
Easy2D/2d/Geometry.h | 304 +
Easy2D/2d/GeometryNode.cpp | 87 +
Easy2D/2d/GeometryNode.h | 89 +
Easy2D/2d/Image.cpp | 182 +
Easy2D/2d/Image.h | 104 +
Easy2D/2d/Layer.cpp | 88 +
Easy2D/2d/Layer.h | 49 +
Easy2D/2d/Node.cpp | 594 ++
Easy2D/2d/Node.h | 411 +
Easy2D/2d/Scene.cpp | 79 +
Easy2D/2d/Scene.h | 52 +
Easy2D/2d/Sprite.cpp | 105 +
Easy2D/2d/Sprite.h | 73 +
Easy2D/2d/Text.cpp | 347 +
Easy2D/2d/Text.h | 221 +
Easy2D/2d/TextStyle.hpp | 91 +
Easy2D/2d/Transform.hpp | 59 +
Easy2D/2d/Transition.cpp | 396 +
Easy2D/2d/Transition.h | 181 +
Easy2D/2d/include-forwards.h | 132 +
Easy2D/Easy2D.vcxproj | 258 +
Easy2D/Easy2D.vcxproj.filters | 378 +
Easy2D/base/AsyncTask.cpp | 113 +
Easy2D/base/AsyncTask.h | 82 +
Easy2D/base/Component.h | 34 +
Easy2D/base/Event.hpp | 179 +
Easy2D/base/EventDispatcher.cpp | 135 +
Easy2D/base/EventDispatcher.h | 78 +
Easy2D/base/EventListener.cpp | 38 +
Easy2D/base/EventListener.h | 65 +
Easy2D/base/Input.cpp | 102 +
Easy2D/base/Input.h | 87 +
Easy2D/base/Object.cpp | 154 +
Easy2D/base/Object.h | 75 +
Easy2D/base/RefCounter.hpp | 52 +
Easy2D/base/Resource.cpp | 134 +
Easy2D/base/Resource.h | 88 +
Easy2D/base/SmartPtr.hpp | 49 +
Easy2D/base/Timer.cpp | 94 +
Easy2D/base/Timer.h | 79 +
Easy2D/base/TimerManager.cpp | 130 +
Easy2D/base/TimerManager.h | 69 +
Easy2D/base/keys.hpp | 125 +
Easy2D/base/logs.cpp | 88 +
Easy2D/base/logs.h | 231 +
Easy2D/base/time.cpp | 453 +
Easy2D/base/time.h | 220 +
Easy2D/base/window.cpp | 393 +
Easy2D/base/window.h | 87 +
Easy2D/common/Array.h | 284 +
Easy2D/common/ComPtr.hpp | 45 +
Easy2D/common/IntrusiveList.hpp | 252 +
Easy2D/common/IntrusivePtr.hpp | 217 +
Easy2D/common/Json.h | 2467 +++++
Easy2D/common/Singleton.hpp | 51 +
Easy2D/common/String.h | 1315 +++
Easy2D/common/closure.hpp | 83 +
Easy2D/common/helper.h | 55 +
Easy2D/common/noncopyable.hpp | 35 +
Easy2D/config.h | 21 +
Easy2D/easy2d.h | 121 +
Easy2D/macros.h | 118 +
Easy2D/math/Matrix.hpp | 271 +
Easy2D/math/Rect.hpp | 112 +
Easy2D/math/Vec2.hpp | 91 +
Easy2D/math/constants.hpp | 43 +
Easy2D/math/ease.hpp | 286 +
Easy2D/math/helper.h | 35 +
Easy2D/math/rand.h | 126 +
Easy2D/math/scalar.hpp | 82 +
Easy2D/platform/Application.cpp | 600 ++
Easy2D/platform/Application.h | 168 +
Easy2D/platform/modules.cpp | 46 +
Easy2D/platform/modules.h | 53 +
Easy2D/renderer/D2DDeviceResources.cpp | 516 +
Easy2D/renderer/D2DDeviceResources.h | 118 +
Easy2D/renderer/D3D10DeviceResources.cpp | 439 +
Easy2D/renderer/D3D10DeviceResources.h | 87 +
Easy2D/renderer/D3D11DeviceResources.cpp | 443 +
Easy2D/renderer/D3D11DeviceResources.h | 92 +
Easy2D/renderer/DeviceResources.h | 39 +
Easy2D/renderer/TextRenderer.cpp | 525 +
Easy2D/renderer/TextRenderer.h | 44 +
Easy2D/renderer/helper.hpp | 73 +
Easy2D/renderer/render.cpp | 456 +
Easy2D/renderer/render.h | 188 +
Easy2D/ui/Button.cpp | 139 +
Easy2D/ui/Button.h | 94 +
Easy2D/ui/Menu.cpp | 100 +
Easy2D/ui/Menu.h | 66 +
Easy2D/utils/DataUtil.cpp | 159 +
Easy2D/utils/DataUtil.h | 130 +
Easy2D/utils/File.cpp | 113 +
Easy2D/utils/File.h | 66 +
Easy2D/utils/Path.cpp | 104 +
Easy2D/utils/Path.h | 40 +
Easy2D/utils/ResLoader.cpp | 251 +
Easy2D/utils/ResLoader.h | 88 +
easy2d-audio/Easy2D-Audio.vcxproj | 8 +-
easy2d-audio/audio.cpp | 4 +-
easy2d-audio/audio.h | 4 +-
easy2d-audio/easy2d-audio.h | 20 +-
easy2d-imgui/Easy2D-ImGui.vcxproj | 8 +-
easy2d-imgui/ImGuiLayer.cpp | 20 +-
easy2d-imgui/ImGuiLayer.h | 20 +-
easy2d-imgui/ImGuiView.cpp | 4 +-
easy2d-imgui/ImGuiView.h | 24 +-
easy2d-imgui/easy2d-imgui.h | 20 +-
easy2d/Easy2D.vcxproj | 2 +
easy2d/Easy2D.vcxproj.filters | 6 +
easy2d/base/Component.h | 4 +-
easy2d/base/Input.h | 4 +-
easy2d/common/helper.h | 4 +
easy2d/easy2d.h | 1 +
easy2d/platform/Application.cpp | 117 +-
easy2d/platform/Application.h | 14 +-
easy2d/renderer/render.cpp | 4 +-
easy2d/renderer/render.h | 4 +-
samples/Box2DSample/Box2DSample.vcxproj | 23 +-
samples/Box2DSample/common.h | 2 +-
samples/Box2DSample/packages.config | 4 +
samples/HelloWorld/HelloWorld.vcxproj | 10 +-
samples/ImGuiSample/ImGuiSample.vcxproj | 12 +-
samples/Samples/Demo5.h | 66 +
samples/Samples/Samples.vcxproj | 16 +-
samples/Samples/Samples.vcxproj.filters | 1 +
samples/Samples/common.h | 2 +
samples/Samples/main.cpp | 44 +-
samples/libs/box2d/Box2D.vcxproj | 252 -
samples/libs/box2d/Box2D.vcxproj.filters | 307 -
samples/libs/box2d/Box2D/Box2D.h | 68 -
.../Box2D/Collision/Shapes/b2ChainShape.cpp | 198 -
.../Box2D/Collision/Shapes/b2ChainShape.h | 105 -
.../Box2D/Collision/Shapes/b2CircleShape.cpp | 99 -
.../Box2D/Collision/Shapes/b2CircleShape.h | 60 -
.../Box2D/Collision/Shapes/b2EdgeShape.cpp | 138 -
.../Box2D/Collision/Shapes/b2EdgeShape.h | 74 -
.../Box2D/Collision/Shapes/b2PolygonShape.cpp | 468 -
.../Box2D/Collision/Shapes/b2PolygonShape.h | 89 -
.../box2d/Box2D/Collision/Shapes/b2Shape.h | 104 -
.../box2d/Box2D/Collision/b2BroadPhase.cpp | 119 -
.../libs/box2d/Box2D/Collision/b2BroadPhase.h | 257 -
.../box2d/Box2D/Collision/b2CollideCircle.cpp | 154 -
.../box2d/Box2D/Collision/b2CollideEdge.cpp | 698 --
.../Box2D/Collision/b2CollidePolygon.cpp | 239 -
.../box2d/Box2D/Collision/b2Collision.cpp | 252 -
.../libs/box2d/Box2D/Collision/b2Collision.h | 277 -
.../libs/box2d/Box2D/Collision/b2Distance.cpp | 737 --
.../libs/box2d/Box2D/Collision/b2Distance.h | 166 -
.../box2d/Box2D/Collision/b2DynamicTree.cpp | 780 --
.../box2d/Box2D/Collision/b2DynamicTree.h | 289 -
.../box2d/Box2D/Collision/b2TimeOfImpact.cpp | 486 -
.../box2d/Box2D/Collision/b2TimeOfImpact.h | 58 -
.../box2d/Box2D/Common/b2BlockAllocator.cpp | 215 -
.../box2d/Box2D/Common/b2BlockAllocator.h | 62 -
samples/libs/box2d/Box2D/Common/b2Draw.cpp | 44 -
samples/libs/box2d/Box2D/Common/b2Draw.h | 97 -
.../libs/box2d/Box2D/Common/b2GrowableStack.h | 85 -
samples/libs/box2d/Box2D/Common/b2Math.cpp | 94 -
samples/libs/box2d/Box2D/Common/b2Math.h | 707 --
.../libs/box2d/Box2D/Common/b2Settings.cpp | 44 -
samples/libs/box2d/Box2D/Common/b2Settings.h | 155 -
.../box2d/Box2D/Common/b2StackAllocator.cpp | 83 -
.../box2d/Box2D/Common/b2StackAllocator.h | 60 -
samples/libs/box2d/Box2D/Common/b2Timer.cpp | 121 -
samples/libs/box2d/Box2D/Common/b2Timer.h | 50 -
.../Contacts/b2ChainAndCircleContact.cpp | 53 -
.../Contacts/b2ChainAndCircleContact.h | 39 -
.../Contacts/b2ChainAndPolygonContact.cpp | 53 -
.../Contacts/b2ChainAndPolygonContact.h | 39 -
.../Dynamics/Contacts/b2CircleContact.cpp | 52 -
.../Box2D/Dynamics/Contacts/b2CircleContact.h | 39 -
.../Box2D/Dynamics/Contacts/b2Contact.cpp | 247 -
.../box2d/Box2D/Dynamics/Contacts/b2Contact.h | 349 -
.../Dynamics/Contacts/b2ContactSolver.cpp | 838 --
.../Box2D/Dynamics/Contacts/b2ContactSolver.h | 95 -
.../Contacts/b2EdgeAndCircleContact.cpp | 49 -
.../Contacts/b2EdgeAndCircleContact.h | 39 -
.../Contacts/b2EdgeAndPolygonContact.cpp | 49 -
.../Contacts/b2EdgeAndPolygonContact.h | 39 -
.../Contacts/b2PolygonAndCircleContact.cpp | 49 -
.../Contacts/b2PolygonAndCircleContact.h | 38 -
.../Dynamics/Contacts/b2PolygonContact.cpp | 52 -
.../Dynamics/Contacts/b2PolygonContact.h | 39 -
.../Box2D/Dynamics/Joints/b2DistanceJoint.cpp | 260 -
.../Box2D/Dynamics/Joints/b2DistanceJoint.h | 169 -
.../Box2D/Dynamics/Joints/b2FrictionJoint.cpp | 251 -
.../Box2D/Dynamics/Joints/b2FrictionJoint.h | 119 -
.../Box2D/Dynamics/Joints/b2GearJoint.cpp | 419 -
.../box2d/Box2D/Dynamics/Joints/b2GearJoint.h | 125 -
.../box2d/Box2D/Dynamics/Joints/b2Joint.cpp | 211 -
.../box2d/Box2D/Dynamics/Joints/b2Joint.h | 226 -
.../Box2D/Dynamics/Joints/b2MotorJoint.cpp | 309 -
.../Box2D/Dynamics/Joints/b2MotorJoint.h | 133 -
.../Box2D/Dynamics/Joints/b2MouseJoint.cpp | 222 -
.../Box2D/Dynamics/Joints/b2MouseJoint.h | 129 -
.../Dynamics/Joints/b2PrismaticJoint.cpp | 642 --
.../Box2D/Dynamics/Joints/b2PrismaticJoint.h | 196 -
.../Box2D/Dynamics/Joints/b2PulleyJoint.cpp | 348 -
.../Box2D/Dynamics/Joints/b2PulleyJoint.h | 152 -
.../Box2D/Dynamics/Joints/b2RevoluteJoint.cpp | 511 -
.../Box2D/Dynamics/Joints/b2RevoluteJoint.h | 204 -
.../Box2D/Dynamics/Joints/b2RopeJoint.cpp | 241 -
.../box2d/Box2D/Dynamics/Joints/b2RopeJoint.h | 114 -
.../Box2D/Dynamics/Joints/b2WeldJoint.cpp | 344 -
.../box2d/Box2D/Dynamics/Joints/b2WeldJoint.h | 126 -
.../Box2D/Dynamics/Joints/b2WheelJoint.cpp | 456 -
.../Box2D/Dynamics/Joints/b2WheelJoint.h | 216 -
samples/libs/box2d/Box2D/Dynamics/b2Body.cpp | 554 -
samples/libs/box2d/Box2D/Dynamics/b2Body.h | 882 --
.../box2d/Box2D/Dynamics/b2ContactManager.cpp | 296 -
.../box2d/Box2D/Dynamics/b2ContactManager.h | 52 -
.../libs/box2d/Box2D/Dynamics/b2Fixture.cpp | 303 -
samples/libs/box2d/Box2D/Dynamics/b2Fixture.h | 345 -
.../libs/box2d/Box2D/Dynamics/b2Island.cpp | 539 -
samples/libs/box2d/Box2D/Dynamics/b2Island.h | 93 -
.../libs/box2d/Box2D/Dynamics/b2TimeStep.h | 70 -
samples/libs/box2d/Box2D/Dynamics/b2World.cpp | 1366 ---
samples/libs/box2d/Box2D/Dynamics/b2World.h | 354 -
.../box2d/Box2D/Dynamics/b2WorldCallbacks.cpp | 36 -
.../box2d/Box2D/Dynamics/b2WorldCallbacks.h | 155 -
samples/libs/box2d/Box2D/Rope/b2Rope.cpp | 259 -
samples/libs/box2d/Box2D/Rope/b2Rope.h | 115 -
298 files changed, 65659 insertions(+), 22133 deletions(-)
create mode 100644 Easy2D-Audio/Easy2D-Audio.vcxproj
create mode 100644 Easy2D-Audio/Easy2D-Audio.vcxproj.filters
create mode 100644 Easy2D-Audio/Music.cpp
create mode 100644 Easy2D-Audio/Music.h
create mode 100644 Easy2D-Audio/Player.cpp
create mode 100644 Easy2D-Audio/Player.h
create mode 100644 Easy2D-Audio/Transcoder.cpp
create mode 100644 Easy2D-Audio/Transcoder.h
create mode 100644 Easy2D-Audio/Voice.cpp
create mode 100644 Easy2D-Audio/Voice.h
create mode 100644 Easy2D-Audio/audio-modules.cpp
create mode 100644 Easy2D-Audio/audio-modules.h
create mode 100644 Easy2D-Audio/audio.cpp
create mode 100644 Easy2D-Audio/audio.h
create mode 100644 Easy2D-Audio/easy2d-audio.h
create mode 100644 Easy2D-ImGui/Easy2D-ImGui.vcxproj
create mode 100644 Easy2D-ImGui/Easy2D-ImGui.vcxproj.filters
create mode 100644 Easy2D-ImGui/ImGuiLayer.cpp
create mode 100644 Easy2D-ImGui/ImGuiLayer.h
create mode 100644 Easy2D-ImGui/ImGuiView.cpp
create mode 100644 Easy2D-ImGui/ImGuiView.h
create mode 100644 Easy2D-ImGui/easy2d-imgui.h
create mode 100644 Easy2D-ImGui/imgui_impl_dx11.cpp
create mode 100644 Easy2D-ImGui/imgui_impl_dx11.h
create mode 100644 Easy2D-ImGui/libs/ImGui/LICENSE.txt
create mode 100644 Easy2D-ImGui/libs/ImGui/imconfig.h
create mode 100644 Easy2D-ImGui/libs/ImGui/imgui.cpp
create mode 100644 Easy2D-ImGui/libs/ImGui/imgui.h
create mode 100644 Easy2D-ImGui/libs/ImGui/imgui_demo.cpp
create mode 100644 Easy2D-ImGui/libs/ImGui/imgui_draw.cpp
create mode 100644 Easy2D-ImGui/libs/ImGui/imgui_internal.h
create mode 100644 Easy2D-ImGui/libs/ImGui/imgui_widgets.cpp
create mode 100644 Easy2D-ImGui/libs/ImGui/imstb_rectpack.h
create mode 100644 Easy2D-ImGui/libs/ImGui/imstb_textedit.h
create mode 100644 Easy2D-ImGui/libs/ImGui/imstb_truetype.h
create mode 100644 Easy2D-Network/Easy2D-Network.vcxproj
create mode 100644 Easy2D-Network/Easy2D-Network.vcxproj.filters
create mode 100644 Easy2D-Network/HttpClient.cpp
create mode 100644 Easy2D-Network/HttpClient.h
create mode 100644 Easy2D-Network/HttpRequest.h
create mode 100644 Easy2D-Network/HttpResponse.h
create mode 100644 Easy2D-Network/curl/curl.h
create mode 100644 Easy2D-Network/curl/curlbuild.h
create mode 100644 Easy2D-Network/curl/curlrules.h
create mode 100644 Easy2D-Network/curl/curlver.h
create mode 100644 Easy2D-Network/curl/easy.h
create mode 100644 Easy2D-Network/curl/mprintf.h
create mode 100644 Easy2D-Network/curl/multi.h
create mode 100644 Easy2D-Network/curl/stdcheaders.h
create mode 100644 Easy2D-Network/curl/typecheck-gcc.h
create mode 100644 Easy2D-Network/easy2d-network.h
create mode 100644 Easy2D-Network/helper.h
create mode 100644 Easy2D/2d/Action.cpp
create mode 100644 Easy2D/2d/Action.h
create mode 100644 Easy2D/2d/ActionGroup.cpp
create mode 100644 Easy2D/2d/ActionGroup.h
create mode 100644 Easy2D/2d/ActionHelper.h
create mode 100644 Easy2D/2d/ActionManager.cpp
create mode 100644 Easy2D/2d/ActionManager.h
create mode 100644 Easy2D/2d/ActionTween.cpp
create mode 100644 Easy2D/2d/ActionTween.h
create mode 100644 Easy2D/2d/Animation.cpp
create mode 100644 Easy2D/2d/Animation.h
create mode 100644 Easy2D/2d/Canvas.cpp
create mode 100644 Easy2D/2d/Canvas.h
create mode 100644 Easy2D/2d/Color.cpp
create mode 100644 Easy2D/2d/Color.h
create mode 100644 Easy2D/2d/DebugNode.cpp
create mode 100644 Easy2D/2d/DebugNode.h
create mode 100644 Easy2D/2d/Font.hpp
create mode 100644 Easy2D/2d/Frames.cpp
create mode 100644 Easy2D/2d/Frames.h
create mode 100644 Easy2D/2d/Geometry.cpp
create mode 100644 Easy2D/2d/Geometry.h
create mode 100644 Easy2D/2d/GeometryNode.cpp
create mode 100644 Easy2D/2d/GeometryNode.h
create mode 100644 Easy2D/2d/Image.cpp
create mode 100644 Easy2D/2d/Image.h
create mode 100644 Easy2D/2d/Layer.cpp
create mode 100644 Easy2D/2d/Layer.h
create mode 100644 Easy2D/2d/Node.cpp
create mode 100644 Easy2D/2d/Node.h
create mode 100644 Easy2D/2d/Scene.cpp
create mode 100644 Easy2D/2d/Scene.h
create mode 100644 Easy2D/2d/Sprite.cpp
create mode 100644 Easy2D/2d/Sprite.h
create mode 100644 Easy2D/2d/Text.cpp
create mode 100644 Easy2D/2d/Text.h
create mode 100644 Easy2D/2d/TextStyle.hpp
create mode 100644 Easy2D/2d/Transform.hpp
create mode 100644 Easy2D/2d/Transition.cpp
create mode 100644 Easy2D/2d/Transition.h
create mode 100644 Easy2D/2d/include-forwards.h
create mode 100644 Easy2D/Easy2D.vcxproj
create mode 100644 Easy2D/Easy2D.vcxproj.filters
create mode 100644 Easy2D/base/AsyncTask.cpp
create mode 100644 Easy2D/base/AsyncTask.h
create mode 100644 Easy2D/base/Component.h
create mode 100644 Easy2D/base/Event.hpp
create mode 100644 Easy2D/base/EventDispatcher.cpp
create mode 100644 Easy2D/base/EventDispatcher.h
create mode 100644 Easy2D/base/EventListener.cpp
create mode 100644 Easy2D/base/EventListener.h
create mode 100644 Easy2D/base/Input.cpp
create mode 100644 Easy2D/base/Input.h
create mode 100644 Easy2D/base/Object.cpp
create mode 100644 Easy2D/base/Object.h
create mode 100644 Easy2D/base/RefCounter.hpp
create mode 100644 Easy2D/base/Resource.cpp
create mode 100644 Easy2D/base/Resource.h
create mode 100644 Easy2D/base/SmartPtr.hpp
create mode 100644 Easy2D/base/Timer.cpp
create mode 100644 Easy2D/base/Timer.h
create mode 100644 Easy2D/base/TimerManager.cpp
create mode 100644 Easy2D/base/TimerManager.h
create mode 100644 Easy2D/base/keys.hpp
create mode 100644 Easy2D/base/logs.cpp
create mode 100644 Easy2D/base/logs.h
create mode 100644 Easy2D/base/time.cpp
create mode 100644 Easy2D/base/time.h
create mode 100644 Easy2D/base/window.cpp
create mode 100644 Easy2D/base/window.h
create mode 100644 Easy2D/common/Array.h
create mode 100644 Easy2D/common/ComPtr.hpp
create mode 100644 Easy2D/common/IntrusiveList.hpp
create mode 100644 Easy2D/common/IntrusivePtr.hpp
create mode 100644 Easy2D/common/Json.h
create mode 100644 Easy2D/common/Singleton.hpp
create mode 100644 Easy2D/common/String.h
create mode 100644 Easy2D/common/closure.hpp
create mode 100644 Easy2D/common/helper.h
create mode 100644 Easy2D/common/noncopyable.hpp
create mode 100644 Easy2D/config.h
create mode 100644 Easy2D/easy2d.h
create mode 100644 Easy2D/macros.h
create mode 100644 Easy2D/math/Matrix.hpp
create mode 100644 Easy2D/math/Rect.hpp
create mode 100644 Easy2D/math/Vec2.hpp
create mode 100644 Easy2D/math/constants.hpp
create mode 100644 Easy2D/math/ease.hpp
create mode 100644 Easy2D/math/helper.h
create mode 100644 Easy2D/math/rand.h
create mode 100644 Easy2D/math/scalar.hpp
create mode 100644 Easy2D/platform/Application.cpp
create mode 100644 Easy2D/platform/Application.h
create mode 100644 Easy2D/platform/modules.cpp
create mode 100644 Easy2D/platform/modules.h
create mode 100644 Easy2D/renderer/D2DDeviceResources.cpp
create mode 100644 Easy2D/renderer/D2DDeviceResources.h
create mode 100644 Easy2D/renderer/D3D10DeviceResources.cpp
create mode 100644 Easy2D/renderer/D3D10DeviceResources.h
create mode 100644 Easy2D/renderer/D3D11DeviceResources.cpp
create mode 100644 Easy2D/renderer/D3D11DeviceResources.h
create mode 100644 Easy2D/renderer/DeviceResources.h
create mode 100644 Easy2D/renderer/TextRenderer.cpp
create mode 100644 Easy2D/renderer/TextRenderer.h
create mode 100644 Easy2D/renderer/helper.hpp
create mode 100644 Easy2D/renderer/render.cpp
create mode 100644 Easy2D/renderer/render.h
create mode 100644 Easy2D/ui/Button.cpp
create mode 100644 Easy2D/ui/Button.h
create mode 100644 Easy2D/ui/Menu.cpp
create mode 100644 Easy2D/ui/Menu.h
create mode 100644 Easy2D/utils/DataUtil.cpp
create mode 100644 Easy2D/utils/DataUtil.h
create mode 100644 Easy2D/utils/File.cpp
create mode 100644 Easy2D/utils/File.h
create mode 100644 Easy2D/utils/Path.cpp
create mode 100644 Easy2D/utils/Path.h
create mode 100644 Easy2D/utils/ResLoader.cpp
create mode 100644 Easy2D/utils/ResLoader.h
create mode 100644 samples/Box2DSample/packages.config
create mode 100644 samples/Samples/Demo5.h
delete mode 100644 samples/libs/box2d/Box2D.vcxproj
delete mode 100644 samples/libs/box2d/Box2D.vcxproj.filters
delete mode 100644 samples/libs/box2d/Box2D/Box2D.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2ChainShape.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2CircleShape.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2CircleShape.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2EdgeShape.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2EdgeShape.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2PolygonShape.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2PolygonShape.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/Shapes/b2Shape.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2BroadPhase.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2BroadPhase.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2CollideCircle.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2CollideEdge.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2CollidePolygon.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2Collision.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2Collision.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2Distance.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2Distance.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2DynamicTree.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2DynamicTree.h
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2TimeOfImpact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Collision/b2TimeOfImpact.h
delete mode 100644 samples/libs/box2d/Box2D/Common/b2BlockAllocator.cpp
delete mode 100644 samples/libs/box2d/Box2D/Common/b2BlockAllocator.h
delete mode 100644 samples/libs/box2d/Box2D/Common/b2Draw.cpp
delete mode 100644 samples/libs/box2d/Box2D/Common/b2Draw.h
delete mode 100644 samples/libs/box2d/Box2D/Common/b2GrowableStack.h
delete mode 100644 samples/libs/box2d/Box2D/Common/b2Math.cpp
delete mode 100644 samples/libs/box2d/Box2D/Common/b2Math.h
delete mode 100644 samples/libs/box2d/Box2D/Common/b2Settings.cpp
delete mode 100644 samples/libs/box2d/Box2D/Common/b2Settings.h
delete mode 100644 samples/libs/box2d/Box2D/Common/b2StackAllocator.cpp
delete mode 100644 samples/libs/box2d/Box2D/Common/b2StackAllocator.h
delete mode 100644 samples/libs/box2d/Box2D/Common/b2Timer.cpp
delete mode 100644 samples/libs/box2d/Box2D/Common/b2Timer.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2CircleContact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2CircleContact.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2Contact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2Contact.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2ContactSolver.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Contacts/b2PolygonContact.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2DistanceJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2FrictionJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2GearJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2GearJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2Joint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2Joint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2MotorJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2MotorJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2MouseJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2MouseJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2PrismaticJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2PulleyJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2RevoluteJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2RopeJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2RopeJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2WeldJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2WeldJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2WheelJoint.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/Joints/b2WheelJoint.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2Body.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2Body.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2ContactManager.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2ContactManager.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2Fixture.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2Fixture.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2Island.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2Island.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2TimeStep.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2World.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2World.h
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2WorldCallbacks.cpp
delete mode 100644 samples/libs/box2d/Box2D/Dynamics/b2WorldCallbacks.h
delete mode 100644 samples/libs/box2d/Box2D/Rope/b2Rope.cpp
delete mode 100644 samples/libs/box2d/Box2D/Rope/b2Rope.h
diff --git a/.gitignore b/.gitignore
index 4ed594f0..5bf2f7c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,5 +10,9 @@ ipch/
*.user
*.lnk
+
.vs
-.vscode
\ No newline at end of file
+.vscode
+
+# NuGet packages
+packages/
\ No newline at end of file
diff --git a/Easy2D-Audio/Easy2D-Audio.vcxproj b/Easy2D-Audio/Easy2D-Audio.vcxproj
new file mode 100644
index 00000000..2a78cd1b
--- /dev/null
+++ b/Easy2D-Audio/Easy2D-Audio.vcxproj
@@ -0,0 +1,162 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ {5D45F66B-BECD-4909-BCFC-C0F3CED9D0A2}
+ Easy2D-Audio
+
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ false
+
+
+
+
+
+ Level3
+ Disabled
+ true
+ ../Easy2D
+
+
+ Windows
+ true
+
+
+
+
+
+
+ Level3
+ Disabled
+ true
+ ../Easy2D
+
+
+ Windows
+ true
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ ../Easy2D
+
+
+ Windows
+ true
+ true
+ true
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ ../Easy2D
+
+
+ Windows
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Easy2D-Audio/Easy2D-Audio.vcxproj.filters b/Easy2D-Audio/Easy2D-Audio.vcxproj.filters
new file mode 100644
index 00000000..883e2fa0
--- /dev/null
+++ b/Easy2D-Audio/Easy2D-Audio.vcxproj.filters
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Easy2D-Audio/Music.cpp b/Easy2D-Audio/Music.cpp
new file mode 100644
index 00000000..002a6a1f
--- /dev/null
+++ b/Easy2D-Audio/Music.cpp
@@ -0,0 +1,177 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#include "easy2d-audio.h"
+#include "Music.h"
+#include "Transcoder.h"
+
+namespace easy2d
+{
+ Music::Music()
+ : opened_(false)
+ , playing_(false)
+ , wave_data_(nullptr)
+ , size_(0)
+ , voice_(nullptr)
+ {
+ }
+
+ Music::Music(Resource const& res)
+ : Music()
+ {
+ Load(res);
+ }
+
+ Music::~Music()
+ {
+ Close();
+ }
+
+ bool Music::Load(Resource const& res)
+ {
+ if (opened_)
+ {
+ Close();
+ }
+
+ HRESULT hr = S_OK;
+ Transcoder transcoder;
+
+ if (res.IsFileType())
+ {
+ if (!modules::Shlwapi::Get().PathFileExistsW(res.GetFileName().c_str()))
+ {
+ E2D_WARNING_LOG(L"Media file '%s' not found", res.GetFileName().c_str());
+ return false;
+ }
+ hr = transcoder.LoadMediaFile(res.GetFileName(), &wave_data_, &size_);
+ }
+ else
+ {
+ hr = transcoder.LoadMediaResource(res, &wave_data_, &size_);
+ }
+
+ if (FAILED(hr))
+ {
+ E2D_ERROR_LOG(L"Load media file failed with HRESULT of %08X", hr);
+ return false;
+ }
+
+ hr = Audio::Instance().CreateVoice(voice_, transcoder.GetWaveFormatEx());
+ if (FAILED(hr))
+ {
+ if (wave_data_)
+ {
+ delete[] wave_data_;
+ wave_data_ = nullptr;
+ }
+ E2D_ERROR_LOG(L"Create source voice failed with HRESULT of %08X", hr);
+ return false;
+ }
+
+ opened_ = true;
+ return true;
+ }
+
+ bool Music::Play(int loop_count)
+ {
+ if (!opened_)
+ {
+ E2D_ERROR_LOG(L"Music must be opened first!");
+ return false;
+ }
+
+ UINT32 buffers_queued = 0;
+ voice_.GetBuffersQueued(&buffers_queued);
+ if (buffers_queued)
+ Stop();
+
+ if (loop_count < 0)
+ loop_count = XAUDIO2_LOOP_INFINITE;
+ else
+ loop_count = std::min(loop_count, XAUDIO2_LOOP_INFINITE - 1);
+
+ HRESULT hr = voice_.Play(wave_data_, size_, static_cast(loop_count));
+ if (FAILED(hr))
+ {
+ E2D_ERROR_LOG(L"Submitting source buffer failed with HRESULT of %08X", hr);
+ }
+
+ playing_ = SUCCEEDED(hr);
+
+ return playing_;
+ }
+
+ void Music::Pause()
+ {
+ if (SUCCEEDED(voice_.Pause()))
+ playing_ = false;
+ }
+
+ void Music::Resume()
+ {
+ if (SUCCEEDED(voice_.Resume()))
+ playing_ = true;
+ }
+
+ void Music::Stop()
+ {
+ if (SUCCEEDED(voice_.Stop()))
+ playing_ = false;
+ }
+
+ void Music::Close()
+ {
+ voice_.Destroy();
+
+ if (wave_data_)
+ {
+ delete[] wave_data_;
+ wave_data_ = nullptr;
+ }
+
+ opened_ = false;
+ playing_ = false;
+ }
+
+ bool Music::IsPlaying() const
+ {
+ if (opened_)
+ {
+ UINT32 buffers_queued = 0;
+ voice_.GetBuffersQueued(&buffers_queued);
+ if (buffers_queued && playing_)
+ return true;
+ }
+ return false;
+ }
+
+ float Music::GetVolume() const
+ {
+ float volume = 0.f;
+ voice_.GetVolume(&volume);
+ return volume;
+ }
+
+ bool Music::SetVolume(float volume)
+ {
+ return SUCCEEDED(voice_.SetVolume(volume));
+ }
+}
\ No newline at end of file
diff --git a/Easy2D-Audio/Music.h b/Easy2D-Audio/Music.h
new file mode 100644
index 00000000..50db0a5a
--- /dev/null
+++ b/Easy2D-Audio/Music.h
@@ -0,0 +1,81 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#pragma once
+#include "Voice.h"
+
+namespace easy2d
+{
+ E2D_DECLARE_SMART_PTR(Music);
+
+ // ֶ
+ class E2D_API Music
+ : public virtual Object
+ {
+ public:
+ Music();
+
+ Music(
+ Resource const& res /* Դ */
+ );
+
+ virtual ~Music();
+
+ // Դ
+ bool Load(
+ Resource const& res /* Դ */
+ );
+
+ //
+ bool Play(
+ int loop_count = 0 /* ѭ (-1 Ϊѭ) */
+ );
+
+ // ͣ
+ void Pause();
+
+ //
+ void Resume();
+
+ // ֹͣ
+ void Stop();
+
+ // رղԴ
+ void Close();
+
+ // Ƿڲ
+ bool IsPlaying() const;
+
+ // ȡ
+ float GetVolume() const;
+
+ //
+ bool SetVolume(
+ float volume /* 1 Ϊԭʼ, 1 ΪŴ, 0 ΪС */
+ );
+
+ protected:
+ bool opened_;
+ bool playing_;
+ UINT32 size_;
+ BYTE* wave_data_;
+ Voice voice_;
+ };
+}
diff --git a/Easy2D-Audio/Player.cpp b/Easy2D-Audio/Player.cpp
new file mode 100644
index 00000000..e49e2469
--- /dev/null
+++ b/Easy2D-Audio/Player.cpp
@@ -0,0 +1,141 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#include "easy2d-audio.h"
+#include "Player.h"
+
+namespace easy2d
+{
+ Player::Player()
+ : volume_(1.f)
+ {
+ }
+
+ Player::~Player()
+ {
+ ClearCache();
+ }
+
+ bool Player::Load(Resource const& res)
+ {
+ size_t hash_code = res.GetHashCode();
+ if (musics_cache_.end() != musics_cache_.find(hash_code))
+ return true;
+
+ MusicPtr music = new (std::nothrow) Music();
+
+ if (music)
+ {
+ if (music->Load(res))
+ {
+ music->SetVolume(volume_);
+ musics_cache_.insert(std::make_pair(hash_code, music));
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool Player::Play(Resource const& res, int loop_count)
+ {
+ if (Load(res))
+ {
+ size_t hash_code = res.GetHashCode();
+ auto music = musics_cache_[hash_code];
+ if (music->Play(loop_count))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void Player::Pause(Resource const& res)
+ {
+ size_t hash_code = res.GetHashCode();
+ if (musics_cache_.end() != musics_cache_.find(hash_code))
+ musics_cache_[hash_code]->Pause();
+ }
+
+ void Player::Resume(Resource const& res)
+ {
+ size_t hash_code = res.GetHashCode();
+ if (musics_cache_.end() != musics_cache_.find(hash_code))
+ musics_cache_[hash_code]->Resume();
+ }
+
+ void Player::Stop(Resource const& res)
+ {
+ size_t hash_code = res.GetHashCode();
+ if (musics_cache_.end() != musics_cache_.find(hash_code))
+ musics_cache_[hash_code]->Stop();
+ }
+
+ bool Player::IsPlaying(Resource const& res)
+ {
+ size_t hash_code = res.GetHashCode();
+ if (musics_cache_.end() != musics_cache_.find(hash_code))
+ return musics_cache_[hash_code]->IsPlaying();
+ return false;
+ }
+
+ float Player::GetVolume() const
+ {
+ return volume_;
+ }
+
+ void Player::SetVolume(float volume)
+ {
+ volume_ = std::min(std::max(volume, -224.f), 224.f);
+ for (const auto& pair : musics_cache_)
+ {
+ pair.second->SetVolume(volume_);
+ }
+ }
+
+ void Player::PauseAll()
+ {
+ for (const auto& pair : musics_cache_)
+ {
+ pair.second->Pause();
+ }
+ }
+
+ void Player::ResumeAll()
+ {
+ for (const auto& pair : musics_cache_)
+ {
+ pair.second->Resume();
+ }
+ }
+
+ void Player::StopAll()
+ {
+ for (const auto& pair : musics_cache_)
+ {
+ pair.second->Stop();
+ }
+ }
+
+ void Player::ClearCache()
+ {
+ musics_cache_.clear();
+ }
+}
\ No newline at end of file
diff --git a/Easy2D-Audio/Player.h b/Easy2D-Audio/Player.h
new file mode 100644
index 00000000..004310b9
--- /dev/null
+++ b/Easy2D-Audio/Player.h
@@ -0,0 +1,93 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#pragma once
+
+namespace easy2d
+{
+ E2D_DECLARE_SMART_PTR(Player);
+
+ // ֲ
+ class E2D_API Player
+ : protected Object
+ {
+ using MusicMap = Map;
+
+ public:
+ Player();
+
+ ~Player();
+
+ // ԤԴ
+ bool Load(
+ Resource const& res /* Դ */
+ );
+
+ //
+ bool Play(
+ Resource const& res, /* Դ */
+ int loop_count = 0 /* ѭ (-1 Ϊѭ) */
+ );
+
+ // ͣ
+ void Pause(
+ Resource const& res /* Դ */
+ );
+
+ //
+ void Resume(
+ Resource const& res /* Դ */
+ );
+
+ // ֹͣ
+ void Stop(
+ Resource const& res /* Դ */
+ );
+
+ // ȡֲ״̬
+ bool IsPlaying(
+ Resource const& res /* Դ */
+ );
+
+ // ȡ
+ float GetVolume() const;
+
+ //
+ void SetVolume(
+ float volume /* 1.0 Ϊԭʼ */
+ );
+
+ // ͣ
+ void PauseAll();
+
+ //
+ void ResumeAll();
+
+ // ֹͣ
+ void StopAll();
+
+ //
+ void ClearCache();
+
+ protected:
+ float volume_;
+ MusicMap musics_cache_;
+ };
+}
diff --git a/Easy2D-Audio/Transcoder.cpp b/Easy2D-Audio/Transcoder.cpp
new file mode 100644
index 00000000..710af127
--- /dev/null
+++ b/Easy2D-Audio/Transcoder.cpp
@@ -0,0 +1,267 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#ifndef INITGUID
+# define INITGUID // MFAudioFormat_PCM, MF_MT_MAJOR_TYPE, MF_MT_SUBTYPE, MFMediaType_Audio
+#endif
+
+#include "easy2d-audio.h"
+#include "Transcoder.h"
+#include "audio-modules.h"
+
+namespace easy2d
+{
+ Transcoder::Transcoder()
+ : wave_format_(nullptr)
+ {
+ }
+
+ Transcoder::~Transcoder()
+ {
+ if (wave_format_)
+ {
+ ::CoTaskMemFree(wave_format_);
+ wave_format_ = nullptr;
+ }
+ }
+
+ const WAVEFORMATEX* Transcoder::GetWaveFormatEx() const
+ {
+ return wave_format_;
+ }
+
+ HRESULT Transcoder::LoadMediaFile(String const& file_path, BYTE** wave_data, UINT32* wave_data_size)
+ {
+ HRESULT hr = S_OK;
+
+ ComPtr reader;
+
+ hr = modules::MediaFoundation::Get().MFCreateSourceReaderFromURL(
+ file_path.c_str(),
+ nullptr,
+ &reader
+ );
+
+ if (SUCCEEDED(hr))
+ {
+ hr = ReadSource(reader.Get(), wave_data, wave_data_size);
+ }
+
+ return hr;
+ }
+
+ HRESULT Transcoder::LoadMediaResource(Resource const& res, BYTE** wave_data, UINT32* wave_data_size)
+ {
+ HRESULT hr = S_OK;
+
+ ComPtr stream;
+ ComPtr byte_stream;
+ ComPtr reader;
+
+ LPVOID buffer;
+ DWORD buffer_size;
+ if (!res.Load(buffer, buffer_size)) { return false; }
+
+ stream = modules::Shlwapi::Get().SHCreateMemStream(
+ static_cast(buffer),
+ static_cast(buffer_size)
+ );
+
+ if (stream == nullptr)
+ {
+ E2D_ERROR_LOG(L"SHCreateMemStream failed");
+ return E_OUTOFMEMORY;
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = modules::MediaFoundation::Get().MFCreateMFByteStreamOnStream(stream.Get(), &byte_stream);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = modules::MediaFoundation::Get().MFCreateSourceReaderFromByteStream(
+ byte_stream.Get(),
+ nullptr,
+ &reader
+ );
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = ReadSource(reader.Get(), wave_data, wave_data_size);
+ }
+
+ return hr;
+ }
+
+ HRESULT Transcoder::ReadSource(IMFSourceReader* reader, BYTE** wave_data, UINT32* wave_data_size)
+ {
+ HRESULT hr = S_OK;
+ DWORD max_stream_size = 0;
+
+ ComPtr partial_type;
+ ComPtr uncompressed_type;
+
+ hr = modules::MediaFoundation::Get().MFCreateMediaType(&partial_type);
+
+ if (SUCCEEDED(hr))
+ {
+ hr = partial_type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = partial_type->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
+ }
+
+ // source reader ýͣʹúʵĽȥƵ
+ if (SUCCEEDED(hr))
+ {
+ hr = reader->SetCurrentMediaType(
+ (DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM,
+ 0,
+ partial_type.Get()
+ );
+ }
+
+ // IMFMediaType лȡ WAVEFORMAT ṹ
+ if (SUCCEEDED(hr))
+ {
+ hr = reader->GetCurrentMediaType(
+ (DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM,
+ &uncompressed_type
+ );
+ }
+
+ // ָƵ
+ if (SUCCEEDED(hr))
+ {
+ hr = reader->SetStreamSelection(
+ (DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM,
+ true
+ );
+ }
+
+ // ȡ WAVEFORMAT
+ if (SUCCEEDED(hr))
+ {
+ UINT32 size = 0;
+ hr = modules::MediaFoundation::Get().MFCreateWaveFormatExFromMFMediaType(
+ uncompressed_type.Get(),
+ &wave_format_,
+ &size,
+ (DWORD)MFWaveFormatExConvertFlag_Normal
+ );
+ }
+
+ // ƵС
+ if (SUCCEEDED(hr))
+ {
+ PROPVARIANT prop;
+ PropVariantInit(&prop);
+
+ hr = reader->GetPresentationAttribute(
+ (DWORD)MF_SOURCE_READER_MEDIASOURCE,
+ MF_PD_DURATION,
+ &prop
+ );
+
+ LONGLONG duration = prop.uhVal.QuadPart;
+ max_stream_size = static_cast(
+ (duration * wave_format_->nAvgBytesPerSec) / 10000000 + 1
+ );
+ PropVariantClear(&prop);
+ }
+
+ // ȡƵ
+ if (SUCCEEDED(hr))
+ {
+ DWORD flags = 0;
+ DWORD position = 0;
+ BYTE* data = new (std::nothrow) BYTE[max_stream_size];
+
+ ComPtr sample;
+ ComPtr buffer;
+
+ if (data == nullptr)
+ {
+ E2D_ERROR_LOG(L"Low memory");
+ hr = E_OUTOFMEMORY;
+ }
+ else
+ {
+ while (true)
+ {
+ hr = reader->ReadSample(
+ (DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM,
+ 0,
+ nullptr,
+ &flags,
+ nullptr,
+ &sample
+ );
+
+ if (flags & MF_SOURCE_READERF_ENDOFSTREAM) { break; }
+
+ if (sample == nullptr) { continue; }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = sample->ConvertToContiguousBuffer(&buffer);
+
+ if (SUCCEEDED(hr))
+ {
+ BYTE *audio_data = nullptr;
+ DWORD sample_buffer_length = 0;
+
+ hr = buffer->Lock(
+ &audio_data,
+ nullptr,
+ &sample_buffer_length
+ );
+
+ if (SUCCEEDED(hr))
+ {
+ for (DWORD i = 0; i < sample_buffer_length; i++)
+ {
+ data[position++] = audio_data[i];
+ }
+ hr = buffer->Unlock();
+ }
+ }
+ buffer = nullptr;
+ }
+ sample = nullptr;
+
+ if (FAILED(hr)) { break; }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ *wave_data = data;
+ *wave_data_size = position;
+ }
+ }
+ }
+
+ return hr;
+ }
+}
\ No newline at end of file
diff --git a/Easy2D-Audio/Transcoder.h b/Easy2D-Audio/Transcoder.h
new file mode 100644
index 00000000..dcfa53af
--- /dev/null
+++ b/Easy2D-Audio/Transcoder.h
@@ -0,0 +1,57 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#pragma once
+#include
+#include
+#include
+
+namespace easy2d
+{
+ class E2D_API Transcoder
+ {
+ WAVEFORMATEX* wave_format_;
+
+ public:
+ Transcoder();
+
+ ~Transcoder();
+
+ const WAVEFORMATEX* GetWaveFormatEx() const;
+
+ HRESULT LoadMediaFile(
+ String const& file_path,
+ BYTE** wave_data,
+ UINT32* wave_data_size
+ );
+
+ HRESULT LoadMediaResource(
+ Resource const& res,
+ BYTE** wave_data,
+ UINT32* wave_data_size
+ );
+
+ HRESULT ReadSource(
+ IMFSourceReader* reader,
+ BYTE** wave_data,
+ UINT32* wave_data_size
+ );
+ };
+}
diff --git a/Easy2D-Audio/Voice.cpp b/Easy2D-Audio/Voice.cpp
new file mode 100644
index 00000000..48dd3fe7
--- /dev/null
+++ b/Easy2D-Audio/Voice.cpp
@@ -0,0 +1,148 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#include "easy2d-audio.h"
+#include "Voice.h"
+
+namespace easy2d
+{
+ Voice::Voice()
+ : source_voice_(nullptr)
+ {
+ }
+
+ Voice::Voice(IXAudio2SourceVoice * source_voice)
+ : source_voice_(source_voice)
+ {
+ }
+
+ Voice::~Voice()
+ {
+ Destroy();
+
+ Audio::Instance().DeleteVoice(this);
+ }
+
+ HRESULT Voice::Play(const BYTE * wave_data, UINT32 data_size, UINT32 loop_count)
+ {
+ if (!source_voice_)
+ return E_UNEXPECTED;
+
+ XAUDIO2_BUFFER buffer = { 0 };
+ buffer.pAudioData = wave_data;
+ buffer.Flags = XAUDIO2_END_OF_STREAM;
+ buffer.AudioBytes = data_size;
+ buffer.LoopCount = loop_count;
+
+ HRESULT hr = source_voice_->SubmitSourceBuffer(&buffer);
+ if (SUCCEEDED(hr))
+ {
+ hr = source_voice_->Start();
+ }
+ return hr;
+ }
+
+ HRESULT Voice::Pause()
+ {
+ if (!source_voice_)
+ return E_UNEXPECTED;
+
+ return source_voice_->Stop();
+ }
+
+ HRESULT Voice::Resume()
+ {
+ if (!source_voice_)
+ return E_UNEXPECTED;
+
+ return source_voice_->Start();
+ }
+
+ HRESULT Voice::Stop()
+ {
+ if (!source_voice_)
+ return E_UNEXPECTED;
+
+ HRESULT hr = source_voice_->Stop();
+ if (SUCCEEDED(hr))
+ {
+ hr = source_voice_->ExitLoop();
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = source_voice_->FlushSourceBuffers();
+ }
+ return hr;
+ }
+
+ HRESULT Voice::GetVolume(float * volume) const
+ {
+ if (!source_voice_)
+ return E_UNEXPECTED;
+
+ if (volume == nullptr)
+ return E_POINTER;
+
+ source_voice_->GetVolume(volume);
+ return S_OK;
+ }
+
+ HRESULT Voice::SetVolume(float volume)
+ {
+ if (!source_voice_)
+ return E_UNEXPECTED;
+
+ volume = std::min(std::max(volume, -224.f), 224.f);
+ return source_voice_->SetVolume(volume);
+ }
+
+ HRESULT Voice::GetBuffersQueued(UINT32 * queued) const
+ {
+ if (!source_voice_)
+ return E_UNEXPECTED;
+
+ if (queued == nullptr)
+ return E_POINTER;
+
+ XAUDIO2_VOICE_STATE state;
+ source_voice_->GetState(&state);
+ *queued = state.BuffersQueued;
+ return S_OK;
+ }
+
+ void Voice::Destroy()
+ {
+ if (source_voice_)
+ {
+ source_voice_->Stop();
+ source_voice_->FlushSourceBuffers();
+ source_voice_->DestroyVoice();
+ source_voice_ = nullptr;
+ }
+ }
+
+ void Voice::SetSourceVoice(IXAudio2SourceVoice * source_voice)
+ {
+ Destroy();
+ source_voice_ = source_voice;
+ }
+
+}
\ No newline at end of file
diff --git a/Easy2D-Audio/Voice.h b/Easy2D-Audio/Voice.h
new file mode 100644
index 00000000..ce6cd830
--- /dev/null
+++ b/Easy2D-Audio/Voice.h
@@ -0,0 +1,72 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#pragma once
+#include
+
+namespace easy2d
+{
+ class E2D_API Voice
+ : protected Noncopyable
+ {
+ public:
+ Voice();
+
+ Voice(
+ IXAudio2SourceVoice* source_voice
+ );
+
+ ~Voice();
+
+ HRESULT Play(
+ const BYTE* wave_data,
+ UINT32 data_size,
+ UINT32 loop_count
+ );
+
+ HRESULT Pause();
+
+ HRESULT Resume();
+
+ HRESULT Stop();
+
+ HRESULT GetVolume(
+ float* volume
+ ) const;
+
+ HRESULT SetVolume(
+ float volume
+ );
+
+ HRESULT GetBuffersQueued(
+ UINT32* queued
+ ) const;
+
+ void Destroy();
+
+ void SetSourceVoice(
+ IXAudio2SourceVoice* source_voice
+ );
+
+ protected:
+ IXAudio2SourceVoice* source_voice_;
+ };
+
+}
diff --git a/Easy2D-Audio/audio-modules.cpp b/Easy2D-Audio/audio-modules.cpp
new file mode 100644
index 00000000..983f9aa5
--- /dev/null
+++ b/Easy2D-Audio/audio-modules.cpp
@@ -0,0 +1,97 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#include "easy2d-audio.h"
+#include "audio-modules.h"
+
+namespace easy2d
+{
+ namespace modules
+ {
+ XAudio2::XAudio2()
+ {
+ const auto xaudio2_dll_names =
+ {
+ L"xaudio2_9.dll", // for Windows 10
+ L"xaudio2_8.dll", // for Windows 8
+ L"xaudio2_7.dll" // for DirectX SDK
+ };
+
+ for (const auto& name : xaudio2_dll_names)
+ {
+ xaudio2 = LoadLibraryW(name);
+ if (xaudio2)
+ {
+ XAudio2Create = (PFN_XAudio2Create)
+ GetProcAddress(xaudio2, "XAudio2Create");
+ break;
+ }
+ }
+
+ if (!xaudio2)
+ {
+ E2D_ERROR_LOG(L"Load xaudio2.dll failed");
+ throw std::runtime_error("Load xaudio2.dll failed");
+ }
+ }
+
+ MediaFoundation::MediaFoundation()
+ {
+ mfplat = LoadLibraryW(L"Mfplat.dll");
+ if (mfplat)
+ {
+ MFStartup = (PFN_MFStartup)
+ GetProcAddress(mfplat, "MFStartup");
+
+ MFShutdown = (PFN_MFShutdown)
+ GetProcAddress(mfplat, "MFShutdown");
+
+ MFCreateMediaType = (PFN_MFCreateMediaType)
+ GetProcAddress(mfplat, "MFCreateMediaType");
+
+ MFCreateWaveFormatExFromMFMediaType = (PFN_MFCreateWaveFormatExFromMFMediaType)
+ GetProcAddress(mfplat, "MFCreateWaveFormatExFromMFMediaType");
+
+ MFCreateMFByteStreamOnStream = (PFN_MFCreateMFByteStreamOnStream)
+ GetProcAddress(mfplat, "MFCreateMFByteStreamOnStream");
+ }
+ else
+ {
+ E2D_LOG(L"Load Mfplat.dll failed");
+ throw std::runtime_error("Load Mfplat.dll failed");
+ }
+
+ mfreadwrite = LoadLibraryW(L"Mfreadwrite.dll");
+ if (mfreadwrite)
+ {
+ MFCreateSourceReaderFromURL = (PFN_MFCreateSourceReaderFromURL)
+ GetProcAddress(mfreadwrite, "MFCreateSourceReaderFromURL");
+
+ MFCreateSourceReaderFromByteStream = (PFN_MFCreateSourceReaderFromByteStream)
+ GetProcAddress(mfreadwrite, "MFCreateSourceReaderFromByteStream");
+ }
+ else
+ {
+ E2D_LOG(L"Load Mfreadwrite.dll failed");
+ throw std::runtime_error("Load Mfreadwrite.dll failed");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Easy2D-Audio/audio-modules.h b/Easy2D-Audio/audio-modules.h
new file mode 100644
index 00000000..059d1535
--- /dev/null
+++ b/Easy2D-Audio/audio-modules.h
@@ -0,0 +1,83 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#pragma once
+#include
+#include
+#include
+#include
+
+namespace easy2d
+{
+ namespace modules
+ {
+ class E2D_API XAudio2
+ {
+ XAudio2();
+
+ HMODULE xaudio2;
+
+ // XAudio2 functions
+ typedef HRESULT(WINAPI *PFN_XAudio2Create)(IXAudio2**, UINT32, XAUDIO2_PROCESSOR);
+
+ public:
+ static inline XAudio2& Get()
+ {
+ static XAudio2 instance;
+ return instance;
+ }
+
+ PFN_XAudio2Create XAudio2Create;
+ };
+
+
+ class E2D_API MediaFoundation
+ {
+ MediaFoundation();
+
+ HMODULE mfplat;
+ HMODULE mfreadwrite;
+
+ // MediaFoundation functions
+ typedef HRESULT(WINAPI *PFN_MFStartup)(ULONG, DWORD);
+ typedef HRESULT(WINAPI *PFN_MFShutdown)();
+ typedef HRESULT(WINAPI *PFN_MFCreateMediaType)(IMFMediaType**);
+ typedef HRESULT(WINAPI *PFN_MFCreateWaveFormatExFromMFMediaType)(IMFMediaType*, WAVEFORMATEX**, UINT32*, UINT32);
+ typedef HRESULT(WINAPI *PFN_MFCreateSourceReaderFromURL)(LPCWSTR, IMFAttributes*, IMFSourceReader**);
+ typedef HRESULT(WINAPI *PFN_MFCreateSourceReaderFromByteStream)(IMFByteStream*, IMFAttributes*, IMFSourceReader**);
+ typedef HRESULT(WINAPI *PFN_MFCreateMFByteStreamOnStream)(IStream*, IMFByteStream**);
+
+ public:
+ static inline MediaFoundation& Get()
+ {
+ static MediaFoundation instance;
+ return instance;
+ }
+
+ PFN_MFStartup MFStartup;
+ PFN_MFShutdown MFShutdown;
+ PFN_MFCreateMediaType MFCreateMediaType;
+ PFN_MFCreateWaveFormatExFromMFMediaType MFCreateWaveFormatExFromMFMediaType;
+ PFN_MFCreateSourceReaderFromURL MFCreateSourceReaderFromURL;
+ PFN_MFCreateSourceReaderFromByteStream MFCreateSourceReaderFromByteStream;
+ PFN_MFCreateMFByteStreamOnStream MFCreateMFByteStreamOnStream;
+ };
+ }
+}
diff --git a/Easy2D-Audio/audio.cpp b/Easy2D-Audio/audio.cpp
new file mode 100644
index 00000000..233b1bd9
--- /dev/null
+++ b/Easy2D-Audio/audio.cpp
@@ -0,0 +1,115 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#include "easy2d-audio.h"
+#include "audio.h"
+#include "audio-modules.h"
+
+namespace easy2d
+{
+ Audio::Audio()
+ : x_audio2_(nullptr)
+ , mastering_voice_(nullptr)
+ {
+ }
+
+ Audio::~Audio()
+ {
+ }
+
+ void Audio::SetupComponent(Application*)
+ {
+ E2D_LOG(L"Creating audio resources");
+
+ HRESULT hr = modules::MediaFoundation::Get().MFStartup(MF_VERSION, MFSTARTUP_FULL);
+
+ if (SUCCEEDED(hr))
+ {
+ hr = modules::XAudio2::Get().XAudio2Create(&x_audio2_, 0, XAUDIO2_DEFAULT_PROCESSOR);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = x_audio2_->CreateMasteringVoice(&mastering_voice_);
+ }
+
+ ThrowIfFailed(hr);
+ }
+
+ void Audio::DestroyComponent()
+ {
+ E2D_LOG(L"Destroying audio resources");
+
+ ClearVoiceCache();
+
+ if (mastering_voice_)
+ {
+ mastering_voice_->DestroyVoice();
+ mastering_voice_ = nullptr;
+ }
+
+ if (x_audio2_)
+ {
+ x_audio2_->Release();
+ x_audio2_ = nullptr;
+ }
+
+ modules::MediaFoundation::Get().MFShutdown();
+ }
+
+ HRESULT Audio::CreateVoice(Voice& voice, const WAVEFORMATEX* wfx)
+ {
+ HRESULT hr;
+ IXAudio2SourceVoice* source_voice;
+
+ hr = x_audio2_->CreateSourceVoice(&source_voice, wfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO);
+ if (SUCCEEDED(hr))
+ {
+ voice.SetSourceVoice(source_voice);
+ voice_cache_.insert(&voice);
+ }
+ return hr;
+ }
+
+ void Audio::DeleteVoice(Voice* voice)
+ {
+ voice_cache_.erase(voice);
+ }
+
+ void Audio::ClearVoiceCache()
+ {
+ for (auto voice : voice_cache_)
+ {
+ voice->Destroy();
+ }
+ voice_cache_.clear();
+ }
+
+ void Audio::Open()
+ {
+ x_audio2_->StartEngine();
+ }
+
+ void Audio::Close()
+ {
+ x_audio2_->StopEngine();
+ }
+
+}
\ No newline at end of file
diff --git a/Easy2D-Audio/audio.h b/Easy2D-Audio/audio.h
new file mode 100644
index 00000000..4058042f
--- /dev/null
+++ b/Easy2D-Audio/audio.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2016-2018 Easy2D - Nomango
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#pragma once
+#include "Voice.h"
+
+namespace easy2d
+{
+ class E2D_API Audio
+ : public Singleton