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