Added Windows implementation of GetData to Texture3D
Fix GetData in Texture2D.
Switching from properties to fields in GetData in Texture3D
Added tests for Get/SetData members of Texture2D and Texture3D
Fix row pitch support in GetData in Texture2D and Texture3D
Removed #define DIRECTX from Texture3D.cs
Add a few missing equality operators to Input structs.

Add equality operators and Object.Equals() overrides to the
GamePadButtons, GamePadDPad, GamePadThumbSticks, and GamePadTriggers
structs in the MonoGame.Framework.Input namespace.
Make SoundEffect.Play not throw an exception on iOS if it fails to play, return false instead as we are meant to.
Implement TryPlay on other platforms.
Fix playing multiple music tracks, previously when the first one finished we'd play the second which would reset the queue.
Fix android song end detection. _androidPlayer is static but wasn't being correctly treated like it was.

Also fix Duration and Position properties (milliseconds not seconds)
Remove _initialized check from DrawableGameComponent.GraphicsDevice

Initially i put the check there as was implemented by @Aztherion.

I did some testings and found that XNA doesn't enforce any similar test.
After all GraphicsDevice is already initialized by Game. It's logical
that someone might want to do some non-content initialization on the
constractor of DrawableGameComponent based on values from
GraphicsDevice.
Merge remote-tracking branch 'upstream/develop' into nKast_DrawableGameComponent_GraphicsDevice
Merge remote-tracking branch 'upstream/develop' into nKast_DrawableGameComponent_GraphicsDevice
fix for VertexBuffer.GetData<>()

-Argument check now throws exceptions/Messages same as XNA.
-Copy now copies only as many as elementCount items.
-Use of offsetInBytes argument.

I accidentally deleted the branch. Original thread at
https://github.com/mono/MonoGame/pull/2033
--------------

Issue:
https://github.com/mono/MonoGame/issues/1076#issuecomment-24449713

I made some quick testing to see if this behaves as XNA.
https://github.com/mono/MonoGame/issues/2032

Here is the tests I used.
private VertexBuffer _vertexBuffer;
private DynamicVertexBuffer _dynamicVertexBuffer;
VertexPositionColor[] _vertices;

private void SetUpVertexBuffers()
{
//setup
_vertexBuffer = new VertexBuffer(this.Game.GraphicsDevice,
VertexPositionColor.VertexDeclaration, 2, BufferUsage.None);
_dynamicVertexBuffer = new DynamicVertexBuffer(this.Game.GraphicsDevice,
VertexPositionColor.VertexDeclaration, 2, BufferUsage.None);
_vertices = new VertexPositionColor[2];
_vertices[0].Position = new Vector3(11f, 12f, 13f);
_vertices[1].Position = new Vector3(21f, 22f, 23f);
_vertices[0].Color = Color.FromNonPremultiplied(127, 63, 31, 255);
_vertices[1].Color = Color.FromNonPremultiplied(15, 7, 3, 255);
}

private void TestVertexBuffer()
{
VertexPositionColor[] output;
Vector3[] outputvec3;
Vector2[] outputvec2;
float[] outputZ;
Color[] outputColor;
int vertexPCStride = VertexPositionColor.VertexDeclaration.VertexStride;

//copy all
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[2];
_vertexBuffer.GetData(output);
Debug.Assert(output[0].Position == _vertices[0].Position);
Debug.Assert(output[0].Color == _vertices[0].Color);
Debug.Assert(output[1].Position == _vertices[1].Position);
Debug.Assert(output[1].Color == _vertices[1].Color);

//copy only first vertex in first position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[2];
_vertexBuffer.GetData(output, 0, 1);
Debug.Assert(output[0].Position == _vertices[0].Position);
Debug.Assert(output[0].Color == _vertices[0].Color);
Debug.Assert(output[1].Position == Vector3.Zero);
Debug.Assert(output[1].Color == Color.Transparent);

//copy first vertex in first position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[1];
_vertexBuffer.GetData(output, 0, 1);
Debug.Assert(output[0].Position == _vertices[0].Position);
Debug.Assert(output[0].Color == _vertices[0].Color);

//copy first vertex in second position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[2];
_vertexBuffer.GetData(output,1,1);
Debug.Assert(output[0].Position == Vector3.Zero);
Debug.Assert(output[0].Color == Color.Transparent);
Debug.Assert(output[1].Position == _vertices[0].Position);
Debug.Assert(output[1].Color == _vertices[0].Color);

//copy second vertex in first position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[1];
_vertexBuffer.GetData(vertexPCStride, output, 0, 1, vertexPCStride);
Debug.Assert(output[0].Position == _vertices[1].Position);
Debug.Assert(output[0].Color == _vertices[1].Color);

//copy second vertex in second position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[2];
_vertexBuffer.GetData(vertexPCStride, output, 1, 1, vertexPCStride);
Debug.Assert(output[0].Position == Vector3.Zero);
Debug.Assert(output[0].Color == Color.Transparent);
Debug.Assert(output[1].Position == _vertices[1].Position);
Debug.Assert(output[1].Color == _vertices[1].Color);

//read positions
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
outputvec3 = new Vector3[2];
_vertexBuffer.GetData(0, outputvec3, 0, 2, vertexPCStride);
Debug.Assert(outputvec3[0] == _vertices[0].Position);
Debug.Assert(outputvec3[1] == _vertices[1].Position);

//read positions 2D
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
outputvec2 = new Vector2[2];
_vertexBuffer.GetData(0, outputvec2, 0, 2, vertexPCStride);
Debug.Assert(outputvec2[0].X == _vertices[0].Position.X);
Debug.Assert(outputvec2[0].Y == _vertices[0].Position.Y);
Debug.Assert(outputvec2[1].X == _vertices[1].Position.X);
Debug.Assert(outputvec2[1].Y == _vertices[1].Position.Y);

//read depth
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
outputZ = new float[2];
_vertexBuffer.GetData(sizeof(float) * 2, outputZ, 0, 2, vertexPCStride);
Debug.Assert(outputZ[0] == _vertices[0].Position.Z);
Debug.Assert(outputZ[1] == _vertices[1].Position.Z);

//read colors
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
outputColor = new Color[2];
_vertexBuffer.GetData(sizeof(float)*3, outputColor, 0, 2,
vertexPCStride);
Debug.Assert(outputColor[0] == _vertices[0].Color);
Debug.Assert(outputColor[1] == _vertices[1].Color);

return;
}
Merge remote-tracking branch 'upstream/develop' into nKast_DrawableGameComponent_GraphicsDevice
Merge remote-tracking branch 'upstream/develop' into tnc_Fix_VertexBuffer_GetData
Fixed Texture2D.GetData() when a rectangle is given.
Make Texture2D.Reload(Stream) public -- again

Someone already did this in a previous commit ( https://github.com/mono/MonoGame/commit/06f6c2fe65201fd3552af1261711af07fbc51cf3 ) but I think it inadvertently got lost in a merge...
I'm not sure why nobody missed it, but my team and I are using this method on Android, to recover from the GraphicsDevice.DeviceReset event. To quote the original commit message:

"The ContentManager class handles texture reloading of all its loaded textures, but if you're using Texture2D.FromStream() to load textures, this change will allow you to reload them without updating their references everywhere."
Merge https://github.com/mono/MonoGame into develop

Conflicts:
	Test/MonoGame.Tests.Windows.csproj
	Test/MonoGame.Tests.XNA.csproj